1. نظرة عامة
في هذا التمرين العملي، ستتعرّف على كيفية تجميع الطبقة الالتفافية في نموذج شبكة عصبية يمكنه التعرّف على الزهور. في هذه المرة، ستنشئ النموذج بنفسك من البداية وستستفيد من قوة وحدة معالجة الموتّرات لتدريبه في ثوانٍ وتكرار تصميمه.
يتضمّن هذا المختبر التوضيحات النظرية اللازمة حول الشبكات العصبية الالتفافية، وهو نقطة انطلاق جيدة للمطوّرين الذين يتعلّمون عن التعلّم العميق.
هذا التدريب العملي هو الجزء 3 من سلسلة "Keras على وحدات TPU". يمكنك تنفيذها بالترتيب التالي أو بشكل مستقل.
- خطوط نقل البيانات السريعة المتوافقة مع وحدات TPU: tf.data.Dataset وTFRecords
- أول نموذج Keras باستخدام التعلّم القائم على نقل المهام
- [هذه التجربة العملية] الشبكات العصبونية الالتفافية باستخدام Keras ووحدات معالجة الموتّرات
- الشبكات العصبية الالتفافية الحديثة وSqueezenet وXception باستخدام Keras ووحدات معالجة الموتّرات

أهداف الدورة التعليمية
- لإنشاء مصنِّف صور التفافي باستخدام نموذج Keras التسلسلي
- تدريب نموذج Keras على وحدة معالجة الموتّرات (TPU)
- لضبط النموذج بدقة من خلال اختيار جيد للطبقات الالتفافية
الملاحظات
إذا لاحظت أي خطأ في هذا الدرس العملي، يُرجى إخبارنا بذلك. يمكن تقديم الملاحظات من خلال مشاكل GitHub [ رابط الملاحظات].
2. البدء السريع في Google Colaboratory
يستخدم هذا التمرين المعملي Google Collaboratory ولا يتطلّب أي إعداد من جانبك. Colaboratory هي منصة دفاتر ملاحظات على الإنترنت لأغراض تعليمية. وتوفّر تدريبًا مجانيًا على وحدات المعالجة المركزية ووحدات معالجة الرسومات ووحدات معالجة الموتّرات.

يمكنك فتح دفتر الملاحظات النموذجي هذا وتجربة بعض الخلايا للتعرّف على Colaboratory.
اختيار واجهة خلفية لوحدة معالجة الموتّرات

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

نفِّذ الخلايا واحدة تلو الأخرى من خلال النقر على إحدى الخلايا واستخدام Shift-ENTER. يمكنك أيضًا تشغيل ورقة الملاحظات بأكملها من خلال بيئة التشغيل > تشغيل الكل
جدول المحتويات

تحتوي جميع دفاتر الملاحظات على جدول محتويات. يمكنك فتحها باستخدام السهم الأسود على اليمين.
الخلايا المخفية

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

يمكن أن يصل Colab إلى حِزم Google Cloud Storage الخاصة بك إذا تم إثبات هويتك باستخدام حساب معتمَد. سيؤدي مقتطف الرمز أعلاه إلى بدء عملية مصادقة.
3- [INFO] ما هي وحدات معالجة الموتّرات (TPU)؟
باختصار

في ما يلي الرمز البرمجي لتدريب نموذج على وحدة معالجة الموتّرات في Keras (والرجوع إلى وحدة معالجة الرسومات أو وحدة المعالجة المركزية في حال عدم توفّر وحدة معالجة الموتّرات):
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
سنستخدم وحدات TPU اليوم لإنشاء أداة تصنيف للزهور وتحسينها بسرعات تفاعلية (دقائق لكل عملية تدريب).

لماذا وحدات معالجة الموتّرات؟
يتم تنظيم وحدات معالجة الرسومات الحديثة حول "نوى" قابلة للبرمجة، وهي بنية مرنة للغاية تتيح لها التعامل مع مجموعة متنوعة من المهام، مثل عرض الرسومات الثلاثية الأبعاد والتعليم العميق والمحاكاة الفيزيائية وما إلى ذلك. من ناحية أخرى، تجمع وحدات TPU بين معالج متجهات تقليدي ووحدة ضرب مصفوفات مخصّصة، وتتفوق في أي مهمة تهيمن عليها عمليات ضرب المصفوفات الكبيرة، مثل الشبكات العصبية.

