কেন এনপি.ডট অপ্রচলিত? (এন-ডিমে অ্যারে)


15

ধরুন আমরা np.dotদুটি 'float32'2 ডি অ্যারে গ্রহণ করি:

res = np.dot(a, b)   # see CASE 1
print(list(res[0]))  # list shows more digits
[-0.90448684, -1.1708503, 0.907136, 3.5594249, 1.1374011, -1.3826287]

নাম্বার। বাদে তারা পরিবর্তন করতে পারে:


ক্যাসি 1 : টুকরাa

np.random.seed(1)
a = np.random.randn(9, 6).astype('float32')
b = np.random.randn(6, 6).astype('float32')

for i in range(1, len(a)):
    print(list(np.dot(a[:i], b)[0])) # full shape: (i, 6)
[-0.9044868,  -1.1708502, 0.90713596, 3.5594249, 1.1374012, -1.3826287]
[-0.90448684, -1.1708503, 0.9071359,  3.5594249, 1.1374011, -1.3826288]
[-0.90448684, -1.1708503, 0.9071359,  3.5594249, 1.1374011, -1.3826288]
[-0.90448684, -1.1708503, 0.907136,   3.5594249, 1.1374011, -1.3826287]
[-0.90448684, -1.1708503, 0.907136,   3.5594249, 1.1374011, -1.3826287]
[-0.90448684, -1.1708503, 0.907136,   3.5594249, 1.1374011, -1.3826287]
[-0.90448684, -1.1708503, 0.907136,   3.5594249, 1.1374011, -1.3826287]
[-0.90448684, -1.1708503, 0.907136,   3.5594249, 1.1374011, -1.3826287]

ফলাফলগুলি পৃথক, যদিও মুদ্রিত স্লাইসটি একই একই সংখ্যাগুলি দ্বারা গুণিত হয়েছে।


CASE 2 : সমতল করুন a, এর 1D সংস্করণ নিন b, তারপরে টুকরো a:

np.random.seed(1)
a = np.random.randn(9, 6).astype('float32')
b = np.random.randn(1, 6).astype('float32')

for i in range(1, len(a)):
    a_flat = np.expand_dims(a[:i].flatten(), -1) # keep 2D
    print(list(np.dot(a_flat, b)[0])) # full shape: (i*6, 6)
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]
[-0.3393164, 0.9528787, 1.3627989, 1.5124314, 0.46389243, 1.437775]

CASE 3 : শক্তিশালী নিয়ন্ত্রণ; সমস্ত অ-জড়িত তালিকা শূন্যে সেট করুন: a[1:] = 0সিএসই 1 কোড যুক্ত করুন SE ফলাফল: তাত্পর্য বজায় রয়েছে।


সিএসই 4 : সূচকগুলি বাদে চেক করুন [0]; এর মত [0], ফলাফলগুলি তাদের সৃষ্টির দিক থেকে অ্যারে বৃদ্ধিগুলির একটি নির্দিষ্ট # স্থির করতে শুরু করে। আউটপুট

np.random.seed(1)
a = np.random.randn(9, 6).astype('float32')
b = np.random.randn(6, 6).astype('float32')

for j in range(len(a) - 2):
    for i in range(1, len(a)):
        res = np.dot(a[:i], b)
        try:    print(list(res[j]))
        except: pass
    print()

সুতরাং, 2D * 2D কেসের ক্ষেত্রে ফলাফল পৃথক হয় - তবে 1D * 1D এর সাথে সামঞ্জস্যপূর্ণ। আমার কিছু পড়া থেকে, এটি সাধারণ সংযোজন ব্যবহার করে 1D-1D থেকে শুরু হয়েছে, যেখানে 2D-2D 'ফ্যানসিয়ার' ব্যবহার করে, পারফরম্যান্স-বুস্টিং সংযোজন যা কম সুনির্দিষ্ট হতে পারে (উদাহরণস্বরূপ পেয়ারওয়াইস সংযোজনটি বিপরীতে করে)। তা সত্ত্বেও, আমি বুঝতে পারি না যে 1 ক্ষেত্রে একবার a'সেট' দোরগোড়ায় কাটলে কেন এই বৈষম্যগুলি বিলুপ্ত হয় ; বৃহত্তর aএবং b, পরে এই প্রান্তিকতা মিথ্যা বলে মনে হয়, তবে এটি সর্বদা বিদ্যমান exists

সকলে বলেছিল: np.dotএনডি-এনডি অ্যারেগুলির জন্য কেন অনর্থক (এবং বেমানান)? প্রাসঙ্গিক গিট


