1. نظرة عامة
سوف تتعلم في هذا التمرين المعملي كيفية تجميع طبقة التفافية في نموذج شبكة عصبية يمكنه التعرف على الأزهار. هذه المرة، ستُنشئ النموذج بنفسك من الصفر وستستخدِم قدرة وحدات TPU لتدريبه في ثوانٍ وتحسين تصميمه.
يشتمل هذا التمرين المعملي على التفسيرات النظرية اللازمة عن الشبكات العصبية الالتفافية، وهو يمثل نقطة انطلاق جيدة للمطورين الذين يتعلمون عن التعلم المتعمق.
هذا التمرين هو الجزء الثالث من سلسلة "Keras on TPU". يمكنك القيام بها بالترتيب التالي أو بشكل مستقل.
- مسارات بيانات بسرعة وحدة معالجة TPU: tf.data.Dataset وTFRecords
- أول نموذج Keras باستخدام ميزة التعلّم بالاستناد إلى نماذج سابقة
- [THIS LAB] الشبكات العصبونية الالتفافية مع Keras ووحدات معالجة الموتّرات
- شبكات convnet الحديثة وSqueezeNet وXception مع Keras ووحدات TPU
المُعطيات
- لإنشاء مصنف للصور الالتفافية باستخدام نموذج Keras التسلسلي.
- لتدريب نموذج Keras على TPU
- لضبط نموذجك باستخدام مجموعة جيدة من الطبقات الالتفافية.
الملاحظات
إذا لاحظت أي أخطاء في التمرين المعملي الخاص بالرموز، يُرجى إخبارنا بذلك. يمكن تقديم الملاحظات من خلال مشاكل GitHub [ رابط الملاحظات].
2. البدء السريع لاستخدام Google Colaboratory
يستخدم هذا المختبر Google Collaboratory ولا يتطلّب أي إعداد من جانبك. Colaboratory هي منصة لأوراق الملاحظات على الإنترنت مخصَّصة لأغراض التعليم. وهو يوفر تدريبًا مجانيًا على استخدام وحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات ووحدة معالجة الموتّرات.
يمكنك فتح نموذج دفتر ملاحظات هذا والاطّلاع على بضع خلايا للتعرّف على Colaboratory.
اختيار إحدى خلفيات وحدة معالجة الموتّرات
في قائمة Colab، اختَر "بيئة التشغيل" > "تغيير نوع بيئة التشغيل"، ثم اختَر "وحدة معالجة الموتّرات". سوف تستخدم في هذا التمرين المعملي وحدة معالجة بيانات (TPU) قوية للتدريب الذي يتم تسريعه باستخدام الأجهزة. سيتم الاتصال بوقت التشغيل تلقائيًا عند التنفيذ الأول، أو يمكنك استخدام الزر "ربط" في أعلى يسار الصفحة.
تنفيذ "دفتر ملاحظات Google"
يمكنك تنفيذ الخلايا واحدة تلو الأخرى من خلال النقر على خلية واستخدام Shift-ENTER. يمكنك أيضًا تشغيل دفتر الملاحظات بالكامل باستخدام بيئة التشغيل > تشغيل الكل.
جدول المحتويات
تحتوي جميع دفاتر الملاحظات على جدول محتويات. يمكنك فتحها باستخدام السهم الأسود على يمين الصفحة.
الخلايا المخفية
لن تعرض بعض الخلايا إلا عناوينها. هذه ميزة خاصة بأوراق ملاحظات Colab. يمكنك النقر مرّتين عليها للاطّلاع على الرمز البرمجي الوارد فيها، ولكنّه لا يكون مثيرًا للاهتمام في العادة. عادةً ما تكون دوال الدعم أو التصورات. لا يزال عليك تشغيل هذه الخلايا لتحديد الدوالّ داخلها.
المصادقة
يمكن لمنصة Colab الوصول إلى حِزمك الخاصة في Google Cloud Storage شرط أن تتم المصادقة باستخدام حساب مفوَّض. سيؤدي مقتطف الرمز أعلاه إلى بدء عملية مصادقة.
3- [معلومات] ما هي وحدات معالجة الموتّرات (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 بمعالج رسومات كلاسيكي ووحدة مخصّصة لضرب المصفوفات، وهي تُحقّق أداءً ممتازًا في أي مهمة تُستخدم فيها عمليات ضرب المصفوفات الكبيرة، مثل الشبكات العصبية.
صورة توضيحية: طبقة شبكة عصبية كثيفة كضرب مصفوفة، مع معالجة مجموعة من ثماني صور من خلال الشبكة العصبونية في وقت واحد يرجى تنفيذ عملية ضرب العمود في سطر واحد للتأكد من أنها تُخرِج مجموع ترجيح لجميع قيم وحدات البكسل في الصورة. يمكن أيضًا تمثيل الطبقات التجميعية على أنّها عمليات ضرب مصفوفات، على الرغم من أنّها أكثر تعقيدًا قليلاً (الشرح هنا في القسم 1).
الأجهزة
MXU وVPU
يتكوّن الإصدار الثاني من وحدة معالجة الموتّرات من وحدة مصفوفة مصفوفة (MXU) تعمل على تنفيذ عمليات ضرب المصفوفة ووحدة معالجة المتّجهات (VPU) لجميع المهام الأخرى مثل عمليات التفعيل وsoftmax وغير ذلك. ويعالج VPU العمليات الحسابية float32 وint32. من ناحية أخرى، يعمل MXU بتنسيق نقطة عائمة بدقة مختلطة تتراوح بين 16 و32 بت.
نقطة عائمة بدقة مختلطة وbfloat16
تُحسِّب وحدة MXU عمليات ضرب المصفوفات باستخدام مدخلات bfloat16 ومخرجات float32. ويتم تنفيذ التراكمات المتوسطة بدقة float32.
عادةً ما يكون تدريب الشبكات العصبية مقاومًا للضوضاء الناتجة عن انخفاض دقة النقطة العائمة. وهناك حالات تساعد فيها الضوضاء المحسّن على التقارب. كان يتم استخدام الدقة بنقطة عائمة 16 بت بشكل تقليدي لتسريع العمليات الحسابية، ولكنّ تنسيقَي float16 وfloat32 لهما نطاقات مختلفة جدًا. يؤدي عادةً تقليل الدقة من float32 إلى float16 إلى حدوث عمليات تجاوز حدود الحد الأدنى والحد الأقصى. تتوفّر حلول، ولكن عادةً ما يلزم إجراء عمل إضافي لاستخدام float16.
لهذا السبب، طرحت Google تنسيق bfloat16 في وحدات TPU. وbfloat16 هو تنسيق float32 مقطوع يتضمّن القيمة نفسها تمامًا لبتّي الأس والفاصل كما في float32. بالإضافة إلى ذلك، تُحسِّن وحدات TPU عمليات ضرب المصفوفات بدقة مختلطة باستخدام مدخلات 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، فقد يتطلب ذلك توفر "نواة" قيمتها 128x128=16K، وهو أمر لا يكون ممكنًا عادةً. تحتوي أكبر وحدات معالجة الرسومات على 4,000 نواة تقريبًا. من ناحية أخرى، تستخدم وحدات TPU الحد الأدنى من الأجهزة لوحدات الحوسبة في وحدة MXU: ما مِن شيء آخر سوى bfloat16 x bfloat16 => float32
وحدات تجميع الضرب. هذه العمليات صغيرة جدًا لدرجة أنّ وحدة TPU يمكنها تنفيذ 16 ألف عملية منها في وحدة MXU بحجم 128x128 ومعالجة عملية ضرب المصفوفات هذه دفعة واحدة.
صورة توضيحية: صفيفة MXU الانقباضية. عناصر الحوسبة هي مراكمات الضربات. يتم تحميل قيم مصفوفة واحدة في الصفيف (النقاط الحمراء). تتدفق قيم المصفوفة الأخرى من خلال الصفيف (نقاط رمادية). تنشر الخطوط العمودية القيم لأعلى. تنشر الخطوط الأفقية المجاميع الجزئية. نترك للمستخدم تمرينًا للتأكّد من أنّه عندما تتدفق البيانات عبر الصفيف، ستحصل على نتيجة ضرب المصفوفة من الجانب الأيمن.
بالإضافة إلى ذلك، أثناء احتساب الجداء النقطي في وحدة MXU، يتم ببساطة نقل القيم المتوسطة بين وحدات الحساب المجاورة. لا حاجة إلى تخزينها واستردادها إلى/من الذاكرة أو حتى ملف السجلّ. والنتيجة النهائية هي أنّ بنية صفيف وحدات معالجة الموتّرات تتمتع بكثافة وقوة كبيرة، بالإضافة إلى سرعة لا يمكن تجاهلها مقارنةً بوحدة معالجة الرسومات عند احتساب عمليات ضرب المصفوفات.
وحدة معالجة الموتّرات في السحابة الإلكترونية
عند طلب "Cloud TPU v2" واحدًا على Google Cloud Platform، ستحصل على جهاز افتراضي (VM) يحتوي على لوحة TPU مرفقة بمنفذ PCI. تحتوي لوحة TPU على أربع شرائح TPU ثنائية النواة. يتميز كل نواة من وحدات معالجة الموتّرات بوحدة معالجة المتجهات (VPU) وبحجم 128×128 MXU (وحدة ضرب MatriX). بعد ذلك، يتم عادةً ربط "وحدة TPU في السحابة الإلكترونية" هذه من خلال الشبكة بالجهاز الافتراضي الذي طلبها. وبالتالي، تبدو الصورة الكاملة على النحو التالي:
رسم توضيحي: جهازك الظاهري مع مسرع "Cloud TPU" المرتبط بالشبكة تتكون "وحدة معالجة الموتّرات في Cloud" نفسها من جهاز افتراضي مزوّد بلوحة TPU متصلة بمنفذ PCI وتحتوي على أربع شرائح TPU ثنائية النواة.
مجموعات وحدات TPU
يتم ربط وحدات معالجة الموتّرات في مراكز بيانات Google بشبكة حوسبة عالية الأداء (HPC) يمكن أن تجعلها تظهر كمسرّع كبير جدًا. وتُطلق Google على هذه المجموعات اسم "الوحدات"، ويمكن أن تتضمّن ما يصل إلى 512 نواة من TPU v2 أو 2048 نواة من TPU v3.
صورة توضيحية: مجموعة TPU v3 يتم توصيل لوحات ورفوف وحدة معالجة الموتّرات من خلال وصلة HPC.
أثناء التدريب، يتم تبادل التدرجات بين نوى وحدة معالجة الموتّرات باستخدام الخوارزمية الخافتة ( شرح جيد لاستنتاج كل الخوارزمية هنا). يمكن للنموذج الذي يتم تدريبه الاستفادة من الأجهزة من خلال التدريب على مجموعات كبيرة من البيانات.
صورة توضيحية: مزامنة التدرجات أثناء التدريب باستخدام خوارزمية التقليل على مستوى شبكة HPC ثنائية الأبعاد (TPU) الخاصة بالطاقة الحلقية المتشابكة (TPU) من Google.
البرامج
تدريب كبير الحجم
يبلغ حجم الدُفعة المثالي لوحدات معالجة الموتّرات ما يصل إلى 128 عنصر بيانات لكل وحدة معالجة مركزية (TPU) أساسية، ولكن يمكن أن تُظهر الأجهزة استخدامًا جيدًا من 8 عناصر بيانات لكل وحدة معالجة معالجة مركزية (TPU). تذكَّر أنّ وحدة معالجة الموتّرات في السحابة الإلكترونية تضمّ 8 أنوية.
في هذا الدرس التطبيقي حول الرموز البرمجية، سنستخدم واجهة برمجة التطبيقات Keras API. في Keras، يكون الحِزمة التي تحدّدها هي حجم الحِزمة العام لوحدة TPU بأكملها. وسيتم تقسيم دُفعاتك تلقائيًا إلى 8 نوى وتشغيلها على 8 نوى لوحدة معالجة الموتّرات.
للحصول على نصائح إضافية بشأن الأداء، يمكنك الاطّلاع على دليل أداء TPU. بالنسبة إلى أحجام الدفعات الكبيرة جدًا، قد تكون هناك حاجة إلى عناية خاصة في بعض النماذج. اطّلِع على LARSOptimizer لمزيد من التفاصيل.
مزيد من المعلومات: XLA
تحدد برامج Tensorflow الرسوم البيانية الحسابية. لا تُشغِّل وحدة معالجة الموتّرات رمز Python مباشرةً، بل تشغِّل الرسم البياني الحسابي المحدّد في برنامج Tensorflow. في الخيارات المتقدمة، يعمل المحول البرمجي المسمى XLA (محول الجبر الخطي المسرّع) على تحويل الرسم البياني TensorFlow لعقد العملية الحاسوبية إلى رمز وحدة معالجة الموتّرات. يُجري هذا المُجمِّع أيضًا العديد من التحسينات المتقدّمة على الرمز البرمجي وتنسيق الذاكرة. ويتمّ التحويل تلقائيًا عند إرسال العمل إلى وحدة معالجة الموتّرات. لست بحاجة إلى تضمين XLA في سلسلة الإنشاء بشكل صريح.
مخطّط بياني: للتشغيل على TPU، يتم أولاً ترجمة الرسم البياني الحسابي الذي يحدّده برنامج Tensorflow إلى تمثيل XLA (مجمّع الجبر الخطي المُسرَّع)، ثم يتم تجميعه بواسطة XLA إلى رمز آلي لوحدة TPU.
استخدام وحدات معالجة الموتّرات في Keras
تتوفّر وحدات معالجة الموتّرات من خلال واجهة برمجة التطبيقات Keras اعتبارًا من الإصدار 2.1 من Tensorflow. يعمل دعم Keras على وحدات معالجة الموتّرات ومجموعات وحدات معالجة الموتّرات. في ما يلي مثال يعمل مع وحدات معالجة الموتّرات ووحدات معالجة الرسومات ووحدة المعالجة المركزية(CPU):
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 (مهام "منصّة الذكاء الاصطناعي" وCollaboratory وKubeflow وأجهزة افتراضية لتعلم الآلة تم إنشاؤها من خلال الأداة "ctpu up"). وتعرف هذه الأنظمة مكان وحدة TPU بفضل متغيّر البيئة TPU_NAME. في حال إنشاء وحدة TPU يدويًا، يمكنك ضبط متغيّر البيئة TPU_NAME على الجهاز الظاهري الذي تستخدمه، أو استدعاءTPUClusterResolver
باستخدام مَعلمات صريحة:TPUClusterResolver(tp_uname, zone, project)
TPUStrategy
هو الجزء الذي ينفذ توزيع الخوارزمية و"تجميع كل القيم" لمزامنة التدرّج.- يتم تطبيق الإستراتيجية من خلال نطاق. يجب تحديد النموذج ضمن نطاق الاستراتيجية().
- تتوقع الدالة
tpu_model.fit
وجود عنصر tf.data.Dataset لإدخال تدريب وحدة معالجة الموتّرات.
المهام الشائعة لنقل بيانات وحدة معالجة الموتّرات
- في حين أنّ هناك العديد من الطرق لتحميل البيانات في نموذج Tensorflow، إلا أنّه يجب استخدام واجهة برمجة التطبيقات
tf.data.Dataset
API بالنسبة إلى وحدات معالجة الموتّرات. - وحدات TPU سريعة جدًا، وغالبًا ما تصبح عملية نقل البيانات هي النقطة التي تبطئ الأداء عند تشغيلها. هناك أدوات يمكنك استخدامها لرصد نقاط الاختناق في البيانات ونصائح أخرى حول الأداء في دليل أداء وحدات معالجة النطاق الفائق (TPU).
- يتم التعامل مع أرقام int8 أو int16 على أنها int32. لا تشتمل وحدة معالجة الموتّرات على أجهزة صحيحة تعمل على أقل من 32 بت.
- بعض عمليات TensorFlow غير متاحة. القائمة هنا. والخبر السار هو أنّ هذا القيد لا ينطبق إلا على رمز التدريب، أي المرور إلى الأمام والخلف من خلال النموذج. سيظل بإمكانك استخدام جميع عمليات Tensorflow في مسار إدخال البيانات لأنّه سيتم تنفيذها على وحدة المعالجة المركزية.
- لا يمكن استخدام
tf.py_func
مع وحدة معالجة الموتّرات.
4. [معلومات] مصنِّف الشبكة العصبونية 101
باختصار
إذا كانت جميع المصطلحات الغامقة في الفقرة التالية معروفة لك بالفعل، يمكنك الانتقال إلى التمرين التالي. إذا كنت قد بدأت للتو في مجال التعلّم العميق، نرحّب بك وننصحك بمواصلة القراءة.
بالنسبة إلى النماذج التي تم إنشاؤها كتسلسل من الطبقات، يوفّر 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, ... )
الشبكة العصبية المكثفة
وهذه هي أبسط شبكة عصبية لتصنيف الصور. فهي تتكون من "الخلايا العصبية" مرتبة في طبقات. تعالج الطبقة الأولى بيانات الإدخال وتغذّي نواتجها في الطبقات الأخرى. ويُطلق عليها اسم "الكثيفة" لأنّ كل خلية عصبية متصلة بجميع الخلايا العصبية في الطبقة السابقة.
يمكنك إدخال صورة إلى مثل هذه الشبكة عن طريق تسوية قيم النموذج اللوني أحمر أخضر أزرق (RGB) لكل وحدات البكسل في خط متجه طويل واستخدامها كمدخلات. وهذا ليس أفضل أسلوب للتعرف على الصور ولكننا سنعمل على تحسينه لاحقًا.
الخلايا العصبية وعمليات التفعيل وخوارزمية RELU
يحسب "العصبون" مجموعًا مرجحًا لجميع مدخلاته، ويضيف قيمة تُعرف باسم "الميل" ويغذّي النتيجة من خلال ما يُعرف باسم "دالة التفعيل". القيم التقديرية والتحيز غير معروفة في البداية. وسيتمّ إعدادها عشوائيًا و"تعلمها" من خلال تدريب الشبكة العصبية على الكثير من البيانات المعروفة.
تسمى دالة التفعيل الأكثر شيوعًا RELU للوحدة الخطية المصححة. إنها دالة بسيطة للغاية كما ترون في الرسم البياني أعلاه.
تفعيل Softmax
تنتهي الشبكة أعلاه بطبقة مكونة من 5 خلايا عصبية لأننا نصنف الزهور إلى 5 فئات (وردة، توليب، الهندباء، أقحوان، دوار الشمس). يتم تنشيط الخلايا العصبية في الطبقات المتوسطة باستخدام وظيفة تفعيل RELU الكلاسيكية. على الرغم من ذلك، في الطبقة الأخيرة، نريد حساب الأعداد بين 0 و1 التي تمثّل احتمالية أن تكون هذه الزهرة وردة وزهرة توليب وما إلى ذلك. لهذا الغرض، سنستخدم وظيفة تنشيط تُعرف باسم "softmax".
يتم تطبيق softmax على متجه من خلال أخذ الأس لكل عنصر ثم تسوية الخط المتجه، عادةً باستخدام المعيار L1 (مجموع القيم المطلقة) بحيث تضيف القيم ما يصل إلى 1 ويمكن تفسيرها على أنها احتمالات.
الخسارة العابرة للإنتروبيا
الآن بعد أن أصبحت شبكتنا العصبية تُقدّم توقّعات من الصور المُدخلة، نحتاج إلى قياس مدى دقتها، أي المسافة بين ما تُخبرنا به الشبكة والإجابات الصحيحة، والتي غالبًا ما تُسمى "التصنيفات". تذكَّر أنّ لدينا تصنيفات صحيحة لجميع الصور في مجموعة البيانات.
يمكن استخدام أيّ مسافة، ولكن بالنسبة إلى مشاكل التصنيف، فإنّ ما يُعرف باسم "مسافة التشويش المتداخل" هي الأكثر فعالية. سنسمي هذا دالة الخطأ أو "loss":
انحدار التدرج
"تدريب" الشبكة العصبية تعني في الواقع استخدام صور التدريب والتصنيفات لضبط الأوزان والتحيزات من أجل تقليل وظيفة فقدان بين القصور. إليك طريقة عملها.
إنّ قياس الاتّحاد التبادلي هو دالة للقيم المرجحة والانحيازات ووحدات البكسل في صورة التدريب وفئتها المعروفة.
إذا احتسبنا المشتقات الجزئية للانتروبيا المتقاطعة بالنسبة إلى جميع الأوزان وجميع الانحيازات، نحصل على "تدرّج" يتم احتسابه لصورة وعلامة وقيمة حالية معيّنة للأوزان والانحيازات. تذكَّر أنّه يمكن أن يكون لدينا ملايين الأوزان والانحيازات، لذا يبدو أنّ احتساب التدرّج هو عمل شاق. لحسن الحظ، تُجري Tensorflow ذلك نيابةً عنا. السمة الحسابية للتدرّج هي أنّه يشير "إلى أعلى". وبما أننا نريد أن نتجه إلى حيث يكون القصور المشترك منخفضًا، فإننا نسير في الاتجاه المعاكس. نعدّل معاملات الترجيح والانحيازات بجزء من التدرّج. بعد ذلك، نكرّر الإجراء نفسه مرارًا وتكرارًا باستخدام الدفعات التالية من الصور والعلامات التدريبية في حلقة تدريب. نأمل أن يؤدي ذلك إلى تقارب في مكان يكون فيه التشويش المتبادل أدنى حدّ، على الرغم من أنّه ما مِن ما يضمن أنّ هذا الحدّ الأدنى فريد.
استخدام دفعات صغيرة والزخمه
يمكنك احتساب التدرّج على صورة مثالية واحدة فقط وتعديل الأوزان والانحيازات على الفور، ولكن إجراء ذلك على مجموعة من 128 صورة مثلاً يعطي تدرجًا يمثّل بشكل أفضل القيود المفروضة من خلال أمثلة الصور المختلفة، وبالتالي من المرجّح أن يتقارب نحو الحلّ بشكل أسرع. حجم الدفعة الصغيرة هو معلمة قابلة للتعديل.
لهذه التقنية، التي تُسمّى أحيانًا "انحدار التدرج العشوائي"، فائدة أخرى أكثر واقعية: فالعمل على الدُفعات يعني أيضًا استخدام مصفوفات أكبر حجمًا، وعادةً ما يكون تحسين هذه المصفوفات أسهل في ما يتعلّق بوحدات معالجة الرسومات ووحدات معالجة الموتّرات.
بالرغم من ذلك، يمكن أن يكون التقارب فوضويًا بعض الشيء، ويمكن أن يتوقف حتى إذا كان خط متجه التدرج يحتوي على جميع الأصفار. هل هذا يعني أننا وجدنا الحد الأدنى؟ ليس دائمًا. يمكن أن يكون مكوّن التدرّج صفريًا عند الحدّ الأدنى أو الحدّ الأقصى. في حال كان متجه التدرج يتضمّن ملايين العناصر، وإذا كانت جميعها صفرية، تكون احتمالية أن يتوافق كل صفر مع الحد الأدنى وعدم توافق أي منها مع الحد الأقصى منخفضة جدًا. في عالم متعدد الأبعاد، تعتبر نقاط السرج شائعة جدًا ولا نريد التوقف عندها.
رسم توضيحي: نقطة سرج التدرج هو 0 ولكنه ليس حدًا أدنى في جميع الاتجاهات. (إسناد الصور Wikimedia: من Nicoguaro - عملك الخاص، CC BY 3.0)
الحل هو إضافة بعض الزخم إلى خوارزمية التحسين بحيث يمكنها تجاوز نقاط سجِل دون توقف.
مسرد المصطلحات
الدفعة أو الدفعة الصغيرة: يتم تنفيذ التدريب دائمًا على دفعات من بيانات التدريب والعلامات. ويساعد ذلك في تقارب الخوارزمية. عادةً ما يكون بُعد "الدُفعة" هو البعد الأول لمتسابقات البيانات. على سبيل المثال، يحتوي مصفوفة ذات الشكل [100، 192، 192، 3] على 100 صورة بحجم 192×192 بكسل مع ثلاث قيم لكل بكسل (أحمر وأخضر وأزرق).
خسارة الإنتروبيا: دالة خسارة خاصة غالبًا ما تُستخدم في المصنِّفات.
الطبقة الكثيفة: طبقة من الخلايا العصبية التي تتصل فيها كل خلية عصبية بجميع الخلايا العصبية في الطبقة السابقة.
الميزات: يُطلق على مدخلات الشبكة العصبية أحيانًا اسم "الميزات". يُطلق على فن تحديد أجزاء مجموعة البيانات (أو مجموعات الأجزاء) التي يجب تقديمها إلى شبكة عصبية للحصول على توقّعات جيدة اسم "هندسة الميزات".
labels: اسم آخر لكلمة "الفئات" أو الإجابات الصحيحة في مشكلة تصنيف خاضعة للإشراف
معدّل التعلّم: هو جزء من التدرّج الذي يتم من خلاله تعديل الأوزان والانحيازات في كل تكرار من حلقة التدريب.
مقاييس تسجيل الدخول: تُعرف "مقاييس تسجيل الدخول" باسم "مقاييس تسجيل الدخول"، وهي ناتج طبقة من الخلايا العصبية قبل تطبيق وظيفة التفعيل. نشأ هذا المصطلح من "الدالة اللوجستية"، والتي تُعرف أيضًا باسم "الدالة السينية"، والتي كانت في السابق وظيفة التفعيل الأكثر رواجًا. تم اختصار "مخرجات الخلايا العصبية قبل الدالة اللوجستية" إلى "مقاييس الاحتمالية".
الخسارة: دالة الخطأ التي تقارن مخرجات الشبكة العصبونية بالإجابات الصحيحة
الخلية العصبية: تُحسِّب الخلايا العصبية مجموعًا مرجحًا لمدخلاتها، وتضيف تحيزًا وتغذّي النتيجة من خلال دالة تنشيط.
التشفير الثنائي: يتم ترميز الصف 3 من أصل 5 صفوف كخطّ متجه من 5 عناصر، وتكون جميعها أصفارًا باستثناء العنصر الثالث الذي يكون 1.
relu: وحدة خطية مُصحَّحة دالة تنشيط شائعة للخلايا العصبية.
sigmoid: دالة تفعيل أخرى كانت شائعة ولا تزال مفيدة في حالات خاصة.
softmax: دالة تفعيل خاصة تعمل على خط متّجه وتزيد من الفرق بين المكوِّن الأكبر وجميع العناصر الأخرى، وتعمل أيضًا على ضبط الخط المتجه ليصبح مجموعه 1 بحيث يمكن تفسيره على أنه متّجه للاحتمالات. تُستخدم كخطوة أخيرة في المصنِّفات.
tensor: يشبه "AdSense" المصفوفة ولكن بعدد عشوائي من الأبعاد. المتسلل أحادي البعد هو متجه. إنّ مصفوفة ثنائية الأبعاد هي مصفوفة. وبعد ذلك، يمكنك الحصول على مصفوفات ذات 3 أو 4 أو 5 سمات أو أكثر.
5- [معلومات جديدة] الشبكات العصبية الالتفافية
باختصار
إذا كانت جميع المصطلحات الغامقة في الفقرة التالية معروفة لك بالفعل، يمكنك الانتقال إلى التمرين التالي. إذا كنت من المبتدئين في استخدام الشبكات العصبية الالتفافية، فيُرجى مواصلة القراءة.
صورة توضيحية: فلترة صورة باستخدام فلترَين متتاليَين يتألف كلٌّ منهما من 4x4x3=48 ترجيحات قابلة للتعلُّم
في ما يلي شكل شبكة عصبية تفافية بسيطة في 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'])
أساسيات الشبكات العصبية التفافِية
في إحدى طبقات الشبكة التفافية، يُجري "العصبون" عملية جمع مرجحة للبكسل فوقه مباشرةً، على مستوى منطقة صغيرة من الصورة فقط. فهي تضيف تحيزًا وتغذي المجموع من خلال دالة تنشيط، تمامًا كما تفعل الخلية العصبية في طبقة كثيفة منتظمة. ثم تتكرر هذه العملية على مستوى الصورة بأكملها باستخدام الأوزان نفسها. تذكر أنه في الطبقات الكثيفة، لكل خلية عصبية أوزانها الخاصة. في هذه الحالة، يتم تمرير "مجموعة واحدة" من الأوزان على الصورة في كلا الاتجاهين (عملية "التفاف"). يحتوي الناتج على عدد القيم نفسه لعدد البكسل في الصورة (مع ضرورة إضافة بعض الحشو على الحواف). وهي عملية فلترة باستخدام فلتر من الأوزان 4x4x3=48.
ومع ذلك، لن تكون 48 وزنًا كافية. لإضافة المزيد من درجات الحرية، نكرر العملية نفسها مع مجموعة جديدة من الترجيح. وينتج عن ذلك مجموعة جديدة من مخرجات الفلاتر. لنسمّيها "قناة" للمخرجات من خلال المقارنة بقنوات R وG وB في صورة الإدخال.
يمكن تلخيص مجموعتي الترجيح (أو أكثر) في صورة متوتر واحد بإضافة بُعد جديد. يعطينا هذا الشكل العام لموتر الأوزان لطبقة التفافية. بما أن عدد قنوات الإدخال والإخراج هو معامل، يمكننا البدء في تكديس وتسلسل الطبقات الالتفافية.
رسم توضيحي: تحوّل شبكة عصبية تفافية "مكعبات" البيانات إلى "مكعبات" أخرى من البيانات.
عمليات التفاف ثابتة وأقصى حدّ للتجميع
من خلال إجراء عمليات الدمج مع خطوة تبلغ 2 أو 3، يمكننا أيضًا تصغير مكعب البيانات الناتج في أبعاده الأفقية. هناك طريقتان شائعتان للقيام بذلك:
- التفاف موسّع: فلتر يتم تمريره كما هو موضح أعلاه ولكن بخطوة >1
- الحد الأقصى لتجميع: نافذة منزلقة تقوم بتطبيق عملية MAX (عادةً على التصحيحات 2×2، ويتكرر كل 2 بكسل)
صورة توضيحية: يؤدي تحريك نافذة الحوسبة بمقدار 3 بكسل إلى الحصول على قيم إخراج أقل. إنّ عمليات الدمج المُعدَّلة أو تجميع الحد الأقصى (الحد الأقصى في نافذة 2×2 تنزلق بخطوة 2) هي طريقة لتصغير مكعب البيانات في السمات الأفقية.
مصنِّف ثوري
أخيرًا، نُرفِق قسمًا للتصنيف من خلال تسطيح مكعب البيانات الأخير وإدخاله من خلال طبقة كثيفة مفعَّلة بتقنية softmax. يمكن أن يبدو المصنِّف التدرّبي النموذجي على النحو التالي:
صورة توضيحية: مصنِّف صور يستخدم طبقات التفافية وطبقة softmax. يتم استخدام فلاتر 3×3 و1×1. تأخذ طبقات "التصفية القصوى" الحد الأقصى من مجموعات نقاط البيانات 2×2. يتم تنفيذ قسم التصنيف باستخدام طبقة كثيفة مع تنشيط softmax.
In 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 طبقات.
- استخدِم فلاتر صغيرة. وعادةً ما تكون الفلاتر بحجم 3×3 مناسبة في كل مكان.
- يمكن أيضًا استخدام فلاتر 1×1 وهي رخيصة. ولا يتمّ "فلترة" أيّ محتوى، بل يتمّ احتساب مجموعات قنوات خطية. استبدِلها بفلاتر حقيقية. (يمكنك الاطلاع على مزيد من المعلومات حول "عمليات الالتفاف 1×1" في القسم التالي).
- بالنسبة لمشكلة تصنيف مثل هذه، يتم تقليل العينة بشكل متكرر باستخدام الحد الأقصى لطبقات التجميع (أو الالتفافات بخطوة >1). لا يهمّك مكان الزهرة، بل ما يهمّك هو أنّها وردة أو زهرة قشطة، لذا ليس من المهم فقدان معلومات x وy، كما أنّ فلترة المناطق الأصغر حجمًا أرخص.
- يصبح عدد الفلاتر عادةً مشابهًا لعدد الفئات في نهاية الشبكة (لماذا يمكنك الاطّلاع على خدعة "متوسط التجميع العام" أدناه). في حال التصنيف إلى مئات الفئات، يمكنك زيادة عدد الفلاتر تدريجيًا في الطبقات المتتالية. بالنسبة لمجموعة بيانات الزهور التي تحتوي على 5 فئات، لن تكون التصفية باستخدام 5 عوامل تصفية فقط كافية. يمكنك استخدام عدد الفلاتر نفسه في معظم الطبقات، على سبيل المثال 32 فلترًا، ثم خفضه في النهاية.
- إنّ الطبقات الكثيفة الأخيرة باهظة التكلفة. ويمكن أن يكون لها أوزان أكثر من جميع الطبقات التجميعية مجتمعة. على سب
متوسط التجميع على مستوى العالم
بدلاً من استخدام طبقة كثيفة ومكلفة في نهاية الشبكة العصبية الالتفافية، يمكنك تقسيم "مكعب" البيانات الواردة إلى أي عدد من الأجزاء التي تتوفر فيها فئاتك، ومتوسط قيمها، وتغذية هذه الفئات من خلال دالة تفعيل softmax. لا تتطلّب طريقة إنشاء قسم التصنيف أيّ أوزان. في Keras، الصيغة هي tf.keras.layers.GlobalAveragePooling2D().
الحلّ
ها هو دفتر الحل. يمكنك استخدامه إذا واجهتك مشكلة.
Keras_Flowers_TPU (solution).ipynb
المواضيع التي تناولناها
- 👀 لعبة مليئة بالطبقات الالتفافية
- 🤓 لقد جرّبنا تجميع الحد الأقصى والخطوات و"تجميع المتوسط العام" وما إلى ذلك.
- 😀 إجراء تكرار سريع على نموذج من العالم الواقعي باستخدام وحدات معالجة النطاق الفائق (TPU)
يُرجى تخصيص بعض الوقت لمراجعة قائمة التحقّق هذه.
7- تهانينا!
لقد أنشأت أول شبكة عصبية التفافية حديثة ودرّبتها على دقة أعلى من% 80، وتكرارت بنيةها في دقائق فقط بفضل وحدات معالجة الموتّرات. يُرجى المتابعة إلى التمرين المعملي التالي للتعرف على البنى الالتفافية الحديثة:
- مسارات بيانات بسرعة وحدة معالجة TPU: tf.data.Dataset وTFRecords
- أول نموذج Keras باستخدام ميزة التعلّم بالاستناد إلى نماذج سابقة
- [THIS LAB] الشبكات العصبية التفافِية باستخدام Keras ووحدات معالجة الموتّرات
- حديث ، squeezenet، وXception، مع Keras ووحدات معالجة الموتّرات
استخدام وحدات معالجة الموتّرات عمليًا
تتوفّر وحدات معالجة النصوص ووحدات معالجة الرسومات على منصّة الذكاء الاصطناعي من Google Cloud:
وأخيرًا، نحن نحب الملاحظات. يُرجى إعلامنا إذا لاحظت أي مشكلة في هذا الدرس التطبيقي أو إذا كنت تعتقد أنّه يجب تحسينه. يمكن تقديم الملاحظات من خلال مشاكل GitHub [ رابط الملاحظات].
|