صورة توضيحية: طبقة شبكة عصبونية كثيفة كعملية ضرب مصفوفات، مع معالجة مجموعة من ثماني صور من خلال الشبكة العصبونية في وقت واحد يُرجى إجراء عملية ضرب صف واحد في عمود واحد للتأكّد من أنّها تجري بالفعل عملية جمع مرجّح لكل قيم وحدات البكسل في الصورة. يمكن تمثيل الطبقات الالتفافية كعمليات ضرب مصفوفات أيضًا، على الرغم من أنّها أكثر تعقيدًا ( يمكنك الاطّلاع على الشرح هنا، في القسم 1).
الأجهزة
وحدات MXU وVPU
يتكوّن قلب TPU v2 من وحدة ضرب المصفوفات (MXU) التي تنفّذ عمليات ضرب المصفوفات، ووحدة معالجة المتجهات (VPU) التي تنفّذ جميع المهام الأخرى، مثل عمليات التنشيط وsoftmax وما إلى ذلك. وتتعامل وحدة معالجة المتجهات مع عمليات الحساب float32 وint32. من ناحية أخرى، تعمل وحدة MXU بتنسيق نقطة عائمة مختلطة الدقة 16-32 بت.

الفاصلة العائمة ذات الدقة المختلطة وbfloat16
تحسب وحدة MXU عمليات ضرب المصفوفات باستخدام مدخلات bfloat16 ومخرجات float32. يتم إجراء عمليات التجميع الوسيطة بدقة float32.

عادةً ما يكون تدريب الشبكة العصبونية مقاومًا للتشويش الناتج عن دقة النقطة العائمة المنخفضة. في بعض الحالات، تساعد الضوضاء المحسِّن في التقارب. لقد تم استخدام دقة النقطة العائمة ذات 16 بت تقليديًا لتسريع العمليات الحسابية، ولكن نطاقات تنسيقات float16 وfloat32 مختلفة تمامًا. يؤدي تقليل الدقة من float32 إلى float16 عادةً إلى حدوث تجاوزات ونقص في التدفق. تتوفّر حلول، ولكن عادةً ما يكون من الضروري إجراء عمل إضافي لجعل float16 تعمل.
لهذا السبب، قدّمت Google تنسيق bfloat16 في وحدات TPU. bfloat16 هو float32 مقطوع مع وحدات البت والمدى نفسها تمامًا كما في float32. بالإضافة إلى أنّ وحدات معالجة الموتّرات تحسب عمليات ضرب المصفوفات بدقة مختلطة مع مدخلات bfloat16 ومخرجات float32، يعني ذلك أنّه عادةً لا يلزم إجراء أي تغييرات على الرموز البرمجية للاستفادة من تحسينات الأداء الناتجة عن الدقة المنخفضة.
مصفوفة نبضية
تنفّذ وحدة MXU عمليات ضرب المصفوفات في الأجهزة باستخدام بنية تُعرف باسم "مصفوفة نبضية" تتدفق فيها عناصر البيانات عبر مصفوفة من وحدات حسابية للأجهزة. (في الطب، يشير مصطلح "انقباضي" إلى تقلّصات القلب وتدفّق الدم، ويشير هنا إلى تدفّق البيانات).
العنصر الأساسي لعملية ضرب المصفوفات هو الضرب النقطي بين صف من إحدى المصفوفتين وعمود من المصفوفة الأخرى (راجِع الرسم التوضيحي في أعلى هذا القسم). بالنسبة إلى عملية ضرب المصفوفات Y=X*W، سيكون أحد عناصر النتيجة كما يلي:
Y[2,0] = X[2,0]*W[0,0] + X[2,1]*W[1,0] + X[2,2]*W[2,0] + ... + X[2,n]*W[n,0]
على وحدة معالجة الرسومات، يمكن برمجة هذا المنتج النقطي في "نواة" وحدة معالجة الرسومات ثم تنفيذه على أكبر عدد ممكن من "النوى" المتاحة بالتوازي لمحاولة احتساب كل قيمة من المصفوفة الناتجة في وقت واحد. إذا كانت المصفوفة الناتجة كبيرة بحجم 128×128، سيتطلّب ذلك توفّر 128×128=16 ألف "نواة"، وهو أمر غير ممكن عادةً. تحتوي أكبر وحدات معالجة الرسومات على حوالي 4,000 نواة. من ناحية أخرى، تستخدم وحدة معالجة الموتّرات الحد الأدنى من الأجهزة لوحدات الحوسبة في MXU: bfloat16 x bfloat16 => float32 وحدات ضرب وتجميع فقط، ولا شيء آخر. وهي صغيرة جدًا لدرجة أنّ وحدة معالجة الموتّرات يمكنها تنفيذ 16 ألفًا منها في وحدة MXU بحجم 128x128 ومعالجة عملية ضرب المصفوفة هذه دفعة واحدة.