অতিরিক্ত তথ্য :

  • পরিবেশ : উইন -10 ওএস, পাইথন 3.7.4, স্পাইডার 3.3.6 আইডিই, অ্যানাকোন্ডা 3.0 2019/10
  • সিপিইউ : i7-7700HQ 2.8 GHz
  • নম্পি v1.16.5

সম্ভাব্য অভিযুক্ত ব্যক্তি গ্রন্থাগার : Numpy MKL - এছাড়াও BLASS লাইব্রেরি; লক্ষ করার জন্য দ্বি রিকোকে ধন্যবাদ


স্ট্রেস-টেস্ট কোড : যেমনটি উল্লিখিত হয়েছে, ফ্রিকোয়েন্সি ডাব্লু / বড় অ্যারেগুলিতে তফাত বাড়িয়ে তোলে; উপরেরটি যদি পুনরুত্পাদনযোগ্য না হয় তবে নীচে হওয়া উচিত (যদি না হয় তবে আরও বৃহত্তর ডিমগুলি চেষ্টা করুন)। আমার আউটপুট

np.random.seed(1)
a = (0.01*np.random.randn(9, 9999)).astype('float32') # first multiply then type-cast
b = (0.01*np.random.randn(9999, 6)).astype('float32') # *0.01 to bound mults to < 1

for i in range(1, len(a)):
    print(list(np.dot(a[:i], b)[0]))

সমস্যার তীব্রতা : দেখানো তাত্পর্যগুলি 'ছোট', তবে আর কয়েক মিলিয়ন সংখ্যক নিউরাল নেটওয়ার্কে কাজ করার সময় কয়েক সেকেন্ডে গুণিত হয় এবং পুরো রানটাইম জুড়ে ট্রিলিয়ন হয়; উল্লিখিত মডেল যথার্থতা এই থ্রেড অনুযায়ী পুরো 10 এর পার্সেন্টের দ্বারা পৃথক ।

নীচে এমন একটি জিএফ দেওয়া আছে যা মূলত কোনও মডেলকে খাওয়ানো থেকে a[0]ডাব্লু / len(a)==1বনাম len(a)==32:


অন্যান্য প্ল্যাটফর্মগুলি ফলাফল হিসাবে, এবং পলের পরীক্ষার জন্য ধন্যবাদ সহ :

কেস 1 পুনরুত্পাদন (আংশিক) :

  • গুগল কোলাব ভিএম - ইনটেল শিওন ২.৩ জি-হার্জ - জুপিটার - পাইথন ৩.6.৮
  • উইন -10 প্রো ডকার ডেস্কটপ - ইনটেল আই 7-8700 কে - জ্যুইটার / স্কিপি-নোটবুক - পাইথন 3.7.3
  • উবুন্টু 18.04.2 এলটিএস + ডকার - এএমডি এফএক্স-8150 - জুপিটার / স্কিপি-নোটবুক - পাইথন 3.7.3

দ্রষ্টব্য : এই ফলন উপরে প্রদর্শিত চেয়ে অনেক কম ত্রুটি; প্রথম সারিতে দুটি এন্ট্রি অন্য সারিতে সংশ্লিষ্ট এন্ট্রি থেকে কমপক্ষে উল্লেখযোগ্য অঙ্কে 1 দ্বারা বন্ধ রয়েছে।

কেস 1 পুনরুত্পাদন করা হয়নি :

  • উবুন্টু 18.04.3 এলটিএস - ইন্টেল আই 7-8700 কে - আইপিথন 5.5.0 - পাইথন 2.7.15+ এবং 3.6.8 (2 পরীক্ষা)
  • উবুন্টু 18.04.3 এলটিএস - ইন্টেল i5-3320M - আইপথিয়ন 5.5.0 - পাইথন 2.7.15+
  • উবুন্টু 18.04.2 এলটিএস - এএমডি এফএক্স-8150 - আইপিথন 5.5.0 - পাইথন 2.7.15rc1

দ্রষ্টব্য :

  • লিঙ্ক Colab নোটবুক এবং jupyter পরিবেশের অনেক ক্ষুদ্রতর অমিল দেন (এবং শুধুমাত্র প্রথম দুই সারি জন্য) চেয়ে আমার সিস্টেমে পালন করা হয়। এছাড়াও, কেস 2 কখনও (এখনও) অসম্পূর্ণতা দেখায় নি।
  • এই অত্যন্ত সীমাবদ্ধ নমুনার মধ্যে, বর্তমান (ডকারাইজড) জুপিটার পরিবেশ আইপিথন পরিবেশের চেয়ে বেশি সংবেদনশীল।
  • np.show_config()পোস্ট করতে খুব দীর্ঘ, তবে সংক্ষেপে: আইপিথন এনভিওরা হলেন বিএলএএস / ল্যাপাক ভিত্তিক; কলাব ওপেনবিএলএস-ভিত্তিক। আইপিথন লিনাক্স এনভিএস-এ, বিএলএএস লাইব্রেরিগুলি সিস্টেম-ইনস্টলড - জুপিটার এবং কোলাবে, তারা / অপ্ট / কনডা / লিবিব থেকে আসে

