كيف يمكن للمرء تبسيط وتسريع حساب الشبكة العصبية الانتشار المباشر؟

مرحبا عزيزي القراء. لقد كتب الكثير وقيل عن الشبكات العصبية ، خاصة حول كيفية تطبيقها ولماذا. علاوة على ذلك ، لا يتم إيلاء قدر كبير من الاهتمام لمسألتين مهمتين: أ) كيفية تبسيط وحساب الشبكة العصبية بسرعة (يتم تحقيق حساب واحد من الأس بواسطة وظائف مكتبة لغات البرمجة ، وعادة ما لا يقل عن 15-20 تعليمات المعالج) ، ب) ماذا ، على الأقل جزئيًا ، لا يساعد منطق الشبكة المبنية - في الواقع ، المصفوفات الضخمة لقيم الأوزان والتشريد التي تم الحصول عليها بعد تدريب الشبكة بطريقة ما في فهم الأنماط التي وجدت هذه الشبكة (تظل مخفية ومهمة تحديدها هي مهمة الصفصاف) نشوئها - أحيانا مهم جدا). سأتحدث عن أحد طرقي في حل هذه المشكلات للشبكات العصبية للتوزيع المباشر العادي ، بينما أحاول الحصول على الحد الأدنى من الرياضيات.

قليلا من الناحية النظرية


شبكة التوزيع المباشر ، من وجهة نظر رياضية ، هي وظيفة كبيرة للغاية ، والتي تشمل قيم مدخلات الشبكة ، ومعاملات الترجيح وتشريد الخلايا العصبية. في كل خلية عصبية للطبقة ، يتم ضرب قيم مدخلات الطبقة (المتجه X) بوزن الخلية العصبية (المتجه) Wi) ، تضيف ما يصل مع إزاحة Bi

si=WiX+Bi


وأدخل وظائف التنشيط A(si)تشكيل مخرجات الخلايا العصبية طبقة.

قد لا تكون وظائف التنشيط بسيطة للغاية ، على سبيل المثال ، تحتوي غالبًا على الأس الأسية (السيني الساني ، الظل الزائدي). إذا نظرت إلى رمز المجمّع الذي يقوم بتنفيذ الأس ، فيمكنك أولاً العثور على العديد من الفحوصات المختلفة التي ليست مطلوبة دائمًا ، وثانياً ، يتم حساب الأس نفسه في عمليتين على الأقل:

exp(v)=2vlog2(e)


لذلك ، إذا أردنا الإسراع في حساب الشبكة ، فإن المهمة الأولى ستكون تبسيط حساب وظيفة التنشيط. يمكنك محاولة التضحية بجودة منخفضة بسبب زيادة السرعة ، واستبدال حساب وظيفة التنشيط الكلاسيكية بحساب دالة أبسط تقريبًا ، والتي (على بيانات الإدخال المتوفرة) تعطي نفس النتائج تقريبًا. بشكل عام ، هذه مشكلة استيفاء كلاسيكية: لدينا مجموعة من القيم تحسب بالوظيفة الأصلية A (s) ، ونختار دالة أبسط تعطي قيمًا متشابهة جدًا. مثل هذه الوظيفة البسيطة (أ) يمكن أن تكون متعددة الحدود عادية ، أو متعددة الحدود ذات قوى سلبية ، أو شيء من هذا القبيل. لقد استخدمت أربعة أنواع من هذه الوظائف:

a(s)=b0+b1s+b2s2+...+bnsn؛
a(s)=b0+b1/s+b2/s2+...+bn/sn؛
a(s)=b0+b1s0،5+b2s1+b3s1،5+...+bns0،5n؛
a(s)=b0+b1/s0،5+b2/s1+b3/s1،5+...+bn/s0،5n؛

لنفترض أنه بالنسبة لكل خلية عصبية تمكنا من استبدال وظيفة التنشيط بوظيفة أبسط قليلاً - يمكن القيام بذلك ، على سبيل المثال ، من خلال تطبيق طريقة المربعات الصغرى. مثل هذا الاستبدال في حد ذاته لن يعطي مكسبًا كبيرًا جدًا. ولكن هنا يمكنك تجربة خدعة أخرى:

  1. اكتب وظيفة تحليلية ضخمة NET (X) محسوبة بواسطة الشبكة ككل ؛
  2. يستعاض عن الوظائف الأصلية A (s) في NET (X) بالوظائف البديلة a (s) التي حصلت عليها ؛
  3. تبسيط NET التي تم الحصول عليها جبريًا (X) (أو بالأحرى ، استخدم بعض الرموز الجاهزة لتبسيط الرموز التعبيرات). هذا ممكن بالفعل (على الأقل ، أسهل بكثير مما كنا سنحاول تبسيط الشبكة مع الوظائف الأصلية ، على سبيل المثال ، مع الأس).