صورة توضيحية: مصفوفة MXU المتزامنة عناصر الحوسبة هي وحدات ضرب وتجميع. يتم تحميل قيم إحدى المصفوفتين في الصفيفة (النقاط الحمراء). تنتقل قيم المصفوفة الأخرى عبر المصفوفة (النقاط الرمادية). تنقل الخطوط العمودية القيم إلى الأعلى. تنقل الخطوط الأفقية المجاميع الجزئية. يُترك للمستخدم مهمة التحقّق من أنّه أثناء انتقال البيانات عبر المصفوفة، ستحصل على نتيجة ضرب المصفوفة من الجانب الأيمن.
بالإضافة إلى ذلك، أثناء احتساب الجداءات النقطية في وحدة MXU، تتدفق المجموعات الوسيطة ببساطة بين وحدات الحوسبة المتجاورة. ولا تحتاج إلى تخزينها واسترجاعها من الذاكرة أو حتى من ملف السجلّ. والنتيجة النهائية هي أنّ بنية مصفوفة النبض في وحدة معالجة الموتّرات تتميّز بكثافة عالية وميزة كبيرة في استهلاك الطاقة، بالإضافة إلى ميزة سرعة لا يُستهان بها مقارنةً بوحدة معالجة الرسومات عند حساب عمليات ضرب المصفوفات.
Cloud TPU
عند طلب " وحدة معالجة الموتّرات من Cloud الإصدار الثاني" على Google Cloud Platform، ستحصل على جهاز افتراضي (VM) يحتوي على لوحة وحدة معالجة الموتّرات متصلة بواجهة PCI. تحتوي لوحة TPU على أربع شرائح TPU ثنائية النواة. تتضمّن كل نواة في وحدة معالجة الموتّرات (TPU) وحدة معالجة متجهات (VPU) ووحدة ضرب المصفوفات (MXU) بحجم 128x128. بعد ذلك، يتم عادةً ربط "Cloud TPU" بالجهاز الافتراضي الذي طلبها من خلال الشبكة. إذًا، تبدو الصورة الكاملة على النحو التالي:

صورة توضيحية: جهازك الافتراضي مع أداة تسريع "Cloud TPU" متصلة بالشبكة تتكوّن "وحدة معالجة الموتّرات من Cloud" نفسها من جهاز افتراضي مزوّد بلوحة وحدة معالجة الموتّرات متصلة بواجهة PCI، وتحتوي هذه اللوحة على أربع شرائح وحدة معالجة موتّرات ثنائية النواة.
حِزم وحدات معالجة الموتّرات
في مراكز بيانات Google، يتم ربط وحدات معالجة الموتّرات (TPU) بنظام ربط داخلي للحوسبة العالية الأداء (HPC)، ما يجعلها تبدو وكأنّها مسرّع كبير جدًا. تطلق Google عليها اسم "حزم"، ويمكن أن تشمل ما يصل إلى 512 من أنوية TPU الإصدار 2 أو 2048 من أنوية TPU الإصدار 3.

صورة توضيحية: مجموعة من وحدات TPU v3. لوحات ووحدات TPU متصلة من خلال شبكة ربط بينية للحوسبة عالية الأداء
أثناء التدريب، يتم تبادل التدرجات بين نوى TPU باستخدام خوارزمية all-reduce ( شرح جيد لخوارزمية all-reduce هنا). يمكن للنموذج الذي يتم تدريبه الاستفادة من الأجهزة من خلال التدريب على أحجام دفعات كبيرة.

صورة توضيحية: مزامنة التدرّجات أثناء التدريب باستخدام خوارزمية all-reduce على شبكة الحوسبة العالية الأداء (HPC) ذات الشكل الحلقي الثنائي الأبعاد في وحدات TPU من Google
البرنامج
التدريب باستخدام حجم الدفعة الكبير
حجم الدفعة المثالي لوحدات TPU هو 128 عنصر بيانات لكل نواة TPU، ولكن يمكن أن تُظهر الأجهزة بالفعل استخدامًا جيدًا من 8 عناصر بيانات لكل نواة TPU. تذكَّر أنّ وحدة Cloud TPU واحدة تتضمّن 8 نوى.
في هذا الدرس العملي، سنستخدم Keras API. في Keras، الدفعة التي تحدّدها هي حجم الدفعة العام لوحدة معالجة Tensor Processing Unit بأكملها. سيتم تقسيم الدفعات تلقائيًا إلى 8 أجزاء وتشغيلها على 8 نوى في وحدة معالجة Tensor.

للحصول على نصائح إضافية بشأن الأداء، يُرجى الاطّلاع على دليل أداء وحدات معالجة Tensor. بالنسبة إلى أحجام الدُفعات الكبيرة جدًا، قد يلزم اتّخاذ عناية خاصة في بعض النماذج، راجِع LARSOptimizer لمزيد من التفاصيل.
الخيارات المتقدّمة: XLA
تحدّد برامج Tensorflow الرسومات البيانية للحساب. لا تشغّل وحدة معالجة Tensor رموز Python البرمجية مباشرةً، بل تشغّل الرسم البياني للحساب الذي يحدّده برنامج TensorFlow. في الخلفية، يحوّل برنامج التجميع المسمّى XLA (برنامج تجميع الجبر الخطي المسرَّع) الرسم البياني لعُقد العمليات الحسابية في TensorFlow إلى لغة آلة TPU. يُجري هذا المحوّل البرمجي أيضًا العديد من عمليات التحسين المتقدّمة على الرمز وتصميم الذاكرة. تتم عملية التجميع تلقائيًا عند إرسال العمل إلى وحدة معالجة الموتّرات. ليس عليك تضمين XLA في سلسلة الإصدار بشكلٍ صريح.

