HyperAI

ملخص وحل مسائل ضرب المصفوفات باستخدام PyTorch

منذ 4 أعوام
معلومة
Rollroll Yuan
特色图像


في التعلم الآلي والتعلم العميق، تعد عمليات المصفوفة الطريقة الأكثر شيوعًا وفعالية لتحسين كفاءة الحوسبة. نظرًا لأن الميزات والأوزان يتم تخزينها كمتجهات، فإن عمليات المصفوفة مهمة بشكل خاص.تتطلب طرق التعلم الآلي المهمة مثل الانحدار التدرجي والانتشار العكسي وعامل تحليل المصفوفة عمليات المصفوفة.


في التعلم العميق، تقوم الشبكات العصبية بتخزين الأوزان في مصفوفات، ويمكن للعمليات القائمة على الجبر الخطي على وحدة معالجة الرسوميات إجراء حسابات بسيطة وسريعة على المصفوفات.

يمكن حساب عمليات المصفوفة ذات النطاق الصغير بسرعة باستخدام حلقات for. ولكن بمجرد مواجهة كمية هائلة من البيانات،ستؤدي عبارات الحلقة إلى إبطاء سرعة الحساب.في هذا الوقت، نستخدم غالبًا عملية ضرب المصفوفات، مما قد يؤدي إلى تحسين كفاءة العمليات الحسابية بشكل كبير.

طرق الضرب الشائعة للمصفوفات والمتجهات والمقاييس

  • ضرب مصفوفة ثنائية الأبعاد باستخدام شعلة (مم)

torch.mm(mat1,ma2,out=None)، حيث mat1(n*m)، mat2(m*d)، أبعاد الإخراج هي (n*d).
ملاحظة: تحسب عملية ضرب المصفوفة لمصفوفتين ثنائيتي الأبعاد ولا تدعم البث.

  • torch.bmm() عملية ضرب مصفوفة الدفعة ثلاثية الأبعاد

torch.bmm(bmat1,bmat2,out=None)، حيث bmat1(b*n*m)، bmat2(B*m*d)، يكون للمخرج الخارجي بُعد (B*n*d).
ملاحظة: يجب أن يكون مدخلا هذه الوظيفة عبارة عن مصفوفات ثلاثية الأبعاد بنفس البعد الأول (يشير إلى بُعد الدفعة). لا يتم دعم البث.

  • torch.matmul() ضرب المصفوفات المختلطة 

torch.matmul(input,other,out=None)، هذه الطريقة أكثر تعقيدًا ويوصى بالرجوع إلى المستند. هو حاصل ضرب مصفوفتين. تعتمد نتيجة الحساب على أبعاد الموتر وتدعم البث.

  • torch.mul() عملية ضرب عناصر المصفوفة 

torch.mul(mat1,other,out=None)، حيث يمكن أن يكون المضاعف الآخر عددًا قياسيًا أو مصفوفة لأي بُعد، طالما تم استيفاء الضرب النهائي، ويتم دعم البث.

  • torch.mv() ضرب المصفوفة بالمتجه

torch.mv(mat, vec, out=None) تضاعف مصفوفة mat ومتجه vec. إذا كان mat عبارة عن موتر n×m وكان vec عبارة عن موتر أحادي الأبعاد مكون من عنصر m، فسيكون الإخراج عبارة عن موتر أحادي الأبعاد مكون من عنصر n، دون دعم البث.

  • torch.dot() ضرب النقاط الموترية

تحسب الدالة torch.dot(tensor1, tensor2) حاصل الضرب النقطي لموترين. كلا الموترين عبارة عن متجهات أحادية الأبعاد ولا يدعمان البث.

الأسئلة الشائعة في المنتدى

 س: كيفية مضاعفة دفعات متجهات البيانات دون استخدام حلقة for؟
شكل الإدخال: N x M x VectorSize شكل الوزن: M x VectorSize x VectorSize شكل الإخراج المستهدف: N x M x VectorSize
يمثل N حجم الدفعة، ويمثل M عدد المتجهات، ويمثل VectorSize حجم المتجهات.
كما هو موضح في الشكل التالي: حل:

N, M, V=2, 3, 5a = torch.randn(N, M, V)b = torch.randn(M, V, V)a_expand = a.unsqueeze(-2)b_expand = b.expand(N, -1, -1, -1)c = torch.matmul(a_expand, b_expand).squeeze(-2)

عنوان البريد الأصلي:https://discuss.pytorch.org/t/batch-matrix-vector-multiplication-without-for-loop/112841
 

س: عند حساب عملية ضرب المصفوفة بالمتجه بواسطة إدخال متجه الدفعة، يحدث خطأ وقت التشغيل 
منح:

# (batch x inp)v = torch.randn(5, 15)# (inp x output)M = torch.randn(15, 20)

احسب:

# (batch x output)out = torch.Tensor(5, 20)for i, batch_v in enumerate(v):    out[i] = (batch_v * M).t()

ومع ذلك، (i) سيؤدي الضرب إلى الخطأ التالي لمدخلين من نفس البعد: RuntimeError: inconsistent tensor size at /home/enrique/code/vendor/pytorch/torch/lib/TH/generic/THTensorMath.c:623
لماذا يحدث هذا الخطأ؟ هل هناك طريقة لتجنب التكرار على متجهات الصفوف؟

  حل:
* يمثل الضرب حسب العنصر. إذا كنت تستخدم Python 3، فيمكنك استخدام عامل @ لضرب المصفوفة بالمتجه وضرب المصفوفة بالمصفوفة.

يمكنك أيضًا استخدام batch_v.mm(M) نظرًا لأن مصفوفة المتجهات الدفعية هي عملية ضرب مصفوفة بمصفوفة.
بالإضافة إلى ذلك، يمكنك أيضًا استخدام طرق مثل bmm وbaddbmm للتخلص من عمليات الحلقة في Python.

عنوان البريد الأصلي:https://discuss.pytorch.org/t/matrix-vector-multiply-handling-batched-data/203
 س: كيفية حساب عملية ضرب المصفوفة والمتجه دون استخدام عبارات الحلقة؟
كيف يمكننا ضرب مصفوفة 2×2 بثلاثة متجهات بحجم 2 دون استخدام الحلقات؟

ملاحظة:
1. عند استخدام عبارة حلقة، يكون الكود كما يلي:

A=torch.tensor([[1.,2.],[3.,4.]])b=torch.tensor([[3.,4.], [5.,6], [7.,8.]])res = []for i in range(b.shape[0]):    res.append(torch.matmul(A, b[i]))

2. بعد محاولة torch.matmul (A.repeat ((2,1,1)) ، b) لا يعمل.

  حل:
يمكن تحقيق ذلك باستخدام a.matmul(bt()).
عنوان البريد الأصلي:https://discuss.pytorch.org/t/vectorize-matrix-vector-multiplication/88051


سيستمر هذا الحساب الرسمي في تحديث أحدث معلومات PyTorch ومهارات التطوير، مرحبًا بك للمتابعة!