ونتيجة لذلك ، أصبح لدينا شيء أكثر بساطة ، وربما أكثر وضوحًا من الناحية الرياضية - هنا يمكنك بالفعل محاولة فهم نوع الوظيفة التي تنفذها الشبكة.

هذا هو خيار شرح منطق الشبكة المبنية.

المهمة الموصوفة ، بالطبع ، فقط بالكلمات تبدو بسيطة. لاستخدامها في البرامج الخاصة بي ، كنت بحاجة إلى كتابة التعليمات البرمجية الخاصة بي لتبسيط التعبيرات الرمزية. بالإضافة إلى ذلك ، لقد قمت بحل مشكلة أكثر تعقيدًا ، بافتراض أن كل خلية عصبية ذات وظيفة A (s) يمكن أن يكون لها عدة خيارات لوظيفة تنشيط بديلة ak(s)وبالتالي ، فإن المهمة العامة تتلخص أيضًا في سرد ​​الخيارات لهذه الوظائف والتبسيط الرمزي للشبكة لكل خيار من هذا القبيل. هنا ساعد فقط موازاة الحسابات.

يؤدي


النتيجة أسعدتني. قمت بتسريع شبكة ثلاثية الطبقات (بثلاثة مدخلات) من ثماني خلايا عصبية (مع أوزان المدخلات والتشريدات) مع وظائف التنشيط "السيني السيني". كما هو مبين في قياسات الوقت ، كان من الممكن الحصول على ربح بنحو 40 ٪ في الوقت المناسب دون خسارة كبيرة في الجودة.

أنا أوضح. هنا هي بيانات الشبكة المصدر:





وفي الثالثة ، طبقة الإخراج:


إذا تم تحديد المدخلات كـ a و b و c ، فبعد الاستبدال والتبسيط ، تعتبر وظيفة الشبكة NET على النحو التالي:

double a2 = a*a; double b2 = b*b; double c2 = c*c; double a3 = a2*a; double b3 = b2*b; double c3 = c2*c; double z01 = sqrt(-1.6302e-02+7.9324e-01*a+9.65149e-01*b+5.64151e-01*c); double z06 = sqrt(1.583708e+00-8.907654e-01*a-2.844379e-01*a2+1.050942e+00*a3+1.178096e+01*b-1.865618e+00*b*a-3.145465e+00*b*a2-5.777153e+00*b2+3.138123e+00*b2*a-1.043599e+00*b3+1.32778e+00*c+5.849582e-01*c*a-3.440382e+00*c*a2+1.838371e+00*c*b+6.864703e+00*c*b*a-3.42434e+00*c*b2-3.013361e-01*c2+3.754167e+00*c2*a-3.745404e+00*c2*b-1.365524e+00*c3+1.014237e-01*z01); double NET = (-1.477593e+00)/(z06)+1.370237e+00-6.303167e-02*a-1.495051e-03*a2+2.33748e-02*a3+5.558024e-02*b+1.178189e-02*b*a-6.996071e-02*b*a2+1.837937e-02*b2+6.97974e-02*b2*a-2.321149e-02*b3+7.924241e-02*c+3.392287e-03*c*a-7.652018e-02*c*a2-1.214263e-02*c*b+1.526831e-01*c*b*a-7.616337e-02*c*b2-1.915279e-03*c2+8.349931e-02*c2*a-8.33044e-02*c2*b-3.037166e-02*c3+1.949161e-02*z01; 

الفوز - أكرر ، 40 ٪ من الوقت ، دون الكثير من الضرر للجودة. أعتقد أنه يمكن تطبيق هذا النهج في الحالات التي تكون فيها سرعة حساب الشبكة العصبية أمرًا بالغ الأهمية - على سبيل المثال ، إذا تم حسابها بشكل متكرر ، في دورة مزدوجة أو ثلاثية. مثال على مثل هذه المشكلة : الحل العددي لمشكلة الديناميكا الهوائية على الشبكة ، وفي كل نقطة من العقد ، تقوم الشبكة العصبية بحساب بعض التوقعات المفيدة ، على سبيل المثال ، لحساب أكثر دقة اللزوجة المضطربة. ثم لدينا دورة خارجية في الوقت المناسب ، يتم تضمين دورة مزدوجة أو ثلاثية في الإحداثيات ، وهناك بالفعل ، من الداخل ، هناك حساب لشبكة عصبية. في هذه الحالة ، التبسيط أكثر من مناسب ومفيد.

Source: https://habr.com/ru/post/ar442478/


All Articles