توضيح: لتشغيل الرسم البياني للحساب الذي يحدّده برنامج TensorFlow على وحدة معالجة الموتّرات، يتم أولاً تحويله إلى تمثيل XLA (مترجم الجبر الخطي المسرَّع)، ثم يتم تجميعه بواسطة XLA في لغة آلة وحدة معالجة الموتّرات.
استخدام وحدات معالجة الموتّرات في Keras
يمكن استخدام وحدات TPU من خلال Keras API بدءًا من الإصدار 2.1 من TensorFlow. تعمل ميزة التوافق مع Keras على وحدات معالجة الموتّرات (TPU) ومجموعات وحدات معالجة الموتّرات. في ما يلي مثال يعمل على وحدة معالجة الموتّرات ووحدات معالجة الرسومات ووحدة المعالجة المركزية:
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
في مقتطف الرمز هذا:
- يبحث
TPUClusterResolver().connect()عن وحدة معالجة الموتّرات على الشبكة. تعمل هذه الأداة بدون مَعلمات على معظم أنظمة Google Cloud (مهام AI Platform وColaboratory وKubeflow وDeep Learning VMs التي تم إنشاؤها من خلال الأداة المساعدة "ctpu up"). تعرف هذه الأنظمة مكان وحدة معالجة الموتّرات بفضل متغيّر البيئة TPU_NAME. إذا أنشأت وحدة TPU يدويًا، يمكنك إما ضبط متغير البيئة TPU_NAME على الجهاز الافتراضي الذي تستخدمه منه، أو استدعاءTPUClusterResolverباستخدام مَعلمات صريحة:TPUClusterResolver(tp_uname, zone, project) TPUStrategyهو الجزء الذي ينفّذ التوزيع وخوارزمية مزامنة التدرّج "all-reduce".- يتم تطبيق الاستراتيجية من خلال نطاق. يجب تحديد النموذج ضمن نطاق الاستراتيجية()
- تتوقّع الدالة
tpu_model.fitإدخال عنصر tf.data.Dataset للتدريب على وحدات TPU.
مهام تكييف البرامج الشائعة لوحدة معالجة الموتّرات
- على الرغم من توفّر العديد من الطرق لتحميل البيانات في نموذج Tensorflow، إلا أنّه يجب استخدام واجهة برمجة التطبيقات
tf.data.Datasetمع وحدات TPU. - تتميّز وحدات TPU بسرعة عالية، وغالبًا ما يصبح استيعاب البيانات هو نقطة الاختناق عند تشغيلها. تتوفّر أدوات يمكنك استخدامها لرصد الاختناقات في البيانات ونصائح أخرى بشأن الأداء في دليل أداء وحدة معالجة Tensor.
- يتم التعامل مع الأرقام int8 أو int16 على أنّها int32. لا تتضمّن وحدة معالجة الموتّرات وحدة أجهزة للأعداد الصحيحة تعمل على أقل من 32 بت.
- بعض عمليات Tensorflow غير متاحة. يمكنك الاطّلاع على القائمة هنا. والخبر السار هو أنّ هذا القيد ينطبق فقط على رمز التدريب، أي التمرير للأمام والخلف من خلال النموذج. سيظل بإمكانك استخدام جميع عمليات Tensorflow في مسار إدخال البيانات لأنّها سيتم تنفيذها على وحدة المعالجة المركزية.
- لا تتوافق
tf.py_funcمع وحدة معالجة Tensor.
4. [INFO] مقدّمة عن مصنّف الشبكة العصبونية
باختصار
إذا كنت تعرف جميع المصطلحات بالخط العريض في الفقرة التالية، يمكنك الانتقال إلى التمرين التالي. إذا كنت مبتدئًا في مجال التعلّم العميق، أهلاً بك، ويُرجى مواصلة القراءة.
بالنسبة إلى النماذج التي تم إنشاؤها كتسلسل من الطبقات، يوفّر Keras واجهة برمجة التطبيقات Sequential API. على سبيل المثال، يمكن كتابة مصنّف صور يستخدم ثلاث طبقات كثيفة في Keras على النحو التالي:
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
tf.keras.layers.Dense(500, activation="relu"),
tf.keras.layers.Dense(50, activation="relu"),
tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])
# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy']) # % of correct answers
# train the model
model.fit(dataset, ... )

الشبكة العصبونية الكثيفة
هذه هي أبسط شبكة عصبية لتصنيف الصور. وهي تتألف من "خلايا عصبية" مرتبة في طبقات. تعالج الطبقة الأولى بيانات الإدخال وتُدخل مخرجاتها إلى طبقات أخرى. يُطلق عليها اسم "كثيفة" لأنّ كل عصبون مرتبط بجميع العصبونات في الطبقة السابقة.

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