আপডেট : গৃহীত উত্তর সঠিক, তবে বিস্তৃত এবং অসম্পূর্ণ। যে কেউ কোড স্তরে আচরণটি ব্যাখ্যা করতে পারে - যথা, একটি সঠিক অ্যালগরিদম ব্যবহার np.dotকরেছেন এবং উপরের ফলাফলগুলিতে পর্যবেক্ষণ করা 'ধারাবাহিক অসঙ্গতিগুলি' কীভাবে ব্যাখ্যা করে (মন্তব্যগুলিও দেখুন) এই প্রশ্নটি সবার জন্য উন্মুক্ত থাকে । এখানে আমার ডিসিফেরিংয়ের বাইরে কিছু সরাসরি বাস্তবায়ন রয়েছে: sdot.c - arraytyype.c.src


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
স্যামুয়েল লিউ

ndarraysসাধারণত সংখ্যার যথার্থ ক্ষতি হ্রাস করার জন্য সাধারণ অ্যালগরিদমগুলি । কারণ সরলতার জন্য তারা reduce-sumপ্রতিটি অক্ষ বরাবর, অপারেশন ক্রমটি সর্বোত্তম হতে পারে না ... নোট করুন আপনি যদি যথার্থ ত্রুটি মনে করেন তবে আপনি ভালভাবে ব্যবহার করতে পারেনfloat64
ভিটার এসআরজি

আগামীকাল পর্যালোচনা করার জন্য আমার কাছে সময় নাও থাকতে পারে, তাই এখনই অনুদানটি প্রদান করছি।
পল

@ পল এটি যে কোনও উপায়ে সর্বাধিক ভোট দেওয়া উত্তরের জন্য স্বয়ংক্রিয়ভাবে পুরস্কৃত হবে - তবে ঠিক আছে, বিজ্ঞপ্তি
দেওয়ার

উত্তর:


7

এটিকে অপ্রয়োজনীয় সংখ্যাসূচক অসম্পূর্ণতার মতো দেখাচ্ছে। এখানে বর্ণিত হিসাবে , ন্যামপি ম্যাট্রিক্সের গুণণের জন্য একটি উচ্চ-অনুকূলিত, সাবধানতার সাথে সুরযুক্ত বিএলএএস পদ্ধতি ব্যবহার করে । এর অর্থ সম্ভবত ম্যাট্রিক্সের আকার পরিবর্তিত হলে অপারেশনগুলির ক্রম (যোগফল এবং পণ্যগুলি) 2 ম্যাট্রিককে গুণিত করে।

আরও পরিষ্কার হওয়ার চেষ্টা করে আমরা জানি যে, গাণিতিকভাবে , ফলাফলের ম্যাট্রিক্সের প্রতিটি উপাদান দুটি ভেক্টরের (সংখ্যার সমান-দৈর্ঘ্যের ক্রম) এর ডট পণ্য হিসাবে গণনা করা যেতে পারে । NumPy ফলাফল ম্যাট্রিক্সের একটি উপাদান গণনা করে এমন নয় । প্রকৃতপক্ষে স্ট্র্যাসেন অ্যালগরিদমের মতো আরও দক্ষ কিন্তু জটিল অ্যালগরিদম রয়েছে যা সরাসরি সারি-কলাম ডট পণ্যটির গণনা ছাড়াই একই ফলাফল অর্জন করে।

যেমন আলগোরিদিম ব্যবহার করার সময়, এমনকি যদি উপাদান সি IJ একটি ফলে ম্যাট্রিক্স সি = এবি গাণিতিকভাবে এর ডট পণ্য হিসাবে সংজ্ঞায়িত করা হয় ই-তম সারি একটি সঙ্গে ঞ তম কলাম বি , আপনি সংখ্যাবৃদ্ধি একটি ম্যাট্রিক্স যদি A2, থাকার একই I- তম যেমন সারি একটি একটি ম্যাট্রিক্স সঙ্গে B2 তে একই থাকার ঞ তম হিসাবে কলাম বি উপাদান C2 এ IJ আসলে (অপারেশন একটি ভিন্ন ক্রম যে সমগ্র উপর নির্ভর করে নিম্নলিখিত নির্ণিত হবে , A2 এবং B2 তে ম্যাট্রিক্স), সম্ভবত বিভিন্ন সংখ্যাসূচক ত্রুটির দিকে পরিচালিত করে।