تُعرف دالة التفعيل الأكثر شيوعًا باسم RELU، وهي اختصار لعبارة وحدة خطية مصحَّحة. إنّها دالة بسيطة للغاية كما يمكنك أن ترى في الرسم البياني أعلاه.
دالة التنشيط Softmax
تنتهي الشبكة أعلاه بطبقة من 5 خلايا عصبية لأنّنا نصنّف الزهور إلى 5 فئات (وردة، وتوليب، وأسد الأسنان، وأقحوان، وعباد الشمس). يتم تنشيط الخلايا العصبية في الطبقات الوسيطة باستخدام دالة التنشيط الكلاسيكية RELU. في الطبقة الأخيرة، نريد حساب أرقام بين 0 و1 تمثّل احتمال أن تكون هذه الزهرة وردة أو زنبقًا أو غير ذلك. لذلك، سنستخدم دالة تفعيل تُعرف باسم "softmax".
يتم تطبيق دالة softmax على متّجه من خلال أخذ الأس لكل عنصر ثم تسوية المتّجه، وعادةً ما يتم ذلك باستخدام قاعدة L1 (مجموع القيم المطلقة) بحيث يصل مجموع القيم إلى 1 ويمكن تفسيرها على أنّها احتمالات.

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

النزول المتدرّج
"تدريب" الشبكة العصبونية يعني في الواقع استخدام صور التدريب والتصنيفات لتعديل الأوزان والانحيازات من أجل تقليل دالة فقدان الإنتروبيا المتقاطعة. إليك طريقة عملها.
الإنتروبيا المتقاطعة هي دالة للأوزان والانحيازات ووحدات البكسل في صورة التدريب وفئتها المعروفة.
إذا حسبنا المشتقات الجزئية للإنتروبيا المتقاطعة بالنسبة إلى جميع الأوزان وجميع الانحيازات، نحصل على "تدرّج" يتم حسابه لصورة وتصنيف وقيمة حالية للأوزان والانحيازات. تذكَّر أنّه يمكن أن يكون لدينا ملايين الأوزان والانحيازات، لذا يبدو أنّ حساب التدرّج يتطلّب الكثير من العمل. لحسن الحظ، تتولّى TensorFlow هذه المهمة. الخاصية الرياضية للتدرّج هي أنّه يشير إلى "الأعلى". بما أنّنا نريد الانتقال إلى المكان الذي تكون فيه الإنتروبيا المتداخلة منخفضة، فإنّنا نتّجه في الاتجاه المعاكس. نعدّل معاملات الترجيح والانحياز بجزء من التدرّج. بعد ذلك، نكرّر العملية نفسها مرارًا وتكرارًا باستخدام الدفعات التالية من الصور والتصنيفات التدريبية، وذلك في حلقة تدريبية. نأمل أن يؤدي ذلك إلى تقليل الإنتروبيا المتقاطعة إلى الحدّ الأدنى، مع العلم أنّه لا يوجد ما يضمن أنّ هذا الحدّ الأدنى فريد.

التقسيم إلى دفعات صغيرة والزخم
يمكنك احتساب التدرّج على صورة مثال واحدة فقط وتعديل الأوزان والانحيازات على الفور، ولكنّ إجراء ذلك على مجموعة من 128 صورة مثلاً يعطي تدرّجًا يمثّل القيود التي تفرضها صور الأمثلة المختلفة بشكل أفضل، وبالتالي من المرجّح أن يتقارب مع الحلّ بشكل أسرع. حجم الدفعة الصغيرة هو مَعلمة قابلة للتعديل.
تتميّز هذه التقنية، التي تُعرف أحيانًا باسم "النزول التدرّجي العشوائي"، بميزة عملية أخرى، وهي أنّ استخدام مجموعات من البيانات يعني أيضًا استخدام مصفوفات أكبر، ويسهل عادةً تحسينها على وحدات معالجة الرسومات ووحدات معالجة الموتّرات.
ومع ذلك، يمكن أن يكون التقارب فوضويًا بعض الشيء، ويمكن أن يتوقف حتى إذا كان خط متجه التدرج يتضمّن أصفارًا فقط. هل يعني ذلك أنّنا عثرنا على حدّ أدنى؟ ليس دائمًا. يمكن أن يكون مكوّن التدرّج اللوني صفرًا عند الحدّ الأدنى أو الأقصى. مع خط متجه التدرج الذي يحتوي على ملايين العناصر، إذا كانت جميعها أصفارًا، يكون احتمال أن يتوافق كل صفر مع الحد الأدنى وألا يتوافق أي منها مع الحد الأقصى صغيرًا جدًا. في مساحة ذات أبعاد عديدة، تكون نقاط السرج شائعة جدًا ولا نريد التوقف عندها.

صورة توضيحية: نقطة سرج يكون التدرّج اللوني 0، ولكنّه ليس الحدّ الأدنى في جميع الاتجاهات. (معلومات تحديد مصدر الصورة Wikimedia: By Nicoguaro - Own work, CC BY 3.0)
الحلّ هو إضافة بعض الزخم إلى خوارزمية التحسين حتى تتمكّن من تجاوز نقاط السرج بدون توقّف.
مسرد المصطلحات
الدُفعات أو الدُفعات الصغيرة: يتم التدريب دائمًا على دُفعات من بيانات التدريب والتصنيفات. يساعد ذلك الخوارزمية في التوافق. عادةً ما تكون سمة "الحزمة" هي السمة الأولى لموترات البيانات. على سبيل المثال، يحتوي متّجه متعدّد الأبعاد بالشكل [100, 192, 192, 3] على 100 صورة بحجم 192x192 بكسل مع ثلاث قيم لكل بكسل (النموذج اللوني أحمر أخضر أزرق).
فقدان الإنتروبيا المتقاطعة: دالة فقدان خاصة تُستخدم غالبًا في أدوات التصنيف.
الطبقة الكثيفة: هي طبقة من الخلايا العصبية حيث تكون كل خلية عصبية مرتبطة بجميع الخلايا العصبية في الطبقة السابقة.
الميزات: يُطلق على مدخلات الشبكة العصبية أحيانًا اسم "الميزات". يُطلق على فن تحديد أجزاء مجموعة البيانات (أو مجموعات الأجزاء) التي يجب إدخالها إلى شبكة عصبونية للحصول على توقّعات جيدة اسم "هندسة الخصائص".
التصنيفات: اسم آخر "للفئات" أو الإجابات الصحيحة في مشكلة التصنيف الخاضع للإشراف
معدّل التعلّم: جزء من التدرّج يتم من خلاله تعديل الأوزان والانحيازات في كل تكرار من حلقة التدريب.
اللوغاريتمات: تُسمّى نواتج إحدى طبقات الخلايا العصبية قبل تطبيق دالة التنشيط "اللوغاريتمات". يأتي المصطلح من "الدالة اللوجستية" المعروفة أيضًا باسم "الدالة السينية" التي كانت دالة التنشيط الأكثر شيوعًا. تم اختصار "مخرجات الخلايا العصبية قبل الدالة اللوجستية" إلى "اللوغاريتمات".
دالة الخسارة: دالة الخطأ التي تقارن نواتج الشبكة العصبية بالإجابات الصحيحة
الخلية العصبية: تحسب المجموع المرجّح لمدخلاتها، وتضيف تحيّزًا، وتمرّر النتيجة من خلال دالة تنشيط.
الترميز الأحادي: يتم ترميز الفئة 3 من أصل 5 كمتجه من 5 عناصر، وكلها أصفار باستثناء العنصر الثالث الذي تكون قيمته 1.
relu: وحدة خطية مصحَّحة دالّة تفعيل شائعة للعصبونات.
sigmoid: هي دالّة تفعيل أخرى كانت شائعة الاستخدام وما زالت مفيدة في حالات خاصة.
softmax: هي دالّة تفعيل خاصة تعمل على متّجه، وتزيد الفرق بين أكبر عنصر وجميع العناصر الأخرى، كما تعمل على تسوية المتّجه ليكون مجموع عناصره 1، وبالتالي يمكن تفسيره على أنّه متّجه احتمالات. يُستخدَم كخطوة أخيرة في المصنّفات.
الموتر: "الموتر" هو بنية بيانات تشبه المصفوفة ولكن بعدد عشوائي من الأبعاد. المتّجه متعدّد الأبعاد أحادي الأبعاد هو متجه. الموتر الثنائي الأبعاد هو مصفوفة. ويمكنك بعد ذلك الحصول على موترات ذات 3 أو 4 أو 5 أبعاد أو أكثر.
5- [معلومات جديدة] الشبكات العصبونية الالتفافية
باختصار
إذا كنت تعرف جميع المصطلحات بالخط العريض في الفقرة التالية، يمكنك الانتقال إلى التمرين التالي. إذا كنت مبتدئًا في استخدام الشبكات العصبونية الالتفافية، يُرجى مواصلة القراءة.

صورة توضيحية: فلترة صورة باستخدام فلترَين متتاليَين يتألف كل منهما من 48 وزنًا قابلاً للتعلم (4x4x3).
إليك الشكل الذي تبدو عليه شبكة عصبونية التفافية بسيطة في Keras:
model = tf.keras.Sequential([
# input: images of size 192x192x3 pixels (the three stands for RGB channels)
tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu', input_shape=[192, 192, 3]),
tf.keras.layers.Conv2D(kernel_size=3, filters=24, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=12, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=6, padding='same', activation='relu'),
tf.keras.layers.Flatten(),
# classifying into 5 categories
tf.keras.layers.Dense(5, activation='softmax')
])
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy'])

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

يمكن جمع مجموعتَي الأوزان (أو أكثر) في موتر واحد عن طريق إضافة بُعد جديد. يمنحنا هذا الشكل العام لموتر الأوزان في الطبقة الالتفافية. بما أنّ عدد قنوات الإدخال والإخراج هي مَعلمات، يمكننا البدء في ترتيب الطبقات الالتفافية وتجميعها.