এ কারণেই, এমনকি গাণিতিকভাবে সি আইজে = সি 2 আইজে (আপনার সিএএসই 1 এর মতো), গণনাগুলিতে অ্যালগোরিদমের পরে ক্রমের বিভিন্ন ক্রম (ম্যাট্রিক্সের আকার পরিবর্তনের কারণে) বিভিন্ন সংখ্যাসূচক ত্রুটি বাড়ে। সংখ্যাসূচক ত্রুটিটি পরিবেশ এবং এই সত্যের উপর নির্ভর করে কিছুটা পৃথক ফলাফলও ব্যাখ্যা করে যে কিছু পরিস্থিতিতে কিছু পরিবেশের জন্য সংখ্যাসূচক ত্রুটি অনুপস্থিত থাকতে পারে।


2
লিঙ্কটির জন্য ধন্যবাদ, এতে প্রাসঙ্গিক তথ্য রয়েছে বলে মনে হয় - আপনার উত্তরটি অবশ্য আরও বিশদ হতে পারে, যতক্ষণ না এটি প্রশ্নের নীচে মন্তব্যগুলির একটি প্যারাফ্রেসিং। উদাহরণস্বরূপ, লিঙ্কযুক্ত এসও সরাসরি Cকোড দেখায় এবং অ্যালগরিদম-স্তরের ব্যাখ্যা সরবরাহ করে, সুতরাং এটি সঠিক দিকে চলে যাচ্ছে।
ওভারলর্ডগোলড্রাগন

এটি "অনিবার্য "ও নয়, যেমন প্রশ্নের নীচের অংশে দেখানো হয়েছে - এবং
অদম্যতার পরিধি

1
@ ওভারলর্ডগোল্ডড্রাগন: (১) সংযোজন সহ একটি তুচ্ছ উদাহরণ: সংখ্যাটি ধরুন n, এমন নম্বর নিন kযা এটি kশেষ ম্যান্টিসার অঙ্কের যথার্থতার নীচে । পাইথনের নেটিভ ফ্লোট n = 1.0এবং k = 1e-16কাজের জন্য। এখন যাক ks = [k] * 100। এটি দেখুন sum([n] + ks) == n, যখনই sum(ks + [n]) > n, সংশ্লেষের আদেশটি ম্যাটার হয়েছে। (২) আধুনিক সিপিইউগুলির সমান্তরালভাবে ফ্লোটিং-পয়েন্ট (এফপি) অপারেশন চালানোর জন্য বেশ কয়েকটি ইউনিট রয়েছে এবং a + b + c + dএকটি সিপিইউতে যে ক্রমটি গণনা করা হয় তা সংজ্ঞায়িত করা হয় না, যদিও কমান্ডটি মেশিন কোডের a + bআগে আসে c + d
9000

1
@ ওভারলর্ডগোলড্রাগন আপনার সচেতন হওয়া উচিত যে আপনি আপনার প্রোগ্রামটি মোকাবেলা করতে বলছেন এমন বেশিরভাগ সংখ্যার সঠিক ভাসমান পয়েন্ট দ্বারা প্রতিনিধিত্ব করা যায় না। ব্যবহার করে দেখুন format(0.01, '.30f')। যদি কোনও সাধারণ 0.01সংখ্যারও কোনও নিমপয় ভাসমান বিন্দু দ্বারা হুবহু উপস্থাপন করা না যায়, তবে আমার উত্তরের বিন্দুটি বোঝার জন্য নম্পপি ম্যাট্রিক্স গুণিত অ্যালগরিদমের গভীর বিবরণ জানার দরকার নেই; এটি ভিন্ন ভিন্ন ম্যাট্রিকগুলি ক্রিয়াকলাপের বিভিন্ন ক্রমের দিকে পরিচালিত করে , যাতে গাণিতিকভাবে সমান ফলাফল সংখ্যাগত ত্রুটির কারণে অল্প পরিমাণে পৃথক হতে পারে।
মিম্জ

2
পুনঃটুইট: কালো রঙের ম্যাজিক বেশ কয়েকটি সিএস এমওওসি-তে পড়ার জন্য একটি কাগজ রয়েছে। আমার স্মরণটি
পল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.