صورة توضيحية: تحوّل شبكة عصبية التفافية "مكعبات" البيانات إلى "مكعبات" أخرى من البيانات.
الالتفافات المخطَّطة، تجميع الحد الأقصى
من خلال إجراء عمليات الالتفاف بخطوة 2 أو 3، يمكننا أيضًا تقليل حجم مكعّب البيانات الناتج في أبعاده الأفقية. هناك طريقتان شائعتان لإجراء ذلك:
- الالتفاف بخطوات متقطّعة: فلتر منزلق كما هو موضّح أعلاه ولكن بخطوة >1
- التجميع الأقصى: نافذة منزلقة تطبّق عملية MAX (عادةً على رقع 2x2، يتم تكرارها كل بكسلَين)

توضيح: يؤدي تحريك نافذة الحساب بمقدار 3 وحدات بكسل إلى الحصول على عدد أقل من قيم الإخراج. تُعدّ الالتفافات المخطوة أو التجميع الأقصى (الحد الأقصى في نافذة 2x2 تنزلق بخطوة 2) طريقة لتقليص مكعب البيانات في الأبعاد الأفقية.
المصنّف التلافيفي
أخيرًا، نرفق رأس تصنيف عن طريق تسوية مكعّب البيانات الأخير وتمريره عبر طبقة كثيفة تم تفعيلها باستخدام دالة softmax. يمكن أن يبدو المصنّف التلافيفي النموذجي على النحو التالي:

صورة توضيحية: مصنّف صور يستخدم طبقات التفافية وطبقات softmax يستخدم فلاتر 3x3 و1x1. تأخذ طبقات maxpool الحد الأقصى لمجموعات من نقاط البيانات 2x2. يتم تنفيذ رأس التصنيف باستخدام طبقة كثيفة مع تنشيط softmax.
في Keras
يمكن كتابة حزمة الالتفاف الموضّحة أعلاه في Keras على النحو التالي:
model = tf.keras.Sequential([
# input: images of size 192x192x3 pixels (the three stands for RGB channels)
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu', input_shape=[192, 192, 3]),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=32, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=32, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(pool_size=2),
tf.keras.layers.Conv2D(kernel_size=3, filters=16, padding='same', activation='relu'),
tf.keras.layers.Conv2D(kernel_size=1, filters=8, padding='same', activation='relu'),
tf.keras.layers.Flatten(),
# classifying into 5 categories
tf.keras.layers.Dense(5, activation='softmax')
])
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy'])
6. شبكة عصبية التفافية مخصّصة
التجربة العملية
لننشئ شبكة عصبونية التفافية وندربها من البداية. سيسمح لنا استخدام وحدة معالجة الموتّرات بتكرار العمليات بسرعة كبيرة. يُرجى فتح دفتر الملاحظات التالي وتنفيذ الخلايا (Shift-ENTER) واتّباع التعليمات حيثما ترى التصنيف "مطلوب العمل".
Keras_Flowers_TPU (playground).ipynb
الهدف هو تجاوز دقة نموذج التعلّم القائم على نقل المهام البالغة% 75. كان لهذا النموذج ميزة، إذ تم تدريبه مسبقًا على مجموعة بيانات تضم ملايين الصور، بينما لدينا هنا 3670 صورة فقط. هل يمكنك على الأقل تقديم سعر مماثل؟
معلومات إضافية
كم عدد الطبقات، وما هو حجمها؟
اختيار أحجام الطبقات هو فن أكثر من كونه علمًا. عليك تحقيق التوازن المناسب بين عدد المعلمات (الأوزان والانحيازات) القليل جدًا والكثير جدًا. إذا كان عدد الأوزان قليلاً جدًا، لن تتمكّن الشبكة العصبية من تمثيل تعقيد أشكال الزهور. وإذا كان عددها كبيرًا جدًا، قد يكون النموذج عرضةً لـ "المطابقة بشكل مفرط"، أي التخصّص في الصور التدريبية وعدم القدرة على التعميم. مع توفّر الكثير من المَعلمات، سيستغرق تدريب النموذج وقتًا طويلاً أيضًا. في Keras، تعرض الدالة model.summary() بنية النموذج وعدد مَعلماته:
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 192, 192, 16) 448
_________________________________________________________________
conv2d_1 (Conv2D) (None, 192, 192, 30) 4350
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 96, 96, 30) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 96, 96, 60) 16260
_________________________________________________________________
...
_________________________________________________________________
global_average_pooling2d (Gl (None, 130) 0
_________________________________________________________________
dense (Dense) (None, 90) 11790
_________________________________________________________________
dense_1 (Dense) (None, 5) 455
=================================================================
Total params: 300,033
Trainable params: 300,033
Non-trainable params: 0
_________________________________________________________________
إليك بعض النصائح:
- إنّ وجود طبقات متعددة هو ما يجعل الشبكات العصبية "العميقة" فعّالة. بالنسبة إلى مشكلة التعرّف البسيطة على الزهور هذه، من المنطقي استخدام 5 إلى 10 طبقات.
- استخدام فلاتر صغيرة عادةً ما تكون فلاتر 3x3 مناسبة في كل مكان.
- يمكن أيضًا استخدام فلاتر 1x1 وهي غير مكلفة. وهي لا "تفلتر" أي شيء، بل تحسب التوليفات الخطية للقنوات. يمكنك استخدامها بالتناوب مع الفلاتر الحقيقية. (مزيد من المعلومات عن "الالتفافات 1x1" في القسم التالي)
- بالنسبة إلى مشكلة تصنيف مثل هذه، يجب تقليل عدد العيّنات بشكل متكرّر باستخدام طبقات اختزال الحد الأقصى (أو الالتفافات مع قفزة > 1). لا يهمك مكان وجود الزهرة، بل يهمك فقط ما إذا كانت وردة أو نبتة هندباء، لذا فإنّ فقدان معلومات x وy ليس مهمًا، كما أنّ فلترة المناطق الأصغر حجمًا أقل تكلفة.
- يصبح عدد الفلاتر عادةً مشابهًا لعدد الفئات في نهاية الشبكة (لماذا؟ راجِع خدعة "التجميع المتوسط العام" أدناه). إذا كنت تصنّف إلى مئات الفئات، عليك زيادة عدد الفلاتر تدريجيًا في الطبقات المتتالية. بالنسبة إلى مجموعة بيانات الزهور التي تحتوي على 5 فئات، لن يكون التصفية باستخدام 5 فلاتر فقط كافيًا. يمكنك استخدام عدد الفلاتر نفسه في معظم الطبقات، مثلاً 32، ثم تقليله في النهاية.
- الطبقات الكثيفة النهائية مكلفة. ويمكن أن تحتوي على أوزان أكثر من جميع الطبقات الالتفافية مجتمعة. على سبيل المثال، حتى مع الحصول على ناتج معقول جدًا من مكعّب البيانات الأخير الذي يتضمّن 24×24×10 نقطة بيانات، ستكلّف طبقة كثيفة تتضمّن 100 عصبون 24×24×10×100=576,000 وزنًا. لذا، ننصحك بالتفكير مليًا أو تجربة تجميع المتوسط العام (راجِع ما يلي).
تجميع المتوسط العالمي
بدلاً من استخدام طبقة كثيفة مكلفة في نهاية شبكة عصبية التفافية، يمكنك تقسيم "المكعب" الوارد للبيانات إلى أكبر عدد ممكن من الأجزاء التي تتضمّنها الفئات، ثم حساب متوسط قيمها وإدخالها من خلال دالة تنشيط softmax. لا تتطلّب طريقة إنشاء رأس التصنيف هذه أي أوزان. في Keras، تكون بنية الجملة tf.keras.layers.GlobalAveragePooling2D().

Solution
إليك دفتر ملاحظات الحلّ. يمكنك استخدامها إذا واجهتك مشكلة.
Keras_Flowers_TPU (solution).ipynb
المواضيع التي تناولناها
- 🤔 لعبتُ بطبقات التفافية
- 🤓 جرّبتُ استخدام التجميع الأقصى والخطوات والتجميع المتوسط العام وما إلى ذلك.
- 😀 تكرار سريع لنموذج من العالم الحقيقي على وحدة معالجة الموتّرات
يُرجى تخصيص بعض الوقت لمراجعة قائمة التحقّق هذه في ذهنك.
7. تهانينا!
لقد أنشأت أول شبكة عصبية التفافية حديثة ودربتها لتحقيق دقة تزيد عن% 80، مع تكرار بنيتها في غضون دقائق فقط بفضل وحدات TPU. يُرجى الانتقال إلى التجربة العملية التالية للتعرّف على البُنى الحديثة للشبكات العصبية الالتفافية:
- خطوط نقل البيانات السريعة المتوافقة مع وحدات TPU: tf.data.Dataset وTFRecords
- أول نموذج Keras باستخدام التعلّم القائم على نقل المهام
- [هذه التجربة العملية] الشبكات العصبونية الالتفافية باستخدام Keras ووحدات معالجة الموتّرات
- الشبكات العصبية الالتفافية الحديثة وSqueezenet وXception باستخدام Keras ووحدات معالجة الموتّرات
وحدات معالجة الموتّرات في التطبيقات العملية
تتوفّر وحدات معالجة الموتّرات ووحدات معالجة الرسومات على منصة Cloud AI:
- على أجهزة Deep Learning الافتراضية
- في AI Platform Notebooks
- في وظائف AI Platform Training
أخيرًا، يسرّنا تلقّي ملاحظاتك. يُرجى إعلامنا إذا لاحظت أي خطأ في هذا المختبر أو إذا كنت تعتقد أنّه يجب تحسينه. يمكن تقديم الملاحظات من خلال مشاكل GitHub [ رابط الملاحظات].

|

