Professional Documents
Culture Documents
التعمق في التعلم العميق - ج2 - د علاء طعيمة
التعمق في التعلم العميق - ج2 - د علاء طعيمة
تأليف:
آ ستون زانغ وآخرون
ترجمة:
د .عالء طعيمة
على مدى السنوات القليلة الماضية ،طور فريق من علماء أمازون كتاباً " Dive into Deep
"Learningيكتسب شعبية بين الطالب والمطورين الذين ينجذبون إلى مجال التعلم العميق
المزدهر ،وهو مجموعة فرعية من التعلم اآللي تركز على الشبكات العصبية االصطناعية واسعة
النطاق.
عند انتهائي من قراءه هذا الكتاب ،احببت ان اترجم هذا الكتاب وأشارككم هذه الترجمة الن
هناك عدد من األشياء الرائعة حول هذا الكتاب وأكثر ما يعجبني هو أنه يغطي كل مجاالت التعلم
العميق تقريبًا مثالً للمبتدئين هناك فصول مثل الشبكات العصبية والبيرسيبترون متعدد الطبقات
واالنحدار والتصنيف باإلضافة الى المفاهيم األساسية من الجبر الخطي ،وحساب التفاضل
والتكامل ،واالحتمال الى فصول متقدمة مثل الشبكات العصبية االلتفافية ،CNNتم تضمين
الشبكات العصبية المتكررة RNNوالرؤية الحاسوبية CVومعالجة اللغات الطبيعية NLP
أيضًا.
هذا كتاب تفاعلي مفتوح المصدر مقدميف شكل فريد يدمج النص والرياضيات والكود،
ويدعم اآلن أطر برمجة TensorFlowو PyTorchو ،Apache MXNetوالتي تمت
صياغتها بالكامل من خالل .Jupyter Notebook
يمكن تقسيم الكتاب إلى ثالثة أجزاء تقريبًا ،لقد قمنايف الوقت الحالي بترجمة الجزء األول
والذي يشمل األساسيات والمقدمات والجزء الثاني والذي يشمل التقنيات الحديثة للتعلم العميق
وان شاء اللهيف المستقبل القريب سنقوم بترجمة الجزء الثالث والذي يشمل مواضيع مثل الرؤية
الحاسوبية ومعالجة اللغات الطبيعية.
لقد اخترت كتاب " "Dive into Deep Learningلما رأيته من جودة هذا الكتاب،
وللمنهجية التي اتبعها المؤلفونيف ترتيبه وبساطة شرحه .لقد حاولت قدر المستطاع ان اخرج
بترجمة ذات جودة عالية ،ومع هذا يبقى عمالً بشرياً يحتمل النقص ،فاذا كان لديك أي مالحظات
حول هذا الكتاب ،فال تتردد بمراسلتنا عبر بريدنا االلكتروني . alaa.taima@qu.edu.iq
نأمل ان يساعد هذا الكتاب كل من يريد ان يدخليف مجال التعلم العميق ومساعدة القارئ
العربي على تعلم هذا المجال .اسأل الله التوفيقيف هذا العمل ألثراء المحتوى العربي الذي يفتقر
أشد االفتقار إلى محتوى جيد ورصينيف مجال الذكاء االصطناعي وتعلم االلة والتعلم العميق.
ونرجو لك االستمتاع مع التعلم العميق وال تنسونا من صالح الدعاء.
المحتويات
19 Builders’ Guide 1
مقد
مها
19 الفصل السادس :دليل البنائين Builders’ Guide
حتى اآلن ،قدمنا بعض مفاهيم التعلم اآللي األساسية ،لتكثيف نماذج التعلم العميق كاملة
الوظائف.يف الفصل األخير ،قمنا بتنفيذ كل مكون من مكونات MLPمن البداية وحتى أوضحنا
كيفية االستفادة من واجهات برمجة التطبيقات APIعالية المستوى لطرح نفس النماذج دون
عناء .للوصول إلى هذا الحد بهذه السرعة ،استدعينا المكتبات ،لكننا تخطينا المزيد من التفاصيل
المتقدمة حول كيفية عملها.يف هذا الفصل ،سنقوم بكشف الستارة ،والبحث بشكل أعمقيف
المكونات الرئيسية لحساب التعلم العميق ،وهي بناء النموذج ،model construction
والوصول إلى المعلمات وتهيئتها ،وتصميم الطبقات والكتل المخصصة ،وقراءة النماذج وكتابتها
على القرص ،واالستفادة من وحدات معالجة الرسومات GPUلتحقيق التعجيل الدراماتيكي.
ستنقلك هذه األفكار من مستخدم نهائي end userإلى مستخدم قوي ،power userمما
يمنحك األدوات الالزمة لجني فوائد مكتبة التعلم العميق الناضجة مع االحتفاظ بالمرونةيف تنفيذ
نماذج أكثر تعقيدًا ،بمايف ذلك النماذج التي تخترعها بنفسك!يف حين أن هذا الفصل ال يقدم أي
نماذج أو مجموعات بيانات جديدة ،فإن فصول النمذجة المتقدمة التي تليها تعتمد بشكل كبير
على هذه التقنيات.
الطبقات ( )1تأخذ مجموعة من المدخالت )2( ،تولد مخرجات مقابلة ،و ( )3موصوفة
بمجموعة من المعلمات القابلة للضبط .tunable parametersعندما عملنا من خالل انحدار
،softmaxكانت طبقة واحدة هي نفسها النموذج .ومع ذلك ،حتى عندما قدمنا الحقًا ،MLPs
ال يزال بإمكاننا التفكيريف النموذج على أنه يحتفظ بنفس ال ُبنية األساسية.
ومن المثير لالهتمام ،بالنسبة لـ ،MLPsأن كل من النموذج بأكمله والطبقات المكونة له
تشتركيف هذا الهيكل .يأخذ النموذج بأكمله المدخالت األولية (الميزات) ،ويولد المخرجات
(التنبؤات) ،ويمتلك المعلمات (المعلمات المدمجة من جميع الطبقات المكونة) .وبالمثل ،فإن
كل طبقة فردية تستوعب المدخالت (التي توفرها الطبقة السابقة) تولد النواتج (المدخالت إلى
الطبقة الالحقة) ،وتمتلك مجموعة من المعلمات القابلة للضبط التي يتم تحديثها وفقًا لإلشارة
التي تتدفق للخلف من الطبقة الالحقة.
بينما قد تعتقد أن الخاليا العصبية والطبقات والنماذج تعطينا أفكارًا تجريدية كافية لمواصلة
أعمالنا ،فقد اتضح أننا غالبًا ما نجد أنه من المناسب التحدث عن مكونات أكبر من طبقة فردية
ولكنها أصغر من النموذج بأكمله .على سبيل المثال ،تمتلك بنية ،ResNet-152التي تحظى
بشعبية كبيرةيف الرؤية الحاسوبية ،مئات الطبقات .تتكون هذه الطبقات من أنماط متكررة
لمجموعات من الطبقات .يمكن أن يصبح تنفيذ مثل هذه الشبكة طبقة واحدةيف كل مرة ممالً.
هذا القلق ليس مجرد افتراض -أنماط التصميم هذه شائعةيف الممارسة .فازت بُنية ResNet
المذكورة أعالهيف مسابقات الرؤية الحاسوبية لعام ImageNet 2015و COCOلكل من
التعرف والكشف ( ) 2016 ،He et al.وال تزال بنية االنتقال للعديد من مهام الرؤية .إن البنى
المماثلة التي يتم فيها ترتيب الطبقاتيف أنماط متكررة مختلفة موجودة اآلنيف كل مكانيف
مجاالت أخرى ،بمايف ذلك معالجة اللغة الطبيعية والكالم.
لتنفيذ هذه الشبكات المعقدة ،نقدم مفهوم وحدة النمطية للشبكة العصبية .moduleيمكن
أن تصف الوحدة النمطية طبقة واحدة ،أو مكونًا يتكون من طبقات متعددة ،أو النموذج بأكمله!
تتمثل إحدى فوائد العمل مع تجريد الوحدة النمطية module abstractionيف أنه يمكن دمجها
في قطع أثرية أكبر ،غالبًا بشكل متكرر .وهذا موضحيف الشكل .6.1.1من خالل تحديد الكود
إلنشاء وحدات ذات تعقيد افتراضي عند الطلب ،يمكننا كتابة كود مضغوط بشكل مدهش مع
االستمراريف تنفيذ الشبكات العصبية المعقدة.
من وجهة نظر البرمجة ،يتم تمثيل الوحدة النمطية بواسطة فئة .classيجب أن تحدد أي فئة
فرعية منه طريقة انتشار أمامية تحول مدخالتها إلى مخرجات ويجب أن تخزن أي معلمات
ضرورية .الحظ أن بعض الوحدات ال تتطلب أي معلمات على اإلطالق .أخيرًا ،يجب أن تمتلك
وحدة نمطية طريقة االنتشار الخلفي ،backpropagationألغراض حساب التدرجات
21 الفصل السادس :دليل البنائين Builders’ Guide
.gradientsلحسن الحظ ،نظرًا لبعض سحر ما وراء الكواليس الذي يوفره التفاضل التلقائي
( auto differentiationالمقدميف القسم )2.5عند تحديد الوحدة النمطية الخاصة بنا ،نحتاج
فقط إلى القلق بشأن المعلمات وطريقة االنتشار األمامية .forward propagation
الشكل 6.1.1يتم دمج الطبقات المتعددةيف وحدات مكونة أنماطًا متكررة لنماذج أكبر.
للبدء ،نعيد النظريف الكود الذي استخدمناه لتنفيذ ( MLPsالقسم .)5.1يُنشئ الكود التالي شبكة
ذات طبقة مخفية واحدة متصلة بالكامل مع 256وحدة وتنشيط ،ReLUمتبوعة بطبقة إخراج
متصلة بالكامل مع 10وحدات (بدون دالة تنشيط).
[(net = tf.keras.models.Sequential
tf.keras.layers.Dense(256, activation=tf.nn.relu),
tf.keras.layers.Dense(10),
)]
لـ مثيل إنشاء طريق عن نموذجنا ببناء قمنا المثال، هذا في
،keras.models.Sequentialمع طبقات بالترتيب الذي يجب أن يتم تنفيذه بها
من خاصًا نوعًا Sequential يحدد باختصار، .arguments كوسيطات
،keras.Modelوهو الكالس (الفئة) الذي يقدم وحدةيف .Kerasيحتفظ بقائمة مرتبة من
النماذج المكونة .constituent Modelsالحظ أن كل طبقة من الطبقتين المتصلتين بالكامل
هي مثيل لكالس Denseالتي تعديف حد ذاتها فئة فرعية من النموذج .كما أن طريقة االنتشار
االمامي (االستدعاء )callبسيطة بشكل ملحوظ :فهي تربط كل وحدةيف القائمة معًا ،وتمرير
ناتج كل منها كمدخل إلى التالي .الحظ أنه حتى اآلن ،كنا نستدعي نماذجنا عبر البناء )net(X
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 22
للحصول على مخرجاتها .هذايف الواقع مجرد اختصار لـ )) ، net.call(Xخدعة بايثون
الرائعة التي تم تحقيقها عبر طريقة __ __callلكالس الوحدة النمطية.
في المقتطف التالي ،نقوم ببرمجة وحدة نمطية من البداية تتوافق مع MLPبطبقة مخفية واحدة
تحتوي على 256وحدة مخفية وطبقة إخراج 10أبعاد .الحظ أن فئة MLPأدناه ترث الفئة التي
تمثل وحدة نمطية .سوف نعتمد بشكل كبير على طرق الفئة األصلية ،parent classونزود
المُنشئ الخاص بنا فقط (طريقة ____initيف بايثون) وطريقة االنتشار األمامي.
class MLP(tf.keras.Model):
def __init__(self):
# Call the constructor of the parent class
tf.keras.Model to perform
# the necessary initialization
)(__super().__init
self.hidden = tf.keras.layers.Dense(units=256,
)activation=tf.nn.relu
)self.out = tf.keras.layers.Dense(units=10
نقوم بإنشاء مثيل لطبقات MLPيف المُنشئ ومن ثم استدعاء هذه الطبقاتيف كل استدعاء لطريقة
االنتشار األمامي .الحظ بعض التفاصيل األساسية .أوالً ،تستدعي طريقة ____init
المخصصة لدينا طريقة __ __initالخاصة بالفئة األصلية عبر )(__init__() .super
يجنبنا ألم إعادة صياغة الكود المعياري المطبق على معظم الوحدات .ثم نقوم بإنشاء مثيل
للطبقتين المتصلتين تمامًا ،ونقوم بتعيينهما إلى self.hiddenو .self.outالحظ أنه
ما لم ننفذ طبقة جديدة ،فال داعي للقلق بشأن طريقة backpropagationأو تهيئة المعلمة.
سيقوم النظام بإنشاء هذه الطرق تلقائيًا .دعونا نجرب هذا.
)(net = MLP
net(X).shape
)]TensorShape([2, 10
من المزايا الرئيسية لتجريد الوحدة تعدد استخداماتها .versatilityيمكننا تصنيف وحدة نمطية
فرعية إلنشاء طبقات (مثل فئة الطبقة المتصلة بالكامل) ،أو نماذج كاملة (مثل فئة MLPأعاله)،
أو مكونات مختلفة من التعقيد الوسيط .نستغل هذا التنوعيف الفصول التالية ،على سبيل المثال
عند معالجة الشبكات العصبية التالفيفية .convolutional neural networks
class MySequential(tf.keras.Model):
def __init__(self, *args):
)(__super().__init
self.modules = args
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 24
Executing 6.1.3
Code in the Forward Propagation Method
تجعل الفئة (الكالس) Sequentialإنشاء النموذج أمرًا سهالً ،مما يسمح لنا بتجميع بُنى جديدة
دون الحاجة إلى تحديد فئتنا الخاصة .ومع ذلك ،ليست كل األبنية عبارة عن سالسل أقحوان
بسيطة .عندما يتطلب األمر مزيدًا من المرونة ،سنرغبيف تحديد الكتل الخاصة بنا .على سبيل
المثال ،قد نرغبيف تنفيذ تدفق التحكم control flowيف بايثون داخل طريقة االنتشار األمامي.
عالوة على ذلك ،قد نرغبيف إجراء عمليات حسابية عشوائية ،وليس مجرد االعتماد على طبقات
الشبكة العصبية المحددة مسبقًا.
ربما الحظت أنه حتى اآلن ،عملت جميع العملياتيف شبكاتنا على عمليات تنشيط شبكتنا
ومعلماتها .ومع ذلك،يف بعض األحيان ،قد نرغبيف دمج المصطلحات التي ليست نتيجة
الطبقات السابقة وال المعلمات القابلة للتحديث .نسمي هذه المعلمات الثابتة constant
.parametersلنفترض على سبيل المثال أننا نريد طبقة تحسب الدالة 𝐱 ⊤ 𝐰 ⋅ 𝑐 = )𝐰 ،𝑓(𝐱,
حيث 𝐱 اإلدخال ،و𝐰 هي المعلمة الخاصة بنا ،و𝑐 هي ثابتة محددة لم يتم تحديثها أثناء
التحسين .لذلك قمنا بتطبيق فئة FixedHiddenMLPعلى النحو التالي.
class FixedHiddenMLP(tf.keras.Model):
def __init__(self):
)(__super().__init
25 Builders’ Guide دليل البنائين:الفصل السادس
self.flatten = tf.keras.layers.Flatten()
# Random weight parameters created with
`tf.constant` are not updated
# during training (i.e., constant parameters)
self.rand_weight =
tf.constant(tf.random.uniform((20, 20)))
self.dense = tf.keras.layers.Dense(20,
activation=tf.nn.relu)
واختبارنا،while قمنا بتشغيل حلقة. فعل نموذجنا شيئًا غير عادي،الحظ أنه قبل إعادة اإلخراج
. حتى يستوفي الشرط2 وقسمنا متجه اإلخراج على، 1 أكبر منℓ1 على الشرط أن معيارها
ال توجد شبكة عصبية قياسية تقوم، على حد علمنا.X قمنا بإرجاع مجموع اإلدخاالتيف،أخيرًا
. الحظ أن هذه العملية المحددة قد ال تكون مفيدةيف أي مهمةيف العالم الحقيقي.بهذه العملية
يف تدفق حسابات الشبكةarbitrary code هدفنا هو فقط أن نوضح لك كيفية دمج رمز تعسفي
.العصبية الخاصة بك
net = FixedHiddenMLP()
net(X)
<tf.Tensor: shape=(), dtype=float32, numpy=0.81634015>
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 26
يمكننا المزج والتوفيق بين الطرق المختلفة لتجميع assemblingالوحدات النمطية معًا.يف
المثال التالي ،نقوم بدمج الوحدات النمطية ببعض الطرق اإلبداعية.
class NestMLP(tf.keras.Model):
def __init__(self):
)(__super().__init
)(self.net = tf.keras.Sequential
self.net.add(tf.keras.layers.Dense(64,
))activation=tf.nn.relu
self.net.add(tf.keras.layers.Dense(32,
))activation=tf.nn.relu
self.dense = tf.keras.layers.Dense(16,
)activation=tf.nn.relu
)(chimera = tf.keras.Sequential
))(chimera.add(NestMLP
))chimera.add(tf.keras.layers.Dense(20
))(chimera.add(FixedHiddenMLP
)chimera(X
><tf.Tensor: shape=(), dtype=float32, numpy=0.63493085
6.1.4
الطبقات Layersعبارة عن وحدات نمطية .modules •
يمكن أن تشتمل العديد من الطبقات على وحدة نمطية. •
يمكن أن تشتمل العديد من الوحدات على وحدة نمطية. •
يمكن أن تحتوي الوحدة النمطية على كود. •
تقوم الوحدات النمطية بالكثير المهام ،بمايف ذلك تهيئة المعلمات parameter •
initializationواالنتشار الخلفي .backpropagation
يتم التعامل مع التسلسل المتسلسل Sequential concatenationsللطبقات •
والوحدات النمطية بواسطة الوحدة النمطية التسلسلية .Sequential
6.1.5
.1ما أنواع المشاكل التي ستحدث إذا قمت بتغيير MySequentialلتخزين
الوحداتيف قائمة بايثون؟
27 الفصل السادس :دليل البنائين Builders’ Guide
.2قم بتنفيذ وحدة نمطية تأخذ وحدتين كوسيطة ،على سبيل المثال net1و net2
وإرجاع اإلخراج المتسلسل لكلتا الشبكتينيف االنتشار األمامي .وهذا ما يسمى أيضًا
بالوحدة المتوازية .parallel module
.3افترض أنك تريد ربط مثيالت متعددة multiple instancesمن نفس الشبكة .قم
بتنفيذ دالة المصنع factory functionالتي تنشئ مثيالت متعددة لنفس الوحدة
وتبني منها شبكة أكبر.
في معظم األوقات ،سنكون قادرين على تجاهل التفاصيل الدقيقة لكيفية اإلعالن عن المعلمات
والتالعب بها ،باالعتماد على أطر التعلم العميق للقيام بالرفع الثقيل .ومع ذلك ،عندما نبتعد عن
البنى المكدسة بطبقات قياسية ،سنحتاج أحيانًا إلى الدخوليف أعشاب إعالن المعلمات
ومعالجتها.يف هذا القسم ،نغطي ما يلي:
[(net = tf.keras.models.Sequential
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(4, activation=tf.nn.relu),
tf.keras.layers.Dense(1),
)]
net.layers[2].weights
)[<tf.Variable 'dense_1/kernel:0' shape=(4, 1
=dtype=float32, numpy
array([[ 0.2706747],
[ 0.7514136],
[-0.7881366],
[-0.1292265]], dtype=float32)>,
<tf.Variable 'dense_1/bias:0' shape=(1,) dtype=float32,
]>)numpy=array([0.], dtype=float32
يمكننا أن نرى أن هذه الطبقة المتصلة بالكامل تحتوي على معلمتين ،تقابل أوزان weightsتلك
الطبقة وانحيازاتها ،biasesعلى التوالي.
type(net.layers[2].weights[1]),
)]tf.convert_to_tensor(net.layers[2].weights[1
(tensorflow.python.ops.resource_variable_ops.ResourceVar
iable,
<tf.Tensor: shape=(1,), dtype=float32,
)>)numpy=array([0.], dtype=float32
All Parameters at Once 6.2.1.2
عندما نحتاج إلى إجراء عمليات على جميع المعلمات ،فإن الوصول إليها واحدًا تلو اآلخر يمكن
أن يصبح ممالً .يمكن أن يصبح الموقف صعبًا بشكل خاص عندما نعمل مع وحدات أكثر تعقيدًا
(على سبيل المثال ،الوحدات المتداخلة ،)nested modulesنظرًا ألننا سنحتاج إلى التكرار
من خالل الشجرة بأكملها الستخراج معلمات كل وحدة فرعية .أدناه نوضح الوصول إلى معلمات
جميع الطبقات.
29 الفصل السادس :دليل البنائين Builders’ Guide
)(net.get_weights
[array([[-0.25718492, -0.02684402, 0.38722616, -
0.21718812],
[ 0.8491538 , 0.2304619 , 0.37694377,
0.5665582 ],
[-0.4560371 , 0.7668019 , -0.52032065,
0.6611255 ],
[ 0.04601806, 0.5825514 , 0.7364692 ,
0.70636266]],
dtype=float32),
array([0., 0., 0., 0.], dtype=float32),
array([[ 0.2706747],
[ 0.7514136],
[-0.7881366],
[-0.1292265]], dtype=float32),
])array([0.], dtype=float32
Tied Parameters 6.2.2
في كثير من األحيان ،نريد مشاركة المعلمات عبر طبقات متعددة .دعونا نرى كيف نفعل ذلك
بأناقة .فيما يلي نخصص طبقة متصلة بالكامل ثم نستخدم معلماتها على وجه التحديد لتعيين
تلك الخاصة بطبقة أخرى .نحتاج هنا إلى تشغيل االنتشار األمامية )net(Xقبل الوصول إلى
المعلمات.
يوضح هذا المثال أن معلمات الطبقة الثانية والثالثة مرتبطة .إنهما ليسا متساويين فقط ،بل يتم
تمثيلهما بنفس الموتر الدقيق .exact tensorوبالتالي ،إذا قمنا بتغيير أحد المعلمات ،يتغير
اآلخر أيضًا .قد تتساءل ،عندما يتم ربط المعلمات ،ماذا يحدث للتدرجات gradients؟ نظرًا
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 30
ألن معلمات النموذج تحتوي على تدرجات ،يتم إضافة تدرجات الطبقة المخفية الثانية والطبقة
المخفية الثالثة معًا أثناء النشر الخلفي .backpropagation
6.2.3
لدينا عدة طرق للوصول إلى معلمات النموذج وربطها.
6.2.4
.1استخدم نموذج NestMLPالمحدديف القسم 6.1وقم بالوصول إلى معلمات الطبقات
المختلفة.
.2أنشئ MLPيحتوي على طبقة معلمة مشتركة وقم بتدريبها .أثناء عملية التدريب،
الحظ معلمات النموذج والتدرجات لكل طبقة.
.3لماذا تعتبر مشاركة المعلمات فكرة جيدة؟
بشكل افتراضي ،يقوم Kerasبتهيئة مصفوفات الوزن weight matricesبشكل موحد من
خالل الرسم من نطاق يتم حسابه وفقًا ألبعاد اإلدخال واإلخراج ،ويتم تعيين جميع معلمات
التحيز على الصفر .يوفر TensorFlowمجموعة متنوعة من طرق التهيئةيف كل من الوحدة
النمطية الجذر rootووحدة .keras.initializers
[(net = tf.keras.models.Sequential
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(4, activation=tf.nn.relu),
tf.keras.layers.Dense(1),
)]
net = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(
4, activation=tf.nn.relu,
kernel_initializer=tf.random_normal_initializer(mean=0,
stddev=0.01),
bias_initializer=tf.zeros_initializer()),
tf.keras.layers.Dense(1)])
net(X)
net.weights[0], net.weights[1]
(<tf.Variable 'dense_2/kernel:0' shape=(4, 4)
dtype=float32, numpy=
array([[-4.3637343e-03, 1.4685265e-02, 1.1814130e-02,
1.0973577e-02],
[ 4.1117594e-03, -1.4918787e-02, -2.7245909e-03,
2.2734334e-03],
[-2.3910873e-02, -2.1292072e-02, -1.7594380e-02,
2.9788772e-03],
[-2.9245612e-05, 1.7144383e-03, 2.0546305e-03,
1.0586854e-03]],
dtype=float32)>,
<tf.Variable 'dense_2/bias:0' shape=(4,) dtype=float32,
numpy=array([0., 0., 0., 0.], dtype=float32)>)
.)1 ،يمكننا أيضًا تهيئة جميع المعلمات إلى قيمة ثابتة معينة (على سبيل المثال
net = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(
4, activation=tf.nn.relu,
kernel_initializer=tf.keras.initializers.Constant(1),
bias_initializer=tf.zeros_initializer()),
tf.keras.layers.Dense(1),
])
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 32
net(X)
net.weights[0], net.weights[1]
(<tf.Variable 'dense_4/kernel:0' shape=(4, 4)
dtype=float32, numpy=
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]], dtype=float32)>,
<tf.Variable 'dense_4/bias:0' shape=(4,) dtype=float32,
numpy=array([0., 0., 0., 0.], dtype=float32)>)
نقوم أدناه، على سبيل المثال.certain blocks يمكننا أيضًا تطبيق مُهيِّئات مختلفة لكتل معينة
.42 وتهيئة الطبقة الثانية إلى قيمة ثابتة تبلغXavier بتهيئة الطبقة األولى باستخدام مُهيئ
net = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(
4,
activation=tf.nn.relu,
kernel_initializer=tf.keras.initializers.GlorotUniform()
),
tf.keras.layers.Dense(
1,
kernel_initializer=tf.keras.initializers.Constant(42)),
])
net(X)
print(net.layers[1].weights[0])
print(net.layers[2].weights[0])
<tf.Variable 'dense_6/kernel:0' shape=(4, 4)
dtype=float32, numpy=
array([[ 0.62105197, 0.0110271 , 0.77947575,
0.42430252],
[ 0.7728824 , -0.06041008, 0.7212722 ,
0.3408653 ],
[-0.23351735, -0.16163725, 0.8497241 , -
0.29418987],
[-0.52923286, -0.5558266 , -0.1514526 , -
0.73771775]],
dtype=float32)>
<tf.Variable 'dense_7/kernel:0' shape=(4, 1)
dtype=float32, numpy=
33 Builders’ Guide دليل البنائين:الفصل السادس
array([[42.],
[42.],
[42.],
[42.]], dtype=float32)>
Custom Initialization 6.3.1.1
يف. ال يتم توفير طرق التهيئة التي نحتاجها بواسطة إطار عمل التعلم العميق،في بعض األحيان
: نحدد مُهيئًا ألي معلمة 𝑤 وزن باستخدام التوزيع الغريب التالي،المثال أدناه
1
𝑈(5,10) with probability
4
1
𝑤∼{ 0 with probability
2
1
𝑈(−10, −5) with probability
4
__ التي تُرجع الموترcall__ وننفذ دالةInitializer منsubclass هنا نحدد فئة فرعية
.المطلوب بالنظر إلى الشكل ونوع البيانات
class MyInit(tf.keras.initializers.Initializer):
def __call__(self, shape, dtype=None):
data=tf.random.uniform(shape, -10, 10,
dtype=dtype)
factor=(tf.abs(data) >= 5)
factor=tf.cast(factor, tf.float32)
return data * factor
net = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(
4,
activation=tf.nn.relu,
kernel_initializer=MyInit()),
tf.keras.layers.Dense(1),
])
net(X)
print(net.layers[1].weights[0])
<tf.Variable 'dense_8/kernel:0' shape=(4, 4)
dtype=float32, numpy=
array([[ 6.262211 , 0. , 0. , 7.670639 ],
[ 8.288603 , 8.044296 , 6.477192 , -0. ],
[-0. , 0. , -0. , -0. ],
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 34
net.layers[1].weights[0][:].assign(net.layers[1].weights
)[0] + 1
)net.layers[1].weights[0][0, 0].assign(42
]net.layers[1].weights[0
)<tf.Variable 'dense_8/kernel:0' shape=(4, 4
=dtype=float32, numpy
array([[42. , 1. , 1. , 8.670639 ],
[ 9.288603 , 9.044296 , 7.477192 , 1. ],
[ 1. , 1. , 1. , 1. ],
[ 1. , 1. , -6.4122763, -4.566807
>)]], dtype=float32
6.3.2
يمكننا تهيئة المعلمات باستخدام مُهيِّئات مضمنة (مدمجة) built-inومخصصة .custom
6.3.3
ابحث عن الوثائق عبر اإلنترنت للحصول على المزيد من المهيئات المدمجة built-in
.initializers
قد تتفاجأ من أن الكود الخاص بنا يعمل على اإلطالق .بعد كل شيء ،ال توجد طريقة يمكن
إلطار التعلم العميق أن يخبرنا بها عن أبعاد إدخال الشبكة .الحيلة هنا هي أن إطار العمل يؤجل
deferالتهيئة ،initializationيف انتظار أول مرة نقوم فيها بتمرير البيانات عبر النموذج،
الستنتاج أحجام كل طبقة أثناء الطيران.
في وقت الحق ،عند العمل مع الشبكات العصبية التالفيفية ،CNNستصبح هذه التقنية أكثر
مالءمة ألن أبعاد اإلدخال (أي دقة الصورة) ستؤثر على أبعاد كل طبقة الحقة .ومن ثم ،فإن
35 الفصل السادس :دليل البنائين Builders’ Guide
القدرة على تعيين المعلمات دون الحاجة إلى معرفة،يف وقت كتابة الكود ،ما هي األبعاد يمكن أن
يبسط إلى حد كبير مهمة تحديد النماذج وتعديلها الحقًا .بعد ذلك ،نتعمقيف آليات التهيئة.
[(net = tf.keras.models.Sequential
tf.keras.layers.Dense(256, activation=tf.nn.relu),
tf.keras.layers.Dense(10),
)]
في هذه المرحلة ،ال يمكن للشبكة معرفة أبعاد أوزان طبقة اإلدخال input layer’s weights
ألن بُعد اإلدخال يظل غير معروف .وبالتالي ،لم يقم إطار العمل بعد بتهيئة أي معلمات .نؤكد
بمحاولة الوصول إلى المعلمات أدناه
بعد ذلك ،دعنا نمرر البيانات عبر الشبكة لجعل إطار العمل يهيئ المعلمات أخيرًا.
6.4.1
يمكن أن تكون التهيئة الكسولة مريحة ،مما يسمح إلطار العمل باستنتاج أشكال •
المعلمات تلقائيًا ،مما يجعل من السهل تعديل ال ُبنى والقضاء على مصدر واحد شائع
لألخطاء.
يمكننا تمرير البيانات عبر النموذج لجعل اإلطار يهيئ المعلمات أخيرًا. •
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 36
6.4.2
.1ماذا يحدث إذا قمت بتحديد أبعاد اإلدخال للطبقة األولى وليس للطبقات الالحقة؟
هل تحصل على تهيئة فورية immediate initialization؟
.2ماذا يحدث إذا قمت بتحديد أبعاد غير متطابقة mismatching dimensions؟
.3ماذا يجب أن تفعل إذا كان لديك مدخالت ذات أبعاد متفاوتة varying
dimensionality؟ تلميح :انظر إلى ربط المعلمة .parameter tying
class CenteredLayer(tf.keras.Model):
def __init__(self):
)(__super().__init
)(layer = CenteredLayer
))]layer(tf.constant([1.0, 2, 3, 4, 5
<tf.Tensor: shape=(5,), dtype=float32, numpy=array([-2.,
>)-1., 0., 1., 2.], dtype=float32
37 الفصل السادس :دليل البنائين Builders’ Guide
net = tf.keras.Sequential([tf.keras.layers.Dense(128),
)])(CenteredLayer
كتحقق إضافي من الصحة ،يمكننا إرسال بيانات عشوائية عبر الشبكة والتحقق من أن المتوسط
هويف الواقع .0نظرًا ألننا نتعامل مع أرقام الفاصلة العائمة ،floating point numbersفقد ال
نزال نرى عددًا صغيرًا جدًا غير صفري بسبب التكميم .quantization
اآلن دعونا ننفذ نسختنا الخاصة من الطبقة المتصلة بالكامل .fully connected layerتذكر
أن هذه الطبقة تتطلب معلمتين ،أحدهما يمثل الوزن واآلخر يمثل التحيز.يف هذا التنفيذ ،نختار
دالة تنشيط ReLUكإعداد افتراضي .تتطلب هذه الطبقة وسيطتي إدخالin_units :
و ،unitsوالتي تشير إلى عدد المدخالت والمخرجات ،على التوالي.
class MyDense(tf.keras.Model):
def __init__(self, units):
)(__super().__init
self.units = units
)return tf.nn.relu(linear
بعد ذلك ،نقوم بإنشاء مثيل لفئة MyDenseوالوصول إلى معلمات النموذج الخاصة بها.
)dense = MyDense(3
)))dense(tf.random.uniform((2, 5
)(dense.get_weights
[array([[-0.02223266, -0.04409523, 0.01749811],
[ 0.04932142, -0.07135182, 0.08249469],
[ 0.05460888, 0.01363679, 0.0342483 ],
[-0.02898769, -0.03092524, -0.02166725],
[-0.05692595, -0.03148399, 0.05532912]],
dtype=float32),
])array([0., 0., 0.], dtype=float32
يمكننا إجراء حسابات االنتشار األمامي forward propagationمباشرة باستخدام طبقات
مخصصة .custom layers
)))dense(tf.random.uniform((2, 5
=<tf.Tensor: shape=(2, 3), dtype=float32, numpy
array([[0.01219213, 0. , 0.12613392],
[0. , 0. , 0.02558431]],
>)dtype=float32
يمكننا أيضًا إنشاء نماذج باستخدام طبقات مخصصة .بمجرد أن نحصل على ذلك ،يمكننا
استخدامه تمامًا مثل الطبقة المضمنة المتصلة بالكامل.
net = tf.keras.models.Sequential([MyDense(8),
)])MyDense(1
)))net(tf.random.uniform((2, 64
=<tf.Tensor: shape=(2, 1), dtype=float32, numpy
array([[0.00192496],
[0. >)]], dtype=float32
6.5.3
يمكننا تصميم طبقات مخصصة عبر فئة الطبقة األساسية .يتيح لنا ذلك تحديد طبقات •
جديدة مرنة تتصرف بشكل مختلف عن أي طبقات موجودةيف المكتبة.
بمجرد تحديدها ،يمكن استدعاء الطبقات المخصصةيف سياقات وبنيات عشوائية. •
يمكن أن تحتوي الطبقات على معلمات محلية ،local parametersوالتي يمكن •
إنشاؤها من خالل الدوال المضمنة .built-in functions
39 الفصل السادس :دليل البنائين Builders’ Guide
6.5.4
.1صمم طبقة تأخذ مدخالً وتحسب تقليل الموتر ،tensor reductionأي أنها ترجع
𝑗.𝑦𝑘 = ∑𝑖, 𝑗𝑥 𝑖𝑥 𝑘𝑗𝑖𝑊
.2صمم طبقة تُرجع النصف المتصدر leading halfمن معامالت فورييه Fourier
coefficientsللبيانات.
)x = tf.range(4
)np.save('x-file.npy', x
يمكننا اآلن قراءة البيانات من الملف المخزن مرة أخرىيف الذاكرة.
)y = tf.zeros(4
)]np.save('xy-files.npy', [x, y
)x2, y2 = np.load('xy-files.npy', allow_pickle=True
)(x2, y2
))](array([0., 1., 2., 3.]), array([0., 0., 0., 0.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 40
يمكننا حتى كتابة وقراءة قاموس يقوم بالتخطيط من السالسل stringsإلى الموترات .tensors
هذا مناسب عندما نريد قراءة أو كتابة جميع األوزانيف النموذج.
class MLP(tf.keras.Model):
def __init__(self):
)(__super().__init
)(self.flatten = tf.keras.layers.Flatten
self.hidden = tf.keras.layers.Dense(units=256,
)activation=tf.nn.relu
)self.out = tf.keras.layers.Dense(units=10
)(net = MLP
))X = tf.random.uniform((2, 20
41 الفصل السادس :دليل البنائين Builders’ Guide
)Y = net(X
بعد ذلك ،نقوم بتخزين معلمات النموذج كملف باسم ""mlp.params
)'net.save_weights('mlp.params
الستعادة النموذج ،نقوم بإنشاء نسخة طبق األصل من نموذج MLPاألصلي .بدالً من التهيئة
العشوائية لمعلمات النموذج ،نقرأ المعلمات المخزنةيف الملف مباشرةً.
)(clone = MLP
)'clone.load_weights('mlp.params
<tensorflow.python.training.tracking.util.CheckpointLoad
>Status at 0x7fe7e6f9fdc0
نظرًا ألن كال المثالين لهما نفس معلمات النموذج ،يجب أن تكون النتيجة الحسابية لنفس
اإلدخال Xهي نفسها .دعونا نتحقق من هذا.
)Y_clone = clone(X
Y_clone == Y
=<tf.Tensor: shape=(2, 10), dtype=bool, numpy
array([[ True, True, True, True, True, True, True,
True, True,
True],
[ True, True, True, True, True, True, True,
True, True,
>)]]True
6.6.3
يمكن استخدام دوال الحفظ saveوالتحميل loadلتنفيذ إدخال /إخراج الملف •
ile I/Oلكائنات الموتر.
يمكننا حفظ وتحميل مجموعات كاملة من المعلمات لشبكة عبر قاموس المعلمات •
.parameter dictionary
يجب أن يتم حفظ البنيةيف الكود وليسيف المعلمات. •
6.6.4
.1حتى لو لم تكن هناك حاجة لنشر نماذج مدربة على جهاز مختلف ،فما هي الفوائد
العملية لتخزين معلمات النموذج؟
.2افترض أننا نريد إعادة استخدام أجزاء فقط من الشبكة ليتم دمجهايف شبكة ذات بنية
مختلفة .كيف يمكنك استخدام ،لنقل أول طبقتين من شبكة سابقةيف شبكة جديدة؟
.3كيف ستشرعيف حفظ بُنية الشبكة والمعلمات؟ ما هي القيود التي ستفرضها على
المعمارية؟
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 42
GPUs 6.7
في القسم ،1.5ناقشنا النمو السريع للحسابات على مدى العقدين الماضيين .باختصار ،زاد أداء
وحدة معالجة الرسومات GPUبمعدل 1000عامل كل عقد منذ عام .2000وهذا يوفر فرصًا
رائعة ولكنه يشير أيضًا إلى الحاجة الملحة لتوفير مثل هذا األداء.
في هذا القسم ،نبدأيف مناقشة كيفية تسخير هذا األداء الحسابي لبحثك .أوالً باستخدام وحدات
معالجة رسومات واحدة وفي وقت الحق ،كيفية استخدام وحدات معالجة رسومات متعددة
وخوادم متعددة (مع وحدات معالجة رسومات متعددة .)multiple GPUs
على وجه التحديد ،سنناقش كيفية استخدام وحدة معالجة رسومات NVIDIAواحدة إلجراء
العمليات الحسابية .أوالً ،تأكد من تثبيت NVIDIA GPUواحد على األقل .بعد ذلك ،قم
بتنزيل برنامج تعريف NVIDIAو CUDAواتبع التعليمات لتعيين المسار المناسب .بمجرد
اكتمال هذه االستعدادات ،يمكن استخدام األمر nvidia-smiلعرض معلومات بطاقة
الرسومات.
!nvidia-smi
Mon Aug 29 23:47:02 2022
+-------------------------------------------------------
----------------------+
| NVIDIA-SMI 460.106.00 Driver Version: 460.106.00
CUDA Version: 11.2 |
|-------------------------------+----------------------
+----------------------+
| GPU Name Persistence-M| Bus-Id | Disp.A
| Volatile Uncorr. ECC
|| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage
| GPU-Util Compute M.
| | |
| MIG M.
|===============================+======================+
|======================
| | 0 Tesla V100-SXM2... Off | 00000000:00:1B.0 Off
| 0
| N/A 48C P0 | 52W / 300W | 1760MiB / 16160MiB
0% | Default
| | |
| N/A
+-------------------------------+----------------------
+----------------------+
43 الفصل السادس :دليل البنائين Builders’ Guide
+-------------------------------------------------------
----------------------+
| Processes:
|
| GPU GI CI PID Type Process name
| GPU Memory
| ID ID
Usage |
=======================================================|
|======================
+-------------------------------------------------------
----------------------+
لتشغيل البرامج الموجودةيف هذا القسم ،تحتاج إلى وحدتي GPUعلى األقل .الحظ أن هذا قد
يكون باهظًا بالنسبة لمعظم أجهزة الكمبيوتر المكتبية ولكنه متاح بسهولةيف السحابة ،cloudعلى
سبيل المثال ،باستخدام مثيالت AWS EC2متعددة وحدات معالجة الرسومات .ال تتطلب
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 44
بدالً من.multiple GPUs جميع األقسام األخرى تقريبًا وحدات معالجة رسومات متعددة
. هذا لتوضيح كيفية تدفق البيانات بين األجهزة المختلفة،ذلك
import tensorflow as tf
from d2l import tensorflow as d2l
num_gpus()
2
تسمحان لنا بتشغيل التعليمات البرمجيةconvenient functions اآلن نحدد دالتي مالئمة
.حتى لو لم تكن وحدات معالجة الرسومات المطلوبة موجودة
with try_gpu():
))X = tf.ones((2, 3
X
=<tf.Tensor: shape=(2, 3), dtype=float32, numpy
array([[1., 1., 1.],
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 46
with try_gpu(1):
))Y = tf.random.uniform((2, 3
Y
=<tf.Tensor: shape=(2, 3), dtype=float32, numpy
array([[0.87347054, 0.4167322 , 0.06983936],
[0.37522686, 0.3176515 , 0.2823031 ]],
>)dtype=float32
Copying 6.7.2.2
إذا أردنا حساب ،X + Yفنحن بحاجة إلى تحديد مكان إجراء هذه العملية .على سبيل المثال،
كما هو موضحيف الشكل ،6.7.1يمكننا نقل Xإلى وحدة معالجة الرسومات الثانية وإجراء
العملية هناك .ال تضف Xو Yببساطة ،ألن هذا سيؤدي إلى استثناء .لن يعرف محرك وقت
التشغيل ما يجب فعله :ال يمكنه العثور على البيانات على نفس الجهاز ويفشل .نظرًا ألن Y
تعيش على وحدة معالجة الرسومات الثانية ،فنحن بحاجة إلى نقل Xإلى هناك قبل أن نتمكن
من إضافة االثنين.
with try_gpu(1):
Z = X
)print(X
)print(Z
(tf.Tensor
][[1. 1. 1.
)[1. 1. 1.]], shape=(2, 3), dtype=float32
(tf.Tensor
][[1. 1. 1.
47 الفصل السادس :دليل البنائين Builders’ Guide
Y + Z
=<tf.Tensor: shape=(2, 3), dtype=float32, numpy
array([[1.8734705, 1.4167322, 1.0698394],
[1.3752269, 1.3176515, 1.2823031]],
>)dtype=float32
تخيل أن المتغير Zالخاص بك موجود بالفعليف وحدة معالجة الرسومات الثانية .ماذا يحدث
إذا استمرينايف االتصال بـ Z2 = Zضمن نطاق الجهاز نفسه؟ سيعود Zبدالً من عمل نسخة
وتخصيص ذاكرة جديدة.
with try_gpu(1):
Z2 = Z
Z2 is Z
True
Side Notes 6.7.2.3
يستخدم الناس وحدات معالجة الرسومات للقيام بالتعلم اآللي ألنهم يتوقعون أن تكون سريعة.
لكن نقل المتغيرات بين األجهزة بطيء .لذلك نريدك أن تكون متأكدًا بنسبة ٪100أنك تريد أن
تفعل شيئًا بطيئًا قبل أن نسمح لك بفعله .إذا قام إطار عمل التعلم العميق بالنسخ تلقائيًا دون
تعطل ،فقد ال تدرك أنك كتبت بعض التعليمات البرمجية البطيئة.
أيضًا ،يعد نقل البيانات بين األجهزة (وحدة المعالجة المركزية ووحدات معالجة الرسومات
واألجهزة األخرى) شيئًا أبطأ بكثير من الحساب .كما أنه يجعل الموازاة أكثر صعوبة ،حيث يتعين
علينا انتظار إرسال البيانات (أو باألحرى استالمها) قبل أن نتمكن من متابعة المزيد من العمليات.
هذا هو السببيف ضرورة توخي الحذر الشديديف عمليات النسخ .كقاعدة عامة ،العديد من
العمليات الصغيرة أسوأ بكثير من عملية واحدة كبيرة .عالوة على ذلك ،فإن العديد من العمليات
في وقت واحد أفضل بكثير من العديد من العمليات الفردية التي تتخللها التعليمات البرمجية إال
إذا كنت تعرف ما تفعله .هذا هو الحال ألن مثل هذه العمليات يمكن أن تمنع إذا كان على أحد
األجهزة انتظار اآلخر قبل أن يتمكن من القيام بشيء آخر .إنه يشبه إلى حد ما طلب قهوتكيف
قائمة انتظار بدالً من طلبها مسبقًا عبر الهاتف واكتشاف أنها جاهزة عندما تكون جاهزًا.
أخيرًا ،عندما نطبع الموترات أو نحول الموترات إلى تنسيق ،NumPyإذا لم تكن البياناتيف
الذاكرة الرئيسية ،فسيقوم اإلطار بنسخها إلى الذاكرة الرئيسية أوالً ،مما يؤدي إلى زيادة نقل
البيانات .واألسوأ من ذلك ،أنه يخضع اآلن لقفل المفسر العالمي global interpreter
المخيف الذي يجعل كل شيء ينتظر بايثون حتى يكتمل.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 48
)(strategy = tf.distribute.MirroredStrategy
with strategy.scope():
[(net = tf.keras.models.Sequential
)])tf.keras.layers.Dense(1
INFO:tensorflow:Using MirroredStrategy with devices
('/job:localhost/replica:0/task:0/device:GPU:0',
)''/job:localhost/replica:0/task:0/device:GPU:1
سنرى العديد من األمثلة حول كيفية تشغيل النماذج على وحدات معالجة الرسوماتيف الفصول
التالية ،وذلك ألنها ستصبح إلى حد ما أكثر كثافة من الناحية الحسابية.
عندما يكون اإلدخال موترًا على وحدة معالجة الرسومات ،فإن النموذج سيحسب النتيجة على
نفس وحدة معالجة الرسومات.
)net(X
=<tf.Tensor: shape=(2, 1), dtype=float32, numpy
array([[0.59118944],
>)[0.59118944]], dtype=float32
دعنا نؤكد أن معلمات النموذج مخزنة على نفس وحدة معالجة الرسومات.
net.layers[0].weights[0].device,
net.layers[0].weights[1].device
('/job:localhost/replica:0/task:0/device:GPU:0',
)''/job:localhost/replica:0/task:0/device:GPU:0
دع المدرب trainerيدعم .GPU
باختصار ،طالما أن جميع البيانات والمعلمات موجودة على نفس الجهاز ،يمكننا تعلم النماذج
بكفاءة .سنرىيف الفصول التالية عدة أمثلة من هذا القبيل.
6.7.4
يمكننا تحديد أجهزة للتخزين والحساب ،مثل وحدة المعالجة المركزية أو وحدة •
معالجة الرسومات .بشكل افتراضي ،يتم إنشاء البياناتيف الذاكرة الرئيسية ثم تستخدم
وحدة المعالجة المركزية إلجراء العمليات الحسابية.
يتطلب إطار عمل التعلم العميق أن تكون جميع بيانات اإلدخال للحساب على نفس •
الجهاز ،سواء كانت وحدة المعالجة المركزية أو نفس وحدة معالجة الرسومات.
49 الفصل السادس :دليل البنائين Builders’ Guide
يمكنك أن تفقد أداءً ملحوظًا عن طريق نقل البيانات دون عناية .الخطأ المعتاد هو كما •
يلي :حساب الخسارة (الخطأ) لكل دفعة صغيرة minibatchعلى وحدة معالجة
تسجيلهايف (أو األوامر سطر على بها المستخدم وإبالغ الرسومات
)NumPy ndarrayسيؤدي إلى تشغيل قفل مترجم عام global interpreter
lockيوقف جميع وحدات معالجة الرسومات .من األفضل بكثير تخصيص ذاكرة
للتسجيل داخل وحدة معالجة الرسومات ونقل السجالت الكبيرة فقط.
6.7.5
.1جرب مهمة حسابية أكبر ،مثل ضرب المصفوفات الكبيرة ،والحظ الفرقيف السرعة
بين وحدة المعالجة المركزية ووحدة معالجة الرسومات .ماذا عن مهمة بكمية صغيرة
من الحسابات؟
.2كيف يجب أن نقرأ ونكتب معلمات النموذج على وحدة معالجة الرسومات؟
.3قم بقياس الوقت المستغرق لحساب 1000مصفوفة من ضرب المصفوفات
100 × 100وتسجيل معيار Frobeniusلمصفوفة اإلخراج نتيجة واحدةيف كل مرة
مقابل االحتفاظ بسجليف وحدة معالجة الرسومات ونقل النتيجة النهائية فقط.
.4قم بقياس الوقت المستغرق إلجراء ضرب المصفوفة-المصفوفة على وحدتي GPU
في نفس الوقت مقابل التسلسل على وحدة معالجة رسومات واحدة .تلميح :يجب أن
ترى تحجيمًا خطيًا linear scalingتقريبًا.
الشبكات العصبية
االلتفافية 7
51 الفصل السابع :الشبكات العصبية االلتفافية
نظرًا ألن هذه الشبكات ثابتةيف ترتيب الميزات ،يمكننا الحصول على نتائج مماثلة بغض النظر
عما إذا كنا نحتفظ بترتيب يتوافق مع ال ُبنية المكانية للبكسل أو إذا قمنا بتغيير أعمدة مصفوفة
التصميم الخاصة بنا قبل مالءمة fittingمعلمات .MLPعلى نحو مفضل ،سنستفيد من معرفتنا
السابقة بأن وحدات البكسل القريبة ترتبط عادةً ببعضها البعض ،لبناء نماذج فعالة للتعلم من
بيانات الصورة.
يقدم هذا الفصل الشبكات العصبية التالفيفية ) ،)1995 ،LeCun et al.( ،(CNNوهي عائلة
قوية من الشبكات العصبية المصممة لهذا الغرض تحديدًا .أصبحت ال ُبنى القائمة على CNN
موجودةيف كل مكان اآلنيف مجال الرؤية الحاسوبية .على سبيل المثال،يف مجموعة ،Imagnet
( ،)2009 ،.Deng et alكان استخدام الشبكات العصبية التالفيفية ،باختصار Convnetsهو
الذي وفر تحسينات كبيرةيف األداء (.)2012 ،Krizhevsky et al.
شبكات CNNالحديثة ،كما يطلق عليها بالعامية ،تدين بتصميمها إلى اإللهام من علم األحياء
،biologyونظرية المجموعة ،group theoryوجرعة صحية من الترقيع التجريبي
.experimental tinkeringباإلضافة إلى كفاءة العينة sample efficiencyيف تحقيق نماذج
دقيقة ،achieving accurate modelsتميل شبكات CNNإلى أن تكون فعالة من الناحية
الحسابية ،وذلك ألنها تتطلب معلمات أقل من ال ُبنى المتصلة تمامًا وألن االلتفافات
convolutionsسهلة الموازاة عبر نوى وحدة معالجة الرسومات (.)2014 ،Chetlur et al.
وبالتالي ،غالبًا ما يطبق الممارسون شبكات CNNكلما أمكن ذلك ،وقد برزوا بشكل متزايد
كمنافسين موثوق بهم حتىيف المهام ذات الهيكل التسلسلي أحادي البعد ،مثل الصوت
( ،)2014 ،Abdel-Hamid et al.النص ( ،)2014 ،Kalchbrenner et al.وتحليل
السالسل الزمنية ،)1995 ،LeCun et al.( time series analysisحيث يتم استخدام
الشبكات العصبية المتكررة ( recurrent neural networks )RNNبشكل تقليدي .كما أن
بعض التعديالت الذكية لشبكات CNNقد جعلتها تؤثر على البيانات المهيكلة بالرسوم البيانية
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 52
أوالً ،سوف نتعمق أكثريف دوافع الشبكات العصبية التالفيفية .ويلي ذلك جولةيف العمليات
األساسية التي تشكل العمود الفقري لجميع الشبكات التالفيفية .وتشمل هذه الطبقات التالفيفية
نفسها ،convolutional layersوالتفاصيل الدقيقة بمايف ذلك الحشو paddingوالخطوة
،strideوطبقات التجميع pooling layersالمستخدمة لتجميع المعلومات عبر المناطق
المكانية المجاورة ،واستخدام قنوات متعددةيف كل طبقة ،ومناقشة دقيقة لهيكل ال ُبنى الحديثة.
سنختتم الفصل بمثال عملي كامل لـ ،LeNetأول شبكة تالفيفية تم نشرها بنجاح ،قبل وقت
طويل من ظهور التعلم العميق الحديث.يف الفصل التالي ،سوف نتعمقيف التطبيقات الكاملة
لبعض أبنية CNNالشائعة والحديثة نسبيًا والتي تمثل تصميماتها معظم التقنيات المستخدمة
بشكل شائع من قبل الممارسين المعاصرين.
في بعض األحيان ،نفتقر حقًا إلى المعرفة لتوجيه بناء ال ُبنى الحِرَفية.يف هذه الحاالت ،قد يكون
MLPهو أفضل ما يمكننا القيام به .ومع ذلك ،بالنسبة للبيانات اإلدراكية عالية األبعاد high-
،dimensional perceptual dataيمكن أن تنمو هذه الشبكات التي تفتقر إلى ال ُبنية بشكل
غير عملي.
على سبيل المثال ،دعنا نعود إلى مثالنا الجاري للتمييز بين القطط والكالب .لنفترض أننا نقوم
بعمل شامليف جمع البيانات ،حيث نجمع مجموعة بيانات مشروحة من صور فوتوغرافية بدقة
واحدة ميغا بكسل .هذا يعني أن كل مدخليف الشبكة له مليون بعد .حتى التخفيض الشديد إلى
ألف بُعد مخفي سيتطلب طبقة متصلة بالكامل تتميز بالمعلمات .106 × 103 = 109ما لم
يكن لدينا الكثير من وحدات معالجة الرسومات ،GPUوموهبة التحسين الموزع ،وقدر غير
عادي من الصبر ،فقد يصبح تعلم معلمات هذه الشبكة غير ممكن.
قد يعترض القارئ الحريص على هذه الحجة على أساس أن دقة واحدة ميغا بكسل قد ال تكون
ضرورية .ومع ذلك،يف حين أننا قد نكون قادرين على التخلص من مائة ألف بكسل ،فإن الطبقة
53 الفصل السابع :الشبكات العصبية االلتفافية
المخفية التي يبلغ حجمها 1000بكسل تقلل بشكل كبير من عدد الوحدات المخفية التي يتطلبها
تعلم التمثيل الجيد للصور ،لذلك سيظل النظام العملي يتطلب مليارات من المعلمات .عالوة
على ذلك ،قد يتطلب تعلم المصنف من خالل مالءمة العديد من المعلمات تجميع مجموعة
بيانات هائلة .ومع ذلك ،أصبح بإمكان كل من البشر وأجهزة الكمبيوتر اليوم التمييز بين القطط
والكالب جيدًا ،األمر الذي يتعارض على ما يبدو مع هذه البديهيات .وذلك ألن الصور تظهر بُنية
غنية يمكن أن يستغلها البشر ونماذج التعلم اآللي على حد سواء .الشبكات العصبية التالفيفية
( ) CNNهي إحدى الطرق اإلبداعية التي تبناها التعلم اآللي الستغالل بعض الهياكل المعروفة
في الصور الطبيعية.
قد يعترض القارئ الحريص على هذه الحجة على أساس أن دقة واحدة ميغا بكسل قد ال تكون
ضرورية .ومع ذلك،يف حين أننا قد نكون قادرين على التخلص من مائة ألف بكسل ،فإن الطبقة
المخفية التي يبلغ حجمها 1000بكسل تقلل بشكل كبير من عدد الوحدات المخفية التي يتطلبها
تعلم التمثيل الجيد للصور ،لذلك سيظل النظام العملي يتطلب مليارات من المعلمات .عالوة
على ذلك ،قد يتطلب تعلم المصنف من خالل مالءمة العديد من المعلمات تجميع مجموعة
بيانات هائلة .ومع ذلك ،أصبح بإمكان كل من البشر وأجهزة الكمبيوتر اليوم التمييز بين القطط
والكالب جيدًا ،األمر الذي يتعارض على ما يبدو مع هذه البديهيات .وذلك ألن الصور تظهر بُنية
غنية يمكن أن يستغلها البشر ونماذج التعلم اآللي على حد سواء .الشبكات العصبية التالفيفية
( ) CNNهي إحدى الطرق اإلبداعية التي تبناها التعلم اآللي الستغالل بعض الهياكل المعروفة
في الصور الطبيعية.
Invariance 7.1.1
تخيل أننا نريد اكتشاف كائنيف صورة ما .يبدو من المعقول أنه أيا كانت الطريقة التي نستخدمها
للتعرف على األشياء ال ينبغي أن تهتم بشكل مفرط بالموقع الدقيق للكائنيف الصورة .من الناحية
المثالية ،يجب أن يستغل نظامنا هذه المعرفة .وعادة ال تطير الخنازير وال تسبح الطائرات عادة.
ومع ذلك ،ال يزال يتعين علينا التعرف على الخنزير الذي ظهريف أعلى الصورة .يمكننا استلهام
بعض اإللهام هنا من لعبة األطفال "أين والدو ( "Where’s Waldoالموضحةيف الشكل .)7.1.1
تتكون اللعبة من عدد من المشاهد الفوضوية المليئة باألنشطة .يظهر والدويف مكان مايف كل منهما،
وعادة ما يتربصيف مكان غير متوقع .هدف القارئ هو تحديد مكانه .على الرغم من مظهره
المميز ،قد يكون هذا صعبًا بشكل كبير ،بسبب العدد الكبير من المشتتات .ومع ذلك ،ال يعتمد
شكل والدو على مكان وجود والدو .يمكننا مسح الصورة باستخدام كاشف والدو Waldo
detectorالذي يمكنه تعيين درجة لكل رقعة ،patchمما يشير إلى احتمالية احتواء التصحيح
على والدو.يف الواقع ،تعتمد العديد من خوارزميات اكتشاف الكائنات وتجزئتها على هذا النهج
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 54
( .)2015 ،Long et al.تنظم شبكات CNNفكرة الثبات المكاني spatial invariance
هذه ،وتستغلها لتعلم تمثيالت representationsمفيدة بمعلمات أقل.
يمكننا اآلن جعل هذه البديهيات أكثر واقعية من خالل تعداد بعض الرغبات لتوجيه تصميمنا
لبُنية شبكة عصبية مناسبة للرؤية الحاسوبية :computer vision
.1في الطبقات األولى ،يجب أن تستجيب شبكتنا بشكل مشابه لنفس الرقعة ،بغض النظر
عن مكان ظهوره في الصورة .يسمى هذا المبدأ بثبات الترجمة translation
( invarianceأو تساوي الترجمة .)translation equivariance
.2يجب أن تركز الطبقات األولى للشبكة على المناطق المحلية ،local regionsدون
اعتبار لمحتويات الصورة في المناطق البعيدة .هذا هو مبدأ المكان .في النهاية ،يمكن
تجميع هذه التمثيالت المحلية local representationsلعمل تنبؤات على مستوى
الصورة بأكملها.
.3أثناء تقدمنا ،يجب أن تكون الطبقات األعمق قادرة على التقاط ميزات أطول مدى
longer-range featuresللصورة ،بطريقة مشابهة للرؤية ذات المستوى األعلى في
الطبيعة.
ليكن 𝑗 [𝐗]𝑖,و 𝑗 [𝐇]𝑖,يدالن على البكسليف الموقع )𝑗 (𝑖,يف صورة اإلدخال input image
والتمثيل المخفي ،hidden representationعلى التوالي .وبالتالي ،لكي تتلقى كل وحدة من
الوحدات المخفية مدخالت من كل بكسل من وحدات البكسل المدخلة ،سننتقل من استخدام
مصفوفات الوزن ( weight matricesكما فعلنا سابقًايف )MLPsلتمثيل معلماتنا كموترات
للوزن من الدرجة الرابعة 𝖶 .لنفترض أن 𝐔 يحتوي على تحيزات ،فيمكننا التعبير رسميًا عن
الطبقة المتصلة بالكامل كـ
يعتبر التبديل من 𝖶 إلى 𝖵 تجميليًا تمامًايف الوقت الحالي نظرًا لوجود تطابق واحد إلى واحد بين
المعامالتيف كال الموترات من الدرجة الرابعة .نحن ببساطة نعيد فهرسة الرموز المنخفضة )𝑙 (𝑘,
مثل ذلك 𝑎 𝑘 = 𝑖 +و 𝑏 .𝑙 = 𝑗 +بعبارة أخرى ،وضعنا 𝑏.[𝖵]𝑖,𝑗,𝑎,𝑏 = [𝖶]𝑖,𝑗,𝑖+𝑎,𝑗+
المؤشرات 𝑎 و𝑏 تتخطى كل من اإلزاحات offsetsاإليجابية والسلبية ،وتغطي الصورة بأكملها.
بالنسبة إلى أي موقع (𝑗 )𝑖 ،يف التمثيل المخفي 𝑗 ، [𝐇]𝑖,نحسب قيمته عن طريق جمع أكثر من
بكسليف 𝑥 ،وتوسيطها )𝑗 ، (𝑖,واخذ االوزان لها بواسطة 𝑏 .[𝖵]𝑖,𝑗,𝑎,قبل أن نواصل العمل ،دعنا
نفكريف العدد اإلجمالي للمعلمات المطلوبة لطبقة واحدة single layerيف هذه المعلمات :يتم
تعيين صورة 1( 1000 × 1000ميغا بكسل) إلى تمثيل مخفي .1000 × 1000يتطلب هذا
معلمات ، 1012تتجاوز بكثير ما يمكن ألجهزة الكمبيوتر التعامل معه حاليًا.
هذا هو االلتواء !convolutionنحن نأخذ االوزان بشكل فعال وحدات البكسليف (𝑖 + 𝑎, 𝑗 +
)𝑏 بالقرب من الموقع )𝑗 (𝑖,باستخدام المعامالت 𝑏 [𝐕]𝑎,للحصول على القيمة 𝑗 .[𝐇]𝑖,الحظ
أن 𝑏[𝐕]𝑎,يحتاج إلى عدد أقل من المعامالت من 𝑏 [𝖵]𝑖,𝑗,𝑎,ألنه لم يعد يعتمد على الموقع داخل
الصورة .وبالتالي ،لم يعد عدد المعلمات المطلوبة 1012ولكن أكثر معقولية هو :1012ال يزال
لدينا االعتماد على ) .𝑎, 𝑏 ∈ (−1000,1000باختصار ،لقد أحرزنا تقدمًا كبيرًا .الشبكات
العصبية ذات التأخير الزمني ) Time-delay neural networks (TDNNsهي بعض
األمثلة األولى الستغالل هذه الفكرة (.)1989 ،Waibel et al.
Locality 7.1.2.2
اآلن دعونا نستدعي المبدأ الثاني :المحلية .Localityكما تم تحفيزنا أعاله ،نعتقد أنه ال ينبغي
علينا أن ننظر بعيدًا جدًا عن الموقع )𝑗 (𝑖,من أجل جمع المعلومات ذات الصلة لتقييم ما يجري
في 𝑗 .[𝐇]𝑖,هذا يعني أنه خارج نطاق ما ، |𝑎| > Δأو |𝑏| > Δيجب علينا ضبط = 𝑏[𝐕]𝑎,
.0بالتساوي ،يمكننا إعادة كتابة 𝑗 [𝐇]𝑖,كـ
يؤدي هذا إلى تقليل عدد المعلمات من 4 ⋅ 106إلى ، 4Δ2حيث يكون عادةً أصغر من .10
على هذا النحو ،قمنا بتقليل عدد المعلمات بمقدار 4أوامر أخرى من حيث الحجم .الحظ أن
( ،)7.1.3باختصار ،هي ما يسمى بالطبقة التالفيفية .convolutional layerالشبكات
العصبية التالفيفية ( ) CNNهي عائلة خاصة من الشبكات العصبية التي تحتوي على طبقات
تالفيفية.يف مجتمع أبحاث التعلم العميق 𝐕،يُشار إلى نواة االلتفاف ,convolution kernel
أو عامل التصفية ،filterأو ببساطة أوزان الطبقة layer’s weightsالتي تُعد معلمات قابلة
للتعلم.
بينمايف السابق ،ربما كنا قد طلبنا باليين من المعلمات لتمثيل طبقة واحدة فقطيف شبكة معالجة
الصور ،فنحن نحتاج اآلن عادةً إلى بضع مئات فقط ،دون تغيير أبعاد المدخالت أو التمثيالت
المخفية .الثمن المدفوع لهذا التخفيض الكبيريف المعلمات هو أن ميزاتنا أصبحت اآلن ترجمة
ثابتة translation invariantوأن طبقتنا يمكنها فقط دمج المعلومات المحلية ،عند تحديد
قيمة كل تنشيط مخفي .كل التعلم يعتمد على فرض التحيز االستقرائي .inductive biasعندما
يتفق هذا التحيز مع الواقع ،نحصل على نماذج ذات كفاءةيف العينة تُعمم جيدًا على البيانات غير
المرئية .لكن بالطبع ،إذا كانت هذه التحيزات ال تتفق مع الواقع ،على سبيل المثال ،إذا تبين أن
الصور ليست ثابتةيف الترجمة ،فقد تكافح نماذجنا حتى لتالئم بيانات التدريب الخاصة بنا.
57 الفصل السابع :الشبكات العصبية االلتفافية
يقودنا هذا االنخفاض الدراماتيكي dramatic reductionيف المعلمات إلى آخر رغباتنا ،أي أن
الطبقات العميقة يجب أن تمثل جوانب أكبر وأكثر تعقيدًا للصورة .يمكن تحقيق ذلك عن طريق
ادخال interleavingالطبقات الالخطية والطبقات التالفيفية بشكل متكرر.
Convolutions 7.1.3
دعونا نراجع بإيجاز سبب تسمية ( )7.1.3بااللتفاف .convolutionيف الرياضيات ،يتم تعريف
االلتفاف بين دالتين ( ،)1973 ،Rudinعلى سبيل المثال 𝑓, 𝑔: ℝ𝑑 → ℝكاالتي:
وهذا يعني أننا نقيس التداخل overlapبين 𝑓 و𝑔 متى يتم "قلب "flippedإحدى الدوال
وإزاحتها " " shiftedبواسطة 𝐱 .عندما يكون لدينا كائنات منفصلة ،discrete objectsيتحول
التكامل إلى مجموع .على سبيل المثال ،بالنسبة إلى المتجهات من مجموعة متجهات األبعاد
الالنهائية التي يمكن جمعها مربعة مع مؤشر يعمل فوق ،ℤنحصل على التعريف التالي:
بالنسبة إلى الموترات ثنائية األبعاد ،لدينا مجموع مقابل مع مؤشرات )𝑏 (𝑎,لـ 𝑓 و(𝑖 − 𝑎, 𝑗 −
)𝑏 لـ 𝑔 ،على التوالي:
يبدو هذا مشابهًا لـ ( ،)7.1.3مع اختالف رئيسي واحد .بدالً من استخدام )𝑏 ،(𝑖 + 𝑎, 𝑗 +
نستخدم االختالف differenceبدالً من ذلك .الحظ ،مع ذلك ،أن هذا التمييز distinction
هويف الغالب تجميلي حيث يمكننا دائمًا مطابقة التدوين بين ( )7.1.3و ( .)7.1.6يصف تعريفنا
األصلييف ( )7.1.3بشكل أكثر مالءمة االرتباط المتبادل .cross-correlationسنعود إلى هذا
في القسم التالي.
Channels 7.1.4
بالعودة إلى كاشف والدو ،Waldo detectorدعونا نرى كيف يبدو هذا .تلتقط الطبقة التالفيفية
نوافذ ذات حجم معين وتزن شدة وفقًا للفلتر 𝖵 ،كما هو موضحيف الشكل .7.1.2قد نهدف إلى
تعلم نموذج بحيث حيثما تكون " "waldonessهي األعلى ،يجب أن نجد ذروةيف تمثيالت
الطبقة المخفية.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 58
هناك مشكلة واحدة فقطيف هذا النهج .حتى اآلن ،تجاهلنا بسعادة أن الصور تتكون من 3قنوات:
األحمر واألخضر واألزرق .باختصار ،الصور ليست كائنات ثنائية األبعاد بل هي موترات من
الدرجة الثالثة ،تتميز باالرتفاع والعرض والقناة ،على سبيل المثال ،مع شكل × 1024 × 1024
3بكسل.يف حين أن أول محورين يتعلقان بالعالقات المكانية ،spatial relationshipsيمكن
اعتبار الثالث على أنه تعيين تمثيل متعدد األبعاد لكل موقع بكسل .وبالتالي نقوم بفهرسة 𝖷 كـ
𝑘 .[𝖷]𝑖,𝑗,يجب أن يتكيف الفلتر التالفيفي convolutional filterوفقًا لذلك .بدال من
𝑏 ،[𝐕]𝑎,لدينا اآلن 𝑐.[𝖵]𝑎,𝑏,
عالوة على ذلك ،كما أن مدخالتنا تتكون من موتر من الدرجة الثالثة ،فقد تبين أنها فكرة جيدة
لصياغة تمثيالتنا المخفية بالمثل كموترات من الدرجة الثالثة 𝖧 .بعبارة أخرى ،بدالً من مجرد
وجود تمثيل مخفي واحد يتوافق مع كل موقع مكاني ،نريد متجهًا كامالً للتمثيالت المخفية
المقابلة لكل موقع مكاني .يمكننا التفكيريف التمثيالت المخفية على أنها تتألف من عدد من
الشبكات ثنائية األبعاد المكدسة فوق بعضها البعض .كما هو الحاليف المدخالت ،تسمى هذه
أحيانًا القنوات .channelsيطلق عليها أيضًا أحيانًا خرائط المعالم ،feature mapsحيث يوفر
كل منها مجموعة مكانية من المعالم المكتسبة للطبقة التالية .بشكل بديهي ،قد تتخيل أنهيف
الطبقات السفلية األقرب إلى المدخالت ،يمكن أن تصبح بعض القنوات متخصصة للتعرف على
الحواف edgesبينما يمكن لآلخرين التعرف على األنسجة .textures
لدعم قنوات متعددةيف كل من المدخالت (𝖷) والتمثيالت المخفية (𝖧) ،يمكننا إضافة إحداثي
رابع إلى 𝖵 .[𝖵]𝑎,𝑏,𝑐,𝑑 :نجمع كل شيء معًا لدينا:
59 الفصل السابع :الشبكات العصبية االلتفافية
حيث 𝑑 فهرسة قنوات اإلخراجيف التمثيالت المخفية 𝖧 .ستستمر الطبقة التالفيفية الالحقةيف
أخذ موتر من الدرجة الثالثة 𝖧 ،كمدخل .لكونها أكثر عمومية )7.1.7( ،هو تعريف الطبقة
التالفيفية لقنوات متعددة ،حيث تكون النواة kernelأو فلتر الطبقة.
ال يزال هناك العديد من العمليات التي نحتاج إلى معالجتها .على سبيل المثال ،نحتاج إلى معرفة
كيفية دمج جميع التمثيالت المخفيةيف ناتج واحد ،على سبيل المثال ،ما إذا كان هناك والدو
Waldoيف أي مكانيف الصورة .نحتاج أيضًا إلى تحديد كيفية حساب األشياء بكفاءة ،وكيفية
الجمع بين طبقات متعددة ،ودوال التنشيط المناسبة ،وكيفية اتخاذ خيارات تصميم معقولة
إلنتاج شبكات فعالةيف الممارسة .ننتقل إلى هذه القضايايف بقية الفصل.
7.1.5
في هذا القسم اشتقنا بُ نية الشبكات العصبية التالفيفية من المبادئ األولى.يف حين أنه من غير
الواضح ما إذا كان هذا هو ما أدى إلى اختراع شبكات ،CNNفمن المرضي معرفة أنها الخيار
الصحيح عند تطبيق مبادئ معقولة لكيفية عمل معالجة الصور وخوارزميات الرؤية الحاسوبية،
على األقل عند المستويات األدنى .على وجه الخصوص ،يشير ثبات الترجمة translation
invarianceيف الصور إلى أنه سيتم التعامل مع جميع بقع الصورة بنفس الطريقة .تعني المنطقة
المحلية Localityأنه سيتم استخدام جوار صغير فقط من وحدات البكسل لحساب التمثيالت
المخفية المقابلة .بعض اإلشارات المبكرة لشبكات CNNهييف شكل Neocognitron
(.)1982 ،Fukushima
المبدأ الثاني الذي واجهناهيف تفكيرنا هو كيفية تقليل عدد المعلماتيف فئة دالة دون الحد من
قوتها التعبيرية ،على األقل ،عندما تصمد افتراضات معينةيف النموذج .لقد رأينا انخفاضًا كبيرًايف
التعقيد نتيجة لهذا التقييد ،وتحويل المشكالت غير القابلة للتنفيذ من الناحية الحسابية
واإلحصائية إلى نماذج يمكن تتبعها.
سمحت لنا إضافة القنوات channelsبإعادة بعض التعقيد الذي فقد بسبب القيود المفروضة
على النواة التالفيفية convolutional kernelمن خالل المحلية وثبات الترجمة .الحظ أن
القنوات هي إضافة طبيعية إلى حد ما تتجاوز األحمر واألخضر واألزرق .العديد من صور األقمار
الصناعية ،خاصة للزراعة واألرصاد الجوية ،لديها عشرات إلى مئات القنوات ،وتولد صورًا فائقة
الطيف بدالً من ذلك .يقدمون بيانات حول العديد من األطوال الموجية المختلفة .فيما يلي سوف
نرى كيفية استخدام التالفيف بشكل فعال لمعالجة أبعاد الصور التي تعمل عليها ،وكيفية االنتقال
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 60
من التمثيل القائم على الموقع location-basedإلى التمثيل القائم على القناة channel-
basedوكيفية التعامل مع عدد كبير من الفئات بكفاءة.
7.1.6
تذكر أن الطبقات التالفيفية convolutional layersهي تسمية خاطئة بالمعنى الدقيق للكلمة،
ألن العمليات التي تعبر عنها توصف بدقة أكبر على أنها ارتباطات متبادلة .cross-correlations
بناءً على أوصافنا للطبقات التالفيفيةيف القسم ،7.1يف مثل هذه الطبقة ،يتم دمج موتر اإلدخال
61 الفصل السابع :الشبكات العصبية االلتفافية
input tensorوموتّر النواة kernel tensorإلنتاج موتر ناتج output tensorمن خالل
عملية االرتباط المتبادل .cross-correlation
دعنا نتجاهل القنوات channelsيف الوقت الحالي ونرى كيف يعمل ذلك مع البيانات ثنائية
األبعاد والتمثيالت المخفية.يف الشكل ،7.2.1المدخالت عبارة عن موتر ثنائي األبعاد بارتفاع
3وعرض .3ونضع عالمة على شكل موتر كالتالي 3 × 3أو ( .)3،3ارتفاع وعرض النواة
كالهما .2شكل نافذة النواة ( kernel windowأو نافذة االلتفاف convolution
)windowيُعطى بارتفاع وعرض النواة (هنا .)2 × 2
في عملية االرتباط المتبادل ثنائية األبعاد ،نبدأ مع نافذة االلتفاف الموضوعةيف الزاوية اليسرى
العليا من موتر اإلدخال ونزلقها عبر موتر اإلدخال ،من اليسار إلى اليمين ومن أعلى إلى أسفل.
عندما تنزلق نافذة االلتفاف إلى موضع معين ،يتم ضرب مستشعر اإلدخال الفرعي الموجوديف
تلك النافذة وموتّر النواة بطريقة عنصرية elementwiseويتم تلخيص الموتر الناتج إلنتاج قيمة
عددية واحدة .تعطي هذه النتيجة قيمة موتر اإلخراجيف الموقع المقابل .هنا ،موتر اإلخراج له
ارتفاع 2وعرض 2ويتم اشتقاق العناصر األربعة من عملية االرتباط المتبادل ثنائية األبعاد:
0 × 0 + 1 × 1 + 3 × 2 + 4 × 3 = 19,
1 × 0 + 2 × 1 + 4 × 2 + 5 × 3 = 25,
3 × 0 + 4 × 1 + 6 × 2 + 7 × 3 = 37,
4 × 0 + 5 × 1 + 7 × 2 + 8 × 3 = 43.
الحظ أنه على طول كل محور ،يكون حجم اإلخراج أصغر قليالً من حجم اإلدخال .نظرًا ألن
النواة تحتوي على عرض وارتفاع أكبر من واحد ،يمكننا فقط حساب االرتباط المتبادل للمواقع
التي تتالءم فيها النواة بالكامل مع الصورة ،ويعطى حجم اإلخراج من خالل حجم اإلدخال
𝑤𝑛 × 𝑛ℎمطروحًا منه حجم نواة االلتفاف 𝑤𝑘 × 𝑘ℎعبر
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 62
تربط الطبقة التالفيفية Convolutional Layerبين المدخالت والنواة وتضيف تحيزًا قياسيًا
إلنتاج مخرجات .المعلمتان للطبقة التالفيفية هما النواة kernelوالتحيز القياسي .scalar bias
عند تدريب النماذج على أساس الطبقات التالفيفية ،نقوم عادةً بتهيئة النواة بشكل عشوائي ،تمامًا
كما نفعل مع طبقة متصلة بالكامل .fully connected layer
63 الفصل السابع :الشبكات العصبية االلتفافية
نحن اآلن جاهزون لتنفيذ طبقة تالفيفية ثنائية األبعاد بناءً على دالة corr2dالمحددة أعاله.يف
طريقة المُنشئ __ ،__initنعلن الوزن weightوالتحيز biasكمعاملين للنموذج .تستدعي
دالة االنتشار األمامي الدالة corr2dوتضيف التحيز.
class Conv2D(tf.keras.layers.Layer):
def __init__(self):
)(__super().__init
)initializer=initializer
self.bias = self.add_weight(name='b', shape=(1,
),
)initializer=initializer
دعنا نتوقف لحظة لتحليل تطبيق بسيط لطبقة تالفيفية :اكتشاف حافة كائنيف صورة من خالل
إيجاد موقع تغيير البكسل .أوالً ،نقوم ببناء "صورة" لـ 6 × 8بكسل .األعمدة األربعة الوسطى
سوداء ( )0والباقي بيضاء (.)1
)corr2d(tf.transpose(X), K
<tf.Variable 'Variable:0' shape=(8, 5) dtype=float32,
=numpy
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
65 الفصل السابع :الشبكات العصبية االلتفافية
يُعد تصميم كاشف الحواف باالختالفات المحدودة ] [1, -1أمرًا رائعًا إذا علمنا أن هذا هو
بالضبط ما نبحث عنه .ومع ذلك ،عندما ننظر إلى نوى أكبر ،ونأخذيف االعتبار طبقات التالفيف
المتتالية ،فقد يكون من المستحيل التحديد الدقيق لما يجب أن يفعله كل فلتر يدويًا.
اآلن دعونا نرى ما إذا كان بإمكاننا تعلم النواة التي ولدت Yمن Xمن خالل النظر إلى أزواج
اإلدخال واإلخراج فقط .نقوم أوالً ببناء طبقة تالفيفية وتهيئة نواتها كموتّر عشوائي .بعد ذلك،يف
كل تكرار ،سنستخدم الخطأ التربيعي لمقارنة Yبإخراج الطبقة التالفيفية .يمكننا بعد ذلك
حساب التدرج لتحديث النواة .من أجل البساطة ،فيما يلي نستخدم الكالس المدمج للطبقات
التالفيفية ثنائية األبعاد ونتجاهل التحيز.
)Y_hat = conv2d(X
for i in range(10):
)with tf.GradientTape(watch_accessed_variables=False
as g:
)]g.watch(conv2d.weights[0
)Y_hat = conv2d(X
l = (abs(Y_hat - Y)) ** 2
# Update the kernel
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 66
في الواقع ،موتر النواة المكتسبة قريب بشكل ملحوظ من موتر النواة Kالذي حددناه سابقًا.
من الجدير بالذكر أنه نظرًا ألن النوى يتم تعلمها من البياناتيف التعلم العميق ،فإن مخرجات
الطبقات التالفيفية تظل غير متأثرة بغض النظر عن أن هذه الطبقات تؤدي إما عمليات االلتفاف
الصارمة أو عمليات االرتباط المتبادل.
لتوضيح ذلك ،افترض أن الطبقة التالفيفية تقوم بعمل ارتباط متبادل وتتعرف على النواةيف الشكل
،7.2.1والتي يشار إليها هنا بالمصفوفة 𝐊 .بافتراض أن الشروط األخرى تظل دون تغيير ،عندما
تقوم هذه الطبقة بإجراء التفاف صارم strict convolutionبدالً من ذلك ،فإن النواة المتعلمة
𝐊 ′ learned kernelستكون كما 𝐊 بعد قلبها أفقيًا وعموديًا .وهذا يعني أنه عندما تقوم الطبقة
67 الفصل السابع :الشبكات العصبية االلتفافية
التالفيفية بإجراء التفاف صارم للمدخالتيف الشكل ،7.2.1وسيتم الحصول على نفس الخرج
𝐊 ′في الشكل ( 7.2.1االرتباط المتبادل للمدخل و 𝐊).
كما هو موضحيف القسم ،7.1.4يُطلق أحيانًا على ناتج الطبقة التالفيفيةيف الشكل 7.2.1اسم
خريطة المعالم ،feature mapحيث يمكن اعتبارها التمثيالت المتعلمة learned
( representationsالسمات)يف األبعاد المكانية ( spatial dimensionsمثل العرض
واالرتفاع) إلى الطبقة الالحقة.يف شبكات ،CNNبالنسبة ألي عنصريف طبقة ما ،يشير مجالها
التأثيري receptive fieldإلى جميع العناصر (من جميع الطبقات السابقة) التي قد تؤثر على
حساب 𝑥 أثناء االنتشار األمامي .الحظ أن حقل التأثير قد يكون أكبر من الحجم الفعلي لإلدخال.
دعونا نواصل استخدام الشكل 7.2.1لشرح مجال التأثير .بالنظر إلى نواة االلتفاف ،2 × 2فإن
مجال التأثير لعنصر اإلخراج المظلل (للقيمة )19هو العناصر األربعةيف الجزء المظلل من
المدخالت .دعنا اآلن نشير إلى المخرجات 2 × 2على 𝐘 وهي أعمق CNNمع طبقة تالفيفية
إضافية 2 × 2تأخذ 𝐘 كمدخالتها ،وتخرج عنصرًا واحدًا 𝑧.يف هذه الحالة ،يشتمل حقل التأثير
لـ 𝑧 على 𝐘 لجميع العناصر األربعة لـ 𝐘 ،بينما يشتمل حقل التأثير على اإلدخال على جميع
عناصر اإلدخال التسعة .وبالتالي ،عندما يحتاج أي عنصريف خريطة المعالم إلى مجال تأثير أكبر
الكتشاف ميزات اإلدخال عبر منطقة أوسع ،يمكننا بناء شبكة أعمق.
الشكل 7.2.2الشكل والتعليق مأخوذ من :)1987( Fieldمثال على الترميز بست قنوات
مختلفة( .يسار) أمثلة على ستة أنواع من أجهزة االستشعار المرتبطة بكل قناة( .يمين) التفاف
للصورةيف (األوسط) مع ستة أجهزة استشعار موضحةيف (يسار) .يتم تحديد استجابة أجهزة
االستشعار الفردية عن طريق أخذ عينات من هذه الصور التي تمت تصفيتها على مسافة
تتناسب مع حجم المستشعر (موضح بالنقاط) .يوضح هذا الرسم البياني استجابة المستشعرات
المتماثلة فقط.
كما اتضح ،فإن هذه العالقة تنطبق حتى على الميزات المحسوبة بواسطة طبقات أعمق من
الشبكات المدربة على مهام تصنيف الصور ،كما هو موضح على سبيل المثال،يف Kuzovkin
.)2018( .et alيكفي القول ،لقد أثبتت التالفيف أنها أداة قوية بشكل ال يصدق للرؤية
الحاسوبية ،سواءيف علم األحياء أويف الكود .على هذا النحو ،ليس من المستغرب (بعد فوات
األوان) أنهم بشروا بالنجاح األخيريف التعلم العميق.
7.2.7
من الذاكرة ،عندما يتعلق األمر بتحسين التالفيف.يف حين أن هذا قد ال يؤدي إلى تصميمات
مثالية للتطبيقات األخرى ،إال أنه يفتح الباب أمام الرؤية الحاسوبيةيف كل مكان وبأسعار معقولة.
من حيث التالفيف نفسها ،يمكن استخدامها ألغراض عديدة مثل اكتشاف الحواف والخطوط،
أو تعتيم الصور ،blur imagesأو شحذها .sharpenواألهم من ذلك ،ليس من الضروري أن
يخترع اإلحصائي (أو المهندس) الفالتر المناسبة .بدالً من ذلك ،يمكننا ببساطة تعلمها من
البيانات .يحل هذا محل االستدالل الهندسي المميز باإلحصاءات القائمة على األدلة .أخيرًا ،ومن
دواعي سرورنا أن هذه المرشحات ليست مفيدة فقط لبناء شبكات عميقة ولكنها تتوافق أيضًا مع
الحقول المستقبلة وخرائط الميزاتيف الدماغ .وهذا يمنحنا الثقة بأننا نسير على الطريق الصحيح.
7.2.8
) :1) × (𝑛𝑤 − 𝑘𝑤 + 1يمكننا فقط تحويل shiftنواة االلتفاف حتى اآلن حتى نفاد وحدات
البكسل لتطبيق االلتفاف عليها.
فيما يلي سوف نستكشف عددًا من التقنيات ،بمايف ذلك الحشو والتالفيف المتدرجة strided
،convolutionsالتي توفر مزيدًا من التحكميف حجم اإلخراج .كدافع ،الحظ أنه نظرًا ألن النوى
عمومًا لها عرض وارتفاع أكبر من ،1بعد تطبيق العديد من التالفيف المتتالية ،فإننا نميل إلى
الوصول إلى مخرجات أصغر بكثير من مدخالتنا .إذا بدأنا بصورة بكسل ،240 × 240فإن
10طبقات 5 × 5تالفيفية تقلل الصورة إلى بكسل ،200 × 200وتقطع 30%من الصورة
وتزيل أي معلومات مثيرة لالهتمام حول حدود الصورة األصلية .الحشو Paddingهو األداة
األكثر شيوعًا للتعامل مع هذه المشكلة.يف حاالت أخرى ،قد نرغبيف تقليل األبعاد بشكل كبير،
على سبيل المثال ،إذا وجدنا أن دقة اإلدخال األصلية غير عملية .التالفيف المتوترة Strided
convolutionsهي تقنية شائعة يمكن أن تساعديف هذه الحاالت.
Padding 7.3.1
كما هو موضح أعاله ،فإن إحدى المشكالت الصعبة عند تطبيق الطبقات التالفيفية هي أننا نميل
إلى فقد وحدات البكسليف محيط صورتنا .ضعيف اعتبارك الشكل 7.3.1الذي يصور استخدام
البكسل كدالة لحجم نواة االلتفاف والموضع داخل الصورة .نادرًا ما يتم استخدام البكسليف
الزوايا على اإلطالق.
نظرًا ألننا عادةً ما نستخدم نوى صغيرة ،small kernelsألي التفاف معين ،فقد نفقد عددًا قليالً
فقط من وحدات البكسل ،لكن هذا يمكن أن يضيف ألننا نطبق العديد من الطبقات التالفيفية
المتعاقبة .يتمثل أحد الحلول المباشرة لهذه المشكلةيف إضافة وحدات بكسل إضافية من الحشو
حول حدود صورة اإلدخال لدينا ،وبالتالي زيادة الحجم الفعال للصورة .عادة ،نقوم بتعيين قيم
وحدات البكسل اإلضافية على صفر.يف الشكل ،7.3.2نقوم بتعبئة (حشو) أحد المدخالت
،3 × 3وزيادة حجمه إلى .5 × 5ثم يزيد الناتج المقابل إلى مصفوفة .4 × 4األجزاء المظللة
71 الفصل السابع :الشبكات العصبية االلتفافية
هي أول عنصر إخراج باإلضافة إلى عناصر موتر اإلدخال والنواة المستخدمة لحساب اإلخراج:
.0 × 0 + 0 × 1 + 0 × 2 + 0 × 3 = 0
بشكل عام ،إذا أضفنا إجمالي صفوف الحشو ( 𝑝ℎنصفها تقريبًايف األعلى ونصفيف األسفل)
ومجموعًا من أعمدة الحشو 𝑤𝑝 (نصفها تقريبًا على اليسار ونصفها على اليمين) ،فسيكون شكل
اإلخراج
تستخدم شبكات CNNنواة التفاف ذات قيم عرض وعرض فردية ،مثل 1أو 3أو 5أو .7
اختيار أحجام نواة فردية له فائدة أنه يمكننا الحفاظ على األبعاد أثناء الحشو بنفس عدد الصفوف
في األعلى واألسفل ،ونفس عدد األعمدة على اليسار واليمين.
عالوة على ذلك ،فإن هذه الممارسة المتمثلةيف استخدام نوى فردية وحشو للحفاظ على األبعاد
بدقة تقدم فائدة كتابية .بالنسبة ألي موتر ثنائي األبعاد ، Xعندما يكون حجم النواة فرديًا ويكون
عدد صفوف وأعمدة الحشو متماثلًايف جميع الجوانب ،مما ينتج عنه مخرجات بنفس ارتفاع
وعرض المدخالت ،فنحن نعلم أن الناتج ] Y[i, jيتم حسابه من خالل االرتباط المتبادل
بين المدخالت ونواة االلتفاف مع النافذة المتمركزة على ].X[i, j
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 72
بكسل من1 ونطبق3 قمنا بإنشاء طبقة تالفيفية ثنائية األبعاد بارتفاع وعرض،في المثال التالي
نجد أن ارتفاع وعرض المخرج يساوي،8 بإدخال ارتفاع وعرض.الحشو على جميع الجوانب
. أيضًا8
import tensorflow as tf
يمكننا أن نجعل الناتج والمدخل لهما نفس االرتفاع،عندما يختلف ارتفاع وعرض نواة االلتفاف
.والعرض عن طريق تعيين أرقام حشو مختلفة لالرتفاع والعرض
Stride 7.3.2
نشير إلى عدد الصفوف واألعمدة التي يتم اجتيازهايف كل شريحة كخطوة .strideحتى اآلن،
استخدمنا عدد الخطوات ،1لكل من الطول والعرض.يف بعض األحيان ،قد نرغبيف اتخاذ خطوة
أكبر .يوضح الشكل 7.3.3عملية االرتباط المتبادل ثنائية األبعاد بخطوة 3عموديًا و 2أفقيًا.
األجزاء المظللة هي عناصر اإلخراج باإلضافة إلى عناصر موتر المدخالت والنواة المستخدمة
لحساب اإلخراج0 × 0 + 6 × 1 + 0 ×،0 × 0 + 0 × 1 + 1 × 2 + 2 × 3 = 8 :
. 2 + 0 × 3 = 6يمكننا أن نرى أنه عند إنشاء العنصر الثاني من العمود األول ،تنزلق نافذة
االلتفاف إلى أسفل ثالثة صفوف .تنقل نافذة االلتفاف عمودين إلى اليمين عند إنشاء العنصر
الثاني من الصف األول .عندما تستمر نافذة االلتفافيف تحريك عمودين إلى اليمين على اإلدخال،
ال يوجد إخراج ألن عنصر اإلدخال ال يمكن أن يمأل النافذة (إال إذا أضفنا عمودًا آخر من الحشو).
بشكل عام ،عندما تكون خطوة االرتفاع 𝑠ℎوخطوة العرض 𝑤𝑠 ،يكون شكل اإلخراج
إذا قمنا بتعيين 𝑝ℎ = 𝑘ℎ − 1ثم ،𝑝𝑤 = 𝑘𝑤 − 1فيمكن تبسيط شكل اإلخراج إلى ⌊(𝑛ℎ +
⌋ 𝑤𝑠 .𝑠ℎ − 1)/𝑠ℎ ⌋ × ⌊(𝑛𝑤 + 𝑠𝑤 − 1)/للمضي قدمًا ،إذا كان ارتفاع اإلدخال وعرضه
قابلين للقسمة على خطوات االرتفاع والعرض ،فسيكون شكل اإلخراج (𝑛ℎ /𝑠ℎ ) × (𝑛𝑤 /
) 𝑤𝑠.
أدناه ،قمنا بتعيين الخطوات على كل من االرتفاع والعرض على ،2وبالتالي خفض ارتفاع
المدخالت وعرضها إلى النصف.
7.3.3
يمكن أن يؤدي الحشو Paddingإلى زيادة ارتفاع وعرض اإلخراج .غالبًا ما يستخدم هذا إلعطاء
اإلخراج نفس االرتفاع والعرض مثل المدخالت لتجنب االنكماش shrinkageغير المرغوب
فيه لإلخراج .عالوة على ذلك ،فإنه يضمن استخدام جميع وحدات البكسل بشكل متكرر .عادةً
ما نختار حشوة متماثلة symmetric paddingعلى جانبي ارتفاع المدخالت وعرضها.يف هذه
الحالة نشير إلى الحشو ) 𝑤𝑝 .(𝑝ℎ ,األكثر شيوعًا التي نضعها 𝑤𝑝 = ، 𝑝ℎوفي هذه الحالة نذكر
ببساطة أننا نختار الحشو 𝑝.
اتفاقية مماثلة تنطبق على الخطوات .عندما تتطابق الخطوة األفقية 𝑠ℎوالخطوة العمودية 𝑤𝑠،
نتحدث ببساطة عن الخطوة 𝑠 .يمكن أن تقلل الخطوة من دقة اإلخراج ،على سبيل المثال تقليل
ارتفاع وعرض اإلخراج إلى 𝑛 1/من ارتفاع وعرض المدخالت لـ .𝑛 > 1بشكل افتراضي،
تكون المساحة المتروكة 0والخطوة .1
حتى اآلن كل الحشو الذي ناقشناه ببساطة الصور الممتدة مع األصفار .هذا له فائدة حسابية كبيرة
ألنه من السهل تحقيقه .عالوة على ذلك ،يمكن تصميم المشغلين لالستفادة من هذه الحشوة
ضمنيًا دون الحاجة إلى تخصيص ذاكرة إضافية.يف الوقت نفسه ،يسمح لشبكات CNNبتشفير
معلومات الموقع الضمنية داخل الصورة ،وذلك ببساطة عن طريق التعرف على مكان وجود
75 الفصل السابع :الشبكات العصبية االلتفافية
7.3.4
.1بالنظر إلى مثال الكود األخير في هذا القسم مع حجم النواة والحشو والخطوة ،احسب
شكل اإلخراج للتحقق مما إذا كان متوافقًا مع النتيجة التجريبية.
.2بالنسبة لإلشارات الصوتية ،audio signalsما الذي يتوافق مع الخطوة 2؟
.3قم بتنفيذ حشوة متطابقة ،mirror paddingأي الحشو حيث يتم عكس قيم الحدود
ببساطة لتوسيع الموترات.
.4ما هي الفوائد الحسابية computational benefitsلخطوة أكبر من 1؟
.5ما الفوائد اإلحصائية statistical benefitsلخطوة أكبر من 1؟
1
.6كيف ستنفذ خطوة من 2؟ مع ماذا يتوافق؟ متى يكون هذا مفيدا؟
عندما نضيف قنوات إلى المزيج ،تصبح كل من مدخالتنا والتمثيالت المخفية موترات ثالثية
األبعاد .على سبيل المثال ،كل صورة إدخال RGBلها شكل 𝑤 × .3 × ℎنشير إلى هذا
المحور ،بحجم ،3كبعد القناة .إن فكرة القنوات قديمة قدم شبكات CNNنفسها .على سبيل
المثال ،يستخدمها .)1995,. LeCun et al(،LeNet5.يف هذا القسم ،سوف نلقي نظرة أعمق
على نواة االلتفاف ذات المدخالت المتعددة وقنوات اإلخراج المتعددة.
عندما تحتوي بيانات اإلدخال على قنوات متعددة ،multiple channelsنحتاج إلى إنشاء نواة
التفاف بنفس عدد قنوات اإلدخال مثل بيانات اإلدخال ،بحيث يمكنها إجراء ارتباط متبادل مع
بيانات اإلدخال .بافتراض أن عدد القنوات لبيانات اإلدخال هو 𝑖𝑐 ،يجب أيضًا أن يكون عدد
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 76
قنوات اإلدخال لنواة االلتفاف 𝑖𝑐 .إذا كان شكل نافذة نواة االلتفاف لدينا هو 𝑤𝑘 × ،𝑘ℎعندما
، 𝑐𝑖 = 1يمكننا التفكيريف نواة االلتواء على أنها مجرد موتر ثنائي األبعاد للشكل 𝑤𝑘 × .𝑘ℎ
ومع ذلك ،عندما 𝑐𝑖 > 1نحتاج إلى نواة تحتوي على موتر الشكل 𝑤𝑘 × 𝑘ℎلكل قناة إدخال.
يؤدي ربط هذه الموترات معًا إلى إنتاج نواة التفاف للشكل 𝑤𝑘 × .𝑐𝑖 × 𝑘ℎنظرًا ألن لكل من
نواة اإلدخال وااللتفاف لديها 𝑖𝑐 قنوات ،يمكننا إجراء عملية االرتباط المتبادل على موتر ثنائي
األبعاد لإلدخال والموتر ثنائي األبعاد لنواة االلتفاف لكل قناة ،مع إضافة نتائج 𝑖𝑐 معًا (التجميع
عبر القنوات) إلنتاج موتر ثنائي األبعاد .هذا هو نتيجة االرتباط المتبادل ثنائي األبعاد بين إدخال
متعدد القنوات ونواة التفاف متعددة المدخالت.
يقدم الشكل 7.4.1مثاالً على الترابط الثنائي األبعاد مع قناتي االدخال .األجزاء المظللة هي أول
عنصر إخراج باإلضافة إلى عناصر موتر اإلدخال والنواة المستخدمة لحساب اإلخراج(1 × 1 +:
.2 × 2 + 4 × 3 + 5 × 4) + (0 × 0 + 1 × 1 + 3 × 2 + 4 × 3) = 56
للتأكد من أننا نفهم حقًا ما يجري هنا ،يمكننا تنفيذ عمليات االرتباط المتبادل مع قنوات اإلدخال
المتعددة بأنفسنا .الحظ أن كل ما نقوم به هو إجراء عملية االرتباط المتبادل لكل قناة ثم جمع
النتائج.
)corr2d_multi_in(X, K
=<tf.Tensor: shape=(2, 2), dtype=float32, numpy
array([[ 56., 72.],
>)[104., 120.]], dtype=float32
Multiple Output Channels 7.4.2
بغض النظر عن عدد قنوات اإلدخال ،فقد انتهى بنا المطاف دائمًا بقناة إخراج واحدة .ومع ذلك،
كما ناقشنايف القسم ،7.1.4فقد تبين أنه من الضروري وجود قنوات متعددةيف كل طبقة.يف أكثر
هياكل الشبكات العصبية شيوعًا ،نقوم بالفعل بزيادة بُعد القناة أثناء تعمقنايف الشبكة العصبية،
وعادةً ما يتم االختزال لموازنة الدقة المكانية للحصول على عمق أكبر للقناة .حدسيًا ،يمكنك
التفكيريف كل قناة على أنها تستجيب لمجموعة مختلفة من الميزات .الواقع أكثر تعقيدًا من هذا
بقليل .قد يشير التفسير الساذج إلى أن التمثيالت يتم تعلمها بشكل مستقل لكل بكسل أو لكل
قناة .بدالً من ذلك ،يتم تحسين القنوات لتكون مفيدة بشكل مشترك .هذا يعني أنه بدالً من تعيين
قناة واحدة لكاشف الحافة ،فقد يعني ذلك ببساطة أن بعض االتجاهيف مساحة القناة يتوافق مع
اكتشاف الحواف.
قم باإلشارة إلى 𝑖𝑐 و 𝑜𝑐 عدد قنوات اإلدخال واإلخراج ،على التوالي ،وليكن 𝑘ℎو 𝑤𝑘 ارتفاع
النواة وعرضها .للحصول على مخرجات مع قنوات متعددة ،يمكننا إنشاء موتر نواة للشكل لكل
قناة إخراج .نجمعها على بُعد قناة اإلخراج ،بحيث يكون شكل نواة االلتفاف
𝑤𝑘 × .𝑐𝑜 × 𝑐𝑖 × 𝑘ℎيف عمليات االرتباط المتبادل ،يتم حساب النتيجة على كل قناة إخراج من
نواة االلتفاف المقابلة لقناة اإلخراج هذه وتأخذ المدخالت من جميع القنواتيف موتر اإلدخال.
نقوم بتنفيذ دالة االرتباط المتبادل cross-correlation functionلحساب ناتج قنوات متعددة
كما هو موضح أدناه.
أدناه ،نقوم بإجراء عمليات االرتباط المتبادل على موتر اإلدخال Xمع موتر النواة .Kاآلن يحتوي
اإلخراج على 3قنوات .تتوافق نتيجة القناة األولى مع نتيجة موتر اإلدخال السابق Xوالقناة
متعددة المدخالت ،نواة قناة اإلخراج األحادي.
)corr2d_multi_in_out(X, K
=<tf.Tensor: shape=(3, 2, 2), dtype=float32, numpy
array([[[ 56., 72.],
[104., 120.]],
نظرًا الستخدام الحد األدنى من النافذة ،يفقد االلتفاف 1 × 1قدرة الطبقات التالفيفية األكبر
على التعرف ع لى األنماط المكونة من تفاعالت بين العناصر المجاورةيف أبعاد االرتفاع والعرض.
الحساب الوحيد لاللتفاف 1 × 1يحدث على بُعد القناة .channel dimension
79 الفصل السابع :الشبكات العصبية االلتفافية
يوضح الشكل 7.4.2حساب االرتباط المتبادل باستخدام نواة االلتفاف 1 × 1مع 3قنوات
إدخال وقناتين إخراج .الحظ أن المدخالت والمخرجات لها نفس االرتفاع والعرض .يتم اشتقاق
كل عنصريف اإلخراج من مجموعة خطية من العناصريف نفس الموضعيف صورة اإلدخال .يمكنك
التفكيريف الطبقة التالفيفية 1 × 1على أنها تشكل طبقة متصلة بالكامل مطبقةيف كل موقع بكسل
فردي لتحويل قيم اإلدخال المقابلة 𝑖𝑐 إلى قيم إخراج 𝑜𝑐 .نظرًا ألن هذه ال تزال طبقة تالفيفية،
يتم ربط األوزان عبر موقع البكسل .وبالتالي فإن الطبقة التالفيفية 1 × 1تتطلب أوزانًا (باإلضافة
إلى التحيز) .الحظ أيضًا أن الطبقات التالفيفية تتبعها عادةً الالخطية .هذا يضمن أن التالفيف
1 × 1ال يمكن ببساطة طيهايف تالفيف أخرى.
الشكل 7.4.2يستخدم حساب االرتباط التبادلي نواة االلتفاف 1 × 1مع 3قنوات إدخال
وقناتي إخراج .المدخالت والمخرجات لها نفس االرتفاع والعرض.
دعنا نتحقق مما إذا كان هذا يعمليف الممارسة العملية :نقوم بتنفيذ التفاف 1 × 1باستخدام
طبقة متصلة بالكامل .الشيء الوحيد هو أننا نحتاج إلى إجراء بعض التعديالت على شكل البيانات
قبل وبعد عملية ضرب المصفوفة.
الحظ ،مع ذلك ،أن هذه المرونة لها ثمن .بالنظر إلى صورة مع حجم)𝑤 × ،(ℎفإن تكلفة
حساب االلتفاف 𝑘 × 𝑘 هي ) .𝒪(ℎ ⋅ 𝑤 ⋅ 𝑘 2بالنسبة 𝑖𝑐 و 𝑜𝑐 قنوات اإلدخال واإلخراج على
التوالي ،يزداد هذا إلى ) 𝑜𝑐 ⋅ 𝑖𝑐 ⋅ .𝒪(ℎ ⋅ 𝑤 ⋅ 𝑘 2بالنسبة لصورة 256 × 256بكسل التي
تحتوي على نواة 5 × 5و 128قنوات إدخال وإخراج على التوالي ،فإن هذا يصل إلى أكثر من
53مليار عملية (نحسب المضاعفات واإلضافات بشكل منفصل).يف وقت الحق سنواجه
استراتيجيات فعالة لخفض التكلفة ،على سبيل المثال ،من خالل اشتراط أن تكون العمليات على
مستوى القناة قطرية ،مما يؤدي إلى هياكل مثل .)2017 ،.Xie et al(،ResNeXt
7.4.5
.1افترض أن لدينا نواة التفاف بالحجم 𝑘2 ،𝑘1وعلى التوالي (مع عدم وجود نواة غير
خطية بينهما).
.1إثبت أنه يمكن التعبير عن نتيجة العملية من خالل التفاف واحد single
.convolution
.2ما هي أبعاد االلتفاف الواحد المكافئ؟
.3هل العكس صحيح ،أي هل يمكنك دائمًا تحليل االلتفاف إلى قسمين أصغر؟
.2افترض مدخالً للشكل 𝑤 × 𝑐𝑖 × ℎونواة التفاف من الشكل 𝑤𝑘 × 𝑐𝑜 × 𝑐𝑖 × 𝑘ℎ
والحشو ) 𝑤𝑝 (𝑝ℎ ,والخطوة ) 𝑤𝑠 .(𝑠ℎ ,
.1ما هي التكلفة الحسابية ( computational costالضرب والجمع) لالنتشار
األمامي؟
.2ما هي بصمة الذاكرة memory footprint؟
.3ما هي بصمة الذاكرة للحساب العكسي backward computation؟
.4ما هي التكلفة الحسابية لالنتشار الخلفي backpropagation؟
81 الفصل السابع :الشبكات العصبية االلتفافية
.3بأي عامل يزداد عدد الحسابات إذا ضاعفنا عدد قنوات اإلدخال 𝑖𝑐 وعدد قنوات
اإلخراج 𝑜𝑐؟ ماذا يحدث إذا ضاعفنا الحشو؟
.4هل المتغيرين Y1و Y2في المثال األخير من هذا القسم متطابقان تمامًا؟ لماذا؟
.5عبر عن التالفيف كضرب مصفوفة ،حتى عندما ال تكون نافذة االلتفاف 1 × 1؟
.6مهمتك هي تنفيذ التالفيف السريعة باستخدام النواة 𝑘 × 𝑘 .أحد الخوارزمية المرشحة
هو المسح أفقيًا عبر المصدر ،وقراءة 𝑘-خطوة عريضة وحساب -1خطوة عريضة من
اإلخراج على نطاق واسع بقيمة واحدة في كل مرة .البديل هو قراءة 𝑘 + Δخطوة
عريضة وحساب Δخطوة عريضة من اإلخراج .لماذا هذا األخير هو األفضل؟ هل هناك
حد لمدى الحجم الذي يجب أن تختار Δ؟
.7افترض أن لدينا مصفوفة 𝑐 × 𝑐.
.1ما مقدار سرعة الضرب بمصفوفة كتلة قطرية إذا تم تقسيم المصفوفة إلى كتل
𝑏؟
.2ما هو الجانب السلبي من وجود الكتل 𝑏؟ كيف يمكنك إصالحه جزئيًا على
األقل؟
Pooling 7.5
في كثير من الحاالت ،تطرح مهمتنا النهائية بعض األسئلة العالمية حول الصورة ،على سبيل
المثال ،هل تحتوي على قطة؟ وبالتالي ،يجب أن تكون وحدات الطبقة النهائية حساسة
للمدخالت بالكامل .من خالل تجميع المعلومات تدريجيًا ،وإنتاج خرائط خشنة وأكثر خشونة،
نحقق هذا الهدف المتمثليف تعلم تمثيل عالمييف النهاية ،مع االحتفاظ بجميع مزايا الطبقات
التالفيفيةيف الطبقات الوسيطة للمعالجة .كلما تعمقنايف الشبكة ،زاد المجال التأثيري receptive
( fieldبالنسبة إلى المدخالت) الذي تكون كل عقدة مخفية حساسة له .يؤدي تقليل الدقة
المكانية إلى تسريع هذه العملية ،حيث تغطي نواة االلتفاف مساحة فعالة أكبر.
عالوة على ذلك ،عند اكتشاف ميزات المستوى األدنى ،مثل الحواف (كما تمت مناقشتهيف القسم
،)7.2غالبًا ما نريد أن تكون تمثيالتنا ثابتة إلى حد ما للترجمة .على سبيل المثال ،إذا أخذنا
الصورة Xبتحديد حاد بين األسود واألبيض وقمنا بتحويل الصورة بأكملها بمقدار بكسل واحد
إلى اليمين ،أي ] ، Z[i, j] = X[i, j + 1فإن الناتج للصورة الجديدة Zقد يكون
مختلفًا تمامًا .سيتم إزاحة الحافة بمقدار بكسل واحد.يف الواقع ،نادرًا ما تحدث األشياءيف نفس
المكان تمامًا.يف الواقع ،حتى مع وجود حامل ثالثي القوائم وجسم ثابت ،فإن اهتزاز الكاميرا
بسبب حركة مصراع الكاميرا قد يغير كل شيء بمقدار بكسل أو نحو ذلك (يتم تحميل الكاميرات
المتطورة بميزات خاصة لمعالجة هذه المشكلة).
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 82
يقدم هذا القسم طبقات التجميع ،pooling layersالتي تخدم األغراض المزدوجة للتخفيف
من حساسية الطبقات التالفيفية تجاه الموقع وتمثيالت االختزال المكاني spatially
.downsampling representations
في كلتا الحالتين ،كما هو الحال مع عامل االرتباط المتبادل ،يمكننا التفكيريف نافذة التجميع
pooling windowعلى أنها تبدأ من أعلى يسار موتر اإلدخال وتنزلق عبر موتر اإلدخال من
اليسار إلى اليمين ومن أعلى إلى أسفل.يف كل موقع تصل إليه نافذة التجميع ،فإنها تحسب الحد
األقصى أو المتوسط لقيمة المستشعر الفرعي لإلدخاليف النافذة ،اعتمادًا على ما إذا كان التجميع
األقصى maxأو المتوسط averageمستخدمًا.
83 الفصل السابع :الشبكات العصبية االلتفافية
يبلغ ارتفاع موتر االخراجيف الشكل 2 7.5.1وعرضه .2وتُشتق العناصر األربعة من القيمة
القصوىيف كل نافذة تجميع:
𝑚𝑎𝑥(0,1,3,4) = 4,
𝑚𝑎𝑥(1,2,4,5) = 5,
𝑚𝑎𝑥(3,4,6,7) = 7,
𝑚𝑎𝑥(4,5,7,8) = 8.
بشكل عام ،يمكننا تحديد طبقة تجميع 𝑞 × 𝑝 عن طريق التجميع فوق منطقة بالحجم المذكور.
بالعودة إلى مشكلة اكتشاف الحواف ،نستخدم ناتج الطبقة التالفيفية كمدخل لتجميع الحد
األقصى .2 × 2تشير بواسطة Xإلى مدخالت الطبقة التالفيفية و Yناتج طبقة التجميع .بغض
و ]X[i, j], X[i, j + 1], X[i+1, j قيم كانت إذا عما النظر
] X[i+1, j + 1مختلفة ،طبقة التجميع دائمًا لها المخرجات .Y[i, j] = 1أي
باستخدام طبقة الحد األقصى من التجميع ، 2 × 2ال يزال بإمكاننا اكتشاف ما إذا كان النمط
الذي تم التعرف عليه بواسطة الطبقة االلتفافية ال يتحرك أكثر من عنصر واحديف االرتفاع أو
العرض.
في الكود أدناه ،نقوم بتنفيذ االنتشار األمامي لطبقة التجميعيف دالة pool2d.هذه الدالة مشابهة
للدالة corr2dيف القسم .7.2ومع ذلك ،ليست هناك حاجة إلى نواة ،حيث يتم حساب
المخرجات على أنها الحد األقصى أو المتوسط لكل منطقةيف اإلدخال.
الحظ أنه بخالف األطر األخرى ،يفضل TensorFlowويتم تحسينه لمدخل آخر القنوات
.channels-last input
85 الشبكات العصبية االلتفافية:الفصل السابع
[[ 4.],
[ 5.],
[ 6.],
[ 7.]],
[[ 8.],
[ 9.],
[10.],
[11.]],
[[12.],
[13.],
[14.],
[15.]]]], dtype=float32)>
فإن أطر التعلم العميق تتطابق مع أحجام نوافذ،نظرًا ألن التجميع يجمع المعلومات من منطقة ما
) نحصل على3 ،3( إذا استخدمنا نافذة تجميع للشكل، على سبيل المثال.التجميع والخطوات
.) افتراضيًا3 ،3( شكل خطوة
يمكن تحديد الخطوة والحشو يدويًا لتجاوز اإلعدادات االفتراضية إلطار العمل،كما هو متوقع
.إذا لزم األمر
)strides=2
)pool2d(X_padded
=<tf.Tensor: shape=(1, 2, 2, 1), dtype=float32, numpy
array([[[[ 5.],
[ 7.]],
[[13.],
>)[15.]]]], dtype=float32
بالطبع ،يمكننا تحديد نافذة تجميع عشوائية مستطيلة ذات ارتفاع وعرض تعسفيين على التوالي،
كما يوضح المثال أدناه.
[[13.],
>)[15.]]]], dtype=float32
Multiple Channels 7.5.3
عند معالجة بيانات اإلدخال متعددة القنوات ،multi-channel input dataتقوم طبقة
التجميع بتجميع كل قناة إدخال على حدة ،بدالً من جمع المدخالت عبر القنوات كما هو الحال
في الطبقة ال تالفيفية .هذا يعني أن عدد قنوات اإلخراج لطبقة التجميع هو نفسه عدد قنوات
اإلدخال .أدناه ،سنقوم بتجميع الموترات Xو X + 1على بُعد القناة إلنشاء إدخال بقناتين.
الحظ أن هذا سيتطلب تسلسالً على طول البعد األخير لـ TensorFlowبسبب بناء جملة
القنوات األخير.
[[13., 14.],
>)[15., 16.]]]], dtype=float32
الحظ أن ناتج تجميع TensorFlowيبدو للوهلة األولى مختلفًا ،ولكن يتم عرض نفس النتائج
عدديًا على أنها MXNetو .PyTorchيكمن االختالفيف األبعاد ،وتؤدي قراءة اإلخراج
عموديًا إلى نفس اإلخراج مثل التطبيقات األخرى.
7.5.4
التجميع Poolingهو عملية بسيطة للغاية .إنه يفعل بالضبط ما يشير إليه اسمه ،النتائج اإلجمالية
عبر نافذة من القيم .كل دالالت االلتفاف ،convolution semanticsمثل الخطوات strides
والحشو ،paddingتنطبق بنفس الطريقة كما فعلت سابقًا .الحظ أن التجميع غير مكترث
بالقنوات ،أي أنه يترك عدد القنوات دون تغيير وينطبق على كل قناة على حدة .أخيرًا ،من بين
خياري التجميع الشائعين ،يُفضل تجميع الحد األقصى max-poolingعلى تجميع المتوسط
، average poolingألنه يمنح درجة معينة من الثبات لإلخراج .االختيار الشائع هو اختيار
حجم نافذة التجميع 2 × 2إلى ربع الدقة المكانية لإلخراج.
الحظ أن هناك العديد من الطرق لتقليل الدقة بعد التجميع .على سبيل المثال،يف التجميع
العشوائي )2013 ،Zeiler and Fergus( stochastic poolingوالتجميع األقصى الكسري
)2014 ،Graham( fractional max-poolingيتم الجمع بين التجميع aggregation
والعشوائية .randomizationيمكن أن يؤدي ذلك إلى تحسين الدقة قليالًيف بعض الحاالت.
أخيرًا ،كما سنرى الحقًا مع آلية االنتباه ،attention mechanismهناك طرق أكثر دقة لتجميع
المخرجات ،aggregating over outputsعلى سبيل المثال ،باستخدام المحاذاة بين متجهي
االستعالم queryوالتمثيل .representation vectors
7.5.5
.1نفذ تجميع المتوسط average poolingمن خالل االلتفاف.
.2إثبت أن تجميع الحد األقصى max-poolingال يمكن تنفيذه من خالل االلتفاف
وحده.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 88
LeNet 7.6
لدينا اآلن جميع المكونات المطلوبة لتجميع شبكة CNNكاملة الوظائف.يف مواجهتنا السابقة
لبيانات الصورة ،طبقنا نموذجًا خطيًا مع انحدار ( softmaxالقسم )4.4و( MLPالقسم )5.2
على صور المالبسيف مجموعة بيانات .Fashion-MNISTلجعل هذه البيانات قابلة
للتمكين ،قمنا أوالً بتسطيح flattenedكل صورة من مصفوفة 28 × 28إلى متجه 784أبعاد
ثابت الطول ،وبعد ذلك قمنا بمعالجتهايف طبقات متصلة بالكامل .اآلن بعد أن أصبح لدينا التعامل
مع الطبقات التالفيفية ،يمكننا االحتفاظ بالبنية المكانيةيف صورنا .كميزة إضافية الستبدال
الطبقات المتصلة بالكامل بطبقات تالفيفية ،سنستمتع بنماذج شحيحة تتطلب معلمات أقل
بكثير.
في هذا القسم ،سنقدم ،LeNetمن بين أولى شبكات CNNالمنشورة لجذب اهتمام واسع
ألدائهايف مهام الرؤية الحاسوبية .تم تقديم النموذج بواسطة (وسمي بإسم) ،Yann LeCunثم
باحثيف ،AT&T Bell Labsبغرض التعرف على األرقام المكتوبة بخط اليديف الصور
( .) 1998 ،LeCun et al.يمثل هذا العمل تتويجا لعقد من البحث لتطوير التكنولوجيا.يف عام
،1989نشر فريق LeCunأول دراسة لتدريب شبكات CNNبنجاح من خالل االنتشار
الخلفي .)1989 ،LeCun et al.( backpropagation
في ذلك الوقت ،حققت LeNetنتائج رائعة مطابقة ألداء آالت المتجهات الداعمة support
،vector machinesثم نهجًا مهيمنًايف التعلم الخاضع لإلشراف ،حيث حقق معدل خطأ أقل
من ٪1لكل رقم .تم تكييف LeNetيف النهاية للتعرف على األرقام لمعالجة الودائعيف أجهزة
89 الفصل السابع :الشبكات العصبية االلتفافية
الصراف اآللي .حتى يومنا هذا ،ال تزال بعض أجهزة الصراف اآللي تشغل الكود الذي كتبه يان
ليكون وزميله ليون بوتويف التسعينيات!
LeNet 7.6.1
على مستوى عالٍ ،تتكون ) LeNet (LeNet-5من جزأين )1( :مشفر تالفيفي
convolutional encoderيتكون من طبقتين تالفيفيتين؛ و ( )2كتلة كثيفة dense block
تتكون من ثالث طبقات متصلة بالكامل؛ تم تلخيص المعماريةيف الشكل .7.6.1
الشكل 7.6.1تدفق البياناتيف .LeNetاإلدخال عبارة عن رقم مكتوب بخط اليد ،والمخرج
هو احتمال أكثر من 10نتائج محتملة.
من أجل تمرير اإلخراج من الكتلة التالفيفية convolutional blockإلى الكتلة الكثيفة dense
،blockيجب علينا تسطيح كل مثاليف الدفعات الصغيرة .minibatchبمعنى آخر ،نأخذ هذا
اإلدخال رباعي األبعاد ونحوله إلى مدخالت ثنائية األبعاد تتوقعها طبقات متصلة تمامًا :كتذكير،
يستخدم التمثيل ثنائي األبعاد الذي نرغب فيه البعد األول لفهرسة األمثلةيف minibatchوالثانية
إلعطاء تمثيل متجه مسطح flatلكل مثال .تحتوي كتلة LeNetالكثيفة على ثالث طبقات
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 90
متصلة بالكامل ،مع مخرجات 120و 84و 10على التوالي .نظرًا ألننا ما زلنا نقوم بالتصنيف،
فإن طبقة اإلخراج ذات 10أبعاد تتوافق مع عدد فئات اإلخراج الممكنة.
أثناء الوصول إلى النقطة التي تفهم فيها حقًا ما يجري داخل ،LeNetربما تكون قد اتخذت
القليل من العمل ،نأمل أن يقنعك مقتطف الشفرة التالي بأن تنفيذ مثل هذه النماذج باستخدام
أطر عمل التعلم العميق الحديثة أمر بسيط بشكل ملحوظ .نحتاج فقط إلى إنشاء كتلة
Sequentialوتربط معًا للطبقات المناسبة ،باستخدام تهيئة Xavierكما هو مقدميف القسم
.5.4.2.2
class LeNet(d2l.Classifier):
def __init__(self, lr=0.1, num_classes=10):
)(__super().__init
)(self.save_hyperparameters
[(self.net = tf.keras.models.Sequential
tf.keras.layers.Conv2D(filters=6,
kernel_size=5,
activation='sigmoid',
padding='same'),
tf.keras.layers.AvgPool2D(pool_size=2,
strides=2),
tf.keras.layers.Conv2D(filters=16,
kernel_size=5,
activation='sigmoid'),
tf.keras.layers.AvgPool2D(pool_size=2,
strides=2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(120,
activation='sigmoid'),
tf.keras.layers.Dense(84,
activation='sigmoid'),
)])tf.keras.layers.Dense(num_classes
نأخذ بعض الحريةيف إعادة إنتاج LeNetبقدر ما نستبدل طبقة التنشيط الغاوسية بطبقة
.softmaxهذا يبسط التنفيذ إلى حد كبير ،ليس أقلها بسبب حقيقة أن مفكك شفرة Gaussian
نادراً ما يستخدميف الوقت الحاضر .بخالف ذلك ،تتطابق هذه الشبكة مع بنية LeNet-5
األصلية.
91 الشبكات العصبية االلتفافية:الفصل السابع
(باألبيض28 × 28 من خالل تمرير صورة أحادية القناة.دعونا نرى ما يحدث داخل الشبكة
يمكننا فحص النموذج للتأكد من أن،واألسود) عبر الشبكة وطباعة شكل اإلخراجيف كل طبقة
.7.6.2 عملياته تتماشى مع ما نتوقعه من الشكل
@d2l.add_to_class(d2l.Classifier) #@save
def layer_summary(self, X_shape):
X = tf.random.normal(X_shape)
for layer in self.net.layers:
X = layer(X)
print(layer.__class__.__name__, 'output
shape:\t', X.shape)
model = LeNet()
model.layer_summary((1, 28, 28, 1))
Conv2D output shape: (1, 28, 28, 6)
AveragePooling2D output shape: (1, 14, 14, 6)
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 92
في المقابل ،تتجاهل الطبقة التالفيفية الثانية الحشو ،وبالتالي يتم تقليل االرتفاع والعرض بمقدار
4بكسل .مع صعود كومة الطبقات ،يزيد عدد القنوات طبقة الطبقة العلوية من 1يف اإلدخال إلى
6بعد الطبقة التالفيفية األولى و 16بعد الطبقة التالفيفية الثانية .ومع ذلك ،فإن كل طبقة تجميع
تقسم االرتفاع والعرض إلى النصف .أخيرًا ،تقلل كل طبقة متصلة بالكامل من األبعاد ،وتصدر
أخيرًا ناتجًا يتطابق بعده مع عدد الفئات.
Training 7.6.2
اآلن بعد أن قمنا بتنفيذ النموذج ،دعنا نجري تجربة لنرى كيف يعمل نموذج LeNet-5على
.Fashion-MNIST
بينما تحتوي شبكات CNNعلى عدد أقل من المعلمات ،إال أنه ال يزال من الممكن حسابها
أكثر تكلفة من MLPsالعميقة المماثلة ألن كل معلمة تشاركيف العديد من عمليات الضرب .إذا
كان لديك وصول إلى وحدة معالجة الرسومات ،GPUفقد يكون هذا هو الوقت المناسب
لوضعها موضع التنفيذ لتسريع التدريب .الحظ أن فئة d2l.Trainerتهتم بكل التفاصيل.
بشكل افتراضي ،يقوم بتهيئة معلمات النموذج على األجهزة المتاحة .تمامًا كما هو الحال مع
،MLPsفإن دالة الخطأ لدينا هي إنتروبيا متقاطعة ،cross-entropyونقوم بتقليلها عن طريق
التدرج االشتقاقي العشوائي المصغر .minibatch stochastic gradient descent
)trainer = d2l.Trainer(max_epochs=10
)data = d2l.FashionMNIST(batch_size=128
with d2l.try_gpu():
)model = LeNet(lr=0.1
)trainer.fit(model, data
93 الفصل السابع :الشبكات العصبية االلتفافية
7.6.3
في هذا الفصل أحرزنا تقدمًا كبيرًا .انتقلنا من MLPsفي الثمانينيات إلى شبكات CNNفي
التسعينيات وأوائل العقد األول من القرن الحادي والعشرين .تظل ال ُبنى المقترحة ،على سبيل
المثال،يف شكل LeNet-5ذات مغزى ،حتى يومنا هذا .يجدر مقارنة معدالت الخطأيف
Fashion-MNISTالتي يمكن تحقيقها مع LeNet-5بأفضل ما يمكن باستخدام MLPs
(القسم )5.2وتلك ذات البنى األكثر تقدمًا مثل ( ResNetالقسم .)8.6يشبه LeNetاألخير
أكثر من السابق .أحد االختالفات األساسية ،كما سنرى ،هو أن الكميات األكبر من الحسابات
أتاحت بنى معمارية أكثر تعقيدًا بشكل ملحوظ.
االختالف الثاني هو السهولة النسبية التي تمكنا بها من تنفيذ .LeNetما كان يمثل تحديًا هندسيًا
يستحق شهورًا من ++ Cوكود التجميع ،assembly codeوالهندسة لتحسين ،SNوأداة
التعلم العميق القائمة على ،)1988, Bottou and Le Cun( ،Lispوأخيراً يمكن اآلن إجراء
التجارب مع النماذجيف دقائق .هذه الزيادة الهائلةيف اإلنتاجية هي التي أدت إلى إضفاء الطابع
الديمقراطي على تطوير نموذج التعلم العميق بشكل هائل.يف الفصل التالي سوف نتبع هذا األرنب
لنرى أين يأخذنا.
7.6.4
.1دعونا نحدث .LeNetنفِّذ واختبر التغييرات التالية:
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 94
Modern 8
Convolutional Neural Networks
اآلن بعد أن فهمنا أساسيات توصيل شبكات CNNمعًا ،فلنقم بجولةيف هياكل CNNالحديثة.
هذه الجولة ،بالضرورة ،غير مكتملة ،وذلك بفضل العدد الكبير من التصاميم الجديدة المثيرة
التي تمت إضافتها .تنبع أهميتها من حقيقة أنه ال يمكن استخدامها مباشرة لمهام الرؤية فحسب،
بل إنها تعمل أيضًا كمولدات ميزات أساسية للمهام األكثر تقدمًا مثل التتبع Zhang ( tracking
،)2021 ،et al.والتقطيع ،)2015 ،Long et al.( segmentationاكتشاف الكائن object
،)2018 ،Redmon and Farhadi( detectionأو تغيير النمط style transformation
(.)2016 ،Gatys et al.يف هذا الفصل ،تتوافق معظم األقسام مع بُنية CNNالهامة التي كانت
في مرحلة ما (أو حاليًا) النموذج األساسي الذي تم بناء العديد من مشاريع البحث واألنظمة
المنشورة عليه .كانت كل من هذه الشبكات لفترة وجيزة معمارية مهيمنة وكان العديد منهم فائزين
أو وصيفينيف مسابقة ImageNetالتي كانت بمثابة مقياس للتقدميف التعلم الخاضع لإلشراف
في الرؤية الحاسوبية منذ عام .2010وفي اآلونة األخيرة فقط بدأت المحوالت transformers
في استبدال شبكات ،CNNبدءًا من )2021( .Dosovitskiy et alويليه محول،swin
( .) 2021 ،.Liu et alسنغطي هذا التطور الحقًايف الفصل الخاص بآليات االنتباه والمحوالت
.Attention Mechanisms and Transformers
في حين أن فكرة الشبكات العصبية العميقة بسيطة للغاية (تكديس مجموعة من الطبقات معًا)،
يمكن أن يختلف األداء بشكل كبير عبر خيارات ال ُبنى والمعلمات الفائقة .الشبكات العصبية
الموصوفةيف هذا الفصل هي نتاج الحدس ،intuitionوبعض األفكار الرياضية ،والكثير من
التجربة والخطأ .trial and errorنقدم هذه النماذج بترتيب زمني ،جزئيًا لنقل إحساس بالتاريخ
بحيث يمكنك تكوين حدسك الخاص حول المكان الذي يتجه إليه المجال وربما تطوير ال ُبنى
الخاصة بك .على سبيل المثال ،قدّم التسوية بالدُفعات batch normalizationوالتوصيالت
المتبقية الموصوفة residual connectionsيف هذا الفصل فكرتين شائعتين للتدريب وتصميم
النماذج العميقة ،وكالهما تم تطبيقهما منذ ذلك الحين على ال ُبنى التي تتجاوز الرؤية الحاسوبية
أيضًا.
AlexNet 8.1
على الرغم من أن شبكات CNNكانت معروفة جيدًايف مجتمعات الرؤية الحاسوبية والتعلم
اآللي بعد تقديم ،)1995,.LeCun et al( ،LeNetإال أنها لم تهيمن على هذا المجال على
الفور .على الرغم من أن LeNetحققت نتائج جيدةيف مجموعات البيانات الصغيرة المبكرة ،إال
أنه لم يتم بعد إنشاء أداء وجدوى تدريب شبكات CNNعلى مجموعات بيانات أكبر وأكثر
واقعية.يف الواقع ،خالل معظم الوقت الفاصل بين أوائل التسعينيات ونتائج مستجمعات المياه
watershed resultsلعام ،)2012 ،Krizhevsky et al.( 2012غالبًا ما تم تجاوز الشبكات
العصبية بواسطة طرق التعلم اآللي األخرى ،مثل طرق النواة Schölkopf and ( ،kernel
،)2002,Smolaالطرق الجماعية ،)1996 ،.Freund et al( ensembleوالتقدير المهيكل
.)2004 ،Taskar et al.( structured estimation
بالنسبة للرؤية الحاسوبية ،ربما ال تكون هذه المقارنة دقيقة تمامًا .أي ،على الرغم من أن مدخالت
الشبكات التالفيفية CNNتتكون من قيم بكسل خام أو معالجة بخفة lightly-processed
(على سبيل المثال ،عن طريق التوسيط ،)centeringفإن الممارسين لن يقوموا أبدًا بتغذية
وحدات البكسل الخاميف النماذج التقليدية .بدالً من ذلك ،تتكون خطوط أنابيب الرؤية الحاسوبية
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 98
النموذجية من خطوط أنابيب استخراج الميزات الهندسية يدويًا ،مثل ،)2004,Lowe( ،SIFT
،)2006,Bay et al.( ،SURFوأكياس الكلمات المرئية Sivic ( bags of visual words
.)2003 ،and Zissermanبدالً من تعلم الميزات ،learning the featuresتم تصميم
الميزات .features were craftedجاء معظم التقدم من وجود أفكار أكثر ذكاءً الستخراج
الميزات من ناحية ونظرة عميقةيف الهندسة )2000 ،Hartley and Zisserman( geometry
من ناحية أخرى .غالبًا ما كانت خوارزمية التعلم تعتبر فكرة متأخرة.
على الرغم من توفر بعض مسرعات الشبكة العصبيةيف التسعينيات ،إال أنها لم تكن قوية بما يكفي
إلنشاء شبكات CNNعميقة متعددة القنوات ومتعددة الطبقات مع عدد كبير من المعلمات.
على سبيل المثال ،تمكنت GeForce 256من NVIDIAمن عام 1999من معالجة 480
مليون عمليةيف الثانية على األكثر ( ،)MFLOPsدون أي إطار عمل برمجة مفيد للعمليات خارج
األلعاب .تستطيع مسرعات اليوم أداء ما يزيد عن TFLOPs 300لكل جهاز ( NVIDIA's
.)Ampere A100الحظ أن FLOPsهي عمليات الفاصلة العائمة مثل عمليات الضرب
واإلضافات .عالوة على ذلك ،كانت مجموعات البيانات datasetsال تزال صغيرة نسبيًا :كان
التعرف الضوئي على الحروف على 60.000صورة بكسل منخفضة الدقة مهمة صعبة للغاية.
يضاف إلى هذه العقبات ،الحيل الرئيسية لتدريب الشبكات العصبية بمايف ذلك توجيهات تهيئة
المعلمات ( ،)2010 ،Glorot and Bengioاالنواع الذكية من التدرج االشتقاقي العشوائي
( ،)2014 ،Kingma and Baدوال التنشيط غير السحق non-squashing activation
،)2010 ،Nair and Hinton( functionsوتقنيات التنظيم الفعالة effective
)2014 ،.Srivastava et al( regularization techniquesال تزال مفقودة.
وبالتالي ،بدالً من تدريب أنظمة من طرف إلى طرف ( end-to-endبكسل إلى تصنيف pixel
،)to classificationبدت خطوط األنابيب الكالسيكية classical pipelinesأكثر مثل هذا:
.1احصل على مجموعة بيانات مثيرة لالهتمام.يف األيام األولى ،كانت مجموعات البيانات
هذه تتطلب أجهزة استشعار باهظة الثمن .على سبيل المثال ،تتميز Apple
QuickTake 100لعام 1994بدقة هائلة تبلغ 0.3ميجابكسل ( ،)VGAقادرة
على تخزين ما يصل إلى 8صور ،وكل ذلك بسعر 1000دوالر.
.2قم بإجراء معالجة مسبقة لمجموعة البيانات باستخدام ميزات مصنوعة يدويًا استنادًا
إلى بعض المعرفة بالبصريات والهندسة وأدوات التحليل األخرى ،وأحيانًا على
االكتشافات المصادفة لطالب الدراسات العليا المحظوظين.
.3قم بتغذية البيانات من خالل مجموعة قياسية من مستخلصات الميزات مثل SIFT
(تحويل ميزة مقياس ثابت ،)scale-invariant feature transform
99 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
إذا تحدثت إلى باحثي التعلم اآللي ،فإنهم يعتقدون أن التعلم اآللي مهم وجميليف نفس الوقت.
أثبتت النظريات األنيقة خصائص المصنفات المختلفة ( )2005 ،Boucheron et al.وأصبح
التحسين المحدب )2004 ،Boyd and Vandenberghe( convex optimization
الدعامة األساسية للحصول عليها .كان مجال التعلم اآللي مزدهرًا وصارمًا ومفيدًا بشكل كبير.
ومع ذلك ،إذا تحدثت إلى باحثيف الرؤية الحاسوبية ،فستسمع قصة مختلفة تمامًا .سيقولون لك
إن الحقيقة القذرة للتعرف على الصور هي أن الميزات featuresوالهندسة الرياضية geometry
( ،)2009 ،Hartley and Kahl ،2000 ،Hartley and Zissermanوالهندسة
،engineeringبدالً من خوارزميات التعلم الجديدة ،هي التي أدت إلى التقدم .يعتقد الباحثون
في الرؤية الحاسوبية بشكل مبرر أن مجموعة بيانات أكبر أو أنظف قليالً أو خط أنابيب محسّن
قليالً الستخراج الميزات أهم بكثير بالنسبة للدقة النهائية أكثر من أي خوارزمية تعلم.
مجموعة أخرى من الباحثين ،بمايف ذلك Yann LeCunو Geoff Hintonو Yoshua
Bengioو Andrew Ngو Shun-ichi Amariو ،Juergen Schmidhuberلديهم
خطط مختلفة .لقد اعتقدوا أنه يجب تعلم الميزات نفسها .عالوة على ذلك ،اعتقدوا أنه لكي
تكون معقدة بشكل معقول ،يجب أن تتكون الميزات بشكل هرمي hierarchicallyمن طبقات
متعددة تم تعلمها بشكل مشترك ،ولكل منها معلمات قابلة للتعلم.يف حالة الصورة ،قد تكتشف
الطبقات الدنيا الحواف واأللوان والنسيج ،texturesعلى غرار الطريقة التي يعالج بها النظام
المرئييف الحيوانات مدخالته .على وجه الخصوص ،ظل التصميم التلقائي للميزات المرئية مثل
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 100
تلك التي تم الحصول عليها عن طريق التشفير المتناثر Olshausen and ( sparse coding
)1996 ،Fieldيمثل تحديًا مفتوحًا حتى ظهور شبكات CNNالحديثة .لم يكن األمر كذلك
حتى ) ) 2013( Le ،Dean et al. (2012أن فكرة إنشاء ميزات من بيانات الصورة اكتسبت
تلقائيًا جذباً كبيرًا.
الشكل 8.1.1تم التعرف على فالتر الصور بواسطة الطبقة األولى من .AlexNetإعادة التوليد
Reproductionمجاملة من .)2012( .Krizhevsky et al
ومن المثير لالهتماميف الطبقات السفلية للشبكة ،أن النموذج تعلم مستخلصات الميزات
feature extractorsالتي تشبه بعض المرشحات التقليدية .traditional filtersيوضح
الشكل 8.1.1واصفات الصورة ذات المستوى األدنى .قد تبني الطبقات العليايف الشبكة على هذه
التمثيالت لتمثيل هياكل أكبر ،مثل العيون واألنوف وشفرات العشب وما إلى ذلك .قد تمثل
الطبقات العليا كائنات كاملة مثل األشخاص أو الطائرات أو الكالب أو األطباق الطائرة.يف النهاية،
تتعلم الحالة المخفية النهائية تمثيلًا مضغوطًا للصورة يلخص محتوياتها بحيث يمكن فصل
البيانات التي تنتمي إلى فئات مختلفة بسهولة.
101 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
في عام ،2009تم إصدار مجموعة بيانات ،)2009,Deng et al.( ،ImageNetمما يشكل
تحديا للباحثين لتعلم نماذج من مليون مثال 1000 ،لكل منها من 1000فئة مميزة من الكائنات.
كانت الفئات نفسها مبنية على أكثر عُقد األسماء شيوعًايف .)1995,Miller( ،WordNet
استخدم فريق ImageNetبحث الصور من Googleللترشيح المسبق لمجموعات كبيرة من
المرشحين لكل فئة واستخدم خط أنابيب التعهيد الجماعي Amazon Mechanical Turk
لتأكيد ما إذا كانت تنتمي إلى الفئة المرتبطة بكل صورة .كان هذا المقياس غير مسبوق ،متجاوزًا
اآلخرين بأكثر من ترتيب من حيث الحجم (على سبيل المثال ،يحتوي CIFAR-100على
60000صورة) .كان الجانب اآلخر هو أن الصور كانت بدقة عالية نسبيًا 224 × 224بكسل،
على عكس مجموعة بيانات TinyImagesبحجم 80مليون (،)2008 ،Torralba et al.
والتي تتكون من صور مصغرة 32 × 32بكسل .سمح هذا بتشكيل ميزات ذات مستوى أعلى.
دفعت المنافسة المصاحبة ،والتي أطلق عليها اسم تحدي التعرف البصري على نطاق واسع على
ImageNet Large Scale Visual Recognition Challenge،ImageNet
( ،)2015,Russakovsky et al.الرؤية الحاسوبية وأبحاث التعلم اآللي إلى األمام ،مما أدى
إلى تحدي الباحثين لتحديد النماذج األفضل أداءً على نطاق أكبر مما كان األكاديميون يعتبرونه
سابقًا .تحتوي أكبر مجموعات بيانات الرؤية ،مثل Schuhmann et ( ،LAION-5B
)2022,al.على مليارات الصور مع بيانات وصفية إضافية.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 102
أثبتت وحدات المعالجة الرسومية ( )GPUsأنها غيرت قواعد اللعبةيف جعل التعلم العميق
ممكنًا .تم تطوير هذه الرقائق منذ فترة طويلة لتسريع معالجة الرسومات إلفادة ألعاب الكمبيوتر.
على وجه الخصوص ،تم تحسينها لضرب المصفوفة-المتجه عالية ،4 × 4والتي تعد مطلوبة
للعديد من مهام رسومات الكمبيوتر .لحسن الحظ ،الرياضيات مشابهة بشكل الفت للنظر لتلك
المطلوبة لحساب الطبقات التالفيفية.يف ذلك الوقت تقريبًا ،بدأت NVIDIAوATIيف تحسين
وحدات معالجة الرسومات لعمليات الحوسبة العامة ( ،)2004 ،Fernandoووصلت إلى حد
تسويقها على أنها وحدات معالجة رسومات لألغراض العامة general-purpose GPUs
(.)GPGPUs
لتوفير بعض الحدس ،ضعيف اعتبارك أنوية المعالج الدقيق الحديث ( .)CPUكل من النوى قوي
إلى حد ما يعمل بتردد ساعة عالٍ وذاكرة تخزين مؤقت كبيرة (تصل إلى عدة ميغا بايت من .)L3
كل نواة مناسبة تمامًا لتنفيذ مجموعة واسعة من التعليمات ،instructionsمع تنبؤات الفروع
،branch predictorsوخط أنابيب عميق ،deep pipelineووحدات تنفيذ متخصصة،
وتنفيذ تخميني ،speculative executionوالعديد من األجراس والصفارات األخرى التي
تمكنه من تشغيل مجموعة كبيرة ومتنوعة من البرامج مع تدفق تحكم متطور sophisticated
.control flowومع ذلك ،فإن هذه القوة الواضحة تكمن أيضًايف كعب أخيل :فلبناء األغراض
العامة م كلف للغاية .إنها تتفوقيف كود األغراض العامة مع الكثير من التحكميف التدفق .هذا
يتطلب الكثير من مساحة الرقاقة ،chip areaليس فقط لوحدة الحساب والمنطق arithmetic
)ALU( logical unitحيث يحدث الحساب ،ولكن أيضًا لجميع األجراس والصفارات
المذكورة أعاله ،باإلضافة إلى واجهات الذاكرة ،memory interfacesومنطق التخزين المؤقت
بين النوى ،caching logic between coresوالوصالت عالية السرعة high-speed
، interconnectsوما إلى ذلك .تعد وحدات المعالجة المركزية سيئة نسبيًايف أي مهمة واحدة
عند مقارنتها باألجهزة المخصصة .تحتوي أجهزة الكمبيوتر المحمولة الحديثة على 8-4نوى
،coresونادرًا ما تتجاوز الخوادم المتطورة 64نواة لكل مقبس ،socketوذلك ببساطة ألنها
ليست فعالة من حيث التكلفة.
103 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
وبالمقارنة ،يمكن أن تتكون وحدات معالجة الرسومات من آالف عناصر المعالجة الصغيرة
(تحتوي أحدث رقائق Ampereمن NIVIDAعلى ما يصل إلى 6912نواة ،)CUDA
وغالبًا ما يتم تجميعهايف مجموعات أكبر (تسميها NVIDIAاالعوجاج .)warpsتختلف
التفاصيل إلى حد ما بين NVIDIAو AMDو ARMوبائعي الرقائق اآلخرين.يف حين أن كل
نواة ضعيفة نسبيًا ،تعمل بتردد ساعة 1جيجاهرتز ،فإن العدد اإلجمالي لهذه النوى هو الذي
يجعل أوامر وحدات معالجة الرسومات من حيث الحجم أسرع من وحدات المعالجة المركزية.
على سبيل المثال ،توفر وحدة معالجة الرسومات Ampere A100الحديثة من NVIDIA
أكثر من TFLOPs 300لكل شريحة من أجل ضرب المصفوفة-المصفوفة متخصصة 16بت
( ،)BFLOAT16وما يصل إلى TFLOPs 20لعمليات النقطة العائمة ذات األغراض العامة
(.)FP32يف الوقت نفسه ،نادراً ما يتجاوز أداء النقطة العائمة لوحدات المعالجة المركزية 1
.TFLOPsعلى سبيل المثال ،يصل Graviton 3من Amazonإلى TFLOPs 2لعمليات
دقيقة 16بت ،وهو رقم مشابه ألداء GPUلمعالج .Apple M1
هناك العديد من األسباب التي تجعل وحدات معالجة الرسومات GPUأسرع بكثير من وحدات
المعالجة المركزية من حيث .FLOPsأوالً ،يميل استهالك الطاقة إلى النمو بشكل تربيعي مع
تردد الساعة .وبالتالي ،بالنسبة لميزانية الطاقة لنواة وحدة المعالجة المركزية التي تعمل 4مرات
1
أسرع (رقم نموذجي) ،يمكنك استخدام 16نواة لوحدة معالجة الرسوماتيف 4السرعة التي تنتج
1
16 × 4 = 4مرات من األداء .ثانيًا ،تعد نوى GPUأبسط بكثير (في الواقع ،لم تكن قادرة حتى
على تنفيذ التعليمات البرمجية لألغراض العامة لفترة طويلة) ،مما يجعلها أكثر كفاءةيف استخدام
الطاقة .على سبيل المثال )1( ،تميل إلى عدم دعم التقييم التخميني speculative
) 2( ،evaluationعادةً ما يكون من غير الممكن برمجة كل عنصر معالجة على حدة ،و()3
ذاكرة التخزين المؤقت cachesلكل نواة تميل إلى أن تكون أصغر بكثير .أخيرًا ،تتطلب العديد
من العملياتيف التعلم العميق نطاقًا تردديًا عاليًا للذاكرة .مرة أخرى ،تتألق وحدات معالجة
الرسومات هنا مع المسارات busesالتي يبلغ عرضها على األقل 10أضعاف عدد وحدات
المعالجة المركزية.
بالعودة إلى عام .2012حدث تقدم كبير عندما نفذ Alex KrizhevskyوIlya Sutskever
شبكة CNNعميقة يمكن تشغيلها على وحدات معالجة الرسومات .لقد أدركوا أن االختناقات
الحسابية computational bottlenecksيف شبكات ،CNNوالتالفيف ومضاعفات
المصفوفات ،كلها عمليات يمكن أن تكون متوازيةيف األجهزة .باستخدام اثنين من NVIDIA
GTX 580sمع 3جيجابايت من الذاكرة ،أي منهما كان قادرًا على ( TFLOPs 1.5ال يزال
يمثل تحديًا لمعظم وحدات المعالجة المركزية بعد عقد من الزمان) ،قاموا بتنفيذ التفافات
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 104
سريعة .كان كود cuda-convnetجيدًا بما يكفي ألنه لعدة سنوات كان معيارًا صناعيًا وعمل
على تشغيل أول عامين من طفرة التعلم العميق.
AlexNet 8.1.2
، AlexNetالتي استخدمت شبكة CNNذات 8طبقات ،فازتيف مسابقة ImageNet
Large Scale Visual Recognition Challenge 2012بهامش كبير ( Russakovsky
.)2013 ،et al.أظهرت هذه الشبكة ،ألول مرة ،أن الميزات التي تم الحصول عليها من خالل
التعلم يمكن أن تتجاوز الميزات المصممة يدويًا ،مما يكسر النموذج السابقيف الرؤية الحاسوبية.
إن معماريات AlexNetو LeNetمتشابهة بشكل الفت للنظر ،كما يوضح الشكل .8.1.2
الحظ أننا نقدم نسخة مبسطة قليالً من AlexNetإلزالة بعض المراوغات التصميمية design
quirksالتي كانت مطلوبةيف عام 2012لجعل النموذج مناسبًا لوحدتي GPUصغيرتين.
هناك أيضًا اختالفات كبيرة بين AlexNetو .LeNetأوالً AlexNet ،أعمق بكثير من
LeNet5الصغير نسبيًا .تتكون AlexNetمن ثماني طبقات :خمس طبقات تالفيفية ،وطبقتان
مخفيتان متصلتان بالكامل ،وطبقة إخراج متصلة بالكامل .ثانيًاAlexNet ،تستخدم ReLU
بدالً من sigmoidكدالة التنشيط .دعنا نتعمقيف التفاصيل أدناه.
Architecture 8.1.2.1
في الطبقة األولى لـ ،AlexNetيكون شكل نافذة االلتفاف convolution windowهو
.11 × 11نظرًا ألن الصوريف ImageNetأعلى بثماني مرات وأعرض من صور ،MNIST
تميل الكائنات الموجودةيف بيانات ImageNetإلى احتالل المزيد من وحدات البكسل بتفاصيل
مرئية أكثر .وبالتالي ،هناك حاجة إلى نافذة التفاف أكبر اللتقاط الكائن .يتم تقليل شكل نافذة
االلتفافيف الطبقة الثانية إلى ،5 × 5متبوعًا بـ .3 × 3باإلضافة إلى ذلك ،بعد الطبقات
التالفيفية األولى والثانية والخامسة ،تضيف الشبكة طبقات تجميع حد اقصى مع شكل نافذة
3 × 3وخطوة .2عالوة على ذلك ،تمتلك AlexNetقنوات التفاف أكثر بعشر مرات من
.LeNet
بعد آخر طبقة تالفيفية ،توجد طبقتان كبيرتان متصلتان بالكامل مع 4096ناتجًا .تتطلب هذه
الطبقات معلمات نموذج 1جيجابايت تقريبًا .نظرًا للذاكرة المحدودةيف وحدات معالجة
الرسومات المبكرة ،استخدم AlexNetاألصلي تصميمًا مزدوجًا لدفق البيانات ،بحيث يمكن
أن تكون كل واحدة من وحدتي GPUمسؤولة عن تخزين وحساب نصف النموذج فقط .لحسن
الحظ ،أصبحت ذاكرة GPUوفيرة نسبيًا اآلن ،لذلك نادرًا ما نحتاج إلى تفكيك النماذج عبر
وحدات معالجة الرسومات هذه األيام (إصدارنا من طراز AlexNetينحرف عن الورقة األصلية
في هذا الجانب).
بحيث ال يمكن، تقريبًايف الفاصل الزمني الموجب0 على تدرج يبلغsigmoid تحصل الدالة
.تدريب النموذج بشكل فعال
import tensorflow as tf
from d2l import tensorflow as d2l
class AlexNet(d2l.Classifier):
def __init__(self, lr=0.1, num_classes=10):
super().__init__()
self.save_hyperparameters()
self.net = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=96,
kernel_size=11, strides=4,
activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=3,
strides=2),
tf.keras.layers.Conv2D(filters=256,
kernel_size=5, padding='same',
activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=3,
strides=2),
tf.keras.layers.Conv2D(filters=384,
kernel_size=3, padding='same',
activation='relu'),
tf.keras.layers.Conv2D(filters=384,
kernel_size=3, padding='same',
activation='relu'),
107 الشبكات العصبية االلتفافية الحديثة:الفصل الثامن
tf.keras.layers.Conv2D(filters=256,
kernel_size=3, padding='same',
activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=3,
strides=2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(4096,
activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(4096,
activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(num_classes)])
لمالحظة224 بارتفاع وعرضsingle-channel data نقوم ببناء مثال بيانات أحادية القناة
.8.1.2 يف الشكلAlexNet إنها تتطابق مع بنية.شكل اإلخراج لكل طبقة
اآلن ،يمكننا البدءيف تدريب .AlexNetبالمقارنة مع LeNetيف القسم ،7.6فإن التغيير الرئيسي
هنا هو استخدام معدل تعليمي أصغر وتدريب أبطأ بكثير بسبب الشبكة األعمق واألوسع ،ودقة
الصورة األعلى ،والتالفيف األكثر تكلفة.
)trainer = d2l.Trainer(max_epochs=10
data = d2l.FashionMNIST(batch_size=128, resize=(224,
))224
with d2l.try_gpu():
)model = AlexNet(lr=0.01
)trainer.fit(model, data
8.1.4
يحمل هيكل AlexNetتشابهًا مذهالً مع ،LeNetمع عدد من التحسينات المهمة ،من حيث
الدقة ( )dropoutوسهولة التدريب ( .)ReLUاألمر المذهل بنفس القدر هو مقدار التقدم
الذي تم إحرازه فيما يتعلق بأدوات التعلم العميق .ما كان لعدة أشهر من العمليف عام 2012
يمكن اآلن إنجازهيف عشرات األسطر من التعليمات البرمجية باستخدام أي إطار عمل حديث.
بمراجعة المعمارية ،نرى أن AlexNetلديها كعب أخيل عندما يتعلق األمر بالكفاءة :تتطلب
آخر طبقتين مخفيتين مصفوفات من الحجم 6400 × 4096و 4096 × 4096على التوالي.
هذا يتوافق مع ذاكرة 164ميجابايت و MFLOPs 81من الحسابات ،وكالهما نفقات غير
109 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
بديهية ،خاصة على األجهزة األصغر ،مثل الهواتف المحمولة .هذا هو أحد أسباب تجاوز
AlexNetلهياكل أكثر فاعلية سنغطيهايف األقسام التالية .ومع ذلك ،فهي خطوة أساسية من
الشبكات الضحلة إلى الشبكات العميقة المستخدمةيف الوقت الحاضر .الحظ أنه على الرغم من
أن عدد المعلمات يتجاوز إلى حد بعيد كمية بيانات التدريبيف تجاربنا (تحتوي الطبقتان
األخيرتان على أكثر من 40مليون معلمة ،تم تدريبهما على مجموعات بيانات من 60ألف
صورة) ،ال يكاد يوجد أي ضبط زائد :overfittingخطأ التدريب والتحقق من الصحة متطابقة
تقريبًا خالل التدريب .ويرجع ذلك إلى التنظيم المحسن ،مثل dropoutالمتأصليف تصميمات
الشبكات العميقة الحديثة.
على الرغم من أنه يبدو أن هناك عددًا قليالً فقط من الخطوطيف تطبيق AlexNetمقارنةً بتطبيق
،LeNetفقد استغرق المجتمع األكاديمي سنوات عديدة الحتضان هذا التغيير المفاهيمي
واالستفادة من نتائجه التجريبية الممتازة .كان هذا أيضًا بسبب عدم وجود أدوات حسابية فعالة.
في ذلك الوقت ،لم يكن )2012,Dean et al.( ،DistBeliefوال )2014,Jia et al.( ،Caffe
موجودًا ،وال يزال )2010,Bergstra et al.( ،Theanoيفتقر إلى العديد من الميزات المميزة.
إن توفر )2016,Abadi et al.( ،TensorFlowهو الوحيد الذي غير هذا الوضع بشكل كبير.
8.1.5
.1لمتابعة المناقشة أعاله ،قم بتحليل الخصائص الحسابية لـ .AlexNet
.1احسب بصمة الذاكرة للتالفيف والطبقات المتصلة بالكامل ،على التوالي .أي
واحد يهيمن؟
.2احسب التكلفة الحسابية لاللتفافات والطبقات المتصلة بالكامل.
.3كيف تؤثر الذاكرة (عرض النطاق الترددي bandwidthللقراءة والكتابة
ووقت التاخير latencyوالحجم) على الحساب؟ وهل هناك فرقيف تأثيره على
التدريب واالستدالل؟
.2أنت مصمم شريحة chip designerوتحتاج إلى موازنة الحساب وعرض النطاق
الترددي للذاكرة .على سبيل المثال ،تتطلب الشريحة األسرع طاقة أكبر وربما مساحة
شريحة أكبر .يتطلب المزيد من عرض النطاق الترددي للذاكرة المزيد من pinsومنطق
التحكم ،control logicوبالتالي مساحة أكبر أيضًا .كيف تقوم بالتحسين؟
.3لماذا لم يعد المهندسون يقدمون تقارير عن معايير األداء على AlexNet؟
.4حاول زيادة عدد الفترات عند تدريب .AlexNetمقارنة مع ،LeNetكيف تختلف
النتائج؟ لماذا؟
.5قد تكون AlexNetمعقدة للغاية بالنسبة لمجموعة بيانات ،Fashion-MNIST
خاصة بسبب الدقة المنخفضة للصور األولية.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 110
.1حاول تبسيط النموذج لجعل التدريب أسرع ،مع ضمان عدم انخفاض الدقة
بشكل ملحوظ.
.2قم بتعديل حجم الدُفعة ،batch sizeوالحظ التغييراتيف اإلنتاجية
( throughputالصور/الثانية) والدقة وذاكرة وحدة معالجة الرسومات.
.6طبق التسرب dropoutو ReLUعلى .LeNet-5هل تتحسن؟ هل يمكنك
تحسين األمور أكثر من خالل المعالجة المسبقة لالستفادة من الثوابت invariances
الكامنةيف الصور؟
.7هل يمكنك جعل AlexNetتعاني من الضبط الزائد overfitting؟ ما الميزة التي
تحتاج إلى إزالتها أو تغييرها لكسر التدريب؟
يعكس التقدميف هذا المجال تقدم ( VLSIتكامل واسع النطاق جدًا very large scale
) integrationيف تصميم الرقائق حيث انتقل المهندسون من وضع الترانزستورات إلى العناصر
المنطقية logical elementsإلى الكتل المنطقية .)1980 ،Mead( logic blocksوبالمثل،
فإن تصميم معماريات الشبكات العصبية قد أصبح أكثر تجريدًا بشكل تدريجي ،مع انتقال
الباحثين من التفكير من حيث الخاليا العصبية الفردية إلى طبقات كاملة ،واآلن إلى الكتل
،blocksوتكرار أنماط الطبقات .بعد عقد من الزمان ،تقدم هذا اآلن للباحثين الذين يستخدمون
نماذج مدربة بالكامل إلعادة توظيفهم لمهام مختلفة ،وإن كانت مرتبطة .عادة ما تسمى هذه
النماذج الكبيرة التي تم اختبارها مسبقًا بنماذج األساس foundation models
(.)2021 ،Bommasani et al.
العودة إلى تصميم الشبكة .ظهرت فكرة استخدام الكتل ألول مرة من مجموعة الهندسة المرئية
)VGG( Visual Geometry Groupيف جامعة أكسفورد،يف شبكة VGGالتي تحمل االسم
نفسه ( .)2014 ،Simonyan and Zissermanمن السهل تنفيذ هذه الهياكل المتكررةيف
الكود مع أي إطار عمل تعلم عميق حديث باستخدام الحلقات والروتينات الفرعية.
VGG 8.2.1
كتلة البناء األساسية لشبكات CNNهي سلسلة مما يلي )1( :طبقة تالفيفية مع حشوة للحفاظ
على الدقة )2( ،غير خطية مثل )3( ،ReLUطبقة تجميع مثل max-poolingلتقليل الدقة.
111 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
تتمثل إحدى مشكالت هذا النهجيف أن الدقة المكانية تتناقص بسرعة كبيرة .على وجه الخصوص،
يفرض هذا حدًا صارمًا للطبقات التالفيفية 𝑑 log 2على الشبكة قبل استخدام جميع األبعاد
(𝑑) .على سبيل المثال،يف حالة ،ImageNetسيكون من المستحيل وجود أكثر من 8طبقات
تالفيفية بهذه الطريقة.
blk.add(tf.keras.layers.MaxPool2D(pool_size=2,
))strides=2
return blk
VGG 8.2.2
مثل AlexNetو ،LeNetيمكن تقسيم شبكة VGGإلى جزأين :األول يتكونيف الغالب من
طبقات تالفيفية convolutionalوتجميعية poolingوالثاني يتكون من طبقات متصلة
بالكامل مماثلة لتلك الموجودةيف .AlexNetيتمثل االختالف الرئيسييف أن الطبقات التالفيفية
يتم تجميعهايف تحويالت غير خطية تترك األبعاد دون تغيير ،متبوعة بخطوة تقليل الدقة
،resolution-reduction stepكما هو موضحيف الشكل .8.2.1
يربط الجزء التالفيفي من الشبكة عدة كتل VGGمن الشكل ( 8.2.1كما هو محدديف دالة
) vgg_blockعلى التوالي .هذا التجمع من االلتفافات هو نمط ظل دون تغيير تقريبًا خالل
العقد الماضي ،على الرغم من أن االختيار المحدد للعمليات قد خضع لتعديالت كبيرة .يتكون
113 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
المتغير conv_archمن قائمة من المجموعات (واحدة لكل كتلة) ،حيث تحتوي كل منها
على قيمتين :عدد الطبقات التالفيفية وعدد قنوات المخرجات ،وهما على وجه التحديد
الوسيطات المطلوبة الستدعاء دالة .vgg_blockعلى هذا النحو ،تحدد VGGعائلة من
الشبكات وليس مجرد مظهر محدد .لبناء شبكة محددة ،نقوم ببساطة بالتكرار عبر القوس arch
لتكوين الكتل.
class VGG(d2l.Classifier):
def __init__(self, arch, lr=0.1, num_classes=10):
)(__super().__init
)(self.save_hyperparameters
)(self.net = tf.keras.models.Sequential
for (num_convs, num_channels) in arch:
self.net.add(vgg_block(num_convs,
))num_channels
(self.net.add
[(tf.keras.models.Sequential
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(4096,
activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(4096,
activation='relu'),
tf.keras.layers.Dropout(0.5),
))])tf.keras.layers.Dense(num_classes
تحتوي شبكة VGGاألصلية على 5كتل تالفيفية ،من بينها الكتل التالفيفية األولى والثانية
تحتوي على طبقة تالفيفية واحدة لكل منها ،وتحتوي الثالثة األخيرة على طبقتين تالفيفيتين لكل
منهما .تحتوي الكتلة األولى على 64قناة إخراج وتضاعف كل كتلة الحقة عدد قنوات اإلخراج،
حتى يصل هذا الرقم إلى .512نظرًا ألن هذه الشبكة تستخدم 8طبقات تالفيفية و 3طبقات
متصلة بالكامل ،فإنها غالبًا ما تسمى .VGG-11
كما ترون ،نقوم بتخفيض االرتفاع والعرض إلى النصفيف كل كتلة ،ونصل أخيرًا إلى ارتفاع
وعرض 7قبل تسطيح التمثيالت للمعالجة بواسطة الجزء المتصل بالكامل من الشبكة .وصف
Simonyanو )2014( Zissermanالعديد من المتغيرات األخرى لـ .VGGيف الواقع ،أصبح
من المعتاد اقتراح مجموعات شبكات ذات موازنات سرعة ودقة مختلفة عند تقديم بُنية جديدة.
Training 8.2.3
نظرًا ألن VGG-11أكثر تطلبًا من الناحية الحسابية من ،AlexNetفإننا نبني شبكة مع عدد
أقل من القنوات .هذا أكثر من كافٍ للتدريب على .Fashion-MNISTعملية التدريب
النموذجية مماثلة لتلك الخاصة بـ AlexNetيف القسم .8.1الحظ مرة أخرى التطابق الوثيق بين
خطأ التحقق من الصحة وخطأ التدريب ،مما يشير إلى كمية صغيرة فقط من الضبط الزائد.
)trainer = d2l.Trainer(max_epochs=10
data = d2l.FashionMNIST(batch_size=128, resize=(224,
))224
with d2l.try_gpu():
model = VGG(arch=((1, 16), (1, 32), (2, 64), (2,
)128), (2, 128)), lr=0.01
)trainer.fit(model, data
8.2.4
قد يجادل المرء بأن VGGهي أول شبكة عصبية تالفيفية حديثة حقًا .بينما قدمت AlexNet
العديد من المكونات التي تجعل التعلم العميق فعالًا على نطاق واسع ،يمكن القول إن VGG
هي التي قدمت الخصائص الرئيسية مثل كتل التالفيف المتعددة وتفضيل الشبكات العميقة
115 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
والضيقة .إنها أيضًا الشبكة األولى التي هييف الواقع عائلة كاملة من النماذج ذات المعلمات
المتشابهة ،مما يمنح الممارس موازنة كبيرة بين التعقيد والسرعة .هذا أيضًا هو المكان الذي تتألق
فيه أطر التعلم العميق الحديثة .لم يعد من الضروري إنشاء ملفات تكوين XMLلتحديد الشبكة،
ولكن بدالً من ذلك ،لتجميع الشبكات المذكورة من خالل كود بايثون البسيط.
أظهر ParNetمؤخرًا ( ) 2021 ،Goyal et al.أنه من الممكن تحقيق أداء تنافسي باستخدام
بُ نية ضحلة أكثر من خالل عدد كبير من الحسابات المتوازية .هذا تطور مثير وهناك أمليف أن يؤثر
على تصاميم المعماريةيف المستقبل .ومع ذلك ،بالنسبة لبقية الفصل ،سنتبع مسار التقدم العلمي
على مدى العقد الماضي.
8.2.5
.1مقارنةً بـ ،AlexNetيُعد VGGأبطأ بكثير من حيث الحساب ،كما أنه يحتاج إلى
المزيد من ذاكرة .GPU
.1قارن عدد المعلمات المطلوبة لـ AlexNetو.VGG
.2قارن عدد عمليات الفاصلة العائمة المستخدمةيف الطبقات التالفيفية والطبقات
المتصلة بالكامل.
.3كيف يمكنك تقليل التكلفة الحسابية التي أنشأتها الطبقات المتصلة بالكامل؟
.4عند عرض األبعاد المرتبطة بالطبقات المختلفة للشبكة ،ال نرى سوى المعلومات
المرتبطة بـ 8كتل (باإلضافة إلى بعض التحويالت المساعدة) ،على الرغم من أن
الشبكة بها 11طبقة .أين ذهبت الطبقات الثالث المتبقية؟
.5استخدم الجدول 1يف مقالة )2014,Simonyan and Zisserman( ،VGG
إلنشاء نماذج شائعة أخرى ،مثل VGG-16أو .VGG-19
.6يعد اختزال Upsamplingالدقةيف Fashion-MNISTبعامل من 8إلى 28 × 28
أبعاد مضيعة للغاية .حاول تعديل بُنية الشبكة وتحويل الدقة ،على سبيل المثال ،إلى
56أو 84بعدًا إلدخالها بدالً من ذلك .هل يمكنك القيام بذلك دون التقليل من دقة
الشبكة؟ ضعيف اعتبارك ورقة )2014,Simonyan and Zisserman( ،VGG
للحصول على أفكار حول إضافة المزيد من العناصر الالخطية قبل االختزال
.downsampling
التي أدخلت على LeNetبواسطة AlexNetو VGGبشكل أساسييف كيفية توسيع هذه
الشبكات الالحقة وتعميق هاتين الوحدتين.
يطرح هذا التصميم تحديين رئيسيين .أوالً ،تستهلك الطبقات المتصلة بالكامليف نهاية الهيكل
عددًا هائالً من المعلمات .على سبيل المثال ،حتى نموذج بسيط مثل VGG-11يتطلب
مصفوفة ضخمة ،25088 × 4096تشغل ما يقرب من 400ميجابايت من ذاكرة الوصول
العشوائي بدقة واحدة ( .)FP32هذا عائق كبير أمام الحساب ،ال سيما على األجهزة المحمولة
والمضمنة .بعد كل شيء ،حتى الهواتف المحمولة المتطورة ال تحتوي على أكثر من 8جيجابايت
من ذاكرة الوصول العشوائي.يف الوقت الذي تم فيه اختراع ،VGGكان هذا ترتيبًا أقل من حيث
الحجم (كان لدى ايفون 512 4Sميجا بايت) .على هذا النحو ،كان من الصعب تبرير إنفاق
غالبية الذاكرة على مصنف الصور.
ثانيًا ،من المستحيل أيضًا إضافة طبقات متصلة بالكامليف وقت سابقيف الشبكة لزيادة درجة
الالخطية :سيؤدي القيام بذلك إلى تدمير البنية المكانية وقد يتطلب المزيد من الذاكرة.
NiN 8.3.1
راجع القسم .7.4.3الذي ناقشنا فيه أن مدخالت ومخرجات الطبقات التالفيفية تتكون من موتر
رباعي األبعاد مع محاور مقابلة للمثال والقناة واالرتفاع والعرض .تذكر أيضًا أن مدخالت
ومخرجات الطبقات المتصلة بالكامل تكون عادةً موترات ثنائية األبعاد تتوافق مع المثال والميزة.
الفكرة وراء NiNهي تطبيق طبقة متصلة بالكامليف كل موقع بكسل (لكل ارتفاع وعرض).
يمكن اعتبار االلتفاف الناتج على أنه طبقة متصلة بالكامل تعمل بشكل مستقل على كل موقع
بكسل.
يوضح الشكل 8.3.1االختالفات الهيكلية الرئيسية بين VGGو NiNوكتلهما .الحظ كالً من
االختالفيف كتل ( NiNااللتفاف األولي يتبعه التالفيف ،1 × 1بينما يحتفظ VGGبالتالفيف
) 3 × 3وفي النهاية حيث لم نعد بحاجة إلى طبقة عمالقة متصلة بالكامل.
117 الشبكات العصبية االلتفافية الحديثة:الفصل الثامن
import tensorflow as tf
from d2l import tensorflow as d2l
NiN 8.3.2
(تم اقتراحه بعد ذلك بوقتAlexNet نفس أحجام االلتفاف األولية مثلNiN يستخدم
وعدد قنوات اإلخراج، على التوالي،3 × 3 و5 × 5،11 × 11 أحجام النواة هي.)قصير
2 طبقة تجميع حد أقصى بخطوةNiN يتبع كل كتلة.AlexNet يتطابق مع تلك الموجودةيف
.3 × 3 وشكل نافذة
يتجنب الطبقاتNiN يف أنVGG وAlexNet وNiN يتمثل االختالف المهم الثاني بين
ٍ مع عدد من قنوات اإلخراج مساوNiN كتلةNiN يستخدم، بدالً من ذلك.ًالمتصلة تمامًا معا
مما ينتج عنه متجه، متبوعة بطبقة تجميع متوسط عالمي،label classes لعدد فئات التسميات
يقلل هذا التصميم بشكل كبير من عدد معلمات النموذج.vector of logits من السجالت
. وإن كان ذلك على حساب زيادة محتملةيف وقت التدريب،المطلوبة
class NiN(d2l.Classifier):
def __init__(self, lr=0.1, num_classes=10):
super().__init__()
self.save_hyperparameters()
self.net = tf.keras.models.Sequential([
nin_block(96, kernel_size=11, strides=4,
padding='valid'),
tf.keras.layers.MaxPool2D(pool_size=3,
strides=2),
nin_block(256, kernel_size=5, strides=1,
padding='same'),
tf.keras.layers.MaxPool2D(pool_size=3,
strides=2),
nin_block(384, kernel_size=3, strides=1,
padding='same'),
tf.keras.layers.MaxPool2D(pool_size=3,
strides=2),
tf.keras.layers.Dropout(0.5),
nin_block(num_classes, kernel_size=3,
strides=1, padding='same'),
tf.keras.layers.GlobalAvgPool2D(),
tf.keras.layers.Flatten()])
.نقوم بإنشاء مثال بيانات لمعرفة شكل اإلخراج لكل كتلة
model = NiN()
X = tf.random.normal((1, 224, 224, 1))
for layer in model.net.layers:
X = layer(X)
119 الشبكات العصبية االلتفافية الحديثة:الفصل الثامن
print(layer.__class__.__name__,'output shape:\t',
X.shape)
Sequential output shape: (1, 54, 54, 96)
MaxPooling2D output shape: (1, 26, 26, 96)
Sequential output shape: (1, 26, 26, 256)
MaxPooling2D output shape: (1, 12, 12, 256)
Sequential output shape: (1, 12, 12, 384)
MaxPooling2D output shape: (1, 5, 5, 384)
Dropout output shape: (1, 5, 5, 384)
Sequential output shape: (1, 5, 5, 10)
GlobalAveragePooling2D output shape: (1, 10)
Flatten output shape: (1, 10)
Training 8.3.3
لتدريب النموذج باستخدام نفس المُحسِّنFashion-MNIST نستخدم،كما كان من قبل
.VGG وAlexNet الذي استخدمناه لـ
trainer = d2l.Trainer(max_epochs=10)
data = d2l.FashionMNIST(batch_size=128, resize=(224,
224))
with d2l.try_gpu():
model = NiN(lr=0.05)
trainer.fit(model, data)
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 120
8.3.4
يحتوي NiNعلى معلمات أقل بشكل كبير من AlexNetو .VGGينبع هذايف المقام األول
من حقيقة أنه ال يحتاج إلى طبقات عمالقة متصلة بالكامل .بدالً من ذلك ،يستخدم متوسط
التجميع العالمي للتجميع عبر جميع مواقع الصور بعد المرحلة األخيرة من جسم الشبكة .هذا
يغني عن الحاجة إلى عمليات تخفيض مكلفة (مكتسبة) ويستبدلها بمتوسط بسيط .ما كان
مفاجئًايف ذلك الوقت هو حقيقة أن هذه العملية المتوسطة لم تضر بالدقة .الحظ أن المتوسط عبر
تمثيل منخفض الدقة (مع العديد من القنوات) يضيف أيضًا إلى مقدار ثبات الترجمة الذي يمكن
للشبكة التعامل معه.
يساعد اختيار عدد أقل من التالفيفات ذات قنوات العريضة واستبدالها بالتالفيف 1 × 1يف
البحث عن عدد أقل من المعلمات .إنه يوفر قدرًا كبيرًا من الالخطية عبر القنوات داخل أي موقع
معين .أثر كل من التالفيف 1 × 1والتجميع العالمي بشكل كبير على تصميمات CNN
الالحقة.
8.3.5
.1لماذا توجد طبقتان تالفيفيتان لكل كتلة NiN؟ زد عددهم إلى ثالثة .قلل عددهم إلى
واحد .ما هي التغييرات؟
.2ما الذي يتغير إذا استبدلت التالفيف 1 × 1بالتالفيف 3 × 3؟
.3ماذا يحدث إذا استبدلت متوسط التجميع العالمي بطبقة متصلة بالكامل (السرعة،
الدقة ،عدد المعلمات)؟
.4احسب استخدام الموارد من أجل .NiN
.1ما هو عدد المعلمات؟
.2ما هو مقدار الحساب؟
.3ما هو مقدار الذاكرة المطلوبة أثناء التدريب؟
.4ما هو مقدار الذاكرة المطلوبة أثناء التنبؤ؟
.5ما هي المشاكل المحتملة مع تقليص التمثيل 384 × 5 × 5إلى التمثيل
10 × 5 × 5يف خطوة واحدة؟
.6استخدم قرارات التصميم الهيكلييف VGGالتي أدت إلى VGG-11وVGG-16
و VGG-19لتصميم عائلة من الشبكات الشبيهة بـ .NiN
121 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
كانت المساهمة الرئيسيةيف GoogLeNetهي تصميم هيكل الشبكة .لقد حلت مشكلة اختيار
نواة االلتفاف بطريقة بارعة .بينما حاولت أعمال أخرى تحديد االلتفاف األفضل ،بدءًا من 1 × 1
إلى ، 11 × 11إال أنها قامت ببساطة بجمع التالفيف متعددة الفروع المتسلسلة .فيما يلي نقدم
نسخة مبسطة قليالً من :GoogLeNetتضمن التصميم األصلي عددًا من الحيل لتحقيق
االستقراريف التدريب من خالل دوال الخسارة المتوسطة ،المطبقة على طبقات متعددة من
الشبكة .لم تعد ضرورية بسبب توفر خوارزميات تدريب محسّنة.
كما هو موضحيف الشكل ،8.4.1تتكون كتلة االستهالل inception blockمن أربعة فروع
متوازية .تستخدم الفروع الثالثة األولى طبقات تالفيفية ذات أحجام نافذة ،1 × 1و5 × 5
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 122
الستخراج المعلومات من األحجام المكانية المختلفة .يضيف الفرعان األوسطان أيضًا التفافًا
للمدخالت لتقليل عدد القنوات ،مما يقلل من تعقيد النموذج .يستخدم الفرع الرابع طبقة تجميع
الحد االقصى ،متبوعة بطبقة تالفيفية لتغيير عدد القنوات .تستخدم الفروع األربعة حشوة مناسبة
إلعطاء اإلدخال واإلخراج نفس االرتفاع والعرض .أخيرًا ،يتم ربط النواتج الموجودة على طول
كل فرع على طول بُعد القناة وتشكل ناتج الكتلة .المعلمات الفائقة المضبوطة بشكل شائع لكتلة
البداية هي عدد قنوات اإلخراج لكل طبقة ،أي كيفية تخصيص السعة بين التالفيف ذات الحجم
المختلف.
class Inception(tf.keras.Model):
# `c1`--`c4` are the number of output channels for
each branch
def __init__(self, c1, c2, c3, c4):
)(__super().__init
self.b1_1 = tf.keras.layers.Conv2D(c1, 1,
)'activation='relu
self.b2_1 = tf.keras.layers.Conv2D(c2[0], 1,
)'activation='relu
self.b2_2 = tf.keras.layers.Conv2D(c2[1], 3,
padding='same',
)'activation='relu
self.b3_1 = tf.keras.layers.Conv2D(c3[0], 1,
)'activation='relu
self.b3_2 = tf.keras.layers.Conv2D(c3[1], 5,
padding='same',
)'activation='relu
self.b4_1 = tf.keras.layers.MaxPool2D(3, 1,
)'padding='same
self.b4_2 = tf.keras.layers.Conv2D(c4, 1,
)'activation='relu
))b4 = self.b4_2(self.b4_1(x
return tf.keras.layers.Concatenate()([b1, b2,
)]b3, b4
للحصول على بعض الحدس عن سبب عمل هذه الشبكة بشكل جيد ،ضعيف اعتبارك مجموعة
الفالتر .يستكشفون الصورةيف مجموعة متنوعة من أحجام الفالتر .هذا يعني أنه يمكن التعرف
على التفاصيل ذات النطاقات المختلفة بكفاءة بواسطة فالتر ذات أحجام مختلفة.يف الوقت نفسه،
يمكننا تخصيص كميات مختلفة من المعلمات لفالتر مختلفة.
GoogLeNet 8.4.2
كما هو مبينيف الشكل ،8.4.2تستخدم GoogLeNetمكدس stackمن إجمالي 9كتل
استهالل ،مرتبةيف 3مجموعات مع أقصى تجميع بينهما ،ومتوسط التجميع العالمييف رأسها
لتوليد تقديراتها .تجميع الحد األقصى بين كتل البداية يقلل من األبعاد.يف جذعها ،تشبه الوحدة
النمطية األولى AlexNetو.LeNet
يمكننا اآلن تنفيذ GoogLeNetقطعة قطعة .لنبدأ بالجذع .تستخدم الوحدة األولى طبقة
تالفيفية 7 × 7ذات 64قناة.
class GoogleNet(d2l.Classifier):
def b1(self):
[(return tf.keras.models.Sequential
tf.keras.layers.Conv2D(64, 7, strides=2,
padding='same',
activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=3,
strides=2,
)])'padding='same
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 124
تستخدم الوحدة الثانية طبقتين تالفيفيتين :األولى ،طبقة تالفيفية 1 × 1ذات 64قناة ،تليها
طبقة تالفيفية 3 × 3تضاعف عدد القنوات ثالث مرات .هذا يتوافق مع الفرع الثانييف كتلة
االستهالل ويختتم تصميم الجسم.يف هذه المرحلة لدينا 192قناة.
)@d2l.add_to_class(GoogleNet
def b2(self):
[(return tf.keras.Sequential
tf.keras.layers.Conv2D(64, 1,
activation='relu'),
tf.keras.layers.Conv2D(192, 3, padding='same',
activation='relu'),
tf.keras.layers.MaxPool2D(pool_size=3,
)])'strides=2, padding='same
تقوم الوحدة الثالثة بتوصيل كتلتين كاملتين من كتل االستهالل على التوالي .عدد قنوات اإلخراج
للكتلة األولى هو .64 + 128 + 32 + 32 = 256هذا يرقى إلى نسبة عدد قنوات اإلخراج
1
بين الفروع األربعة لـ .2: 4: 1: 1لتحقيق ذلك ،نقوم أوالً بتقليل أبعاد اإلدخال بمقدار 2وبواسطة
1
يف الفرعين الثاني والثالث على التوالي للوصول إلى القنوات 16 = 192/12والقنوات 12
16 = 192/12على التوالي.
يتم زيادة عدد قنوات اإلخراج لكتلة االستهالل الثانية إلى 128 + 192 + 96 + 64 = 480
محققاً نسبة .128: 192: 96: 64 = 4: 6: 3: 2كما كان من قبل ،نحتاج إلى تقليل عدد األبعاد
1 1
على التوالي يكفي ،والعائد القنوات 128و 32 و الوسيطةيف القناة الثانية والثالثة .مقياس
8 2
على التوالي .يتم التقاط هذا من خالل وسيطات المنشئ Inception blockالتالية.
)@d2l.add_to_class(GoogleNet
def b3(self):
[(return tf.keras.models.Sequential
Inception(64, (96, 128), (16, 32), 32),
Inception(128, (128, 192), (32, 96), 64),
tf.keras.layers.MaxPool2D(pool_size=3,
)])'strides=2, padding='same
الوحدة الرابعة أكثر تعقيدًا .يربط خمس كتل بدايةيف سلسلة ،ولديهم 192 + 208 + 48 +
، 128 + 256 + 64 + 64 = 512 ، 160 + 224 + 64 + 64 = 512، 64 = 512و
256 + 320 + 128 + 128 = 832112 + 288 + 64 + 64 = 528قنوات اإلخراج،
على التوالي .عدد القنوات المخصصة لهذه الفروع مماثل لتلك الموجودةيف الوحدة الثالثة :الفرع
الثاني مع الطبقة التالفيفية 3 × 3يخرج أكبر عدد من القنوات ،يليه الفرع األول مع الطبقة
التالفيفية 1 × 1فقط ،والفرع الثالث مع الطبقة التالفيفية ، 5 × 5والفرع الرابع مع طبقة
125 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
التجميع القصوى .3 × 3سيقلل الفرعان الثاني والثالث أوالً عدد القنوات وفقًا للنسبة .تختلف
هذه النسب اختالفًا طفيفًايف كتل التأسيس المختلفة.
)@d2l.add_to_class(GoogleNet
def b4(self):
[(return tf.keras.Sequential
Inception(192, (96, 208), (16, 48), 64),
Inception(160, (112, 224), (24, 64), 64),
Inception(128, (128, 256), (24, 64), 64),
Inception(112, (144, 288), (32, 64), 64),
Inception(256, (160, 320), (32, 128), 128),
tf.keras.layers.MaxPool2D(pool_size=3,
)])'strides=2, padding='same
تحتوي الوحدة الخامسة على كتلتين ابتدائيتين مع 256 + 320 + 128 + 128 = 832و
384 + 384 + 128 + 128 = 1024قنوات إخراج .عدد القنوات المخصصة لكل فرع هو
نفسه الموجوديف الوحدتين الثالثة والرابعة ،ولكنه يختلفيف القيم المحددة .وتجدر اإلشارة إلى
أن الكتلة الخامسة تتبعها طبقة اإلخراج .تستخدم هذه الكتلة طبقة تجميع المتوسط العالمية لتغيير
ارتفاع وعرض كل قناة إلى ،1تمامًا كما هو الحاليف .NiNأخيرًا ،نقوم بتحويل اإلخراج إلى
مصفوفة ثنائية األبعاد متبوعة بطبقة متصلة بالكامل يكون عدد مخرجاتها هو عدد فئات التسمية.
)@d2l.add_to_class(GoogleNet
def b5(self):
[(return tf.keras.Sequential
Inception(256, (160, 320), (32, 128), 128),
Inception(384, (192, 384), (48, 128), 128),
tf.keras.layers.GlobalAvgPool2D(),
)])(tf.keras.layers.Flatten
اآلن بعد أن حددنا جميع الكتل من b1إلى ،b5فإن األمر يتعلق فقط بتجميعهم جميعًايف شبكة
كاملة.
)@d2l.add_to_class(GoogleNet
def __init__(self, lr=0.1, num_classes=10):
)(__super(GoogleNet, self).__init
)(self.save_hyperparameters
[(self.net = tf.keras.Sequential
self.b1(), self.b2(), self.b3(), self.b4(),
self.b5(),
)])tf.keras.layers.Dense(num_classes
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 126
في الوقت الحالي ،التعديل الوحيد الذي سنقوم به هو تقليل ارتفاع المدخالت وعرضها من 224
إلى 96للحصول على وقت تدريب معقول على .Fashion-MNISTهذا يبسط الحساب.
دعونا نلقي نظرة على التغييراتيف شكل اإلخراج بين الوحدات المختلفة.
)trainer = d2l.Trainer(max_epochs=10
))data = d2l.FashionMNIST(batch_size=128, resize=(96, 96
with d2l.try_gpu():
)model = GoogleNet(lr=0.01
)trainer.fit(model, data
127 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
8.4.4
الميزة الرئيسية لـ GoogLeNetهي أنها أرخصيف الواقع للحوسبة من سابقاتها مع توفير دقة
محسنةيف نفس الوقت .يمثل هذا بداية تصميم شبكة مدروس بشكل أكبر والذي يتم فيه استبدال
تكلفة تقييم الشبكة مع تقليل األخطاء .كما يمثل بداية التجريب على مستوى الكتلة باستخدام
معلمات فائقة لتصميم الشبكة ،ع لى الرغم من أنها كانت يدوية بالكامليف ذلك الوقت .سنعيد
النظريف هذا الموضوعيف القسم 8.8عند مناقشة استراتيجيات استكشاف بُنية الشبكة.
خالل األقسام التالية ،سنواجه عددًا من خيارات التصميم (على سبيل المثال ،تسوية الدُفعات
،batch normalizationواالتصاالت المتبقية ،residual connectionsوتجميع القنوات
)channel groupingالتي تسمح لنا بتحسين الشبكات بشكل كبير.يف الوقت الحالي ،يمكنك
أن تفخر بتنفيذ ما يمكن القول إنه أول شبكة CNNحديثة حقًا.
8.4.5
.1كانت GoogLeNetناجحة للغاية لدرجة أنها مرت بعدد من التكرارات .هناك العديد
من التكرارات لـ GoogLeNetالتي تعمل على تحسين السرعة والدقة بشكل
تدريجي .حاول تنفيذ وتشغيل بعضها .وهي تشمل ما يلي:
.2أضف طبقة تسوية دفعية ( ،)2015 ،Ioffe and Szegedyكما هو موضح الحقًايف
القسم .8.5
.3قم بإجراء تعديالت على كتلة االستهالل (العرض واالختيار وترتيب التالفيف) ،كما
هو موضحيف (.)2016 ،Szegedy et al.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 128
مالحظة .يمكن أن يعمل هذا بشكل جيد ،على سبيل المثال ،لبيانات المستشعر المكاني .تعد
تقنيات المعالجة المسبقة هذه وغيرها الكثير مفيدة للحفاظ على التحكميف مشكلة التقدير بشكل
جيد .انظر على سبيل المثال ،المقاالت التي كتبها )2008( .Guyon et alلمراجعة اختيار
الميزات وتقنيات االستخراج .توحيد المتجهات Standardizing vectorsله أيضًا تأثير جانبي
لطيف يتمثليف تقييد دالة التعقيد للدوال التي تعمل على أساسها .على سبيل المثال ،الحد
المشهور بهامش الشعاع )1995 ،Vapnik( radius-margin boundيف آالت ناقالت الدعم
،Perceptron Convergence وTheorem support vector machines
( )1962,Novikoffيعتمدان على مدخالت ذات معيار محدود .bounded norm
ثانيًا ،بالنسبة إلى MLPأو CNNالنموذجي ،أثناء تدريبنا ،قد تأخذ المتغيراتيف الطبقات
المتوسطة (على سبيل المثال ،مخرجات التحويل األفينييف )MLPقيمًا بأحجام متفاوتة على
نطاق واسع :كالهما على طول الطبقات من اإلدخال إلى اإلخراج ،عبر الوحداتيف نفس الطبقة،
وبمرور الوقت بسبب تحديثاتنا لمعلمات النموذج .افترض مخترعو التسوية بالدفعات بشكل غير
رسمي أن هذا االنجراف driftيف توزيع مثل هذه المتغيرات يمكن أن يعيق تقارب الشبكة.
حدسيًا ،قد نخمن أنه إذا كانت إحدى الطبقات بها عمليات تنشيط متغيرة تزيد 100مرة عن
تلك الموجودةيف طبقة أخرى ،فقد يتطلب ذلك تعديالت تعويضيةيف معدالت التعلم .تهدف
المحلالت التكيفية Adaptive solversمثل )2011,Duchi et al.( ،AdaGradأو ،Adam
( )2014,Kingma and Baأو )2018,Zaheer et al.( ،Yogiأو Distributed
)2020,Anil et al.( ،Shampooإلى معالجة هذا األمر من وجهة نظر التحسين ،على سبيل
المثال ،عن طريق إضافة جوانب من أساليب الدرجة الثانية .البديل هو منع حدوث المشكلة،
ببساطة عن طريق التسوية التكيفية .adaptive normalization
ثالثًا ،الشبكات األعمق معقدة وتميل إلى أن تكون أكثر قدرة على الضبط الزائد overfitting
بسهولة .هذا يعني أن التنظيم regularizationيصبح أكثر أهمية .تقنية شائعة للتنظيم هي حقن
الضوضاء .noise injectionكان هذا معروفًا لفترة طويلة ،على سبيل المثال ،فيما يتعلق بحقن
الضوضاء للمدخالت ( .)1995 ،Bishopكما أنه يشكل أساس التسرب dropoutيف القسم
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 130
.5.6كما اتضح ،مصادفة تمامًا ،فإن تسوية الدُفعات ينقل جميع الفوائد الثالثة :المعالجة
المسبقة ،preprocessingواالستقرار العددي ،numerical stabilityوالتنظيم
.regularization
يتم تطبيق تسوية الدُفعات على الطبقات الفردية ،أو اختياريًا ،لكل منها:يف كل تكرار تدريبي،
نقوم أوالً بتسوية المدخالت (تسوية الدُفعة) بطرح متوسطها والقسمة على انحرافها المعياري،
حيث يتم تقدير كالهما بناءً على اإلحصائيات من الدفعات الصغيرة الحالي .بعد ذلك ،نطبق
معامل مقياس scale coefficientوتعويض الستعادة درجات الحرية المفقودة .يرجع هذا
تحديدًا إلى هذا التسوية استنادًا إلى إحصائيات الدُفعات ،حيث تشتق تسوية الدُفعة اسمها.
الحظ أنه إذا حاولنا تطبيق تسوية الدُفعات باستخدام دفعات صغيرة من الحجم ،1فلن نتمكن
من تعلم أي شيء .هذا ألنه بعد طرح المتوسط ،ستأخذ كل وحدة مخفية القيمة .0كما قد
تتخيل ،نظرًا ألننا نخصص قسمًا كامالً لتسوية الدُفعات ،مع وجود عدد كافٍ من الدُفعات
الصغيرة ،فإن الطريقة تثبت فعاليتها وثباتها .أحد الوجبات الجاهزة هنا هو أنه عند تطبيق تسوية
الدُفعات ،يكون اختيار حجم الدُفعة أكثر أهمية من عدم تسوية الدُفعات ،أو على األقل ،هناك
حاجة إلى معايرة مناسبة حيث يمكننا تعديلها.
قم باإلشارة بواسطة الدفعات الصغيرة ℬوليكن 𝐱 ∈ ℬتكون مدخالً لتسوية الدُفعات (.)BN
في هذه الحالة ،يتم تحديد تسوية الدُفعة على النحو التالي:
𝐱− 𝝁 ℬ
⊙ 𝜸 = )𝐱(BN + 𝜷. ()8.5.1
𝝈 ℬ
^ ^
في ( 𝝁ℬ ،)8.5.1هو متوسط العينة و 𝝈ℬهو االنحراف المعياري للعينة من الدفعات الصغيرة.
بعد تطبيق التوحيد القياسي ،standardizationفإن الدفعات الصغيرة الناتج له متوسط صفري
وتباين الوحدة .يعد اختيار تباين الوحدة (مقابل بعض األرقام السحرية األخرى) اختيارًا عشوائيًا.
نستعيد درجة الحرية هذه بتضمين معلمة مقياس عنصري ( 𝜸 )elementwiseومعلمة تحول
( 𝜷 )shift parameterلها نفس الشكل مثل 𝐱 .كالهما معلمات يجب تعلمها كجزء من تدريب
النموذج.
ال يمكن لألحجام المتغيرة للطبقات المتوسطة أن تتباعد أثناء التدريب ألن تسوية الدُفعات يتركز
^ ^
بنشاط ويعيد قياسها مرة أخرى إلى متوسط وحجم معينين (عبر 𝝁ℬو .)𝝈ℬتؤكد التجربة العملية
أنه ،كما أشير إليه عند مناقشة إعادة قياس الميزات ،feature rescalingيبدو أن تسوية الدُفعات
^ ^
يسمح بمعدالت تعلم أكثر قوة .نحسب 𝝁ℬو 𝝈ℬيف ( )8.5.1كالتالي:
131 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
الحظ أننا نضيف ثابتًا صغيرًا لتقدير التباين لضمان عدم محاولة القسمة على الصفر أبدًا ،حتى
في الحاالت التي قد يكون فيها تقدير التباين التجريبي صغيرًا جدًا أو حتى يتالشى .التقديرات
^ ^
𝝁ℬو 𝝈ℬمواجهة مشكلة القياس باستخدام تقديرات صاخبة noisy estimatesللمتوسط
والتباين .قد تعتقد أن هذه الضوضاء يجب أن تكون مشكلة .على العكس تمامًا ،هذا مفيد بالفعل.
تبين أن هذا موضوع متكرريف التعلم العميق .ألسباب لم يتم وصفها جيدًا من الناحية النظرية،
غالبًا ما تؤدي المصادر المختلفة للضوضاءيف التحسين إلى تدريب أسرع وضبط زائد أقل :يبدو
أن هذا االختالف يعمل كشكل من أشكال التنظيم )2018 ،Teye et al.( .و (،Luo et al.
)2018يربطان خصائص تسوية الدُفعات بـ Bayesian priorsوالعقوبات على التوالي .على
وجه الخصوص ،يلقي هذا بعض الضوء على اللغز لماذا يعمل تسوية الدُفعات بشكل أفضل مع
األحجام الصغيرة المتوسطةيف النطاق .50 ∼ 100يبدو أن هذا الحجم المعين من الدفعات
الصغيرة minibatchيضخ "المقدار المناسب "right amountمن الضوضاء لكل طبقة ،سواء
^ ^
من حيث الحجم عبر 𝝈 ،ومن حيث التعويض عن عبر 𝝁 :الدفعة الصغيرة األكبر larger
minibatchيتم تنظيمها بشكل أقل بسبب التقديرات األكثر ثباتًا،يف حين أن الدفعات الصغيرة
االصغر tiny minibatchesتدمر اإلشارة المفيدة بسبب التباين العالي .استكشاف هذا االتجاه
بشكل أكبر ،والنظريف األنواع البديلة للمعالجة المسبقة والتصفية قد يؤدي إلى أنواع فعالة أخرى
من التنظيم.
عند إصالح نموذج مدرب ،قد تعتقد أننا نفضل استخدام مجموعة البيانات datasetبأكملها
لتقدير المتوسط والتباين .بمجرد اكتمال التدريب ،لماذا نرغبيف تصنيف نفس الصورة بشكل
مختلف ،اعتمادًا على المجموعة التي تتواجد فيها؟ أثناء التدريب ،مثل هذا الحساب الدقيق غير
ممكن ألن المتغيرات الوسيطة لجميع أمثلة البيانات تتغيريف كل مرة نقوم فيها بتحديث نموذجنا.
ومع ذلك ،بمجرد تدريب النموذج ،يمكننا حساب متوسطات ومتغيرات كل طبقة بناءً على
مجموعة البيانات بأكملها.يف الواقع ،هذه ممارسة قياسية للنماذج التي تستخدم تسوية الدُفعات،
وبالتالي تعمل طبقات تسوية الدفعات بشكل مختلفيف وضع التدريب training mode
(التسوية عن طريق إحصائيات الدُفعة المصغرة) وفي وضع التنبؤ ( prediction modeالتسوية
بواسطة إحصاءات مجموعة البيانات).يف هذا النموذج ،تشبه إلى حد كبير سلوك تنظيم التسرب
dropout regularizationمن القسم ،5.6حيث يتم حقن الضوضاء فقط أثناء التدريب.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 132
تذكر أن المتوسط والتباين يتم حسابهما على نفس الدفعة الصغيرة minibatchالذي يتم تطبيق
التحويل عليه.
افترض أن الدفعات الصغيرة لدينا تحتوي على 𝑚 أمثلة وأن ناتج االلتفاف لكل قناة له ارتفاع 𝑝
وعرض 𝑞 .بالنسبة للطبقات التالفيفية ،نقوم بتنفيذ تسوية كل دفعة على العناصر 𝑞 ⋅ 𝑝 ⋅ 𝑚 لكل
قناة إخراجيف وقت واحد .وبالتالي ،فإننا نجمع القيم عبر جميع المواقع المكانية عند حساب
المتوسط والتباين ،وبالتالي نطبق نفس المتوسط والتباين داخل قناة معينة لتسوية القيمةيف كل
موقع مكاني .كل قناة لها مقياسها ومعلمات التحول الخاصة بها ،وكالهما قيمة قياسية .scalar
المتوسط والتباين جيدًا ،حتى لو كان ذلك ضمن مالحظة واحدة فقط .قاد هذا االعتبار Ba et
)2016( .alإلدخال مفهوم تسوية الطبقة .layer normalizationإنه يعمل تمامًا مثل معيار
الدُفعة ،batch normفقط أنه يتم تطبيقه على مالحظة واحدةيف كل مرة .وبالتالي فإن كالً من
اإلزاحة والقيمة القياسية .scalarsبالنظر إلى متجه 𝐱 ذي األبعاد 𝑛 ،يتم إعطاء معايير norms
الطبقة بواسطة
^
𝜇𝐱−
= )𝐱(𝐱 → LN ^
,
𝜎
حيث يتم تطبيق المقياس scalingواإلزاحة offsetمن حيث المعامل ويتم تقديمهما بواسطة
𝑛 𝑛
^ 1 ^2 1 ^
∑ = 𝜇: ∑ = 𝑥𝑖 and 𝜎 : (𝑥𝑖 − 𝜇)2 + 𝜖.
𝑛 𝑛
𝑖=1 𝑖=1
كما كان من قبل ،نضيف ازاحة صغيرًة 𝜖 > 0لمنع القسمة على الصفر .تتمثل إحدى الفوائد
الرئيسية الستخدام تسوية الطبقةيف أنه يمنع التباعد .divergenceبعد كل شيء ،تجاهل 𝜖،
ناتج تسوية الطبقة مستقل عن المقياس .هذا هو ،لدينا )𝐱𝛼( LN(𝐱) ≈ LNألي خيار .𝛼 ≠ 0
تصبح هذه مساواة لـ ∞ → |𝛼| (المساواة التقريبية ترجع إلى االزاحة 𝜖 لتعويض التباين).
ميزة أخرى لتسوية الطبقة هي أنها ال تعتمد على حجم الدفعات الصغيرة .كما أنها مستقلة عما
إذا كنايف تدريب أو نظام اختبار .بمعنى آخر ،إنه ببساطة تحول حتمي يوحد التنشيطات إلى مقياس
معين .يمكن أن يكون هذا مفيدًا جدًايف منع التباعديف التحسين .نتخطى المزيد من التفاصيل
ونوصي القارئ المهتم بالرجوع إلى المقالة األصلية.
عادةً ،بعد التدريب ،نستخدم مجموعة البيانات بأكملها لحساب التقديرات الثابتة لإلحصاءات
المتغيرة ثم إصالحهايف وقت التنبؤ .وبالتالي ،فإن تسوية الدُفعات يتصرف بشكل مختلف أثناء
التدريب وفي وقت االختبار .تذكر أن التسرب يعرض أيضًا هذه الخاصية.
بوضع تفاصيل الخوارزمية جانبًا ،الحظ نمط التصميم الذي يقوم عليه تنفيذنا للطبقة .عادةً،
نحدد الرياضياتيف دالة منفصلة ،على سبيل المثال .batch_normنقوم بعد ذلك بدمج هذه
الدالةيف طبقة مخصصة ،custom layerوالتي يعالج كودهايف الغالب مسائل مسك الدفاتر
،bookkeepingمثل نقل البيانات إلى سياق الجهاز الصحيح ،وتخصيص أي متغيرات مطلوبة
وتهيئتها ،وتتبع المتوسطات المتحركة (هنا للمتوسط والتباين) ،وما إلى ذلك .يتيح هذا النمط
فصلًا نظيفًا للرياضيات عن الكود المعياري .الحظ أيضًا أنه من أجل السهولة ،لم نقلق بشأن
االستنتاج التل قائي لشكل اإلدخال هنا ،وبالتالي نحتاج إلى تحديد عدد الميزات طوال الوقت.يف
الوقت الحالي ،توفر جميع أطر التعلم العميق الحديثة اكتشافًا تلقائيًا للحجم والشكليف واجهات
برمجة تطبيقات APIتسوية الدُفعات عالية المستوى (في الواقع ،سنستخدم هذا بدالً من ذلك).
class BatchNorm(tf.keras.layers.Layer):
def __init__(self, **kwargs):
)super(BatchNorm, self).__init__(**kwargs
initializer=tf.initializers.ones,
trainable=True)
self.beta = self.add_weight(name='beta',
shape=weight_shape,
initializer=tf.initializers.zeros,
trainable=True)
# The variables that are not model parameters
are initialized to 0
self.moving_mean =
self.add_weight(name='moving_mean',
shape=weight_shape,
initializer=tf.initializers.zeros,
trainable=False)
self.moving_variance =
self.add_weight(name='moving_variance',
shape=weight_shape,
initializer=tf.initializers.ones,
trainable=False)
super(BatchNorm, self).build(input_shape)
@tf.function
def call(self, inputs, training):
if training:
axes = list(range(len(inputs.shape) - 1))
batch_mean = tf.reduce_mean(inputs, axes,
keepdims=True)
batch_variance =
tf.reduce_mean(tf.math.squared_difference(
inputs, tf.stop_gradient(batch_mean)),
axes, keepdims=True)
batch_mean = tf.squeeze(batch_mean, axes)
batch_variance = tf.squeeze(batch_variance,
axes)
mean_update = self.assign_moving_average(
self.moving_mean, batch_mean)
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 136
variance_update =
self.assign_moving_average(
self.moving_variance, batch_variance)
self.add_update(mean_update)
self.add_update(variance_update)
mean, variance = batch_mean, batch_variance
else:
mean, variance = self.moving_mean,
self.moving_variance
output = batch_norm(inputs, moving_mean=mean,
moving_var=variance,
beta=self.beta, gamma=self.gamma, eps=1e-5)
return output
هذه. للتحكميف التجميع على تقديرات المتوسط والتباين السابقةmomentum استخدمنا الزخم
إلى حد ما حيث ال عالقة لها على اإلطالق بمصطلح الزخمmisnomer تسمية خاطئة
فهو االسم المعتمد بشكل شائع، ومع ذلك.12.6 يف التحسينيف القسمmomentum term
نستخدم نفس اسم المتغيريف التعليمات البرمجية،API وإحترامًا التفاقية تسمية،لهذا المصطلح
.الخاصة بنا أيضًا
LeNet 8.5.4
التقليديLeNet نطبقه أدناه على نموذج،في السياقBatchNorm لمعرفة كيفية تطبيق
تذكر أنه يتم تطبيق تسوية الدفعات بعد الطبقات التالفيفية أو الطبقات المتصلة.) 7.6 (القسم
.بالكامل ولكن قبل دوال التنشيط المقابلة
class BNLeNetScratch(d2l.Classifier):
def __init__(self, lr=0.1, num_classes=10):
super().__init__()
self.save_hyperparameters()
self.net = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=6,
kernel_size=5,
input_shape=(28, 28,
1)),
BatchNorm(),
tf.keras.layers.Activation('sigmoid'),
tf.keras.layers.AvgPool2D(pool_size=2,
strides=2),
tf.keras.layers.Conv2D(filters=16,
kernel_size=5),
137 الشبكات العصبية االلتفافية الحديثة:الفصل الثامن
BatchNorm(),
tf.keras.layers.Activation('sigmoid'),
tf.keras.layers.AvgPool2D(pool_size=2,
strides=2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(120),
BatchNorm(),
tf.keras.layers.Activation('sigmoid'),
tf.keras.layers.Dense(84), BatchNorm(),
tf.keras.layers.Activation('sigmoid'),
tf.keras.layers.Dense(num_classes)])
هذا الكود.Fashion-MNIST سنقوم بتدريب شبكتنا على مجموعة بيانات،كمايف السابق
. ألول مرةLeNet مطابق تقريبًا لذلك عندما قمنا بتدريب
trainer = d2l.Trainer(max_epochs=10)
data = d2l.FashionMNIST(batch_size=128)
with d2l.try_gpu():
model = BNLeNetScratch(lr=0.5)
trainer.fit(model, data)
shift ( ومعامل التحويلgamma )scale parameter( دعونا نلقي نظرة على معلمة المقياس
. الذي تم تعلمه من طبقة تسوية الدفعة األولىbeta )parameter
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 138
tf.reshape(model.net.layers[1].gamma, (-1,)),
tf.reshape(
model.net.layers[1].beta, (-1,))
(<tf.Tensor: shape=(6,), dtype=float32, numpy=
array([4.5314302, 2.9945924, 2.1465805, 2.1390676,
3.5647843, 2.0847673],
dtype=float32)>,
<tf.Tensor: shape=(6,), dtype=float32, numpy=
array([ 0.21811652, -0.152415 , -1.0798329 , -
1.2022917 , -0.03723535,
-0.7957938 ], dtype=float32)>)
Concise Implementation 8.5.5
يمكننا استخدام كالس، التي حددناها بأنفسنا للتو،BatchNorm بالمقارنة مع كالس
المحددةيف واجهات برمجة التطبيقات عالية المستوى من إطار عمل التعلمBatchNorm
باستثناء أننا لم نعد بحاجة إلى تقديم، يبدو الرمز مطابقًا تقريبًا لتطبيقنا أعاله.العميق مباشرة
.وسيطات إضافية له للحصول على األبعاد الصحيحة
class BNLeNet(d2l.Classifier):
def __init__(self, lr=0.1, num_classes=10):
super().__init__()
self.save_hyperparameters()
self.net = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=6,
kernel_size=5,
input_shape=(28, 28,
1)),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Activation('sigmoid'),
tf.keras.layers.AvgPool2D(pool_size=2,
strides=2),
tf.keras.layers.Conv2D(filters=16,
kernel_size=5),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Activation('sigmoid'),
tf.keras.layers.AvgPool2D(pool_size=2,
strides=2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(120),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Activation('sigmoid'),
139 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
tf.keras.layers.Dense(84),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Activation('sigmoid'),
)])tf.keras.layers.Dense(num_classes
أدناه ،نستخدم نفس المعلمات الفائقة لتدريب نموذجنا .الحظ أنه كالعادة ،يعمل متغير واجهة
برمجة التطبيقات عالي المستوى بشكل أسرع نظرًا ألن كوده قد تم تجميعه إلى C++أو
CUDAبينما يجب تفسير تطبيقنا المخصص بواسطة بايثون.
)trainer = d2l.Trainer(max_epochs=10
)data = d2l.FashionMNIST(batch_size=128
with d2l.try_gpu():
)model = BNLeNet(lr=0.5
)trainer.fit(model, data
8.5.6
بشكل بديهي ،يُعتقد أن تسوية الدُفعات batch normalizationتجعل مشهد التحسين أكثر
سالسة .ومع ذلك ،يجب أن نكون حريصين على التمييز بين الحدس التأملي والتفسيرات
الحقيقية للظواهر التي نالحظها عند تدريب النماذج العميقة .تذكر أننا ال نعرف حتى لماذا تعمم
الشبكات العصبية العميقة األبسط ( MLPsو CNNالتقليدية) جيدًايف المقام األول .حتى مع
التسرب dropoutوتناقص الوزن ،weight decayفإنها تظل مرنة للغاية لدرجة أن قدرتها
على التعميم على البيانات غير المرئية تحتاج على األرجح إلى ضمانات تعلم نظرية أكثر دقة.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 140
في المقالة األصلية التي اقترحت تسوية الدُفعات ( ، )2015 ،Ioffe and Szegedyباإلضافة
إلى تقديم أداة قوية ومفيدة ،قدمت شرحًا لسبب نجاحها :عن طريق تقليل التحول المتغير
الداخلي .internal covariate shiftمن المفترض أن المؤلفين قصدوا عن طريق التحول
الداخلي المتغير شيئًا مثل الحدس المعبر عنه أعاله -فكرة أن توزيع القيم المتغيرة يتغير على
مدار التدريب .ومع ذلك ،كانت هناك مشكلتانيف هذا التفسير )1 :هذا االنجراف driftمختلف
تمامًا عن التحول المتغير ،مما يجعل االسم تسمية خاطئة .misnomerإذا كان هناك أي شيء،
فهو أقرب إلى مفهوم االنجراف )2 .يقدم التفسير حدسًا غير محدد ولكنه يترك السؤال عن سبب
نجاح هذه التقنية تحديدًايف سؤال مفتوح يحتاج إلى تفسير دقيق.يف هذا الكتاب ،نهدف إلى نقل
الحدس الذي يستخدمه الممارسون لتوجيه تطورهم للشبكات العصبية العميقة .ومع ذلك ،نعتقد
أنه من المهم فصل هذه البديهيات التوجيهية عن الحقائق العلمية الراسخة.يف النهاية ،عندما تتقن
هذه المادة وتبدأيف كتابة أوراقك البحثية الخاصة ،سترغبيف أن تكون واضحًايف التحديد بين
االدعاءات التقنية والحدس.
بعد نجاح تسوية الدفعات ،ظهر تفسيره من حيث التحول الداخلي المتغير مرارًا وتكرارًايف
المناقشاتيف األدبيات الفنية والخطاب األوسع حول كيفية تقديم أبحاث التعلم اآللي.يف خطاب
ال يُنسى ألقاه أثناء قبوله جائزة اختبار الوقت Test of Time Awardيف مؤتمر NeurIPS
،2017استخدم علي رحيمي التحول الداخلي المشترك internal covariate shiftكنقطة
محوريةيف حجة تشبه الممارسة الحديثة للتعلم العميق بالكيمياء .بعد ذلك ،تمت إعادة النظريف
المثال بالتفصيليف ورقة موقف تحدد االتجاهات المثيرة للقلقيف التعلم اآللي (ليبتون
وشتاينهاردت .)2018 ،اقترح مؤلفون آخرون تفسيرات بديلة لنجاح تسوية الدُفعات ،حيث زعم
البعض أن نجاح التسوية على دفعات يأتي على الرغم من إظهار سلوك يتعارض من بعض النواحي
مع تلك التي زُعمتيف المقالة األصلية (.)2018 ،Santurkar et al.
نالحظ أن التحول المتغير الداخلي ال يستحق النقد أكثر من أي من آالف االدعاءات الغامضة
ال مماثلة التي يتم تقديمها كل عاميف أدبيات التعلم اآللي التقنية .على األرجح ،فإن صدى هذه
النقاشات كنقطة محوريةيف هذه المناقشات يرجع إلى التعرف الواسع على الجمهور المستهدف.
أثبت تسوية الدُفعات أنه أسلوب ال غنى عنه ،تم تطبيقهيف جميع مصنفات الصور المنشورة تقريبًا،
مما أكسب المقالة التي قدمت التقنية عشرات اآلالف من االستشهادات .ومع ذلك ،فإننا نخمّن
أن المبادئ التوجيهية للتنظيم من خالل حقن الضوضاء والتسريع من خالل إعادة القياس
والمعالجة المسبقة أخيرًا قد تؤدي إلى المزيد من االختراعات للطبقات والتقنياتيف المستقبل.
في مالحظة أكثر عملية ،هناك عدد من الجوانب aspectsالتي تستحق التذكر حول تسوية
الدُفعات:
141 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
أثناء تدريب النموذج ،يضبط تسوية الدُفعات باستمرار اإلخراج الوسيط للشبكة من •
خالل استخدام المتوسط واالنحراف المعياري للدفعات الصغيرة ،بحيث تكون قيم
المخرجات الوسيطةيف كل طبقة عبر الشبكة العصبية أكثر استقرارًا.
تختلف تسوية الدُفعات للطبقات المتصلة تمامًا والطبقات التالفيفية قليالً.يف الواقع، •
بالنسبة للطبقات التالفيفية ،يمكن أحيانًا استخدام تسوية الطبقة كبديل.
مثل طبقة التسرب ،dropout layerفإن طبقات تسوية الدفعات لها سلوكيات •
مختلفةيف وضع التدريب ووضع التنبؤ.
يعد تسوية الدُفعات مفيدًا للتنظيم وتحسين التقاربيف التحسين .من ناحية أخرى، •
يبدو أن الدافع األصلي لتقليل التحول المتغير الداخلي ليس تفسيرًا صالحًا.
8.5.7
.1هل يجب إزالة معلمة التحيز من الطبقة المتصلة بالكامل أو الطبقة التالفيفية قبل تسوية
الدُفعة؟ لماذا؟
.2قارن معدالت التعلم لـ LeNetمع أو بدون تسوية الدفعات.
.1ارسم الزيادةيف دقة التحقق من الصحة .validation accuracy
.2ما الحجم الذي يمكنك جعل معدل التعلم قبل فشل التحسينيف كلتا الحالتين؟
.3هل نحتاج إلى تسوية الدفعاتيف كل طبقة؟ جربها؟
.4قم بتنفيذ إصدار "خفيف "liteمن تسوية الدُفعات الذي يزيل فقط المتوسط ،أو بدالً
من ذلك يزيل التباين فقط .كيف تتصرف؟
.5إصلح معلمات betaو .gammaراقب وحلل النتائج.
.6هل يمكنك استبدال التسرب dropoutبتسوية الدفعات؟ كيف يتغير السلوك؟
.7أفكار البحث :فكريف تحوالت التسوية األخرى التي يمكنك تطبيقها:
.1هل يمكنك تطبيق التحويل المتكامل االحتمالي probability integral
transform؟
.2هل يمكنك استخدام تقدير التغاير covariance estimateالكامل للرتبة؟
لماذا ربما ال تفعل ذلك؟
.3هل يمكنك استخدام متغيرات مصفوفة مضغوطة compact matrix
variantsأخرى (كتلة قطرية ،block-diagonalرتبة إزاحة منخفضة
،low-displacement rankمونارك ،Monarchإلخ)؟
sparsification compressionكمنظم .4هل يعمل ضغط التناثر
regularizer؟
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 142
.5هل هناك توقعات أخرى (على سبيل المثال ،مخروط محدب convex
،coneوتحويالت خاصة بمجموعة تناظر symmetry group-specific
)transformsيمكنك استخدامها؟
def
𝑓ℱ∗ = argmin 𝐿(𝐗, 𝐲, 𝑓) subject to 𝑓 ∈ ℱ.
𝑓
من ∗ 𝑓 .مع فئات الدوال المتداخلة حيث ℱ1 ⊆ ⋯ ⊆ ℱ6على يمين الشكل ،8.6.1يمكننا
تجنب المشكلة المذكورة أعاله من فئات الدوال غير المتداخلة.
الشكل 8.6.1بالنسبة لفئات الدوال غير المتداخلة ،ال تضمن فئة الدالة األكبر (المشار إليها
بالمنطقة) االقتراب من دالة "الحقيقة" (∗ 𝑓) .هذا ال يحدثيف فئات الدوال المتداخلة.
وبالتالي ،فقط إذا كانت فئات الدوال األكبر تحتوي على الفئات األصغر ،فإننا نضمن أن زيادتها
يزيد بشكل صارم من القوة التعبيرية للشبكة .بالنسبة للشبكات العصبية العميقة ،إذا تمكنا من
تدريب الطبقة المضافة حديثًا على دالة هوية ,𝑓(𝐱) = 𝐱،identity functionفسيكون
النموذج الجديد فعالًا مثل النموذج األصلي .نظرًا ألن النموذج الجديد قد يحصل على حل أفضل
يناسب مجموعة بيانات التدريب ،فقد تسهل الطبقة المضافة تقليل أخطاء التدريب.
هذا هو السؤال الذي أخذيف االعتبار ( )2016 ،He et al.عند العمل على نماذج رؤية حاسوبية
عميقة جدًا.يف قلب شبكتهم المتبقية المقترحة ( )ResNetهي فكرة أن كل طبقة إضافية يجب
أن تحتوي بسهولة أكبر على دالة الهوية كأحد عناصرها .هذه االعتبارات عميقة إلى حد ما لكنها
أدت إلى حل بسيط بشكل مدهش ،وهو الكتلة المتبقية .residual blockمع ذلك ،فازت شبكة
ResNetبتحدي التعرف البصري على نطاق واسع على ImageNetيف عام .2015كان
للتصميم تأثير عميق على كيفية بناء شبكات عصبية عميقة .على سبيل المثال ،تمت إضافة الكتل
المتبقية إلى الشبكات المتكررة .)2016 ،Prakash et al. ،2017 ،Kim et al.( RNN
وبالمثل ،فإن المحوالت )2017 ،Vaswani et al.( transformersتستخدمها لتكديس
طبقات عديدة من الشبكات بكفاءة .يتم استخدامه أيضًايف الشبكات العصبية للرسم البياني
)2016 ،Kipf and Welling( graph neural networksوكمفهوم أساسي ،فقد تم
استخدامه على نطاق واسعيف الرؤية الحاسوبية (Ren et ،2018 ،Redmon and Farhadi
.) 2015 ،al.الحظ أن الشبكات المتبقية سبقتها شبكات الطرق السريعة highway networks
( )2015 ،Srivastava et al.التي تشتركيف بعض الدوافع ،وإن كان ذلك بدون تحديد معلمات
أنيقة حول دالة الهوية.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 144
الشكل 8.6.2يف الكتلة العادية (على اليسار) ،يجب أن يتعلم الجزء الموجود داخل المربع ذي
الخطوط المنقطة تعيين )𝐱(𝑓 مباشرةً.يف الكتلة المتبقية (على اليمين) ،يحتاج الجزء الموجود
داخل المربع ذي الخطوط المنقطة إلى معرفة التعيين المتبقي 𝐱 ،𝑔(𝐱) = 𝑓(𝐱) −مما يسهل
تعلم تعيين الهوية 𝐱 = )𝐱(𝑓.
145 الشبكات العصبية االلتفافية الحديثة:الفصل الثامن
تحتوي الكتلة المتبقية على.VGG الكامل لـ3 × 3 تصميم الطبقة التالفيفيةResNet تتبع
تتبع كل طبقة تالفيفية طبقة تسوية دفعية. بنفس عدد قنوات اإلخراج3 × 3 طبقتين تالفيفيتين
نتخطى عمليتي االلتفاف هاتين ونضيف اإلدخال مباشرةً قبل، بعد ذلك.ReLU ودالة تنشيط
يتطلب هذا النوع من التصميم أن يكون ناتج الطبقتين التالفيفيتين. النهائيةReLU دالة تنشيط
فنحن، إذا أردنا تغيير عدد القنوات. بحيث يمكن إضافتهما معًا،من نفس شكل المدخالت
إضافية لتحويل المدخالت إلى الشكل المطلوب لعملية1 × 1 بحاجة إلى إدخال طبقة تالفيفية
. دعونا نلقي نظرة على الكود أدناه.اإلضافة
import tensorflow as tf
from d2l import tensorflow as d2l
kernel_size=3, strides=strides)
self.conv2 =
tf.keras.layers.Conv2D(num_channels, kernel_size=3,
padding='same')
self.conv3 = None
if use_1x1conv:
self.conv3 =
tf.keras.layers.Conv2D(num_channels, kernel_size=1,
strides=strides)
self.bn1 = tf.keras.layers.BatchNormalization()
self.bn2 = tf.keras.layers.BatchNormalization()
Y += X
)return tf.keras.activations.relu(Y
يولد هذا الرمز نوعين من الشبكات :أحدهما حيث نضيف المدخالت إلى المخرجات قبل تطبيق
دالة ReLUالالخطيةكلما ،use_1x1conv=Falseواآلخر حيث نعدل القنوات والدقة
عن طريق متوسطات االلتفاف 1 × 1قبل اإلضافة .يوضح الشكل 8.6.3هذا.
الشكل 8.6.3فدرة ResNetمع االلتفاف 1 × 1وبدونه ،والذي يحول اإلدخال إلى الشكل
المطلوب لعملية اإلضافة.
)blk = Residual(3
))X = tf.random.normal((4, 6, 6, 3
)Y = blk(X
Y.shape
)]TensorShape([4, 6, 6, 3
لدينا أيضًا خيار خفض ارتفاع وعرض اإلخراج إلى النصف مع زيادة عدد قنوات اإلخراج.يف
هذه الحالة ،نستخدم التالفيف 1 × 1عبر .use_1x1conv=Trueيكون هذا مفيدًايف بداية
كل كتلة ResNetلتقليل األبعاد المكانية spatial dimensionalityعبر الخطوات = .2
ResNet 8.6.3
أول طبقتين من ResNetهما نفس طبقات GoogLeNetالتي وصفناها من قبل :الطبقة
التالفيفية 7 × 7مع 64قناة إخراج وخطوة 2متبوعة بطبقة تجميع الحد األقصى 3 × 3بخطوة
.2والفرق هو تسوية الدُفعات تمت إضافة طبقة بعد كل طبقة تالفيفيةيف .ResNet
class ResNet(d2l.Classifier):
def b1(self):
[(return tf.keras.models.Sequential
tf.keras.layers.Conv2D(64, kernel_size=7,
strides=2,
padding='same'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Activation('relu'),
tf.keras.layers.MaxPool2D(pool_size=3,
strides=2,
)])'padding='same
تستخدم GoogLeNetأربع وحدات مكونة من كتل االستهالل .Inceptionومع ذلك،
تستخدم شبكة ResNetأربع وحدات مكونة من الكتل المتبقية ،يستخدم كل منها عدة كتل
متبقية مع نفس العدد من قنوات اإلخراج .عدد القنواتيف الوحدة األولى هو نفس عدد قنوات
اإلدخال .نظرًا ألنه تم بالفعل استخدام طبقة تجميع بحد أقصى بخطوة ،2فليس من الضروري
تقليل االرتفاع والعرض.يف أول كتلة متبقية لكل من الوحدات الالحقة ،يتم مضاعفة عدد القنوات
مقارنةً بالوحدة السابقة ،ويتم تقليل االرتفاع والعرض إلى النصف.
)@d2l.add_to_class(ResNet
def block(self, num_residuals, num_channels,
first_block=False):
)(blk = tf.keras.models.Sequential
for i in range(num_residuals):
if i == 0 and not first_block:
blk.add(Residual(num_channels,
))use_1x1conv=True, strides=2
else:
))blk.add(Residual(num_channels
return blk
ثم نضيف جميع الوحدات إلى .ResNetهنا ،يتم استخدام كتلتين متبقيتين لكل وحدة .أخيرًا،
تمامًا مثل ،GoogLeNetنضيف طبقة تجميع المتوسط العالمية ،متبوعة بإخراج الطبقة
المتصلة بالكامل.
)@d2l.add_to_class(ResNet
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 148
قبل تدريب ،ResNetدعنا نالحظ كيف يتغير شكل اإلدخال عبر وحدات مختلفةيف .ResNet
كما هو الحاليف جميع البنى السابقة ،تنخفض الدقة بينما يزداد عدد القنوات ألعلى حتى النقطة
التي تجمع فيها طبقة تجميع المتوسط العالمي كل المعالم.
class ResNet18(ResNet):
def __init__(self, lr=0.1, num_classes=10):
super().__init__(((2, 64), (2, 128), (2, 256),
(2, 512)),
)lr, num_classes
)trainer = d2l.Trainer(max_epochs=10
))data = d2l.FashionMNIST(batch_size=128, resize=(96, 96
with d2l.try_gpu():
)model = ResNet18(lr=0.01
)trainer.fit(model, data
ResNeXt 8.6.5
أحد التحديات التي يواجهها المرءيف تصميم ResNetهو الموازنة trade-offبين الالخطية
واألبعاد داخل كتلة معينة .بمعنى ،يمكننا إضافة المزيد من الالخطية عن طريق زيادة عدد
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 150
الطبقات ،أو عن طريق زيادة عرض التالفيف .تتمثل اإلستراتيجية البديلةيف زيادة عدد القنوات
التي يمكنها نقل المعلومات بين الكتل .لسوء الحظ ،يأتي هذا األخير مع عقوبة تربيعية
quadratic penaltyألن التكلفة الحسابية الستيعاب القنوات وقنوات البث تتناسب مع ⋅ 𝑖𝑐(𝒪
) 𝑜𝑐 (انظر مناقشتنايف القسم .)7.4
يمكننا أخذ بعض اإللهام من كتلة االستهالل Inception blockيف الشكل 8.4.1الذي يحتوي
على معلومات تتدفق عبر الكتلةيف مجموعات منفصلة .أدى تطبيق فكرة المجموعات المستقلة
المتعددة على مجموعة ResNetيف الشكل 8.6.3إلى تصميم ،.Xie et al( ResNeXt
.)2017يختلف ResNeXtعن مجموعة التحوالت transformationيف البداية ،حيث يتبنى
نفس التحوليف جميع الفروع ،مما يقلل من الحاجة إلى الضبط اليدوي لكل فرع.
يُطلق على تقسيم االلتفاف من القنوات 𝑖𝑐 إلى 𝑜𝑐 مجموعة من مجموعات الحجم 𝑔 𝑐𝑖 /التي
تولد مخرجات الحجم 𝑔 ،𝑐𝑜 /بشكل مناسب تمامًا ،االلتفاف المجمّع grouped
.convolutionيتم تقليل التكلفة الحسابية (بالتناسب) من ) 𝑜𝑐 ⋅ 𝑖𝑐(𝒪 إلى ⋅ )𝑔𝒪(𝑔 ⋅ (𝑐𝑖 /
)𝑔 ،(𝑐𝑜 /𝑔)) = 𝒪(𝑐𝑖 ⋅ 𝑐𝑜 /أي أنها أسرع 𝑔 مرات .واألفضل من ذلك ،يتم أيضًا تقليل عدد
المعلمات الالزمة لتوليد اإلخراج من مصفوفة 𝑜𝑐 × 𝑖𝑐 إلى مصفوفات أصغر حجمًا
151 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
)𝑔 ،(𝑐𝑖 /𝑔) × (𝑐𝑜 /ومرة أخرى يتم تقليلها 𝑔 مرة أخرى .فيما يلي نفترض أن كال 𝑖𝑐 و 𝑜𝑐
يقبل القسمة على 𝑔.
التحدي الوحيديف هذا التصميم هو عدم تبادل أي معلومات بين المجموعات 𝑔 .تعدل كتلة
ResNeXtيف الشكل 8.6.5هذا بطريقتين :االلتفاف المجمع مع النواة 3 × 3يقع بين التفافين
.1 × 1الثانية تخدم واجب مزدوجيف تغيير عدد القنوات مرة أخرى .وتتمثل الفائدةيف أننا ندفع
)𝑏 ⋅ 𝑐(𝒪 تكلفة نواة 1 × 1فقط ويمكن أن نتعامل مع تكلفة )𝑔 𝒪(𝑏 2 /للنواة .3 × 3على
غرار تنفيذ الكتلة المتبقيةيف القسم ،8.6.2يتم استبدال االتصال المتبقي (وبالتالي معممة
)generalizedبواسطة االلتفاف .1 × 1
يوفر الشكل الصحيحيف الشكل 8.6.5ملخصًا أكثر إيجازًا عن فدرة الشبكة الناتجة .ستلعب أيضًا
دورًا رئيسيًايف تصميم شبكات CNNالحديثة العامةيف القسم .8.8الحظ أن فكرة التالفيف
المجمعة تعود إلى تطبيق .)2012,Krizhevsky et al.( ،AlexNetعند توزيع الشبكة عبر
وحدتي GPUبذاكرة محدودة ،تعامل التطبيق مع كل وحدة معالجة رسومات كقناة خاصة بها
دون أي آثار سيئة.
padding="same",
)groups=bot_channels//groups
= self.conv3
)tf.keras.layers.Conv2D(num_channels, 1, strides=1
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 152
self.bn1 = tf.keras.layers.BatchNormalization()
self.bn2 = tf.keras.layers.BatchNormalization()
self.bn3 = tf.keras.layers.BatchNormalization()
if use_1x1conv:
self.conv4 =
tf.keras.layers.Conv2D(num_channels, 1,
strides=strides)
self.bn4 =
tf.keras.layers.BatchNormalization()
else:
self.conv4 = None
8.6.6
مرغوبة ألنها تسمح لنا بالحصولNested function classes تعتبر فئات الدوال المتداخلة
تتمثل إحدى طرق.على فئات دوال أكثر قوة بدالً من فئات دوال مختلفة بمهارة عند إضافة سعة
تسمح الوصالت.تحقيق ذلكيف السماح لطبقات إضافية بالمرور عبر المدخالت إلى المخرجات
يغير هذا التحيز االستقرائي من كون الدوال البسيطة من الشكل، نتيجة لذلك.المتبقية بذلك
.𝑓(𝐱) = 𝐱 = )𝐱(𝑓 إلى دوال بسيطة تبدو وكأنها0
153 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
يعد ResNeXtمثاالً على كيفية تطور تصميم الشبكات العصبية التالفيفية بمرور الوقت :من
خالل كونه أكثر اقتصادايف الحساب وتداوله مع حجم عمليات التنشيط (عدد القنوات) ،فإنه
يسمح بشبكات أسرع وأكثر دقة بتكلفة أقل .طريقة بديلة لعرض التالفيف المجمعة grouped
convolutionsهي التفكيريف مصفوفة كتلة قطرية block-diagonal matrixلألوزان
التالفيفية .الحظ أن هناك عددًا قليالً جدًا من هذه "الحيل" التي تؤدي إلى شبكات أكثر كفاءة.
على سبيل المثال ،يحاكي )2018,Wu et al.(2018 ،ShiftNetتأثيرات االلتفاف ،ببساطة
عن طريق إضافة عمليات تنشيط متغيرة shifted activationsإلى القنوات ،مما يوفر تعقيدًا
متزايدًا للدوال ،هذه المرة دون أي تكلفة حسابية.
من السمات الشائعة للتصميمات التي ناقشناها حتى اآلن أن تصميم الشبكة يدوي إلى حد ما،
وي عتمد بشكل أساسي على براعة المصمميف العثور على المعلمات الفائقة للشبكة "الصحيحة".
في حين أنه من الواضح أنه مجدي ،إال أنه مكلف للغاية من حيث الوقت البشري وليس هناك ما
يضمن أن النتيجة مثالية بأي شكل من األشكال .سنناقشيف القسم 8.8عددًا من االستراتيجيات
للحصول على شبكات عالية الجودة بطريقة أكثر آلية .على وجه الخصوص ،سنراجع فكرة
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 154
مساحات تصميم الشبكة network design spacesالتي أدت إلى نماذج ،RegNetX / Y
(.)2020,Radosavovic et al.
8.6.7
.1ما هي االختالفات الرئيسية بين كتلة االستهالل Inception blockيف الشكل 8.4.1
والكتلة المتبقية residual block؟ كيف يقارنون من حيث الحساب والدقة وفئات
الدوال التي يمكنهم وصفها؟
.2ارجع إلى الجدول1يف مقالة )2016,He et al.( ،ResNetلتنفيذ انواع مختلفة
different variantsللشبكة.
.3بالنسبة للشبكات األعمق ،تقدم شبكة ResNetبُنية "عنق الزجاجة "bottleneck
لتقليل تعقيد النموذج .حاول تنفيذه.
.4في اإلصدارات الالحقة من ،ResNetقام المؤلفون بتغيير بنية "االلتفاف ،وتسوية
الدفعات ،والتفعيل" إلى بُنية "تسوية الدُفعات ،والتنشيط ،وااللتفاف" .قم بإجراء هذا
التحسين بنفسك .انظر الشكل1يف )2016( .He et alلمزيد من التفاصيل.
.5لماذا ال يمكننا فقط زيادة تعقيد الدوال دون قيود ،حتى لو كانت فئات الدوال متداخلة؟
𝑓(𝐱) = 𝐱 + 𝑔(𝐱).
وهذا يعني أن ResNetتتحلل 𝑓 إلى مصطلح خطي بسيط ومصطلح غير خطي أكثر تعقيدًا.
ماذا لو أردنا التقاط (وليس بالضرورة إضافة) المعلومات التي تتجاوز المصطلحين؟ أحد هذه
الحلول هو .)2017,Huang et al.( ،DenseNet
كما هو مبينيف الشكل ،8.7.1فإن االختالف الرئيسي بين ResNetو DenseNetهو أنهيف
الحالة األخيرة تكون المخرجات متسلسلة (يُشار إليها بـ ] )[,بدالً من إضافتها .نتيجة لذلك،
نقوم بإجراء تعيين من 𝐱 الى قيمها بعد تطبيق تسلسل معقد بشكل متزايد من الدوال:
𝐱 → [𝐱, 𝑓1 (𝐱), 𝑓2 ([𝐱, 𝑓1 (𝐱)]), 𝑓3 ([𝐱, 𝑓1 (𝐱), 𝑓2 ([𝐱, 𝑓1 (𝐱)])]), … ].
في النهاية ،يتم دمج كل هذه الدواليف MLPلتقليل عدد الميزات مرة أخرى .من حيث التنفيذ،
هذا بسيط للغاية :بدالً من إضافة المصطلحات ،نقوم بتجميعها .نشأ اسم DenseNetمن حقيقة
أن الرسم البياني للتبعية بين المتغيرات يصبح كثيفًا جدًا .ترتبط الطبقة األخيرة من هذه السلسلة
بكثافة بجميع الطبقات السابقة .الوصالت الكثيفة dense connectionsموضحةيف الشكل
.8.7.2
وطبقاتdense blocks هي كتل كثيفةDenseNet المكونات الرئيسية التي تتكون منها شبكة
بينما يتحكم، يحدد األول كيفية تسلسل المدخالت والمخرجات.transition layers انتقالية
𝐱 → نظرًا ألن التوسع،األخيريف عدد القنوات بحيث ال يكون كبيرًا جدًا
.𝐱[ يمكن أن يكون عالي األبعاد, 𝑓1 (𝐱), 𝑓2 ([𝐱, 𝑓1 (𝐱)]), … ]
import tensorflow as tf
from d2l import tensorflow as d2l
class ConvBlock(tf.keras.layers.Layer):
def __init__(self, num_channels):
super(ConvBlock, self).__init__()
self.bn = tf.keras.layers.BatchNormalization()
self.relu = tf.keras.layers.ReLU()
self.conv = tf.keras.layers.Conv2D(
filters=num_channels, kernel_size=(3, 3),
padding='same')
class DenseBlock(tf.keras.layers.Layer):
def __init__(self, num_convs, num_channels):
super(DenseBlock, self).__init__()
self.listLayers = []
for _ in range(num_convs):
157 الشبكات العصبية االلتفافية الحديثة:الفصل الثامن
self.listLayers.append(ConvBlock(num_channels))
class TransitionBlock(tf.keras.layers.Layer):
def __init__(self, num_channels, **kwargs):
super(TransitionBlock, self).__init__(**kwargs)
self.batch_norm =
tf.keras.layers.BatchNormalization()
self.relu = tf.keras.layers.ReLU()
self.conv = tf.keras.layers.Conv2D(num_channels,
kernel_size=1)
self.avg_pool =
tf.keras.layers.AvgPool2D(pool_size=2, strides=2)
قم بتطبيق طبقة انتقالية بها 10قنوات على إخراج الكتلة الكثيفةيف المثال السابق .هذا يقلل من
عدد قنوات اإلخراج إلى ،10ويقلل االرتفاع والعرض إلى النصف.
)blk = TransitionBlock(10
blk(Y).shape
)]TensorShape([4, 4, 4, 10
DenseNet 8.7.4
بعد ذلك ،سنقوم ببناء نموذج .DenseNetتستخدم DenseNetأوالً نفس الطبقة التالفيفية
الفردية وطبقة تجميع الحد االقصى كمايف .ResNet
class DenseNet(d2l.Classifier):
def b1(self):
[(return tf.keras.models.Sequential
(tf.keras.layers.Conv2D
64, kernel_size=7, strides=2,
padding='same'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.ReLU(),
(tf.keras.layers.MaxPool2D
pool_size=3, strides=2,
)])'padding='same
بعد ذلك ،على غرار الوحدات األربع المكونة من الكتل المتبقية التي تستخدمها ،ResNet
تستخدم DenseNetأربع كتل كثيفة .على غرار ،ResNetيمكننا تعيين عدد الطبقات
التالفيفية المستخدمةيف كل كتلة كثيفة .هنا ،قمنا بتعيينه على ،4بما يتوافق مع نموذج
ResNet-18يف القسم .8.6عالوة على ذلك ،قمنا بتعيين عدد القنوات (أي معدل النمو)
للطبقات التالفيفيةيف الكتلة الكثيفة إلى ،32لذلك ستتم إضافة 128قناة إلى كل كتلة كثيفة.
في ،ResNetيتم تقليل االرتفاع والعرض بين كل وحدة بواسطة كتلة متبقية بخطوة .2هنا،
نستخدم طبقة االنتقال لخفض االرتفاع والعرض إلى النصف وخفض عدد القنوات إلى النصف.
على غرار ،ResNetيتم توصيل طبقة تجميع عالمية وطبقة متصلة بالكامليف النهاية إلنتاج
الناتج.
)@d2l.add_to_class(DenseNet
def __init__(self, num_channels=64, growth_rate=32,
arch=(4, 4, 4, 4),
lr=0.1, num_classes=10):
)(__super(DenseNet, self).__init
)(self.save_hyperparameters
159 الشبكات العصبية االلتفافية الحديثة:الفصل الثامن
self.net = tf.keras.models.Sequential(self.b1())
for i, num_convs in enumerate(arch):
self.net.add(DenseBlock(num_convs, growth_rate))
# The number of output channels in the previous
dense block
num_channels += num_convs * growth_rate
# A transition layer that halves the number of
channels is added
# between the dense blocks
if i != len(arch) - 1:
num_channels //= 2
self.net.add(TransitionBlock(num_channels))
self.net.add(tf.keras.models.Sequential([
tf.keras.layers.BatchNormalization(),
tf.keras.layers.ReLU(),
tf.keras.layers.GlobalAvgPool2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(num_classes)]))
Training 8.7.5
224 سنقوم بتقليل ارتفاع اإلدخال وعرضه من،يف هذا القسم،نظرًا ألننا نستخدم شبكة أعمق هنا
. لتبسيط الحساب96 إلى
trainer = d2l.Trainer(max_epochs=10)
data = d2l.FashionMNIST(batch_size=128, resize=(96, 96))
with d2l.try_gpu():
model = DenseNet(lr=0.01)
trainer.fit(model, data)
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 160
8.7.6
المكونات الرئيسية التي تتكون منها DenseNetهي كتل كثيفة dense blocksوطبقات
انتقالية .transition layersبالنسبة لألخير ،نحتاج إلى إبقاء األبعاد تحت السيطرة عند تكوين
الشبكة عن طريق إضافة طبقات انتقالية تقلص عدد القنوات مرة أخرى .فيما يتعلق باالتصاالت
عبر الطبقات ،cross-layer connectionsعلى عكس شبكة ،ResNetحيث يتم إضافة
المدخالت والمخرجات معًا ،تقوم DenseNetبتجميع المدخالت والمخرجات على بُعد
القناة .على الرغم من أن عمليات التسلسل هذه تعيد استخدام الميزات لتحقيق كفاءة حسابية،
إال أنها لألسف تؤدي إلى استهالك كبير لذاكرة وحدة معالجة الرسومات .GPUنتيجة لذلك،
قد يتطلب تطبيق DenseNetتطبيقات أكثر كفاءةيف استخدام الذاكرة والتي قد تزيد من وقت
التدريب (.)2017 ،Pleiss et al.
8.7.7
.1لماذا نستخدم تجميع المتوسط average poolingبدالً من تجميع الحد األقصى
max-poolingيف الطبقة االنتقالية؟
.2إحدى المزايا المذكورةيف مقالة DenseNetهي أن معلمات نموذجها أصغر من تلك
الخاصة بـ .ResNetلماذا هذا هو الحال؟
.3إحدى المشكالت التي تم انتقاد DenseNetبسببها هي استهالكها العالي للذاكرة.
.1هل هذا هو الحال فعال؟ حاول تغيير شكل اإلدخال الى 224 × 224لرؤية
االستهالك الفعلي لذاكرة وحدة معالجة الرسومات بشكل تجريبي.
.2هل يمكنك التفكيريف وسيلة بديلة لتقليل استهالك الذاكرة؟ كيف تريد تغيير
أطار العمل؟
.4نفذ إصدارات DenseNetالمختلفة الواردةيف الجدول 1من مقالة ،DenseNet
(.)2017,Huang et al.
.3صمم نموذجًا قائمًا على MLPمن خالل تطبيق فكرة .DenseNetقم بتطبيقه على
مهمة التنبؤ بسعر السكنيف القسم .5.7
على وجه التحديد ،البحث عن العمارة العصبية )Zoph and ( ،)2018,Liu et al.( ،(NAS
)2016,Leهو عملية أتمتة بنى الشبكات العصبية .نظرًا لمساحة البحث الثابتة ،تستخدم NAS
إستراتيجية بحث لتحديد بُ نية ضمن مساحة البحث تلقائيًا بناءً على تقدير األداء الذي تم إرجاعه.
نتيجة NASهي مثيل شبكة واحد.
بدالً من التركيز على تصميم مثل هذه الحاالت الفردية ،يتمثل النهج البديليف تصميم مساحات
تصميم الشبكة network design spacesالتي تميز مجموعات الشبكات ( Radosavovic
.)2020 ،et al.تجمع هذه الطريقة بين قوة التصميم اليدوي و .NASمن خالل اإلجراءات شبه
اآللية (كما هو الحاليف ،)NASيستكشف تصميم مساحات تصميم الشبكة الجانب الهيكلي
لتصميم الشبكة من مساحة تصميم AnyNetاألولية .ثم يشرعيف اكتشاف مبادئ التصميم (كما
هو الحاليف التصميم اليدوي) التي تؤدي إلى شبكات بسيطة ومنتظمة .RegNets :قبل إلقاء
الضوء على مبادئ التصميم هذه ،دعنا نبدأ بمساحة التصميم األولية.
AnyNet 8.8.1
تسمى مساحة التصميم األولية ،AnyNetوهي مساحة تصميم غير مقيدة نسبيًا ،حيث يمكننا
التركيز على استكشاف بُنية الشبكة بافتراض الكتل القياسية الثابتة مثل ( ResNeXtالقسم
.)8.6.5على وجه التحديد ،تتضمن بُنية الشبكة عناصر مثل عدد الكتلnumber of blocks
وعدد قنوات اإلخراجيف كل مرحلة ،وعدد المجموعات ( number of groupsعرض
المجموعة) ونسبة االختناق bottleneck ratioداخل كل كتلة .ResNeXt
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 162
الشكل 8.8.1مساحة تصميم .AnyNetإلى جانب عدد المجموعات ونسبة االختناق داخل
كل كتلة ،تشمل خيارات التصميم :العمق 𝑖𝑑 وعدد قنوات اإلخراج 𝑖𝑤 ألي مرحلة 𝑖.
تظهر مساحة تصميم AnyNetيف الشكل .8.8.1تبدأ هذه الشبكة بجذع ،stemيتبعها جسم
bodyبمراحل تحول 𝑛 ،ورأس headنهائي .بشكل ملموس ،فإن جذع الشبكة عبارة عن
التفاف 3 × 3مع الخطوة 2التي تقسم ارتفاع وعرض صورة اإلدخال إلى النصف .رأس الشبكة
عبارة عن تجميع متوسط عالمي يتبعه طبقة متصلة بالكامل للتنبؤ بفئة اإلخراج .الحظ أن جذع
الشبكة ورأسها يظالن ثابتًا وبسيطًا ،بحيث يركز التصميم على هيكل الشبكة الذي يعد مركزيًا
لألداء .على وجه التحديد ،يتكون جسم الشبكة من مراحل التحويل 𝑛 (𝑛 هو معطى) ،حيث
تتكون المرحلة 𝑖 من كتل 𝑑𝑖 ResNeXtمع قنوات اإلخراج 𝑖𝑤 ،وتنخفض بشكل تدريجي
االرتفاع والعرض إلى النصف عبر الكتلة األولى (إعداد ،use_1x1conv=True
strides=2يف d2l.ResNeXtBlockيف القسم .)8.6.5دعنا نشير كذلك إلى نسبة
االختناق وعدد المجموعات (عرض المجموعة) داخل كل كتلة ResNeXtللمرحلة 𝑖 كـ 𝑖𝑏 و
𝑖𝑔 ،على التوالي .بشكل عام ،على الرغم من هيكل الشبكة المباشر ،تنوع 𝑖𝑏 𝑔𝑖 ,و 𝑖𝑤 ،و 𝑖𝑑
ينتج عنه عدد كبير من الشبكات الممكنةيف مساحة تصميم .AnyNet
163 الشبكات العصبية االلتفافية الحديثة:الفصل الثامن
import tensorflow as tf
from d2l import tensorflow as d2l
class AnyNet(d2l.Classifier):
def stem(self, num_channels):
return tf.keras.models.Sequential([
tf.keras.layers.Conv2D(num_channels,
kernel_size=3, strides=2,
padding='same'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Activation('relu')])
. عرض الكتلةnum_channels حيث يحدد،ResNeXt تتكون كل مرحلة من العمق لكتل
.الحظ أن الكتلة األولى تقسم ارتفاع وعرض صور اإلدخال إلى النصف
@d2l.add_to_class(AnyNet)
def stage(self, depth, num_channels, groups, bot_mul):
net = tf.keras.models.Sequential()
for i in range(depth):
if i == 0:
net.add(d2l.ResNeXtBlock(num_channels,
groups, bot_mul,
use_1x1conv=True, strides=2))
else:
net.add(d2l.ResNeXtBlock(num_channels,
groups, bot_mul))
return net
.AnyNet نكمل تنفيذ،من خالل وضع جذع الشبكة والجسم والرأس معًا
@d2l.add_to_class(AnyNet)
def __init__(self, arch, stem_channels, lr=0.1,
num_classes=10):
super(AnyNet, self).__init__()
self.save_hyperparameters()
self.net =
tf.keras.models.Sequential(self.stem(stem_channels))
for i, s in enumerate(arch):
self.net.add(self.stage(*s))
self.net.add(tf.keras.models.Sequential([
tf.keras.layers.GlobalAvgPool2D(),
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 164
))])tf.keras.layers.Dense(units=num_classes
Constraining 8.8.2
Design Spaces with Lower Error Distributions
بالنسبة ألي مرحلة من مراحل ،AnyNetتكون خيارات التصميم هي نسبة االختناق 𝑖𝑏 وعدد
المجموعات 𝑖𝑔 داخل كل كتلة وعرض الكتلة 𝑖𝑤 والعمق 𝑖𝑑 .تبدأ عملية تصميم مساحات
الشبكة من بُنية شبكة غير مقيدة نسبيًا تتميز بـ ( 𝑖𝑑 ) 𝑏𝑖 ، 𝑔𝑖 ، 𝑤𝑖 ،يف مساحة تصميم AnyNet
األولية .ثم تقوم هذه العملية باختبار نماذج تدريجية من مساحة تصميم المدخالت لتقييم توزيع
الخطأ ( )2019 ،Radosavovic et al.كمؤشر للجودة quality indicatorإلخراج مساحة
تصميم أكثر تقييدًا مع نماذج أبسط قد يكون لها جودة أفضل.
دعونا نوضح بالتفصيل مؤشر الجودة هذا لمساحات التصميم .بالنظر إلى النماذج المأخوذة من
بعض مساحات التصميم ،تقيس دالة التوزيع التجريبية للخطأ error empirical
، 𝐹(𝑒) ،distribution functionجزء النماذج التي بها أخطاء 𝑖𝑒 أقل من 𝑒:
𝑛
1
𝐹(𝑒) = ∑ 𝟏 (𝑒𝑖 < 𝑒).
𝑛
𝑖=1
الشكل 8.8.2مقارنة دوال التوزيع التجريبية للخطأ لمساحات التصميم .تظهر تسميات الشكل
خطأ الحد األدنى والخطأ المتوسط .تؤدي زيادة عرض الشبكة عبر المراحل ( 𝐶AnyNetX
من إلى 𝐷 )AnyNetXوزيادة عمق الشبكة عبر المراحل (من 𝐷 AnyNetXإلى
𝐸 )AnyNetXإلى تبسيط مساحة التصميم مع توزيعات أخطاء محسّنة (الشكل مأخوذ من
(.))2020 ،Radosavovic et al.
يسار الشكل 8.8.2أن كال مساحات التصميم لهما نفس الجودة .نظرًا ألن األبسط هو األفضل،
فإننا نواصل البحث من خالل مشاركة عدد المجموعات 𝑔 = 𝑖𝑔 بشكل إضافي .وهذا يؤدي إلى
مزيد من مساحة التصميم المبسطة مع عدم وجود تغيير فعلييف توزيعات الخطأ (يمين الشكل
.)8.8.2
يشير التحقيقيف النماذج الجيدة والسيئة من ان 𝐶 AnyNetXقد يكون من المفيد زيادة العرض
عبر المراحل ( .)2020 ،Radosavovic et al.تجريبيًا ،تبسيط 𝐶AnyNetXو
𝐷 AnyNetXمع 𝑤𝑖 ≤ 𝑤𝑖+1لتحسين جودة مساحات التصميم (يسار الشكل .)8.8.3
وبالمثل ،فإن إضافة المزيد من القيود 𝑑𝑖 ≤ 𝑑𝑖+1لزيادة عمق الشبكة عبر المراحل يعطي أفضل
(يمين الشكل .)8.8.3
الشكل 8.8.3مقارنة دوال التوزيع التجريبية للخطأ لمساحات التصميم .تظهر تسميات الشكل
خطأ الحد األدنى والخطأ المتوسط .تؤدي زيادة عرض الشبكة عبر المراحل (من
𝐶 AnyNetXإلى 𝐷 )AnyNetXوزيادة عمق الشبكة عبر المراحل (من 𝐷 AnyNetXإلى
𝐸 ) AnyNetXإلى تبسيط مساحة التصميم مع توزيعات أخطاء محسّنة (الشكل مأخوذ من
(.))2020 ،Radosavovic et al.
RegNet 8.8.3
تتكون مساحة التصميم 𝐸 AnyNetXالناتجة من شبكات بسيطة تتبع مبادئ التصميم سهلة
التفسير:
) قيود خطية كمية لـلزيادة2020 ،Radosavovic et al.( اقترح،باتباع مبادئ التصميم هذه
التي تستخدمRegNetY وResNeXt باستخدام كتلRegNetX مما يؤدي إلى، 𝑑𝑖 𝑖𝑤 و
قمنا بتنفيذ متغير، على سبيل المثال.)2018,Hu et al.( ،SENets أيضًا مشغلين من
طبقة والذي يتميز بـ32 المكون منRegNetX
• 𝑏𝑖 = 1;
• 𝑔𝑖 = 16;
• 𝑤1 = 32, 𝑤2 = 80;
• 𝑑1 = 4, 𝑑2 = 6.
class RegNet32(AnyNet):
def __init__(self, lr=0.1, num_classes=10):
stem_channels, groups, bot_mul = 32, 16, 1
depths, channels = (4, 6), (32, 80)
super().__init__(
((depths[0], channels[0], groups, bot_mul),
(depths[1], channels[1], groups, bot_mul)),
stem_channels, lr, num_classes)
تقلل بشكل تدريجي الدقة وتزيد من قنواتRegNet يمكننا أن نرى أن كل مرحلة من مراحل
.اإلخراج
trainer = d2l.Trainer(max_epochs=10)
data = d2l.FashionMNIST(batch_size=128, resize=(96, 96))
with d2l.try_gpu():
model = RegNet32(lr=0.01)
trainer.fit(model, data)
167 الفصل الثامن :الشبكات العصبية االلتفافية الحديثة
8.8.5
مع الخصائص المرغوبة مثل المحلية localityوثبات الترجمة translation invariance
(القسم )7.1للرؤية ،كانت شبكات CNNهي ال ُبنى المهيمنةيف هذا المجال.يف اآلونة األخيرة،
أثارت المحوالت (القسم )2021 ،Touvron et al. ،2021 ،Dosovitskiy et al.( )11.7
و )2021,Tolstikhin et al.( ،MLPsأيضًا بحثًا يتجاوز بُنى CNNالراسخة للرؤية .على
وجه التحديد ،على الرغم من عدم وجود التحيزات االستقرائية inductive biasesالمذكورة
أعاله المالزمة لشبكات ،CNNفقد حققت محوالت الرؤية (القسم )11.8أداءً متطورًايف
تصنيف الصور على نطاق واسعيف أوائل عام ،2020مما يدل على أن قابلية التوسع تتفوق على
التحيزات االستقرائية ( .)2021 ،Dosovitskiy et al.بمعنى آخر ،غالبًا ما يكون من الممكن
تدريب محوالت كبيرة large transformersلتتفوق على شبكات CNNالكبيرةيف مجموعات
البيانات الكبيرة .مستوحاة من سلوك التحجيم الفائق superior scaling behaviorللمحوالت
(القسم )11.9مع االهتمام الذاتي متعدد الرؤوس ( multi-head self-attentionالقسم
،)11.5تؤدي عملية التحسين التدريجي من بُنية ResNetالقياسية نحو تصميم محول الرؤية
vision transformerإلى عائلة من شبكات CNNتسمى ConvNeXtالنماذج التي
تتنافس بشكل إيجابي مع المحوالت من أجل الرؤية ( .)2022 ،Liu et al.نحيل القراء
المهتمين إلى مناقشات تصميم CNNيف مقالة .)2022,Liu et al.( ،ConvNeXt
8.8.6
.1قم بزيادة عدد المراحل إلى .4هل يمكنك تصميم RegNetأعمق يعمل بشكل
أفضل؟
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 168
بعد ذلك،يف القسم ،7انتقلنا إلى بيانات الصورة ،حيث تتكون المدخالت من قيم البكسل األولية
في كل إحداثييف الصورة .ال تكاد بيانات الصورة تتناسب مع فاتورة مجموعة البيانات الجدولية
النموذجية .هناك ،احتجنا إلى استدعاء الشبكات العصبية التالفيفية ( )CNNللتعامل مع الهيكل
الهرمي والثوابت .ومع ذلك ،كانت بياناتنا ال تزال ذات طول ثابت .يتم تمثيل كل صورة من صور
Fashion-MNISTكشبكة من قيم البكسل .28 × 28عالوة على ذلك ،كان هدفنا تطوير
نموذج ينظر إلى صورة واحدة فقط ثم ينتج تنبوًا واحدًا .ولكن ما الذي يجب أن نفعله عندما
نواجه سلسلة من الصور ،كما هو الحاليف مقطع فيديو ،أو عند تكليفنا بإنتاج تنبؤ منظم بشكل
تسلسلي ،كمايف حالة التسميات التوضيحية للصور image captioning؟
تتطلب مهام التعلم التي ال تعد وال تحصى التعامل مع البيانات المتسلسلة .sequential data
يتطلب شرح الصور وتوليف الكالم وتوليد الموسيقى أن تنتج النماذج مخرجات تتكون من
تسلسالت.يف المجاالت األخرى ،مثل توقع السالسل الزمنية time series prediction
وتحليل الفيديو video analysisواسترجاع المعلومات الموسيقية musical information
،retrievalيجب أن يتعلم النموذج من المدخالت المتسلسلة .غالبًا ما تنشأ هذه المطالبيف
وقت واحد :مهام مثل ترجمة مقاطع نصية من لغة طبيعية إلى أخرى ،أو االنخراطيف حوار ،أو
التحكميف روبوت ،تتطلب نماذج استيعاب وإخراج بيانات منظمة بالتسلسل.
الشبكات العصبية المتكررة ( )RNNsهي نماذج التعلم العميق التي تلتقط ديناميكيات
التسلسالت عبر االتصاالت المتكررة ،recurrent connectionsوالتي يمكن اعتبارها دورات
في شبكة العقد .قد يبدو هذا غير منطقييف البداية .بعد كل شيء ،فإن الطبيعة المغذية
feedforward natureللشبكات العصبية هي التي تجعل ترتيب الحساب واضحًا .ومع ذلك،
يتم تحديد الحواف المتكررة بطريقة دقيقة تضمن عدم حدوث مثل هذا الغموض .يتم إلغاء
171 الفصل التاسع :الشبكات العصبية المتكررة
التحكميف الشبكات العصبية المتكررة عبر الخطوات الزمنية ( time stepsأو خطوات التسلسل
،)sequence stepsمع تطبيق نفس المعلمات األساسيةيف كل خطوة .بينما يتم تطبيق
االتصاالت القياسية بشكل متزامن لنشر عمليات تنشيط كل طبقة إلى الطبقة الالحقةيف نفس
الخطوة الزمنية ،تكون االتصاالت المتكررة ديناميكية ،وتمرير المعلومات عبر خطوات الوقت
المجاورة .كما يكشف العرض غير المطوي unfolded viewيف الشكل ،9.1يمكن اعتبار
شبكات RNNبمثابة شبكات عصبية تلقائية feedforward neural networksحيث تتم
مشاركة معلمات كل طبقة (التقليدية والمتكررة )conventional and recurrentعبر
خطوات زمنية.
الشكل 9.1على اليسار يتم تصوير الوصالت المتكررة recurrent connectionsعبر حواف
دورية .cyclic edgesعلى اليمين ،نكشف عن RNNبمرور الوقت .هنا ،تمتد الحواف
المتكررة على خطوات زمنية متجاورة ،adjacent time stepsبينما يتم حساب االتصاالت
التقليدية conventional connectionsبشكل متزامن.
مثل الشبكات العصبية على نطاق أوسع ،تتمتع شبكات RNNبتاريخ طويل يمتد من االنضباط،
حيث نشأت كنماذج للدماغ شاعها علماء اإلدراك وتم تبنيها الحقًا كأدوات نمذجة عملية
يستخدمها مجتمع التعلم اآللي .كما هو الحال مع التعلم العميق على نطاق أوسع ،يتبنى هذا
الكتاب منظور التعلم اآللي ،مع التركيز على RNNsكأدوات عملية ارتفعت إلى الشعبيةيف 2010
بسبب النتائج المذهلةيف مهام متنوعة مثل التعرف على خط اليد handwriting recognition
( ،)2008 ،Graves et al.الترجمة اآللية ،.Sutskever et al( machine translation
،)2014والتعرف على التشخيصات الطبية Lipton ( recognizing medical diagnosis
.)2016 ،.et alنوجه القارئ المهتم بمزيد من المواد األساسية إلى مراجعة شاملة متاحة
للجمهور ( .)2015 ،.Lipton et alنالحظ أيضًا أن التسلسل ليس فريدًا بالنسبة لـ .RNNs
على سبيل المثال ،يمكن تكييف شبكات CNNالتي قدمناها بالفعل للتعامل مع البيانات ذات
الطول المتفاوت ،varying lengthعلى سبيل المثال ،الصور ذات الدقة المتفاوتة varying
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 172
مهدت إحدى األفكار الرئيسية الطريق لثورةيف نمذجة التسلسل.يف حين أن المدخالت واألهداف
للعديد من المهام األساسيةيف التعلم اآللي ال يمكن بسهولة تمثيلها كمتجهات ذات طول ثابت
،fixed length vectorsإال أنه يمكن تمثيلهايف كثير من األحيان على أنها متواليات متغيرة
الطول لمتجهات الطول الثابت .على سبيل المثال ،يمكن تمثيل المستندات كتسلسل من
الكلمات .غالبًا ما يمكن تمثيل السجالت الطبية كتسلسل لألحداث (لقاءات ،أدوية ،إجراءات،
اختبارات معملية ،تشخيصات) .يمكن تمثيل مقاطع الفيديو كتسلسالت متفاوتة الطول للصور
الثابتة.
بينما ظهرت نماذج التسلسليف مجاالت تطبيق ال حصر لها ،فإن البحث األساسييف المنطقة كان
مدفوعًايف الغالب بالتقدميف المهام األساسيةيف معالجة اللغة الطبيعية natural language
.processingوبالتالي ،خالل هذا الفصل ،سنركز عرضنا وأمثلة على البيانات النصية text
.dataإذا فهمت هذه األمثلة ،فإن تطبيق هذه النماذج على أساليب البيانات األخرى يجب أن
يكون بسيطًا نسبيًا.يف األقسام القليلة التالية ،نقدم تدوينًا أساسيًا للتسلسالت وبعض مقاييس
التقييم لتقييم جودة مخرجات النموذج المنظم بشكل تسلسلي .بعد ذلك ،نناقش المفاهيم
األساسية لنموذج اللغة ونستخدم هذه المناقشة لتحفيز نماذج RNNاألولى لدينا .أخيرًا ،نصف
طريقة حساب التدرجات عند االنتشار الخلفي من خالل شبكات RNNواستكشاف بعض
التحديات التي غالبًا ما تتم مواجهتها عند تدريب مثل هذه الشبكات ،وتحفيز بُنى RNN
الحديثة التي ستتبعيف القسم .10
تتكون بعض مجموعات البيانات من تسلسل ضخم واحد .ضعيف اعتبارك ،على سبيل المثال،
التدفقات الطويلة للغاية لقراءات أجهزة االستشعار التي قد تكون متاحة لعلماء المناخ.يف مثل
173 الفصل التاسع :الشبكات العصبية المتكررة
هذه الحاالت ،قد نقوم بإنشاء مجموعات بيانات تدريبية عن طريق أخذ عينات عشوائية الحقة
من بعض الطول المحدد مسبقًا.يف كثير من األحيان ،تصل بياناتنا كمجموعة من التسلسالت
.sequencesخذ بعين االعتبار األمثلة التالية )1( :مجموعة من الوثائق ،كل منها يمثل على أنه
تسلسل كلمات خاص به ،ولكل منها طوله الخاص 𝑖𝑇؛ ( )2التمثيل المتسلسل للمريض الذي
يبقىيف المستشفى ،حيث تتكون كل إقامة من عدد من األحداث ويعتمد طول التسلسل تقريبًا
على طول مدة اإلقامة.
في السابق ،عند التعامل مع المدخالت الفردية ،افترضنا أنه تم أخذ عينات منها بشكل مستقل
عن نفس التوزيع األساسي )𝑋(𝑃 .بينما ال نزال نفترض أن التسلسالت بأكملها (على سبيل
المثال ،المستندات الكاملة أو مسارات المريض) يتم أخذ عينات منها بشكل مستقل ،ال يمكننا
افتراض أن البيانات التي تصليف كل خطوة زمنية مستقلة عن بعضها البعض .على سبيل المثال،
تعتمد الكلمات التي من المحتمل أن تظهر الحقًايف المستند بشكل كبير على الكلمات التي وردت
س ابقًايف المستند .يعتمد الدواء الذي من المحتمل أن يتلقاها المريضيف اليوم العاشر من زيارة
المستشفى بشكل كبير على ما حدثيف األيام التسعة السابقة.
وهذا ينبغي أن يكون مفاجئا .إذا لم نكن نعتقد أن العناصريف التسلسل كانت مرتبطة ببعضنا
البعض ،فلن نتكبد عناء تصميمها كسلسلةيف المقام األول .ضعيف اعتبارك فائدة ميزات الملء
التلقائي auto-fillالشائعةيف أدوات البحث وعمالء البريد اإللكتروني الحديث .إنها مفيدة على
وجه التحديد ألنه غالبًا ما يكون من الممكن التنبؤ (بشكل ناقص ،ولكن أفضل من التخمين
العشوائي) ما قد تكون االستمرارية المحتملة للتسلسل ،مع إعطاء بعض البادئة األولية .بالنسبة
لمعظم نماذج التسلسل ،ال نطلب االستقالل ،أو حتى الثبات ،لتسلسالتنا .بدالً من ذلك ،نطلب
فقط أن يتم أخذ عينات من التسلسالت نفسها من بعض التوزيع األساسي الثابت على
التسلسالت بأكملها.
يسمح هذا النهج المرن بظواهر مثل ( )1المستندات التي تبدو مختلفة بشكل كبيريف البداية عما
كانت عليهيف النهاية ،أو ( ) 2تطور حالة المريض إما نحو الشفاء أو نحو الوفاة خالل فترة اإلقامة
في المستشفى؛ و ( ) 3تطور ذوق العميل بطرق يمكن التنبؤ بها على مدار التفاعل المستمر مع
نظام التوصية .recommender system
نرغب أحيانًايف توقع هدف ثابت 𝑦 بالنظر إلى إدخال منظم بشكل تسلسلي (على سبيل المثال،
تصنيف المشاعر sentiment classificationبناءً على مراجعة فيلم).يف أوقات أخرى ،نرغب
في توقع هدف منظم بشكل تسلسلي ( 𝑇𝑦 )𝑦1 , … ,مع األخذيف االعتبار إدخال ثابت (على سبيل
المثال ،تسمية توضيحية للصورة .)image captioningال يزال هدفنايف أوقات أخرى هو التنبؤ
باألهداف المنظمة بشكل تسلسلي بناءً على المدخالت المنظمة بالتسلسل (على سبيل المثال،
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 174
الترجمة اآللية أو التسميات التوضيحية للفيديو .)video captioningتأخذ مهام التسلسل إلى
التسلسل شكلين )1( :محاذاة :alignedحيث تتم محاذاة اإلدخاليف كل خطوة زمنية مع هدف
مطابق (على سبيل المثال ،جزء من عالمات الكالم)؛ ( )2غير محاذي :unalignedحيث ال
يُظهر المدخل والهدف بالضرورة استجابات خطوة بخطوة (على سبيل المثال ،الترجمة اآللية).
قبل أن نقلق بشأن التعامل مع األهداف من أي نوع ،يمكننا معالجة المشكلة األكثر وضوحًا:
نمذجة الكثافة غير الخاضعة لإلشراف ( unsupervised density modelingوتسمى أيضًا
نمذجة التسلسل .)sequence modelingهنا ،بالنظر إلى مجموعة من المتسلسالت
،sequencesهدفنا هو تقدير دالة الكتلة االحتمالية probability mass functionالتي تخبرنا
بمدى احتمالية رؤية أي تسلسل معين ،أي ) 𝑇 𝐱 .𝑝(𝐱1 , … ,
افترض اآلن أن المتداول يرغبيف إجراء صفقات قصيرة األجل ،والدخول بشكل استراتيجي إلى
المؤشر أو الخروج منه ،اعتمادًا على ما إذا كان يعتقد أنه سيرتفع أو ينخفضيف الخطوة الزمنية
الالحقة.يف غياب أي ميزات أخرى (أخبار ،بيانات التقارير المالية ،إلخ) ،فإن اإلشارة الوحيدة
175 الفصل التاسع :الشبكات العصبية المتكررة
المتاحة للتنبؤ بالقيمة الالحقة هي تاريخ األسعار حتى اآلن .وبالتالي فإن المتداول مهتم بمعرفة
توزيع االحتماالت
على األسعار التي قد يتخذها المؤشريف الخطوة الزمنية الالحقة .بينما قد يكون تقدير التوزيع
بالكامل على متغير عشوائي ذي قيمة مستمرة أمرًا صعبًا ،سيكون من دواعي سرور المتداول
التركيز على بعض اإلحصائيات الرئيسية للتوزيع ،ال سيما القيمة المتوقعة والتباين .استراتيجية
واحدة بسيطة لتقدير التوقع المشروط
سيكون تطبيق نموذج االنحدار الخطي ( linear regressionراجع القسم .)3.1مثل هذه
النماذج التي تتراجع عن قيمة اإلشارة على القيم السابقة لتلك اإلشارة نفسها تسمى بشكل طبيعي
نماذج االنحدار الذاتي .autoregressive modelsهناك مشكلة رئيسية واحدة فقط :يختلف
عدد المدخالت 𝑥𝑡−1 , … , 𝑥1حسب 𝑡 .أي أن عدد المدخالت يزداد مع كمية البيانات التي
نواجهها .وبالتالي ،إذا أردنا التعامل مع بياناتنا التاريخية كمجموعة تدريب ،فإننا نواجه مشكلة أن
كل مثال يحتوي على عدد مختلف من الميزات .سوف يدور الكثير مما يلييف هذا الفصل حول
تقنيات التغلب على هذه التحديات عند االنخراطيف مشاكل نمذجة االنحدار الذاتي حيث يكون
موضوع االهتمام هو ) 𝑃(𝑥𝑡 ∣ 𝑥𝑡−1 , … , 𝑥1أو بعض اإلحصائيات الخاصة بهذا التوزيع.
تتكرر بعض االستراتيجيات بشكل متكرر .أوالً ،قد نعتقد أنه على الرغم من توفر التسلسالت
الطويلة ،𝑥𝑡−1 , … , 𝑥1فقد ال يكون من الضروري الرجوع إلى الوراء حتى اآلنيف التاريخ عند
التنبؤ بالمستقبل القريب.يف هذه الحالة ،قد نكتفي بشرط بعض النوافذ الطويلة 𝜏 واستخدام
المالحظات 𝜏 𝑥𝑡−1 , … , 𝑥𝑡−فقط .الفائدة المباشرة هي أن عدد المدخالت اآلن هو نفسه دائمًا،
على األقل بالنسبة لـ 𝜏 > 𝑡 .هذا يسمح لنا بتدريب أي نموذج خطي أو شبكة عميقة تتطلب
متجهات ذات طول ثابت كمدخالت .ثانيًا ،قد نقوم بتطوير نماذج تحافظ على بعض الملخصات
𝑡 ℎللمشاهدات السابقة (انظر الشكل )9.1.2وفي نفس الوقت يتم تحديث 𝑡 ℎباإلضافة إلى
^ ^
التنبؤ 𝑡𝑥 .هذا يؤدي إلى النماذج التي تقدر مع ) 𝑡 𝑥𝑡 = 𝑃(𝑥𝑡 ∣ ℎباإلضافة إلى تحديثات
النموذج ) .ℎ𝑡 = 𝑔(ℎ𝑡−1 , 𝑥𝑡−1نظرًا لعدم مالحظة 𝑡 ℎمطلقًا ،فإن هذه النماذج تسمى أيضًا
نماذج االنحدار الذاتي الكامنة .latent autoregressive models
إلنشاء بيانات التدريب من البيانات التاريخية ،يقوم المرء عادة بإنشاء أمثلة عن طريق أخذ
العينات بشكل عشوائي .بشكل عام ،ال نتوقع وقتًا للوقوف بال حراك .ومع ذلك ،فإننا نفترض
غالبًا أنهيف حين أن القيم المحددة لـ 𝑡𝑥 قد تتغير ،فإن الديناميكيات التي يتم وفقًا لها إنشاء كل
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 176
مالحظة الحقة بالنظر إلى المالحظات السابقة ال تتغير .يسمي اإلحصائيون الديناميكيات التي ال
تتغير بالثبات .stationary
في حين أن نمذجة اللغة قد ال تبدو ،للوهلة األولى ،كمشكلة االنحدار الذاتي ،يمكننا تقليل
النمذجة اللغوية إلى التنبؤ االنحدار الذاتي عن طريق تحليل كثافة مفصل تسلسل ∣ 𝑡𝑥(𝑝
) 𝑇𝑥 𝑥1 , … ,إلى ضرب كثافات شرطية بطريقة من اليسار إلى اليمين عن طريق تطبيق قاعدة
السلسلة لالحتمالية:
𝑇
الحظ أنه إذا كنا نعمل مع إشارات منفصلة مثل الكلمات ،فيجب أن يكون نموذج االنحدار الذاتي
مصنفًا احتماليًا ،مما ينتج عنه توزيع احتمالي كامل على المفردات الخاصة بالكلمات التي ستأتي
بعد ذلك ،بالنظر إلى السياق األيسر.
غالبًا ما نجد أنه من المفيد العمل مع النماذج التي تستمر كما لو أن شرط ماركوف قد تم استيفائه،
حتى عندما نعلم أن هذا صحيح تقريبًا .مع المستندات النصية الحقيقية ،نستمريف الحصول على
المعلومات حيث نقوم بتضمين المزيد والمزيد من سياق اليسار .لكن هذه المكاسب تتضاءل
بسرعة .وبالتالي ،فإننايف بعض األحيان نتنازل عن الصعوبات الحسابية واإلحصائية ونتجنبها من
خالل نماذج التدريب التي تعتمد صالحيتها على شرط ماركوف من الدرجة 𝑘 .حتى النماذج
اللغوية الضخمة القائمة على RNNوالتي تعتمد على المحوالتيف الوقت الحاضر نادرًا ما
تتضمن أكثر من آالف كلمات السياق.
باستخدام البيانات المنفصلة ،discrete dataيحسب نموذج ماركوف الحقيقي ببساطة عدد
المرات التي حدثت فيها كل كلمةيف كل سياق ،مما ينتج عنه تقدير التردد النسبي لـ ∣ 𝑡𝑥(𝑃
) .𝑥𝑡−1عندما تفترض البيانات قيمًا منفصلة فقط (كمايف اللغة) ،يمكن حساب التسلسل األكثر
احتماالً للكلمات بكفاءة باستخدام البرمجة الديناميكية .dynamic programming
عشوائيًا آخر على ما يبدو؟ من حيث المبدأ ،ال حرجيف ظهور ) 𝑇𝑥 𝑃(𝑥1 , … ,بترتيب عكسي.
النتيجة هي التفكيك الى العوامل صالح :valid factorization
1
ومع ذلك ،هناك العديد من األسباب التي تجعل تحليل النص إلى عوامليف نفس االتجاهات التي
نقرأها (من اليسار إلى اليمين لمعظم اللغات ،ولكن من اليمين إلى اليسار للعربية والعبرية)
مفضلًا لمهمة نمذجة اللغة .أوالً ،هذا مجرد اتجاه طبيعي أكثر بالنسبة لنا للتفكير فيه .بعد كل
شيء نقرأ النص كل يوم ،وتسترشد هذه العملية بقدرتنا على توقع الكلمات والعبارات التي من
المحتمل أن تأتي بعد ذلك .فكر فقطيف عدد المرات التي أكملت فيها جملة شخص آخر.
وبالتالي ،حتى لو لم يكن لدينا سبب آخر لتفضيل مثل هذه فك التشفير بالترتيب ،فإنها ستكون
مفيدة فقط إذا كان لدينا حدس أفضل لما يجب أن يكون مرجحًا عند التنبؤ بهذا الترتيب.
ثانيًا ،من خالل التحليل بالترتيب ،factorizing in orderيمكننا تعيين احتماالت للتسلسالت
الطويلة بشكل تعسفي باستخدام نفس نموذج اللغة .لتحويل االحتمالية عبر الخطوات 1من
خالل 𝑡 إلى احتمال يمتد إلى كلمة ،𝑡 + 1فإننا ببساطة نضربيف االحتمال الشرطي للرمز token
المعطى اإلضافي بالنظر إلى االحتمالية السابقة𝑃(𝑥𝑡+1 , … , 𝑥1 ) = 𝑃(𝑥𝑡 , … , 𝑥1 ) ⋅ :
) .𝑃(𝑥𝑡+1 ∣ 𝑥𝑡 , … , 𝑥1
ثالثًا ،لدينا نماذج تنبؤية أقوى للتنبؤ بالكلمات المجاورة مقابل الكلمات الموجودةيف مواقع أخرى
عشوائية.يف حين أن جميع أوامر التحليل إلى العوامل صحيحة ،فإنها ال تمثل بالضرورة جميعًا
مشاكل النمذجة التنبؤية السهلة على حد سواء .ال ينطبق هذا على اللغة فحسب ،بل ينطبق أيضًا
على أنواع البيانات األخرى ،على سبيل المثال ،عندما تكون البيانات منظمة سببيًا .نعتقد أن
األحداث المستقبلية ال يمكن أن تؤثر على الماضي .ومن ثم ،إذا غيرنا 𝑡𝑥 ،فقد نتمكن من التأثير
على ما يحدث لـ 𝑥𝑡+1للمضي قدمًا ولكن ليس العكس .أي ،إذا غيرنا 𝑡𝑥 ،فإن التوزيع على
األحداث الماضية لن يتغير.يف بعض السياقات ،يجعل هذا من السهل التنبؤ بـ ) 𝑡𝑥 ∣ 𝑃(𝑥𝑡+1
بدالً من التنبؤ بـ ) .𝑃(𝑥𝑡 ∣ 𝑥𝑡+1على سبيل المثال،يف بعض الحاالت ،يمكننا أن نجد = 𝑥𝑡+1
𝜖 𝑓(𝑥𝑡 ) +لبعض الضوضاء المضافة 𝜖 ،بينما العكس ليس صحيحًا (.)2009 ،Hoyer et al.
هذه أخبار رائعة ،نظرًا ألنه عادةً ما يكون االتجاه األمامي هو الذي نهتم بتقديره .كتاب بيترز
وآخرون ( ) 2017( .)Peters et alأوضح المزيد حول هذا الموضوع .نحن بالكاد نخدش
سطحه.
179 الفصل التاسع :الشبكات العصبية المتكررة
Training 9.1.3
قبل أن نركز اهتمامنا على البيانات النصية ،دعنا نجرب ذلك أوالً باستخدام بعض البيانات
التركيبية ذات القيمة المستمرة .continuous-valued synthetic data
%matplotlib inline
import tensorflow as tf
from d2l import tensorflow as d2l
هنا ،ستتبع 1000بيانات تركيبية دالة المثلثية ،sinمطبقة على 0.01مرة من الخطوة الزمنية.
لجعل المشكلة أكثر إثارة لالهتمام ،قمنا بإفساد كل عينة بضوضاء مضافة .من هذا التسلسل
نستخرج أمثلة تدريبية ،كل منها يتكون من ميزات وتسمية.
class Data(d2l.DataModule):
def __init__(self, batch_size=16, T=1000,
num_train=600, tau=4):
)(self.save_hyperparameters
)self.time = tf.range(1, T + 1, dtype=tf.float32
self.x = tf.sin(0.01 * self.time) +
tf.random.normal([T]) * 0.2
)(data = Data
d2l.plot(data.time, data.x, 'time', 'x', xlim=[1, 1000],
))figsize=(6, 3
للبدء ،نجرب نموذجًا يعمل كما لو أن البيانات استوفت شرط ماركوف ذات الرتبة 𝜏 ،وبالتالي
يتنبأ باستخدام المالحظات السابقة 𝜏 فقط .وبالتالي لكل خطوة زمنية لدينا مثال مع التسمية = 𝑦
𝑡𝑥 والميزات ] .𝐱𝑡 = [𝑥𝑡−𝜏 , … , 𝑥𝑡−1قد يكون القارئ الذكي قد الحظ أن هذه النتائجيف أمثلة
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 180
𝜏 ،1000 −ألننا نفتقر إلى التاريخ الكافي 𝜏𝑦 𝑦1 , … ,لها .بينما يمكننا وضع المتتاليات األولى
𝜏 باألصفار ،إلبقاء األمور بسيطة ،نقوم بإسقاطهايف الوقت الحالي .تحتوي مجموعة البيانات
الناتجة على أمثلة 𝜏 ، 𝑇 −حيث يكون لكل إدخاليف النموذج طول تسلسل 𝜏 .نقوم بإنشاء مكرر
بياناتيف أول 600مثال ،يغطي فترة دالة .sin
)@d2l.add_to_class(Data
def get_dataloader(self, train):
features = [self.x[i : self.T-self.tau+i] for i in
])range(self.tau
)self.features = tf.stack(features, 1
))self.labels = tf.reshape(self.x[self.tau:], (-1, 1
i = slice(0, self.num_train) if train else
)slice(self.num_train, None
return self.get_tensorloader([self.features,
)self.labels], train, i
في هذا المثال سيكون نموذجنا انحدارًا خطيًا قياسيًا.
)model = d2l.LinearRegression(lr=0.01
)trainer = d2l.Trainer(max_epochs=5
)trainer.fit(model, data
Prediction 9.1.4
لتقييم نموذجنا ،نتحقق أوالً من مدى جودة أداء نموذجنا عند التنبؤ بخطوة واحدة لألمام one-
.step-ahead prediction
181 الفصل التاسع :الشبكات العصبية المتكررة
)(onestep_preds = model(data.features).numpy
d2l.plot(data.time[data.tau:], [data.labels,
onestep_preds], 'time', 'x',
legend=['labels', '1-step preds'], figsize=(6,
))3
تبدو التوقعات بخطوة واحدة جيدة ،حتى قرب النهاية .𝑡 = 1000
فكر اآلن ،ماذا لو الحظنا فقط بيانات التسلسل حتى الخطوة الزمنية 604
( )n_train + tauولكننا نرغبيف عمل تنبؤات عدة خطواتيف المستقبل .لسوء الحظ ،ال
يمكننا حساب التنبؤ بخطوة واحدة للخطوة الزمنية 609مباشرة ،ألننا ال نعرف المدخالت
المقابلة ،بعد أن رأينا فقط حتى .𝑥604يمكننا معالجة هذه المشكلة عن طريق إدخال توقعاتنا
السابقة كمدخالت لنموذجنا لعمل تنبؤات الحقة ،والتوقع لألمام ،خطوة واحدةيف كل مرة ،حتى
الوصول إلى الخطوة الزمنية المطلوبة:
^
𝑥605 = 𝑓(𝑥601 , 𝑥602 , 𝑥603 , 𝑥604 ),
^ ^
𝑥606 = 𝑓(𝑥602 , 𝑥603 , 𝑥604 , 𝑥605 ),
^ ^ ^
𝑥607 = 𝑓(𝑥603 , 𝑥604 , 𝑥605 , 𝑥606 ),
^ ^ ^ ^
𝑥608 = 𝑓(𝑥604 , 𝑥605 , 𝑥606 , 𝑥607 ),
^ ^ ^ ^ ^
𝑥609 = 𝑓(𝑥605 , 𝑥606 , 𝑥607 , 𝑥608 ),
…
^
بشكل عام ،بالنسبة للتسلسل المرصود 𝑡𝑥 ،𝑥1 , … ,خرجه المتوقع 𝑘𝑥𝑡+يف الخطوة الزمنية 𝑡 +
𝑘 يسمى بالتنبؤ بـ 𝑘 خطوة إلى األمام .k-step-ahead predictionمنذ أن الحظنا حتى ،𝑥604
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 182
^
التنبؤ بخطوة 𝑘 لألمام هو 𝑘 . 𝑥604+بمعنى آخر ،سيتعين علينا االستمراريف استخدام تنبؤاتنا
الخاصة لعمل تنبؤات متعددة الخطوات .دعونا نرى كيف تسير األمور على ما يرام.
))multistep_preds = tf.Variable(tf.zeros(data.T
)multistep_preds[:].assign(data.x
for i in range(data.num_train + data.tau, data.T):
(multistep_preds[i].assign(tf.reshape(model
tf.reshape(multistep_preds[i-data.tau : i], (1,
)))( -1))),
d2l.plot([data.time[data.tau:],
data.time[data.num_train+data.tau:]],
[onestep_preds,
multistep_preds[data.num_train+data.tau:]], 'time',
'x', legend=['1-step preds', 'multistep
))preds'], figsize=(6, 3
لسوء الحظ،يف هذه الحالة نفشل بشكل مذهل .تتحلل التنبؤات إلى ثابت بسرعة كبيرة بعد بضع
خطوات تنبؤ .لماذا كان أداء الخوارزمية أسوأ بكثير عند توقع المزيديف المستقبل؟يف النهاية ،يرجع
هذا إلى حقيقة أن األخطاء تتراكم .لنفترض أنه بعد الخطوة 1لدينا بعض الخطأ 𝜖 = . 𝜖1اآلن
مدخالت الخطوة 2مضطربة بواسطة ،𝜖1وبالتالي نعاني من بعض الخطأيف ترتيب 𝜖2 = 𝜖 +
𝑐𝜖1لبعض الثابت 𝑐 ،وما إلى ذلك .يمكن أن تتباعد التنبؤات بسرعة عن المالحظات الحقيقية.
قد تكون بالفعل على دراية بهذه الظاهرة الشائعة .على سبيل المثال ،تنبؤات الطقس خالل الـ
24ساعة القادمة تميل إلى أن تكون دقيقة جدًا ولكن بعد ذلك ،تنخفض الدقة بسرعة .سنناقش
طرق تحسين هذا خالل هذا الفصل وما بعده.
183 الشبكات العصبية المتكررة:الفصل التاسع
دعونا نلقي نظرة فاحصة على الصعوباتيف بالتنبؤات بـ 𝑘 خطوة إلى األمام عن طريق حساب
𝑘 = 1,4,16,64 التنبؤات على التسلسل الكامل لـ
def k_step_pred(k):
features = []
for i in range(data.tau):
features.append(data.x[i : i+data.T-data.tau-
k+1])
# The (i+tau)-th element stores the (i+1)-step-ahead
predictions
for i in range(k):
preds = model(tf.stack(features[i : i+data.tau],
1))
features.append(tf.reshape(preds, -1))
return features[data.tau:]
يف حين أن.يوضح هذا بوضوح كيف تتغير جودة التنبؤ بينما نحاول التنبؤ أكثريف المستقبل
فإن أي شيء، ال تزال تبدو جيدة4-step-ahead predictions التنبؤات ذات األربع خطوات
.يتجاوز ذلك يكون عديم الفائدة تقريبًا
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 184
9.1.5
هناك اختالف كبيريف الصعوبة بين االستيفاء interpolationواالستقراء .interpolation
وبالتالي ،إذا كان لديك تسلسل ،sequenceفاحترم دائمًا الترتيب الزمني للبيانات عند التدريب،
أي ال تتدرب أبدًا على البيانات المستقبلية .بالنظر إلى هذا النوع من البيانات ،تتطلب نماذج
التسلسل أدوات إحصائية متخصصة للتقدير .هناك خياران شائعان هما نماذج االنحدار الذاتي
autoregressive modelsونماذج االنحدار التلقائي المتغيرة الكامنة latent-variable
.autoregressive modelsبالنسبة للنماذج السببية ( causal modelsعلى سبيل المثال،
الوقتيف المضي قدمًا ،)time going forwardيكون تقدير االتجاه األمامي أسهل كثيرًا من
االتجاه العكسي .بالنسبة للتسلسل المرصود حتى الخطوة الزمنية ،فإن ناتجها المتوقعيف الخطوة
الزمنية هو التنبؤ بالخطوة إلى األمام .كلما توقعنا مزيدًا من الوقت من خالل الزيادة ،تتراكم
األخطاء وتتدهور جودة التنبؤ ،غالبًا بشكل كبير.
9.1.6
.1قم بتحسين النموذج في تجربة هذا القسم.
.1هل تدمج أكثر من المشاهدات observationsاألربع الماضية؟ كم تحتاج حقا؟
.2كم عدد المشاهدات السابقة التي ستحتاجها إذا لم يكن هناك ضوضاء؟ تلميح:
يمكنك الكتابة كمعادلة تفاضلية .cos
.3هل يمكنك دمج المشاهدات القديمة مع الحفاظ على العدد اإلجمالي للسمات
ثابتًا؟ هل هذا يحسن الدقة؟ لماذا؟
.4قم بتغيير بُ نية الشبكة العصبية وتقييم األداء .يمكنك تدريب النموذج الجديد
بمزيد من الفترات .epochsماذا تالحظ؟
.2يرغب المستثمر في العثور على ورقة مالية جيدة للشراء .ينظر إلى العوائد السابقة ليقرر
أيها من المرجح أن يكون جيدًا .ما الذي يمكن أن يحدث خطأ في هذه االستراتيجية؟
.3هل السببية causalityتنطبق أيضا على النص؟ إلى أي مدى؟
.4أعط مثاالً عندما قد تكون هناك حاجة إلى نموذج االنحدار التلقائي الكامن اللتقاط
ديناميكية البيانات.
)''090b5e7e70c295757f55df93cb0a180b9691891a
with open(fname) as f:
)(return f.read
)(data = TimeMachine
)(raw_text = data._download
]raw_text[:60
'The Time Machine, by H. G. Wells
'[1898]nnnnnInnnThe Time Tra
للتبسيط ،نتجاهل عالمات الترقيم والكتابة باألحرف الكبيرة عند المعالجة المسبقة للنص الخام
.raw text
@d2l.add_to_class(TimeMachine) #@save
def _preprocess(self, text):
)(return re.sub('[^A-Za-z]+', ' ', text).lower
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 186
)text = data._preprocess(raw_text
]text[:60
'the time machine by h g wells i the time traveller for
'so it
Tokenization 9.2.2
الرموز Tokensهي الوحدات الذرية (غير القابلة للتجزئة) للنص .تتوافق كل خطوة زمنية مع
رمز Tokenواحد ،ولكن ما يشكل رمزًا على وجه التحديد هو اختيار التصميم .على سبيل
المثال ،يمكننا تمثيل الجملة " " Baby needs a new pair of shoesعلى شكل سلسلة من
7كلمات ،حيث تشتمل مجموعة كل الكلمات على مفردات كبيرة (عادةً عشرات أو مئات
اآلالف من الكلمات) .أو قد نمثل نفس الجملة كتسلسل أطول بكثير من 30حرفًا ،باستخدام
مفردات أصغر بكثير( ال يوجد سوى 256حرف ASCIIمميز ).أدناه ،نقوم بترميز نصنا المعالج
مسبقًا إلى سلسلة من األحرف.
)@d2l.add_to_class(TimeMachine #@save
def _tokenize(self, text):
)return list(text
)tokens = data._tokenize(text
)]','.join(tokens[:30
't,h,e, ,t,i,m,e, ,m,a,c,h,i,n,e, ,b,y, ,h, ,g,
' ,w,e,l,l,s,
Vocabulary 9.2.3
هذه الرموز tokensال تزال سالسل .stringsومع ذلك ،يجب أن تتكون مدخالت نماذجنا في
النهاية من مدخالت رقمية .بعد ذلك ،نقدم فئة إلنشاء المفردات ،vocabulariesأي الكائنات
التي تربط كل قيمة رمزية مميزة بفهرس فريد .unique indexأوالً ،نحدد مجموعة الرموز
الفريدة في مجموعة التدريب الخاصة بنا .ثم نقوم بتعيين فهرس رقمي لكل رمز فريد unique
. tokenغالبًا ما يتم حذف عناصر المفردات النادرة للراحة .عندما نواجه رمزًا مميزًا في وقت
التدريب أو االختبار لم يسبق رؤيته أو تم إسقاطه من المفردات ،فإننا نقوم بتمثيله برمز
”> ،“<unkمما يدل على أن هذه قيمة غير معروفة .unknown value
def __len__(self):
return len(self.idx_to_token)
@property
def unk(self): # Index for the unknown token
return self.token_to_idx['<unk>']
وتحويل تسلسل السالسل إلى قائمة من، نقوم اآلن ببناء مفردات لمجموعة البيانات الخاصة بنا
الحظ أننا لم نفقد أي معلومات ويمكننا بسهولة.numerical indices المؤشرات الرقمية
.)string تحويل مجموعة البيانات الخاصة بنا إلى تمثيلها األصلي (سلسلة
vocab = Vocab(tokens)
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 188
]]indices = vocab[tokens[:10
)print('indices:', indices
))print('words:', vocab.to_tokens(indices
]indices: [21, 9, 6, 0, 21, 10, 14, 6, 0, 14
words: ['t', 'h', 'e', ' ', 't', 'i', 'm', 'e', ' ',
]''m
Putting It All Together 9.2.4
باستخدام الفئات والطرق المذكورة أعاله ،نقوم بتجميع كل شيء في طريقة اإلنشاء التالية لفئة
، TimeMachineوالتي تُرجع المجموعة ، corpusوقائمة من المؤشرات المرمزة token
، indicesوالمفردات ، vocabوهي مفردات مجموعة .The Time Machineالتعديالت
التي أجريناها هنا هي ) 1( :نقوم بترميز النص إلى أحرف ،وليس كلمات ،لتبسيط التدريب في
أقسام الحقة ؛ ( ) 2المجموعة عبارة عن قائمة واحدة ،وليست قائمة بقوائم الرموز ،نظرًا ألن كل
سطر نص في مجموعة بيانات The Time Machineليس بالضرورة جملة أو فقرة.
@d2l.add_to_class(TimeMachine) #@save
def build(self, raw_text, vocab=None):
))tokens = self._tokenize(self._preprocess(raw_text
)if vocab is None: vocab = Vocab(tokens
]corpus = [vocab[token] for token in tokens
return corpus, vocab
)(words = text.split
)vocab = Vocab(words
]vocab.token_freqs[:10
[('the', 2261),
('i', 1267),
('and', 1245),
('of', 1155),
('a', 816),
('to', 695),
189 الفصل التاسع :الشبكات العصبية المتكررة
('was', 552),
('in', 541),
('that', 443),
])('my', 440
الحظ أن الكلمات العشر األكثر شيوعًا ليست كلها وصفية .descriptiveقد تتخيل أننا قد نرى
قائمة مشابهة جدًا إذا اخترنا أي كتاب عشوائيًا .مقاالت مثل " "theو " ، "aضمائر مثل " "iو
" ، "myوحروف الجر مثل " "ofو " "toو " "inتحدث غالبًا ألنها تخدم أدوارًا نحوية مشتركة.
غالبًا ما تسمى هذه الكلمات الشائعة في آن واحد ولكنها وصفية بشكل خاص كلمات التوقف
، stop wordsوفي األجيال السابقة من مصنفات النص التي تستند إلى تمثيالت كيس من
الكلمات ، bag-of-wordsغالبًا ما يتم تصفيتها .ومع ذلك ،فهي تحمل معنى وليس من
الضروري تصفيتها عند العمل مع النماذج العصبية الحديثة القائمة على RNNوالمحول .إذا
نظرت إلى أسفل القائمة ،ستالحظ أن تردد الكلمات يتالشى بسرعة .الكلمة العاشرة األكثر شيوعًا
هي أقل من 1/5مثل الكلمة األكثر شيوعًا .يميل تردد الكلمات إلى اتباع توزيع قانون السلطة
( power law distributionتحديدًا )Zipfianأثناء نزولنا في المراتب .ranksللحصول
على فكرة أفضل ،نرسم رقم تكرار الكلمة .word frequency
بعد التعامل مع الكلمات القليلة األولى كاستثناءات ،تتبع جميع الكلمات المتبقية تقريبًا خطًا
مستقيمًا في رسم .log-logيلتقط قانون Zipfهذه الظاهرة ،والذي ينص على أن تكرار 𝑖𝑛
الكلمة األكثر شيوعًا هو:
1
∝ 𝑖𝑛 ,
𝛼𝑖
وهو ما يعادل:
حيث 𝛼 هو األس الذي يميز التوزيع وهو ثابت .يجب أن يمنحنا هذا بالفعل وقفة إذا أردنا نمذجة
الكلمات عن طريق حساب اإلحصائيات .بعد كل شيء ،سنبالغ في تقدير تكرار الذيل،
والمعروف أيضًا باسم الكلمات النادرة .infrequent wordsولكن ماذا عن تركيبات الكلمات
األخرى ،مثل كلمتين متتاليتين ( ، )bigramsوثالث كلمات متتالية ( ، )trigramsوما بعدها؟
دعونا نرى ما إذا كان تردد bigramيتصرف بنفس طريقة تكرار الكلمة المفردة (.)unigram
('the--time--machine', 30),
('the--medical--man', 24),
('it--seemed--to', 16),
('it--was--a', 15),
('here--and--there', 15),
('seemed--to--me', 14),
('i--did--not', 14),
('i--saw--the', 13),
('i--began--to', 13)]
األحادي: بين هذه النماذج الثالثةtoken frequency دعنا نتخيل معدل تكرار الرمز، أخيرًا
.trigrams و، bigrams و، unigrams
يبدو أيضًا أن تسلسل الكلمات يتبع، unigram بخالف كلمات، ً أوال.هذا الرقم مثير للغاية
n- عدد، ثانيًا. اعتمادًا على طول التسلسل، )9.2.1( وإن كان بأس أصغر 𝛼 في، Zipf قانون
. هذا يعطينا األمل في أن هناك قدرًا كبيرًا من ال ُبنية في اللغة. المميزة ليس بهذه الضخامةgrams
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 192
ثالثًا ،نادرًا ما تحدث العديد من .n-gramsهذا يجعل بعض األساليب غير مناسبة لنمذجة
اللغة ويحفز استخدام نماذج التعلم العميق .سنناقش هذا في القسم التالي.
9.2.6
يعتبر النص من أكثر أشكال بيانات التسلسل شيوعًايف التعلم العميق .الخيارات الشائعة لما يشكل
رمزًا tokenهي األحرف والكلمات وقطع الكلمات .لمعالجة النص ،نقوم عادةً ( )1بتقسيم
النص إلى رموز tokens؛ ( )2بناء مفردات لتعيين سالسل الرموز token stringsإلى مؤشرات
رقمية numerical indices؛ و ( )3تحويل البيانات النصية إلى مؤشرات رمزية token
indicesللنماذج للتالعب بها .من الناحية العملية ،فإن تكرار الكلمات يميل إلى اتباع قانون
.Zipfهذا صحيح ليس فقط للكلمات الفردية ( ،)unigramsولكن أيضًا بالنسبة إلى n-
.grams
9.2.7
.1في تجربة هذا القسم ،قم بترميز tokenizeالنص إلى كلمات وقم بتغيير قيمة وسيطة
min_freqلمثيل .Vocabصف نوعياً كيف تؤثر التغييراتيف min_freqعلى
حجم المفردات الناتجة.
.2قدر اُس توزيع Zipfianلـ unigramsو bigramsوtrigramsيف هذه المجموعة
.corpus
.3ابحث عن بعض مصادر البيانات األخرى (قم بتنزيل مجموعة بيانات قياسية للتعلم
اآللي ،واختر كتابًا آخريف مجال عام اخر ،واكتشف موقعًا إلكترونيًا ،وما إلى ذلك).
لكل منها ،قم بترميز البيانات على مستوى الكلمة والحرف .كيف تقارن أحجام
المفردات مع مجموعة The Time Machineبقيم مكافئة لـ .min_freqقدر
األس لتوزيع Zipfianالمقابل لتوزيعات unigramو bigramلهذه المجموعات.
كيف تتم مقارنتها بالقيم التي الحظتها لمجموعة The Time Machine؟
𝑃(𝑥1 , 𝑥2 , … , 𝑥𝑇 ),
النماذج اللغوية Language modelsمفيدة بشكل ال يصدق .على سبيل المثال ،سيكون نموذج
اللغة المثالي قادرًا على إنشاء نص طبيعي بمفرده ،وذلك ببساطة عن طريق رسم رمز واحد في
كل مرة ) .𝑥𝑡 ∼ 𝑃(𝑥𝑡 ∣ 𝑥𝑡−1 , … , 𝑥1على عكس القرد الذي يستخدم آلة كاتبة ،فإن كل النص
الخارج من هذا النموذج سيمر كلغة طبيعية ،على سبيل المثال ،نص إنجليزي .عالوة على ذلك،
سيكون كافيًا إلنشاء حوار هادف ،ببساطة عن طريق تكييف النص على أجزاء الحوار السابقة.
من الواضح أننا ما زلنا بعيدين جدًا عن تصميم مثل هذا النظام ،ألنه سيحتاج إلى فهم النص
بدالً من مجرد إنشاء محتوى معقول نحويًا.
ومع ذلك ،فإن النماذج اللغوية تقدم خدمة رائعة حتى في شكلها المحدود .على سبيل المثال ،
الجملتان " "to recognize speechو " "to wreck a nice beachتبدو متشابهة جدًا .يمكن
أن يتسبب هذا في الغموض في التعرف على الكالم ،والذي يمكن حله بسهولة من خالل نموذج
لغ وي يرفض الترجمة الثانية باعتبارها غريبة .وبالمثل ،في خوارزمية تلخيص المستندات
،document summarizationمن المفيد معرفة أن " "dog bites manأكثر تكرارًا من
" ، "man bites dogأو أن عبارة " "I want to eat grandmaهي عبارة مزعجة إلى حد ما ،
بينما ""I want to eat, grandmaأكثر اعتدالًا.
على سبيل المثال ،يمكن إعطاء احتمال وجود تسلسل نصي يحتوي على أربع كلمات على النحو
التالي:
يُشار عادةً إلى صيغ االحتمال التي تتضمن متغير واحد ،ومتغيرين ،وثالثة متغيرات على أنها
نماذج ،unigramو ،bigramو ،trigramعلى التوالي .من أجل حساب نموذج اللغة ،نحتاج
إلى حساب احتمال الكلمات واالحتمال الشرطي للكلمة بالنظر إلى الكلمات القليلة السابقة.
الحظ أن هذه االحتماالت هي معلمات نموذج اللغة .language model parameters
حيث )𝑥(𝑛 و) 𝑛(𝑥, 𝑥 ′عدد تكرارات المفردات وأزواج الكلمات المتتالية ،على التوالي .لسوء
الحظ ،يعد تقدير احتمال وجود زوج من الكلمات أكثر صعوبة إلى حد ما ،نظرًا ألن حدوث
" " deep learningأقل تكرارًا .على وجه الخصوص ،بالنسبة لبعض تركيبات الكلمات غير
المعتادة ،قد يكون من الصعب العثور على تكرارات كافية للحصول على تقديرات دقيقة .كما
هو مقترح من النتائج التجريبية في القسم ، 9.2.5تأخذ األمور منعطفًا نحو األسوأ بالنسبة
لتركيبات مكونة من ثالث كلمات وما بعدها .سيكون هناك العديد من التركيبات المعقولة المكونة
من ثالث كلمات والتي من المحتمل أال نراها في مجموعة البيانات الخاصة بنا .ما لم نقدم بعض
الحلول لتعيين مثل هذه المجموعات من الكلمات عددًا غير صفري ،فلن نتمكن من استخدامها
في نموذج اللغة .إذا كانت مجموعة البيانات صغيرة أو كانت الكلمات نادرة جدًا ،فقد ال نعثر
حتى على واحدة منها.
𝑛 ك عدد إجمالي للكلمات في مجموعة التدريب وعدد الكلمات الفريدة .يساعد هذا الحل مع
الفردي ،على سبيل المثال ،عبر
هنا ،𝜖1 , 𝜖2و 𝜖3المعلمات الفائقة .خذ 𝜖1كمثال :عندما 𝜖1 = 0ال يتم تطبيق أي تجانس no
^
smoothing؛ عندما 𝜖1تقترب من الالنهاية الموجبة 𝑃(𝑥) ،يقترب من االحتمال الموحد
𝑚 . 1/ما ورد أعاله هو البديل البدائي إلى حد ما لما يمكن أن تحققه التقنيات األخرى ( Wood
.)2011 ،et al.
لسوء الحظ ،تصبح مثل هذه النماذج غير عملية إلى حد ما بسرعة لألسباب التالية .أوالً ،كما
تمت مناقشتهيف القسم ،9.2.5نادرًا ما تحدث العديد من القواعد اللغوية ،مما يجعل تجانس
البالس غير مناسب إلى حد ما لنمذجة اللغة .ثانيًا ،نحتاج إلى تخزين كل التواتر .countsثالثًا،
هذا يتجاهل تمامًا معنى الكلمات .على سبيل المثال ،يجب أن تحدث "القط "catو" القطط
" felineيف السياقات ذات الصلة .من الصعب للغاية تعديل مثل هذه النماذج لسياقات إضافية،
في حين أن نماذج اللغة القائمة على التعلم العميق مناسبة تمامًا ألخذ ذلكيف االعتبار .يكاد يكون
من المؤكد أن تكون تسلسالت الكلمات الطويلة األخيرة جديدة ،ومن ثم فإن النموذج الذي
يحسب ببساطة تواتر تسلسالت الكلمات التي شوهدت سابقًا ال بد أن يؤدي أداءً ضعيفًا هناك.
لذلك ،فإننا نركز على استخدام الشبكات العصبية لنمذجة اللغةيف بقية الفصل.
Perplexity 9.3.2
بعد ذلك ،دعنا نناقش كيفية قياس جودة نموذج اللغة ،والتي سيتم استخدامها لتقييم نماذجنايف
األقسام التالية .إحدى الطرق هي التحقق من مدى دهشة النص .surprising the textنموذج
اللغة الجيد قادر على التنبؤ برموز عالية الدقة بما سنراه بعد ذلك .تأمل االستمرارية التالية لعبارة
"إنها تمطر ،”It is rainingعلى النحو الذي اقترحته نماذج لغوية مختلفة:
من حيث الجودة ،من الواضح أن المثال 1هو األفضل .الكلمات منطقية ومتماسكة منطقيًا.يف
حين أنه قد ال يعكس بدقة الكلمة التي تليها معنوية (كان من الممكن أن تكون " in San
"Franciscoو " "in winterامتدادات معقولة تمامًا) ،إال أن النموذج قادر على التقاط أي نوع
من الكلمات التالية .المثال 2أسوأ بكثير من خالل إنتاج امتداد غير منطقي .ومع ذلك ،فقد تعلم
النموذج على األقل كيفية تهجئة الكلمات ودرجة معينة من االرتباط بين الكلمات .أخيرًا ،يشير
المثال 3إلى نموذج سيئ التدريب ال يناسب البيانات بشكل صحيح.
قد نقيس جودة النموذج عن طريق حساب احتمالية التسلسل .likelihood of the sequence
لسوء الحظ ،هذا رقم يصعب فهمه ويصعب مقارنته .بعد كل شيء ،من المرجح أن تحدث
التسلسالت األقصر بكثير من التسلسالت األطول ،وبالتالي فإن تقييم النموذج على ماغنوم أوبس
تولستوي الحرب والسالم سينتج حتمًا احتمالية أقل بكثير من ،على سبيل المثال،يف رواية األمير
الصغير لسانت إكزوبيري .ما ينقص هو ما يعادل المتوسط.
نظرية المعلومات Information theoryتأتييف متناول اليد هنا .لقد حددنا االنتروبيا
،entropyوالمفاجأة ،surprisalواالنتروبيا المتقاطعة cross-entropyعندما قدمنا انحدار
( softmaxالقسم .)4.1.3إذا أردنا ضغط النص ،فيمكننا أن نسأل عن توقع الرمز tokenالتالي
في ضوء المجموعة الحالية من الرموز .يجب أن يسمح لنا نموذج اللغة األفضل بالتنبؤ بالرمز
التالي بشكل أكثر دقة .وبالتالي ،يجب أن يسمح لنا بإنفاق عدد أقل من البتاتيف ضغط التسلسل.
لذلك يمكننا قياسه من خالل متوسط خسارة االنتروبيا على جميع الرموز للتسلسل:
𝑛 1
∑
𝑛 𝑡=1
− log 𝑃(𝑥𝑡 ∣ 𝑥𝑡−1 , … , 𝑥1 ), )(9.3.7
حيث 𝑃 يتم تقديمه بواسطة نموذج اللغة وهو الرمز الفعلي الذي يتم مالحظتهيف الخطوة الزمنية
𝑡 من التسلسل .هذا يجعل األداءيف المستندات ذات األطوال المختلفة قابالً للمقارنة .ألسباب
تاريخية ،يفضل العلماءيف معالجة اللغة الطبيعية استخدام كمية تسمى االرتباك .perplexity
باختصار ،هو اُس لـ (:)9.3.7
𝑛
1
∑ exp (− log 𝑃(𝑥𝑡 ∣ 𝑥𝑡−1 , … , 𝑥1 )).
𝑛
𝑡=1
يمكن فهم االرتباك Perplexityبشكل أفضل على أنها المتوسط الهندسي لعدد الخيارات
الحقيقية التي لدينا عند تحديد الرمز tokenالذي نختاره بعد ذلك .دعونا نلقي نظرة على عدد
من الحاالت:
197 الفصل التاسع :الشبكات العصبية المتكررة
في أفضل سيناريو ،يقوم النموذج دائمًا بتقدير احتمالية الرمز المستهدف تمامًا مثل .1 •
في هذه الحالة ،يكون ارتباك النموذج هو .1
في أسوأ السيناريوهات ،يتنبأ النموذج دائمًا باحتمالية الرمز على أنه .0يف هذه الحالة، •
يكون االرتباك هو الالنهاية الموجبة .positive infinity
في األساس ،يتنبأ النموذج بتوزيع موحد على جميع الرموز المتاحة للمفردات.يف هذه •
الحالة ،االرتباك تساوي عدد الرموز الفريدة unique tokensللمفردات.يف الواقع،
إذا قمنا بتخزين التسلسل دون أي ضغط ،فسيكون هذا أفضل ما يمكننا فعله لتشفيره.
ومن ثم ،فإن هذا يوفر حدًا أعلى غير بديهي يجب أن يتغلب عليه أي نموذج مفيد.
• import tensorflow as tf
• from d2l import tensorflow as d2l
Partitioning Sequences 9.3.3
سنصمم نماذج لغوية باستخدام الشبكات العصبية ونستخدم االرتباك perplexityلتقييم مدى
جودة النموذجيف توقع الرمز التالي بالنظر إلى المجموعة الحالية من الرموزيف التسلسالت النصية.
قبل تقديم النموذج ،لنفترض أنه يعالج دفعة صغيرة من التسلسالت بطول محدد مسبقًايف كل
مرة .السؤال اآلن هو كيف تقرأ الدفعات الصغيرة من تسلسالت اإلدخال والتسلسالت المستهدفة
بشكل عشوائي.
بالنسبة لنمذجة اللغة ،يتمثل الهدفيف التنبؤ بالرمز التالي بناءً على الرموز التي رأيناها حتى اآلن،
ومن ثم فإن األهداف (التسميات) هي التسلسل األصلي ،والتي تم إزاحتها بواسطة رمز واحد.
التسلسل المستهدف ألي تسلسل 𝑡𝐱 إدخال يكون 𝐱𝑡+1بطول𝑛.
يوضح الشكل 9.3.1مثاالً للحصول على 5أزواج من متواليات اإلدخال والتسلسالت المستهدفة
مع 𝑛 = 5و .𝑑 = 2
@d2l.add_to_class(d2l.TimeMachine) #@save
def __init__(self, batch_size, num_steps,
num_train=10000, num_val=5000):
)(__super(d2l.TimeMachine, self).__init
)(self.save_hyperparameters
))(corpus, self.vocab = self.build(self._download
]array = tf.constant([corpus[i:i+num_steps+1
for i in range(0, len(corpus)-
)])num_steps-1
]self.X, self.Y = array[:,:-1], array[:,1:
لتدريب نماذج اللغة ،سنقوم بأخذ عينات عشوائية من أزواج من تسلسالت اإلدخال والتسلسالت
المستهدفةيف الدفعات الصغيرة .يُنشئ مُحمل البيانات data loaderالتالي بشكل عشوائي دفعة
صغيرة من مجموعة البياناتيف كل مرة .تحدد الوسيطة batch_sizeعدد األمثلة الالحقة
()self.bيف كل الدفعة الصغيرة و num_stepsهو الطول التالييف الرموز (.)self.n
@d2l.add_to_class(d2l.TimeMachine) #@save
def get_dataloader(self, train):
(idx = slice(0, self.num_train) if train else slice
)self.num_train, self.num_train + self.num_val
return self.get_tensorloader([self.X, self.Y],
)train, idx
كما نرىيف ما يلي ،يمكن الحصول على دفعة صغيرة من التسلسالت المستهدفة عن طريق
تحويل تسلسالت اإلدخال بواسطة رمز واحد.
9.3.5
.1افترض أن هناك 100,000كلمات في مجموعة بيانات التدريب .ما مقدار تكرار
الكلمات والتكرار المجاور متعدد الكلمات التي يحتاجها أربعة غرام للتخزين؟
.2كيف يمكنك أن تكون نموذجا للحوار dialogue؟
.3ما الطرق األخرى التي يمكنك التفكير بها لقراءة بيانات التسلسل الطويل long
sequence data؟
.4ضع في اعتبارك طريقتنا للتخلص من عدد عشوائي منتظم من الرموز tokensالقليلة
األولى في بداية كل فترة.
.1هل يؤدي حقًا إلى توزيع منتظم uniform distributionتمامًا على
التسلسالت الموجودة في المستند؟
.2ما الذي يجب عليك فعله لجعل األشياء أكثر انتظاماً uniform؟
.5إذا أردنا أن يكون المثال المتسلسل جملة كاملة ،فما نوع المشكلة التي يقدمها هذا في
أخذ الدفعات الصغيرة؟ كيف يمكننا حل المشكلة؟
حيث ℎ𝑡−1هي حالة مخفية hidden stateتخزن معلومات التسلسل حتى خطوة زمنية .𝑡 − 1
بشكل عام ،يمكن حساب الحالة المخفيةيف أي خطوة زمنية 𝑡 بناءً على كل من اإلدخال الحالي
𝑡𝑥 والحالة المخفية السابقة :ℎ𝑡−1
بالنسبة لدالة قوية بدرجة كافيةيف ( ،)9.4.2فإن نموذج المتغير الكامن ليس تقريبيًا .بعد كل هذا،
يمكن 𝑡 ℎببساطة تخزين جميع البيانات التي الحظتها حتى اآلن .ومع ذلك ،فمن المحتمل أن
يجعل كالً من الحساب والتخزين باهظ التكلفة.
تذكر أننا ناقشنا الطبقات المخفية مع الوحدات المخفيةيف القسم .5ومن الجدير بالذكر أن
الطبقات المخفية والحاالت المخفية تشير إلى مفهومين مختلفين تمامًا .الطبقات المخفية ،كما
هو موضح ،هي طبقات مخفية عن العرض على المسار من اإلدخال إلى اإلخراج .الحاالت
المخفية هي مدخالت تحدث تقنيًا لكل ما نقوم بهيف خطوة معينة ،وال يمكن حسابها إال من
خالل النظر إلى البياناتيف خطوات زمنية سابقة.
الشبكات العصبية المتكررة ) (RNNsهي شبكات عصبية ذات حاالت مخفية .قبل تقديم
نموذج ، RNNنعيد أوالً زيارة نموذج MLPالمقدميف القسم .5.1
حيث 𝑞×𝑛 𝐎 ∈ ℝهو متغير اإلخراج 𝐖ℎ𝑞 ∈ ℝℎ×𝑞 ،هو معلمة الوزن ،و 𝑞× 𝐛𝑞 ∈ ℝ1هو
معلمة التحيز لطبقة اإلخراج .إذا كانت مشكلة تصنيف ،فيمكننا استخدام )𝐎( softmaxلحساب
التوزيع االحتمالي لفئات المخرجات.
هذا مشابه تمامًا لمشكلة االنحدار التي حللناها سابقًايف القسم ،9.1ومن ثم قمنا بحذف
التفاصيل .يكفي أن نقول إنه يمكننا اختيار أزواج تسمية الميزات عشوائيًا وتعلم معلمات شبكتنا
عبر التمايز التلقائي automatic differentiationوالتدرج االشتقاقي العشوائي .SGD
Recurrent 9.4.2
Neural Networks with Hidden States
تختلف األمور تمامًا عندما تكون لدينا حاالت مخفية .دعونا نلقي نظرة على الهيكل ببعض
التفاصيل.
افترض أن لدينا دفعة صغيرة من المدخالت 𝑑×𝑛𝐗 𝑡 ∈ ℝيف الخطوة الزمنية 𝑡 .بمعنى آخر،
بالنسبة لدفعة صغيرة من أمثلة التسلسل 𝑛 ،يتوافق كل صف مع مثال واحديف خطوة زمنية 𝑡 من
التسلسل .بعد ذلك ،قم باإلشارة إلى 𝐇𝑡 ∈ ℝ𝑛×ℎكإخراج الطبقة المخفية للخطوة الزمنية 𝑡.
على عكس ،MLPنحفظ هنا إخراج الطبقة المخفية من الخطوة الزمنية السابقة ونقدم معلمة
وزن جديدة 𝐖ℎℎ ∈ ℝℎ×ℎلوصف كيفية استخدام إخراج الطبقة المخفية لخطوة الوقت السابقة
في الخطوة الزمنية الحالية .على وجه التحديد ،يتم تحديد حساب ناتج الطبقة المخفية لخطوة
الوقت الحالية من خالل إدخال خطوة الوقت الحالي مع إخراج الطبقة المخفية لخطوة الوقت
السابقة:
هناك العديد من الطرق المختلفة لبناء RNNs. RNNsذات الحالة المخفية المحددة بواسطة
( )9.4.5شائعة جدًا .بالنسبة للخطوة الزمنية 𝑡 ،يكون إخراج طبقة اإلخراج مشابهًا للحسابيف
:MLP
لقد ذكرنا للتو أن حساب 𝐗 𝑡 𝐖𝑥ℎ + 𝐇𝑡−1 𝐖ℎℎللحالة المخفية يعادل ضرب المصفوفة
لتسلسل 𝑡 𝐗 و 𝐇𝑡−1وتسلسل 𝐖𝑥ℎو .𝐖ℎℎعلى الرغم من أنه يمكن إثبات ذلكيف الرياضيات،
إال أننا فيما يلي نستخدم مقتطفًا بسيطًا من التعليمات البرمجية إلظهار ذلك .بادئ ذي بدء ،نحدد
المصفوفات Xو W_xhو Hو ، W_hhوالتي تكون أشكالها )(4, ، (3, 4) ، (1, 4) ،(3, 1
) 4على التوالي .بضرب Xيف ، W_xhو Hيف ، W_hhعلى التوالي ،ثم إضافة هذين المضاعفين،
نحصل على مصفوفة الشكل ).(3, 4
203 الشبكات العصبية المتكررة:الفصل التاسع
import tensorflow as tf
from d2l import tensorflow as d2l
الشكل 9.4.2نموذج لغة على مستوى الحرف يعتمد على .RNNتسلسل المدخالت
والهدف هما " "machinو " ،"achineعلى التوالي.
أثناء عملية التدريب ،نقوم بتشغيل عملية softmaxعلى اإلخراج من طبقة اإلخراج لكل خطوة
زمنية ،ثم نستخدم خطأ االنتروبيا المتقاطعة لحساب الخطأ بين إخراج النموذج والهدف .بسبب
الحساب المتكرر للحالة المخفيةيف الطبقة المخفية ،يتم تحديد ناتج الخطوة الزمنية 3يف الشكل
،9.4.2من خالل تسلسل النص " "mو " "aو " ."cنظرًا ألن الحرف التالي للتسلسليف بيانات
التدريب هو " ،”hفإن خطأ الوقت الخطوة 3ستعتمد على توزيع االحتمالية للحرف التالي الذي
تم إنشاؤه بناءً على تسلسل الميزات " "mو " "aو " "cوالهدف " "hلهذه الخطوة الزمنية.
205 الفصل التاسع :الشبكات العصبية المتكررة
في الممارسة العملية ،يتم تمثيل كل رمز من خالل متجه ذو األبعاد 𝑑 ،ونستخدم حجم الدُفعة
.𝑛 > 1لذلك ،ستكون المدخالت 𝑡 𝐗يف الخطوة الزمنية 𝑡 عبارة عن مصفوفة 𝑑 × 𝑛 مطابقة
لما ناقشناهيف القسم .9.4.2
في األقسام التالية ،سنقوم بتنفيذ RNNsلنماذج اللغة على مستوى األحرف.
9.4.4
تسمى الشبكة العصبية التي تستخدم الحساب المتكرر recurrent computationللحاالت
المخفية hidden statesالشبكة العصبية المتكررة ( .)RNNيمكن للحالة المخفية لـ RNN
التقاط المعلومات التاريخية للتسلسل حتى الخطوة الزمنية الحالية .مع الحساب المتكرر ،ال يزداد
عدد معلمات نموذج RNNمع زيادة عدد الخطوات الزمنية .بالنسبة للتطبيقات ،يمكن
استخدام RNNإلنشاء نماذج لغة على مستوى األحرف character-level language
.models
9.4.5
.1إذا استخدمنا RNNللتنبؤ بالحرف التالييف تسلسل نصي ،فما هو ال ُبعد المطلوب
ألي إخراج؟
.2لماذا يمكن لـ RNNالتعبير عن االحتمال الشرطي لرمزيف خطوة زمنية معينة بناءً على
جميع الرموز السابقةيف تسلسل النص؟
.3ماذا يحدث للتدرج gradientإذا قمت بالنشر الخلفي من خالل تسلسل طويل long
sequence؟
.4ما هي بعض المشاكل المرتبطة بنموذج اللغة الموصوفيف هذا القسم؟
%matplotlib inline
import math
import tensorflow as tf
from d2l import tensorflow as d2l
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 206
RNN 9.5.1
الحظ أن عدد الوحدات المخفية.)9.4.2 (القسمRNN نبدأ بتحديد فئة لتنفيذ نموذج
.tunable hyperparameter عبارة عن معلمة فائقة قابلة للضبطnum_hiddens
@d2l.add_to_class(RNNScratch) #@save
def forward(self, inputs, state=None):
if state is not None:
state, = state
state = tf.reshape(state, (-1,
self.W_hh.shape[0]))
outputs = []
for X in inputs: # Shape of inputs: (num_steps,
batch_size, num_inputs)
state = tf.tanh(tf.matmul(X, self.W_xh) + (
tf.matmul(state, self.W_hh) if state is not
None else 0)
+ self.b_h)
outputs.append(state)
return outputs, state
على النحوRNN من تسلسل اإلدخاليف نموذجminibatch يمكننا تغذية الدفعة الصغيرة
.التالي
d2l.check_len(outputs, num_steps)
d2l.check_shape(outputs[0], (batch_size, num_hiddens))
d2l.check_shape(state, (batch_size, num_hiddens))
RNN-based Language Model RNN 9.5.2
عبرRNN حيث نمرريف، RNN التالية نموذج لغة قائم علىRNNLMScratch تحدد فئة
تكون المدخالت، عند تدريب النماذج اللغوية.__init__ للطريقةrnn الوسيطة
والذي يساوي حجم، فإنهما لهما نفس البعد، ومن ثم.والمخرجات من نفس المفردات
كما. لتقييم النموذجperplexity الحظ أننا نستخدم االرتباك.vocabulary size المفردات
. يضمن هذا إمكانية مقارنة التسلسالت ذات األطوال المختلفة،9.3.2 تمت مناقشتهيف القسم
def init_params(self):
self.W_hq = tf.Variable(tf.random.normal(
(self.rnn.num_hiddens, self.vocab_size)) *
self.rnn.sigma)
self.b_q =
tf.Variable(tf.zeros(self.vocab_size))
return l
عند التعامل مع مثل هذه البيانات الفئوية ،categorical dataفإن اإلستراتيجية األكثر شيوعًا
هي تمثيل كل عنصر بترميز واحد ساخن ( ne-hot encodingاستدعاء من القسم .)4.1.1
ترميز واحد ساخن هو متجه يتم تحديد طوله من خالل حجم المفردات 𝑁 ،حيث يتم تعيين
جميع اإلدخاالت على ، 0باستثناء اإلدخال المقابل للرمز المميز الخاص بنا ،والذي تم تعيينه
على .1على سبيل المثال ،إذا كانت المفردات تحتوي على 5عناصر ،فإن المتجهات الساخنة
الواحدة المقابلة للمؤشرات 0و 2ستكون على النحو التالي.
@d2l.add_to_class(RNNLMScratch) #@save
def one_hot(self, X):
)# Output shape: (num_steps, batch_size, vocab_size
209 الفصل التاسع :الشبكات العصبية المتكررة
@d2l.add_to_class(RNNLMScratch) #@save
def output_layer(self, rnn_outputs):
outputs = [tf.matmul(H, self.W_hq) + self.b_q for H
]in rnn_outputs
)return tf.stack(outputs, 1
@d2l.add_to_class(RNNLMScratch) #@save
def forward(self, X, state=None):
)embs = self.one_hot(X
)rnn_outputs, _ = self.rnn(embs, state
)return self.output_layer(rnn_outputs
دعنا نتحقق مما إذا كان الحساب األمامي forward computationينتج مخرجات بالشكل
الصحيح.
يعد التعامل مع التدرجات المتالشية والمتفجرة مشكلة أساسية عند تصميم شبكات RNN
وقد ألهمت بعضًا من أكبر التطوراتيف هياكل الشبكات العصبية الحديثة.يف الفصل التالي،
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 210
سنتحدث عن ال ُبنى ال متخصصة التي تم تصميمها على أمل التخفيف من مشكلة التدرج
المتالشي .vanishing gradientومع ذلك ،حتى RNNsالحديثة ال تزال تعانييف كثير من
األحيان من انفجار التدرجات .exploding gradientsأحد الحلول غير األنيقة ولكنه موجود
في كل مكان هو قص التدرجات Gradients Clippingببساطة إلجبار التدرجات "المقطوعة
" clippedالناتجة على أخذ قيم أصغر.
بشكل عام ،عند تحسين بعض األهداف عن طريق التدرج االشتقاقي ،gradient descentنقوم
بتحديث متكرر للمعامل موضع االهتمام ،على سبيل المثال متجه 𝐱 ،ولكن ندفعهيف اتجاه التدرج
السلبي 𝐠 (في التدرج االشتقاقي العشوائي ،SGDنحسب هذا التدرج على عينة عشوائية من
الدفعات الصغيرة) .على سبيل المثال ،مع معدل التعلم ، 𝜂 > 0يأخذ كل تحديث النموذج
الشكل 𝐠𝜂 .𝐱 ← 𝐱 −لنفترض كذلك أن الدالة الموضوعية 𝑓 سلسة بدرجة كافية .رسميًا ،نقول
إن الهدف هو Lipschitzمستمر مع ثابت 𝐿 ،وهذا يعني أنه بالنسبة ألي 𝐱 و 𝐲 ،لدينا
كما ترى ،عندما نقوم بتحديث متجه المعلمة عن طريق طرح 𝐠𝜂 ،فإن التغييريف قيمة الهدف
يعتمد على معدل التعلم ومعيار التدرج و𝐿 على النحو التالي:
بمعنى آخر ،ال يمكن أن يتغير الهدف بأكثر من ‖𝐠‖𝜂𝐿 .قد يُنظر إلى وجود قيمة صغيرة لهذا
الحد األعلى على أنه أمر جيد أو سيء .على الجانب السلبي ،نحن نحد من السرعة التي يمكننا
بها تقليل قيمة الهدف .على الجانب المشرق ،يحد هذا من مقدار الخطأ الذي يمكن أن نخطئ
فيهيف أي خطوة من خطوات االنحدار.
عندما نقول إن التدرجات تنفجر ،فإننا نعني أن ‖𝐠‖ يصبح كبيرًا للغاية.يف هذه الحالة األسوأ ،قد
نحدث الكثير من الضرريف خطوة متدرجة واحدة بحيث يمكننا التراجع عن كل التقدم الذي تم
إحرازه على مدار آالف التكرارات التدريبية .عندما يمكن أن تكون التدرجات كبيرة جدًا ،غالبًا ما
يتباعد تدريب الشبكة العصبية ،ويفشليف تقليل قيمة الهدف.يف أوقات أخرى ،يتقارب التدريبيف
النهاية ولكنه غير مستقر بسبب االرتفاع الهائليف الخطأ.
تتمثل إحدى طرق الحد من حجم ‖𝐠‖𝜂𝐿يف تقليص معدل التعلم 𝜂 إلى قيم صغيرة .تتمثل
إحدى الميزات هنايف أننا ال نحيز التحديثات .لكن ماذا لو نادرًا ما نحصل على تدرجات كبيرة؟
هذه الخطوة الجذرية تبطئ تقدمنايف جميع الخطوات ،فقط للتعامل مع أحداث التدرج المتفجر
النادرة .البديل الشائع هو تبني قص التدرج اإلرشادي gradient clipping heuristicإلسقاط
التدرجات 𝐠 على كرة من نصف قطر 𝜃 معين على النحو التالي:
211 الفصل التاسع :الشبكات العصبية المتكررة
𝜃
𝐠 ← 𝑚𝑖𝑛(1, )𝐠.
‖𝐠‖
هذا يضمن ان معيار التدرج ال يتجاوز 𝜃 أبدًا وأن التدرج المحدث يتماشى تمامًا مع االتجاه
األصلي لـ 𝐠 .كما أن لها أيضًا تأثير جانبي مرغوب فيه للحد من التأثير الذي يمكن أن تمارسه أي
دفعة صغيرة (وداخله أي عينة معينة) على متجه المعلمة .هذا يمنح درجة معينة من المتانة
للنموذج .لنكون واضحين ،إنه اختراق .يعني قص التدرج Gradient clippingأننا ال نتبع دائمًا
التدرج الحقيقي ومن الصعب التفكير بشكل تحليلييف اآلثار الجانبية المحتملة .ومع ذلك ،فهو
اختراق مفيد للغاية ،ويتم اعتماده على نطاق واسعيف تطبيقات RNNيف معظم أطر التعلم
العميق.
نحدد أدناه طريقة لقص التدرجات ،والتي يتم استدعاؤها بواسطة طريقة fit_epochلفئة
( d2l.Trainerانظر القسم .)3.4الحظ أنه عند حساب معيار التدرج ،gradient norm
فإننا نجمع جميع معلمات النموذج ،ونتعامل معها على أنها متجه معلمة عمالق واحد.
@d2l.add_to_class(d2l.Trainer) #@save
def clip_gradients(self, grad_clip_val, grads):
grad_clip_val = tf.constant(grad_clip_val,
)dtype=tf.float32
new_grads = [tf.convert_to_tensor(grad) if
(isinstance
grad, tf.IndexedSlices) else grad for grad in
]grads
))norm = tf.math.sqrt(sum((tf.reduce_sum(grad ** 2
))for grad in new_grads
if tf.greater(norm, grad_clip_val):
for i, grad in enumerate(new_grads):
new_grads[i] = grad * grad_clip_val / norm
return new_grads
return grads
Training 9.5.4
باستخدام مجموعة بيانات (بيانات) ،The Time Machineنقوم بتدريب نموذج لغة على
مستوى األحرف ( )modelبناءً على ) RNN (rnnالمنفذ من البداية .الحظ أننا نحسب
التدرجات أوالً ،ثم نقصها (نقطعها) ،ونقوميف النهاية بتحديث معلمات النموذج باستخدام
التدرجات المقطوعة .clipped gradients
rnn = RNNScratch(num_inputs=len(data.vocab),
)num_hiddens=32
model = RNNLMScratch(rnn,
)vocab_size=len(data.vocab), lr=1
trainer = d2l.Trainer(max_epochs=100,
)gradient_clip_val=1
)trainer.fit(model, data
Decoding 9.5.5
بمجرد تعلم نموذج اللغة ،يمكننا استخدامه ليس فقط للتنبؤ بالرمز التالي ولكن لمواصلة التنبؤ
بكل رمز الحق ،والتعامل مع الرمز المتوقع مسبقًا كما لو كان الرمز التالييف اإلدخال.يف بعض
األحيان نرغب فقطيف إنشاء نص كما لو كنا نبدأيف بداية المستند .ومع ذلك ،غالبًا ما يكون من
المفيد شرط نموذج اللغة على بادئة يوفرها المستخدم .على سبيل المثال ،إذا كنا نطور ميزة
اإلكمال التلقائي لمحرك البحث أو لمساعدة المستخدمينيف كتابة رسائل البريد اإللكتروني،
فنحن نرغبيف تغذية ما كتبوه حتى اآلن (البادئة ،)the prefixثم إنشاء استمرار محتمل.
تولد دالة التنبؤ predictالتالية استمرارًا ،حرفًا واحدًايف كل مرة ،بعد إدخال بادئة prefix
مقدمة من المستخدم ،عند المرور عبر األحرف الموجودةيف البادئة ،prefixنستمريف تمرير
الحالة المخفية إلى الخطوة التالية ولكن ال يتم إنشاء أي ناتج .وهذا ما يسمى بفترة اإلحماء
.warm-up periodبعد استيعاب البادئة ،نحن اآلن على استعداد لبدء إرسال األحرف التالية،
والتي سيتم إعادة إدخال كل منهايف النموذج كمدخليف الخطوة الزمنية الالحقة.
213 الفصل التاسع :الشبكات العصبية المتكررة
@d2l.add_to_class(RNNLMScratch) #@save
def predict(self, prefix, num_preds, vocab,
device=None):
]]]state, outputs = None, [vocab[prefix[0
for i in range(len(prefix) + num_preds - 1):
)]]]X = tf.constant([[outputs[-1
)embs = self.one_hot(X
)rnn_outputs, state = self.rnn(embs, state
if i < len(prefix) - 1: # Warm-up period
)]]outputs.append(vocab[prefix[i + 1
else: # Predict `num_preds` steps
)Y = self.output_layer(rnn_outputs
outputs.append(int(tf.reshape(tf.argmax(Y,
)))axis=2), 1
return ''.join([vocab.idx_to_token[i] for i in
)]outputs
فيما يلي ،نحدد البادئة ونجعلها تولد 20حرفًا إضافيًا.
في حين أن تنفيذ نموذج RNNأعاله من البداية مفيد ،إال أنه ليس مناسبًا.يف القسم التالي،
سنرى كيفية االستفادة من أطر التعلم العميق لتوجيه RNNsباستخدام البنى القياسية ،وجني
مكاسبيف األداء من خالل االعتماد على دوال المكتبة المحسنة للغاية.
9.5.6
يمكننا تدريب نماذج اللغة المستندة إلى RNNإلنشاء نص يتبع بادئة النص المقدمة من
المستخدم .user-provided text prefixيتكون نموذج لغة RNNالبسيط من ترميز
اإلدخال ونمذجة RNNوتوليد اإلخراج .أثناء التدريب ،يمكن لقص التدرج gradient
clippingأن يخفف من مشكلة انفجار التدرجات ولكنه ال يعالج مشكلة تالشي التدرجات.يف
التجربة ،قمنا بتنفيذ نموذج بسيط للغة RNNوقمنا بتدريبه باستخدام قص التدرج على
تسلسالت نصية ،تم ترميزها على مستوى الحرف .من خالل التكييف على بادئة ،يمكننا استخدام
نموذج اللغة إلنشاء عمليات استمرارية محتملة ،والتي تثبت فائدتهايف العديد من التطبيقات،
على سبيل المثال ،ميزات اإلكمال التلقائي.
9.5.7
.1هل يتنبأ نموذج اللغة المطبق بالرمز التالي بناءً على جميع الرموز السابقة حتى أول رمز
في The Time Machine؟
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 214
Concise 9.6
Implementation of Recurrent Neural Networks
مثل معظم تطبيقاتنا من البداية ،تم تصميم القسم 9.5لتوفير نظرة ثاقبة حول كيفية عمل كل
مكون .ولكن عندما تستخدم RNNsكل يوم أو تكتب رمز اإلنتاج ،سترغبيف االعتماد أكثر
على المكتبات التي تقلل من وقت التنفيذ (من خالل توفير كود المكتبة للنماذج والدوال الشائعة)
ووقت الحساب (عن طريق تحسين الخروج من تطبيقات المكتبة هذه) .سيوضح لك هذا القسم
كيفية تنفيذ نموذج اللغة نفسه بشكل أكثر كفاءة باستخدام واجهة برمجة التطبيقات عالية
المستوى التي يوفرها إطار عمل التعلم العميق الخاص بك .نبدأ ،كمايف السابق ،بتحميل مجموعة
بيانات .The Time Machine
.API واالستفادة من واجهة برمجة التطبيقات عالية المستوى، نقوم بتدريب نموذجنا،بعد ذلك
with d2l.try_gpu():
trainer = d2l.Trainer(max_epochs=100,
gradient_clip_val=1)
trainer.fit(model, data)
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 216
9.6.3
توفر واجهات برمجة التطبيقات عالية المستوى APIفي أطر التعلم العميق تطبيقات RNNs
القياسية .تساعدك هذه المكتبات على تجنب إضاعة الوقتيف إعادة تنفيذ النماذج القياسية.
عالوة على ذلك ،غالبًا ما يتم تحسين تطبيقات إطار العمل بشكل كبير ،مما يؤدي إلى مكاسب
كبيرةيف األداء (الحسابي) مقارنة بالتطبيقات من البداية.
9.6.4
.1هل يمكنك جعل نموذج RNNيعاني من الضبط الزائد overfittingباستخدام
واجهات برمجة التطبيقات عالية المستوى API؟
.2نفذ نموذج االنحدار الذاتي autoregressive modelللقسم 9.1باستخدام
.RNN
التدرجات المتفجرة تنبع من االنتشار الخلفي عبر تسلسالت طويلة .قبل تقديم عدد كبير من بنى
RNNالحديثة ،دعنا نلقي نظرة فاحصة على كيفية عمل االنتشار الخلفي
backpropagationفي نماذج التسلسل بتفاصيل رياضية .نأمل أن تجلب هذه المناقشة بعض
الدقة لمفهوم التالشي وانفجار التدرجات .إذا كنت تتذكر مناقشتنا حول االنتشار األمامي والخلفي
من خالل الرسوم البيانية الحسابية عندما قدمنا MLPsفي القسم ، 5.3فيجب أن يكون االنتشار
األمامي في RNNsمباشرًا نسبيًا .يسمى تطبيق االنتشار الخلفي في RNNsاالنتشار الخلفي
عبر الزمن .)1990 ،Werbos ( backpropagation through timeيتطلب هذا اإلجراء
منا توسيع ( expandأو )unrollالرسم البياني الحسابي لخطوة واحدة في وقت واحد في كل
مرة .إن RNNالموسعة هو أساسًا ش بكة عصبية تلقائية ذات خاصية خاصة تتكرر فيها نفس
المعلمات في جميع أنحاء الشبكة غير المنضبطة ،وتظهر في كل خطوة زمنية .بعد ذلك ،تمامًا
كما هو الحال في أي شبكة عصبية امامية التغذية ،يمكننا تطبيق قاعدة السلسلة ،االنتشار الخلفي
للتدرجات عبر .unrolled netيجب جمع التدرج gradientفيما يتعلق بكل معلمة عبر جميع
األماكن التي تحدث فيها المعلمة في .unrolled netيجب أن يكون التعامل مع مثل هذا الربط
بالوزن مألوفًا في فصولنا حول الشبكات العصبية التالفيفية.
تنشأ المضاعفات ألن التسلسالت يمكن أن تكون طويلة نوعًا ما .ليس من غير المعتاد العمل مع
تسلسالت نصية تتكون من أكثر من ألف رمز .الحظ أن هذا يطرح مشاكل من وجهة نظر حسابية
(الكثير من الذاكرة) والتحسين (عدم االستقرار العددي) .المدخالت من الخطوة األولى تمر عبر
أكثر من 1000ضرب مصفوفة قبل الوصول إلى المخرجات ،وهناك حاجة إلى 1000ضرب
مصفوفة أخرى لحساب التدرج .نقوم اآلن بتحليل الخطأ الذي يمكن أن يحدث وكيفية معالجته
في الممارسة العملية.
RNNs 9.7.1
نبدأ بنموذج مبسط لكيفية عمل ال .RNNيتجاهل هذا النموذج تفاصيل حول تفاصيل الحالة
المخفية وكيفية تحديثها .ال يميز الترميز الرياضي هنا بشكل صريح بين القيم القياسية scalars
والمتجهات vectorsوالمصفوفات .matricesنحن نحاول فقط تطوير بعض الحدس .في
هذا النموذج المبسط ،نشير إلى الحالة المخفية 𝑡 ℎو 𝑡𝑥كمدخالت و 𝑡𝑜كمخرج في الخطوة
الزمنية 𝑡 .تذكر مناقشاتنا في القسم 9.4.2أن اإلدخال والحالة المخفية يمكن تسلسلهما قبل
ضربهما بمتغير وزن واحد في الطبقة المخفية .وبالتالي ،فإننا نستخدم 𝑤ℎو 𝑜𝑤 لنؤشر أوزان
الطبقة المخفية وطبقة المخرجات ،على التوالي .نتيجة لذلك ،فإن الحاالت المخفية
والمخرجات في كل مرة من الخطوات هي
حيث 𝑓 و𝑔 هي تحويالت الطبقة المخفية وطبقة اإلخراج ،على التوالي .ومن ثم ،لدينا سلسلة
من القيم } … {… , (𝑥𝑡−1 , ℎ𝑡−1 , 𝑜𝑡−1 ), (𝑥𝑡 , ℎ𝑡 , 𝑜𝑡 ),التي تعتمد على بعضها البعض من
forward خالل الحساب المتكرر .recurrent computationاالنتشار األمامي
propagationواضح إلى حد ما .كل ما نحتاجه هو تكرار الخطوات الثالثية ) 𝑡𝑜 (𝑥𝑡 , ℎ𝑡 ,مرة
واحدة في كل مرة .يتم بعد ذلك تقييم التناقض بين المخرجات 𝑡𝑜 والهدف المطلوب 𝑡𝑦 بواسطة
دالة هدف 𝑇 عبر جميع الخطوات الزمنية
𝑇
1
∑ = ) 𝑜𝑤 𝐿(𝑥1 , … , 𝑥𝑇 , 𝑦1 , … , 𝑦𝑇 , 𝑤ℎ , 𝑙(𝑦𝑡 , 𝑜𝑡 ).
𝑇
𝑡=1
بالنسبة إلى ، backpropagationتكون األمور أكثر تعقيدًا بعض الشيء ،خاصةً عندما نحسب
التدرجات فيما يتعلق بمعلمات 𝑤ℎالدالة الموضوعية 𝐿 .على وجه التحديد ،من خالل قاعدة
السلسلة،
𝐿𝜕 1 ) 𝑡𝑜𝜕𝑙(𝑦𝑡 ,
𝜕𝑤ℎ
= 𝑇 ∑𝑇𝑡=1 𝜕𝑤ℎ
1 𝑡𝜕𝑙(𝑦𝑡 ,𝑜𝑡 ) 𝜕𝑔(ℎ𝑡 ,𝑤𝑜 ) 𝜕ℎ
)(9.7.3
= ∑𝑇𝑡=1 .
𝑇 𝑡𝑜𝜕 𝑡𝜕ℎ 𝜕𝑤ℎ
يسهل حساب العامل األول والثاني للضرب في ( .)9.7.3العامل الثالث 𝜕ℎ𝑡 /𝜕𝑤ℎهو المكان
الذي تصبح فيه األشياء خادعة ،ألننا نحتاج إلى حساب تأثير المعلمة 𝑤ℎعلى 𝑡 ℎبشكل متكرر.
وفقًا للحساب المتكرر في ( ℎ𝑡 ، )9.7.1يعتمد على كال ℎ𝑡−1و ، 𝑤ℎوحيث يعتمد حساب
ℎ𝑡−1على 𝑤ℎأيضًا .وبالتالي ،فإن تقييم إجمالي المشتق لـ 𝑡 ℎفيما يتعلق بـ 𝑤ℎباستخدام
عوائد قاعدة السلسلة
𝑡𝜕ℎ ) 𝜕𝑓(𝑥𝑡 ,ℎ𝑡−1 ,𝑤ℎ 𝜕𝑓(𝑥𝑡 ,ℎ𝑡−1 ,𝑤ℎ ) 𝜕ℎ𝑡−1
= + . )(9.7.4
𝜕𝑤ℎ 𝜕𝑤ℎ 𝜕ℎ𝑡−1 𝜕𝑤ℎ
الشتقاق التدرج أعاله ،افترض أن لدينا ثالثة متواليات } 𝑡𝑐{ {𝑎𝑡 }, {𝑏𝑡 },تحقق 𝑎0 = 0
و 𝑎𝑡 = 𝑏𝑡 + 𝑐𝑡 𝑎𝑡−1من أجل … .𝑡 = 1,2,ثم الجل 𝑡 ≥ 1من السهل أن تظهر
𝑡−1
∑ 𝑎𝑡 = 𝑏𝑡 + (∏𝑡𝑗=𝑖+1 𝑐𝑗 ) 𝑏𝑖 . )(9.7.5
𝑖=1
𝑡𝜕ℎ
𝑡𝑎 = ,
𝜕𝑤ℎ
) 𝜕𝑓(𝑥𝑡 ,ℎ𝑡−1 ,𝑤ℎ
𝑡𝑏 = 𝜕𝑤ℎ
, )(9.7.6
) 𝜕𝑓(𝑥𝑡 ,ℎ𝑡−1 ,𝑤ℎ
𝑡𝑐 = 𝜕ℎ𝑡−1
,
بينما يمكننا استخدام قاعدة السلسلة لحساب 𝜕ℎ𝑡 /𝜕𝑤ℎبشكل تكراري ،recursivelyيمكن
أن تصبح هذه السلسلة طويلة جدًا عندما 𝑡 تكون كبيرة .دعونا نناقش عددًا من االستراتيجيات
للتعامل مع هذه المشكلة.
يتبع من تعريف 𝑡𝜉 ذلك .𝐸[𝑧𝑡 ] = 𝜕ℎ𝑡 /𝜕𝑤ℎحيث ينتهي الحساب المتكرر 𝜉𝑡 = 0في تلك
الخطوة الزمنية 𝑡 .يؤدي هذا إلى مجموع اوزان للتسلسالت ذات أطوال متفاوتة ،حيث تكون
التسلسالت الطويلة نادرة ولكنها ذات وزن زائد overweightedبشكل مناسب .تم اقتراح هذه
الفكرة من قبل Tallecو .)2017( Ollivier
يوضح الشكل 9.7.1االستراتيجيات الثالث عند تحليل األحرف القليلة األولى من The
Time Machineباستخدام االنتشار الخلفي عبر الزمن لـ :RNNs
الصف األول هو االقتطاع العشوائي randomized truncationالذي يقسم النص إلى •
مقاطع ذات أطوال مختلفة.
الصف الثاني هو االقتطاع المنتظم regular truncationالذي يقسم النص إلى •
تتابعات من نفس الطول .هذا ما كنا نفعله في تجارب .RNN
الصف الثالث هو االنتشار الخلفي الكامل عبر الزمن الذي يؤدي إلى تعبير غير عملي •
حسابيًا.
لسوء الحظ ،على الرغم من جاذبيته من الناحية النظرية ،فإن االقتطاع العشوائي ال يعمل بشكل
أفضل بكثير من االقتطاع المنتظم ،ويرجع ذلك على األرجح إلى عدد من العوامل .أوالً ،تأثير
المشاهدة بعد عدد من خطوات االنتشار الخلفييف الماضي كافٍ تمامًا اللتقاط التبعياتيف
الممارسة العملية .ثانيًا ،يتعارض التباين المتزايد مع حقيقة أن التدرج يكون أكثر دقة بمزيد من
221 الفصل التاسع :الشبكات العصبية المتكررة
الخطوات .ثالثًا ،نريديف الواقع نماذج لها نطاق قصير من التفاعالت .وبالتالي ،فإن االنتشار
الخلفي المقتطع بانتظام عبر الزمن له تأثير تنظيم طفيف يمكن أن يكون مرغوبًا فيه.
حيث 𝑑× 𝐖ℎℎ ∈ ℝℎ×ℎ ، 𝐖ℎ𝑥 ∈ ℝℎو 𝐖𝑞ℎ ∈ ℝ𝑞×ℎهي معلمات الوزن 𝑙(𝐨𝑡 , 𝑦𝑡 ) .تدل
على الخطأيف الخطوة الزمنية 𝑡 .دالتنا الموضوعية هي الخطأ بمرور الوقت 𝑇 من بداية التسلسل
لذلك:
𝑇
1
𝐿 = ∑ 𝑙(𝐨𝑡 , 𝑦𝑡 ).
𝑇
𝑡=1
الشكل 9.7.2رسم بياني حسابي يوضح التبعيات لنموذج RNNبثالث خطوات زمنية .تمثل
المربعات متغيرات (غير مظللة) أو معلمات (مظللة) وتمثل الدوائر عوامل التشغيل.
من أجل تصور التبعيات بين متغيرات النموذج والمعلمات أثناء حساب ،RNNيمكننا رسم
مخطط بياني حسابي للنموذج ،كما هو موضحيف الشكل .9.7.2على سبيل المثال ،يعتمد حساب
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 222
الحاالت المخفية للخطوة الزمنية 𝐡3 ،3على معلمات النموذج 𝑥 𝐖ℎو 𝐖ℎℎالحالة المخفية
لخطوة الوقت األخيرة 𝐡2وإدخال الخطوة الزمنية الحالية .𝐱3
كما ذكر للتو ،فإن معلمات النموذج في الشكل 9.7.2هي 𝑥 𝐖ℎو 𝐖ℎℎو .𝐖𝑞ℎبشكل عام ،
يتطلب تدريب هذا النموذج حساب التدرج فيما يتعلق بهذه المعلمات 𝜕𝐿/𝜕𝐖ℎ𝑥 ،
و 𝜕𝐿/𝜕𝐖ℎℎو .𝜕𝐿/𝜕𝐖𝑞ℎوفقًا للتبعيات الواردة في الشكل ، 9.7.2يمكننا اجتياز االتجاه
المعاكس لألسهم لحساب وتخزين التدرجات بدورها .للتعبير بمرونة عن ضرب المصفوفات
والمتجهات والكميات ذات األشكال المختلفة في قاعدة السلسلة ،نستمر في استخدام العامل
prodكما هو موضح في القسم .5.3
بادئ ذي بدء ،يعد التفريق بين الدالة الموضوعية فيما يتعلق بإخراج النموذج في أي خطوة زمنية
𝑡 أمرًا بسيطًا إلى حد ما:
اآلن ،يمكننا حساب انحدار الهدف فيما يتعلق بالمعامل 𝐖𝑞ℎفي طبقة المخرجات:
.𝜕𝐿/𝜕𝐖𝑞ℎ ∈ ℝ𝑞×ℎبناءً على الشكل ، 9.7.2يعتمد الهدف 𝐿 على 𝐖𝑞ℎبواسطة
𝑇 𝐨 .𝐨1 , … ,باستخدام قاعدة السلسلة ينتج
𝑇 𝑇
𝐿𝜕 𝑡𝐨𝜕 𝐿𝜕 ⊤ 𝐿𝜕
∑= (prod , ∑=) 𝐡 ,
𝜕𝐖𝑞ℎ 𝜕𝐨𝑡 𝜕𝐖𝑞ℎ 𝑡 𝑡𝐨𝜕
𝑡=1 𝑡=1
بعد ذلك ،كما هو موضح في الشكل ، 9.7.2في الخطوة الزمنية النهائية 𝑇 ،تعتمد دالة الهدف
على الحالة المخفية 𝑇 𝐡 فقط عبر 𝑇 𝐨 .لذلك ،يمكننا بسهولة إيجاد التدرج 𝜕𝐿/𝜕𝐡𝑇 ∈ ℝℎ
باستخدام قاعدة السلسلة:
يصبح األمر أكثر تعقيدًا في أي خطوة زمنية 𝑇 < 𝑡 ،حيث تعتمد الدالة الموضوعية 𝐿 على 𝑡𝐡
عبر 𝐡𝑡+1و 𝑡𝐨 .وفقًا لقاعدة السلسلة ،يمكن حساب التدرج للحالة المخفية 𝜕𝐿/𝜕𝐡𝑡 ∈ ℝℎ
في أي خطوة زمنية 𝑇 < 𝑡 بشكل متكرر على النحو التالي:
يمكننا أن نرى من ( )9.7.15أن هذا المثال الخطي البسيط يعرض بالفعل بعض المشكالت
.𝐖ℎℎفي ذلك ،تختفي
⊤
الرئيسية لنماذج التسلسل الطويل :إنه ينطوي على إمكانات كبيرة جدًا من
القيم الذاتية eigenvaluesاألصغر من 1وتتباعد القيم الذاتية األكبر من .1هذا غير مستقر
عدديًا ،والذي يتجلى في شكل تدرجات متالشية ومتفجرة .تتمثل إحدى طرق معالجة ذلك في
اقتطاع الخطوات الزمنية بحجم مناسب حسابيًا كما تمت مناقشته في القسم .9.7.1من الناحية
العملية ،يمكن أيضًا إجراء هذا االقتطاع عن طريق فصل التدرج بعد عدد معين من الخطوات
الزمنية .الحقًا ،سنرى كيف يمكن لنماذج التسلسل األكثر تعقيدًا مثل الذاكرة طويلة قصيرة
المدى long short-term memoryأن تخفف من حدة هذا األمر أكثر.
أخيرًا ،يوضح الشكل 9.7.2أن دالة الهدف 𝐿 تعتمد على معلمات النموذج 𝑥 𝐖ℎو 𝐖ℎℎفي
الطبقة المخفية عبر الحاالت المخفية 𝑇 𝐡 .𝐡1 , … ,لحساب التدرجات فيما يتعلق بهذه
المعلمات 𝑑× 𝜕𝐿/𝜕𝐖ℎ𝑥 ∈ ℝℎو 𝜕𝐿/𝜕𝐖ℎℎ ∈ ℝℎ×ℎنطبق قاعدة السلسلة التي تعطي
𝑇 𝑇
𝐿𝜕 𝑡𝐡𝜕 𝐿𝜕 ⊤ 𝐿𝜕
∑= (prod , ∑=) 𝐱 ,
𝑥𝜕𝐖ℎ 𝑥𝜕𝐡𝑡 𝜕𝐖ℎ 𝑡 𝑡𝐡𝜕
𝑡=1 𝑡=1
𝑇 𝑇
𝐿𝜕 𝑡𝐡𝜕 𝐿𝜕 ⊤ 𝐿𝜕
∑= (prod , ∑=) 𝐡 ,
𝜕𝐖ℎℎ 𝜕𝐡𝑡 𝜕𝐖ℎℎ 𝜕𝐡𝑡 𝑡−1
𝑡=1 𝑡=1
حيث 𝑡𝐡𝜕 𝜕𝐿/يتم حسابها بشكل متكرر بواسطة ( )9.7.13و ( )9.7.14هي الكمية الرئيسية
التي تؤثر على االستقرار العددي.
نظرًا ألن االنتشار الخلفي عبر الزمن هو تطبيق االنتشار الخلفي في ، RNNsكما أوضحنا في
القسم ، 5.3فإن تدريب RNNsيبدل االنتشار األمامي مع االنتشار الخلفي عبر الزمن .إلى
جانب ذلك ،يحسب االنتشار الخلفي عبر الزمن ويخزن التدرجات المذكورة أعاله بدوره .على
وجه التحديد ،يتم إعادة استخدام القيم الوسيطة المخزنة لتجنب تكرار العمليات الحسابية ،
مثل تخزين 𝑡𝐡𝜕 𝜕𝐿/الستخدامها في حساب كل من 𝑥 𝜕𝐿/𝜕𝐖ℎو . 𝜕𝐿/𝜕𝐖ℎℎ
9.7.3
االنتشار الخلفي عبر الزمن هو مجرد تطبيق االنتشار الخلفي لتسلسل النماذج ذات الحالة
المخفية .هناك حاجة إلى االقتطاع Truncationمن أجل الراحة الحسابية واالستقرار العددي،
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 224
9.7.4
.1افترض أن لدينا مصفوفة متماثلة 𝑛×𝑛 𝐌 ∈ ℝمع قيم ذاتية (𝜆𝑖 )eigenvalues
المتجهات الذاتية المقابلة لها هي (𝑛 .𝐯𝑖 )𝑖 = 1, … ,دون فقدان العمومية ،افترض
أنها مرتبة بالترتيب | .|𝜆𝑖 | ≥ |𝜆𝑖+1
𝑖𝑘𝜆 .2أظهر أن 𝑘 𝐌 لديه قيم ذاتية eigenvalues
.3إثبت أنه بالنسبة إلى المتجه العشوائي 𝑛 ، 𝐱 ∈ ℝمع وجود احتمال 𝐱 𝑘 𝐌 كبير ،سيتم
محاذاة إلى حد كبير مع المتجه الذاتي ( 𝐯1)eigenvectorلـ𝐌 .إضف طابع رسيماً
على هذا البيان.
.4ماذا تعني النتيجة أعاله للتدرجات في RNNs؟
.5إلى جانب قص التدرج ، gradient clippingهل يمكنك التفكير في أي طرق أخرى
للتعامل مع انفجار التدرج في الشبكات العصبية المتكررة RNN؟
الشبكات العصبية المتكررة
الحديثة 10
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 226
Modern 10
Recurrent Neural Networks
قدم الفصل السابق األفكار الرئيسية وراء الشبكات العصبية المتكررة ( .)RNNsومع ذلك،
تمامًا كما هو الحال مع الشبكات العصبية التالفيفية ،CNNكان هناك قدر هائل من االبتكاريف
معماريات ،RNNوبلغت ذروتهايف العديد من التصميمات المعقدة التي أثبتت نجاحهايف
الممارسة .على وجه الخصوص ،تتميز التصميمات األكثر شيوعًا بآليات للتخفيف من عدم
االستقرار العددي numerical instabilityالسيئ السمعة الذي تواجهه ،RNNsكما يتجلى
في اختفاء التدرجات وانفجارها .تذكر أننايف القسم 9تعاملنا مع انفجار التدرج من خالل تطبيق
استدالل قص متدرج حاد .gradient clipping heuristicعلى الرغم من فعالية هذا
االختراق ،فإنه يترك مشكلة اختفاء التدرجات مفتوحة.
في هذا الفصل ،نقدم األفكار الرئيسية وراء أنجح بُنى RNNللتسلسل ،والتي تنبع من مقالتين
تم نشرهمايف عام .1997المقالة األولى ،الذاكرة طويلة قصيرة المدى Hochreiter ( LSTM
، ) 1997 ،and Schmidhuberتقدم خلية الذاكرة ،وهي وحدة الحساب التي تحل محل
العقد التقليديةيف الطبقة المخفية للشبكة .باستخدام خاليا الذاكرة هذه ،تكون الشبكات قادرة
على التغلب على صعوبات التدريب التي واجهتها الشبكات المتكررة السابقة .حدسيًا ،تتجنب
خلية الذاكرة مشكلة التدرج المتالشي عن طريق االحتفاظ بالقيميف الحالة الداخلية لكل خلية
ذاكرة متتالية على طول حافة متكررة بوزن 1عبر العديد من الخطوات الزمنية المتتالية .تساعد
مجموعة من البوابات المضاعفة الشبكة على تحديد كل من المدخالت التي يجب السماح
بدخولهايف حالة الذاكرة ،ومتى يجب أن يؤثر محتوى حالة الذاكرة على إخراج النموذج.
ستشرح األقسام األولىيف هذا الفصل بُنية ،LSTMوهي نسخة أخف وزنًا تسمى الوحدة
المتكررة ذات البوابات ،)GRU( gated recurrent unitواألفكار الرئيسية وراء شبكات
RNNثنائية االتجاه وشرح موجز لكيفية تكديس طبقات RNNمعًا لتكوين شبكات RNN
عميقة .بعد ذلك ،سوف نستكشف تطبيق RNNsيف مهام التسلسل إلى التسلسل ،وإدخال
الترجمة اآللية جنبًا إلى جنب مع األفكار الرئيسية مثل معماريات المشفر -مفكك الشفرة
encoder-decoder architecturesوالبحث الشعاعي .beam search
يأتي مصطلح "الذاكرة طويلة قصيرة المدى" من الحدس التالي .تمتلك الشبكات العصبية
المتكررة البسيطة ذاكرة طويلة المدى على شكل أوزان .تتغير األوزان ببطء أثناء التدريب ،مما
يؤدي إلى ترميز المعرفة العامة حول البيانات .لديهم أيضًا ذاكرة قصيرة المدىيف شكل عمليات
تنشيط سريعة الزوال ،والتي تنتقل من كل عقدة إلى عقد متتالية .يقدم نموذج LSTMنوعًا
وسيطًا للتخزين عبر خلية الذاكرة .خلية الذاكرة هي وحدة مركبة ،مبنية من عقد أبسطيف نمط
اتصال محدد ،مع تضمين جديد للعقد المضاعفة.
الداخلية (بوابة اإلدخال) )2( ،يجب مسح الحالة الداخلية إلى (بوابة النسيان ،)forget gateو
( ) 3يجب السماح للحالة الداخلية للخاليا العصبية بالتأثير على ناتج الخلية (بوابة اإلخراج
.)output gate
الشكل 10.1.1حساب بوابة اإلدخال وبوابة النسيان وبوابة اإلخراجيف نموذج .LSTM
وتحدد بوابة اإلخراج output gateما إذا كان يجب أن تؤثر خلية الذاكرة على اإلخراجيف الخطوة
الزمنية الحالية.
رياضيًا ،افترض أن هناك وحدات مخفية ، ℎوحجم الدُفعة 𝑛 ،وعدد المدخالت 𝑑 .وبالتالي،
يكون اإلدخال 𝑑×𝑛 𝐗 𝑡 ∈ ℝوالحالة المخفية للخطوة الزمنية السابقة هي .𝐇𝑡−1 ∈ ℝ𝑛×ℎيف
المقابل ،يتم تعريف البواباتيف الخطوة الزمنية 𝑡 على النحو التالي :بوابة اإلدخال هي ∈ 𝑡𝐈
، ℝ𝑛×ℎوبوابة النسيان ، 𝐅𝑡 ∈ ℝ𝑛×ℎوبوابة اإلخراج هي .𝐎𝑡 ∈ ℝ𝑛×ℎيتم حسابها على النحو
التالي:
هي معلمات الوزن و حيث 𝐖𝑥𝑖 , 𝐖𝑥𝑓 , 𝐖𝑥𝑜 ∈ ℝ𝑑×ℎو 𝐖ℎ𝑖 , 𝐖ℎ𝑓 , 𝐖ℎ𝑜 ∈ ℝℎ×ℎ
𝐛𝑖 , 𝐛𝑓 , 𝐛𝑜 ∈ ℝ1×ℎهي معلمات التحيز .الحظ أن البث ( broadcastingانظر القسم )2.1.4
يتم تشغيله أثناء عملية الجمع .نحن نستخدم دوال ( sigmoidكما هو مقدميف القسم )5.1
لتعيين قيم اإلدخال إلى الفاصل الزمني ).(0,1
حيث 𝐖𝑥𝑐 ∈ ℝ𝑑×ℎو 𝐖ℎ𝑐 ∈ ℝℎ×ℎهي معلمات الوزن و 𝐛𝑐 ∈ ℝ1×ℎهي معلمة تحيز.
إذا كانت بوابة النسيان دائمًا 1وكانت بوابة اإلدخال دائمًا ،0فستظل الحالة الداخلية 𝐂𝑡−1لخلية
الذاكرة ثابتة إلى األبد ،وستمر دون تغييريف كل خطوة زمنية الحقة .ومع ذلك ،فإن بوابات اإلدخال
ونسيان البوابات تمنح النموذج المرونة لتعلم متى يجب الحفاظ على هذه القيمة دون تغيير ومتى
تشوشها استجابةً للمدخالت الالحقة.يف الممارسة العملية ،يخفف هذا التصميم من مشكلة
التدرج المتالشي ،مما ينتج عنه نماذج يسهل تدريبها كثيرًا ،خاصةً عند مواجهة مجموعات
البيانات ذات أطوال التسلسل الطويل.
اإلخراج .يف ،LSTMsنطبق أوالً على الحالة الداخلية لخلية الذاكرة ثم نطبق ضرب نقطي أخر،
هذه المرة باستخدام بوابة اإلخراج .هذا يضمن أن تكون قيم 𝑡𝐇 دائمًايف الفاصل الزمني ):(−1,1
عندما تكون بوابة اإلخراج قريبة من ،1فإننا نسمح للحالة الداخلية لخلية الذاكرة بالتأثير على
الطبقات الالحقة غير المحظورة ،بينما بالنسبة لقيم بوابة اإلخراج القريبة من ،0فإننا نمنع الذاكرة
الحالية من التأثير على الطبقات األخرى للشبكةيف الخطوة الزمنية الحالية .الحظ أن خلية الذاكرة
يمكنها تجميع المعلومات عبر العديد من الخطوات الزمنية دون التأثير على بقية الشبكة (طالما
أن بوابة اإلخراج تأخذ قيمًا قريبة من ،)0ثم تؤثر فجأة على الشبكةيف خطوة زمنية الحقة بمجرد
بوابة اإلخراج تقلب من قيم قريبة من 0إلى قيم قريبة من .1
tf.Variable(tf.zeros(num_hiddens)))
@d2l.add_to_class(LSTMScratch)
def forward(self, inputs, H_C=None):
H, C = None, None if H_C is None else H_C
outputs = []
for X in inputs:
I = tf.sigmoid(tf.matmul(X, self.W_xi) + (
tf.matmul(H, self.W_hi) if H is not None
else 0) + self.b_i)
if H is None:
H, C = tf.zeros_like(I), tf.zeros_like(I)
F = tf.sigmoid(tf.matmul(X, self.W_xf) +
tf.matmul(H, self.W_hf) +
self.b_f)
O = tf.sigmoid(tf.matmul(X, self.W_xo) +
tf.matmul(H, self.W_ho) +
self.b_o)
233 الشبكات العصبية المتكررة الحديثة:الفصل العاشر
class LSTM(d2l.RNN):
def __init__(self, num_hiddens):
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 234
d2l.Module.__init__(self)
self.save_hyperparameters()
self.rnn = tf.keras.layers.LSTM(
num_hiddens, return_sequences=True,
return_state=True, time_major=True)
lstm = LSTM(num_hiddens=32)
with d2l.try_gpu():
model = d2l.RNNLM(lstm, vocab_size=len(data.vocab),
lr=4)
trainer.fit(model, data)
. هي النموذج األولي الكامن المتغير االنحدار التلقائي مع التحكميف الحالة غير البديهيةLSTM
multiple طبقات متعددة، على سبيل المثال،تم اقتراح العديد من المتغيرات على مر السنين
فإن، ومع ذلك. أنواع مختلفة من التنظيم،residual connections وصالت متبقية،layers
) مكلف للغاية بسبب التبعية طويلةGRUs ونماذج التسلسل األخرى (مثلLSTMs تدريب
الحقًا سنواجه نماذج بديلة مثل المحوالت. للتسلسلlong range dependency المدى
. التي يمكن استخدامهايف بعض الحاالتtransformers
235 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
10.1.4
بينما تم نشر LSTMsيف عام ،1997فقد برزت بشكل أكبر مع بعض االنتصاراتيف مسابقات
التنبؤيف منتصف العقد األول من القرن الحادي والعشرين ،وأصبحت النماذج السائدة للتعلم
المتسلسل من عام 2011حتى وقت قريب مع ظهور نماذج المحوالت transformer
،modelsبدءًا من عام .2017حتى مخترعي المحوالت يدينون ببعض أفكارهم الرئيسية
البتكارات التصميم المعماري التي قدمتها .LSTMتحتوي LSTMعلى ثالثة أنواع من
البوابات :بوابات اإلدخال input gatesوبوابات النسيان forget gatesوبوابات اإلخراج
output gatesالتي تتحكميف تدفق المعلومات .يتضمن إخراج الطبقة المخفية لـ LSTM
الحالة المخفية والحالة الداخلية لخلية الذاكرة .يتم تمرير الحالة المخفية فقط إلى طبقة اإلخراج
بينما تكون الحالة الداخلية لخلية الذاكرة داخلية بالكامل .يمكن أن تخفف LSTMsمن التالشي
وانفجار التدرجات.
10.1.5
.1اضبط المعلمات الفائقة وحلل تأثيرها على وقت التشغيل واالرتباك وتسلسل اإلخراج.
.2كيف ستحتاج إلى تغيير النموذج لتوليد كلمات مناسبة بدالً من تسلسل األحرف؟
.3قارن التكلفة الحسابية لـ GRUsو LSTMsو RNNsالعادية لبُعد مخفي معين.
قم بإيالء اهتمام خاص لتكلفة التدريب واالستدالل.
.4نظرًا ألن خلية الذاكرة المرشحة تضمن أن نطاق القيمة يقع بين −1و 1باستخدام
الدالة ، tanhفلماذا تحتاج الحالة المخفية إلى استخدام الدالة مرة أخرى للتأكد من
أن نطاق قيمة اإلخراج يقع بين −1و 1؟
.5نفذ نموذج LSTMلتنبؤ السالسل الزمنية بدالً من توقع تسلسل األحرف.
رياضيًا ،لخطوة زمنية معينة 𝑡 ،افترض أن اإلدخال عبارة عن عدد من الدفعات الصغيرة ∈ 𝑡 𝐗
𝑑×𝑛 :ℝعدد األمثلة، 𝑛:عدد المدخالت ) 𝑑 :والحالة المخفية للخطوة الزمنية السابقة هي
( 𝐇𝑡−1 ∈ ℝ𝑛×ℎعدد الوحدات المخفية .) ℎ:بعد ذلك ،يتم حساب بوابة إعادة التعيين ∈ 𝑡 𝐑
ℝ𝑛×ℎوبوابة التحديث 𝐙𝑡 ∈ ℝ𝑛×ℎعلى النحو التالي:
حيث 𝐖𝑥𝑟 , 𝐖𝑥𝑧 ∈ ℝ𝑑×ℎو 𝐖ℎ𝑟 , 𝐖ℎ𝑧 ∈ ℝℎ×ℎهي معلمات الوزن و 𝐛𝑟 , 𝐛𝑧 ∈ ℝ1×ℎ
هي معلمات التحيز.
237 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
حيث 𝐖𝑥ℎ ∈ ℝ𝑑×ℎو 𝐖ℎℎ ∈ ℝℎ×ℎهي معلمات الوزن 𝐛ℎ ∈ ℝ1×ℎ ،هو التحيز ،والرمز
⊙ هو عامل ضرب ( Hadamardبشكل عنصري .)elementwiseهنا نستخدم دالة تنشيط
.tanh
والنتيجة مرشح ،candidateألننا ما زلنا بحاجة إلى دمج عمل بوابة التحديث .بالمقارنة مع
( ،)9.4.5يمكن اآلن تقليل تأثير الحاالت السابقة مع الضرب األولي لـ 𝑡 𝐑 و 𝐇𝑡−1يف
( .)10.2.2عندما تكون اإلدخاالتيف بوابة إعادة الضبط 𝑡 𝐑 قريبة من ،1فإننا نسترد vanilla
RNNكمايف ( .)9.4.5بالنسبة لجميع إدخاالت بوابة إعادة الضبط 𝑡 𝐑 القريبة من ،0تكون
حالة المرشح المخفية نتيجة MLPمع إدخال 𝑡 𝐗 .وبالتالي يتم إعادة تعيين resetأي حالة
مخفية موجودة مسبقًا إلى اإلعدادات االفتراضية.
يوضح الشكل 10.2.2التدفق الحسابي بعد تطبيق بوابة إعادة الضبط .reset gate
عندما تكون بوابة التحديث 𝑡𝐙 قريبة من ،1فإننا ببساطة نحتفظ بالحالة القديمة.يف هذه الحالة،
يتم تجاهل المعلومات الواردة من 𝑡 𝐗 ،مما يؤدي بشكل فعال إلى تخطي الخطوة الزمنية 𝑡يف
سلسلة التبعية.يف المقابل ،عندما تكون 𝑡𝐙 قريبة من ،0تقترب الحالة الكامنة الجديدة 𝑡𝐇 من
~
الحالة الكامنة المرشحة 𝑡𝐇 .يوضح الشكل 10.2.3التدفق الحسابي بعد تشغيل بوابة التحديث.
تساعد بوابات إعادة الضبط Reset gatesتعيين البوابات في التقاط التبعيات قصيرة •
المدى في التسلسل.
تساعد بوابات التحديث Update gatesعلى التقاط التبعيات طويلة المدى في •
التسلسل.
import tensorflow as tf
from d2l import tensorflow as d2l
Initializing Model Parameters 10.2.4
نرسم األوزان من توزيع غاوسي مع االنحراف.الخطوة األولى هي تهيئة معلمات النموذج
عددnum_hiddens يحدد المعامل الفائق.0 ونضبط التحيز علىsigma المعياري ليكون
نقوم بإنشاء جميع األوزان والتحيزات المتعلقة ببوابة التحديث وبوابة إعادة.الوحدات المخفية
.الضبط والحالة المخفية المرشحة
class GRUScratch(d2l.Module):
def __init__(self, num_inputs, num_hiddens,
sigma=0.01):
super().__init__()
self.save_hyperparameters()
tf.Variable(tf.zeros(num_hiddens)))
@d2l.add_to_class(GRUScratch)
def forward(self, inputs, H=None):
matmul_H = lambda A, B: tf.matmul(A, B) if H is not
None else 0
outputs = []
for X in inputs:
Z = tf.sigmoid(tf.matmul(X, self.W_xz) + (
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 240
class GRU(d2l.RNN):
def __init__(self, num_inputs, num_hiddens):
d2l.Module.__init__(self)
self.save_hyperparameters()
self.rnn = tf.keras.layers.GRU(num_hiddens,
return_sequences=True,
return_state=True)
. بدالً من بايثونcompiled operators الكود أسرعيف التدريب ألنه يستخدم عوامل مترجمة
10.2.6.2
مقارنةً بـ ،LSTMsتحقق وحدات GRUأداءً مشابهًا ولكنها تميل إلى أن تكون أخف من
الناحية الحسابية .بشكل عام ،مقارنةً بـ RNNsالبسيطة ،يمكن لـ RNNsذات البوابات مثل
LSTMsو GRUsالتقاط التبعيات بشكل أفضل للتسلسالت ذات مسافات الخطوة الزمنية
الكبيرة .تحتوي وحدات GRUعلى RNNsاألساسية كحالة قصوى عند تشغيل بوابة إعادة
التعيين .reset gateيمكنهم أيضًا تخطي التكرارات الالحقة عن طريق تشغيل بوابة التحديث
.update gate
10.2.6.3
′
.1افترض أننا نريد فقط استخدام اإلدخال في الخطوة الزمنية 𝑡 للتنبؤ باإلخراج في
الخطوة الزمنية .𝑡 > 𝑡 ′ما هي أفضل القيم لبوابات إعادة التعيين والتحديث لكل خطوة
زمنية؟
.2اضبط المعلمات الفائقة وحلل تأثيرها على وقت التشغيل واالرتباك وتسلسل اإلخراج.
.3قارن بين وقت التشغيل واالرتباك وسالسل اإلخراج لتطبيقات rnn.RNNو
rnn.GRUمع بعضها البعض.
.4ماذا يحدث إذا قمت بتنفيذ أجزاء فقط من ، GRUعلى سبيل المثال ،مع بوابة إعادة
الضبط فقط أو بوابة تحديث فقط؟
الطريقة القياسية لبناء هذا النوع من RNNالعميقة بسيطة بشكل مذهل :نحن نكدس RNNs
فوق بعضنا البعض .بالنظر إلى تسلسل الطول 𝑇 ،ينتج RNNاألول سلسلة من المخرجات،
243 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
وكذلك الطول 𝑇 .هذه ،بدورها ،تشكل المدخالت إلى طبقة RNNالتالية.يف هذا القسم
القصير ،نوضح نمط التصميم هذا ونقدم مثالًا بسيطًا لكيفية ترميز مثل هذه RNNsالمكدسة.
أدناه،يف الشكل ،10.3.1نوضح RNNعميقًا مع طبقات مخفية .تعمل كل حالة مخفية على
إدخال متسلسل وتنتج مخرجات متسلسلة .عالوة على ذلك ،تعتمد أي خلية ( RNNالمربع
األبيضيف الشكل ) 10.3.1يف كل خطوة زمنية على كل من قيمة الطبقة نفسهايف الخطوة الزمنية
السابقة وقيمة الطبقة السابقةيف نفس الخطوة الزمنية.
بشكل رسمي ،افترض أن لدينا الدفعات الصغيرة مع االدخال 𝑑×𝑛( 𝐗 𝑡 ∈ ℝعدد األمثلة، 𝑛:
عدد المدخالتيف كل مثال) 𝑑:يف الخطوة الزمنية.يف نفس الخطوة الزمنية 𝑡 ،ليكن الحالة
)𝑙(
المخفية لـ 𝑙 thالطبقة المخفية ( 𝐿 )𝑙 = 1, … ,تكون ( 𝐇𝑡 ∈ ℝ𝑛×ℎعدد الوحدات المخفية:
)(0
𝑡𝐇 ،يتم حساب )ℎومتغير طبقة اإلخراج يكون 𝑞×𝑛( 𝐎𝑡 ∈ ℝعدد النواتج .) 𝑞:ضبط 𝑡 𝐗 =
الحالة المخفية لـ 𝑙 thالطبقة المخفية التي تستخدم دالة التنشيط 𝑙𝜙 على النحو التالي:
)𝑙( )(𝑙−1 )𝑙( )𝑙( )𝑙( )𝑙(
𝑡𝐇( 𝑙𝜙 = 𝑡𝐇 𝐖𝑥ℎ + 𝐇𝑡−1 𝐖ℎℎ + 𝐛ℎ ),
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 244
في النهاية ،يعتمد حساب الطبقة المخرجة فقط على الحالة المخفية لـ 𝐿thالطبقة المخفية
النهائية:
)𝐿(
𝐎𝑡 = 𝐇𝑡 𝐖ℎ𝑞 + 𝐛𝑞 ,
حيث الوزن 𝑞× 𝐖ℎ𝑞 ∈ ℝℎوالتحيز 𝑞× 𝐛𝑞 ∈ ℝ1هما معلمات النموذج للطبقة الناتجة.
تمامًا كما هو الحال مع ،MLPsفإن عدد الطبقات المخفية 𝐿 وعدد الوحدات المخفية ℎهي
معلمات فائقة يمكننا ضبطها .تقع عروض طبقة RNNالشائعة ()ℎيف النطاق )، (64,2056
بينما تقع األعماق الشائعة ( 𝐿)يف النطاق ) .(1,8باإلضافة إلى ذلك ،يمكننا بسهولة الحصول
على RNNذي بوابات عميقة عن طريق استبدال حساب الحالة المخفيةيف ( )10.3.1بحساب
LSTMأو .GRU
class StackedRNNScratch(d2l.Module):
def __init__(self, num_inputs, num_hiddens,
num_layers, sigma=0.01):
)(__super().__init
)(self.save_hyperparameters
self.rnns = [d2l.RNNScratch(num_inputs if i==0
else num_hiddens,
)num_hiddens, sigma
])for i in range(num_layers
يقوم الحساب األمامي متعدد الطبقات ببساطة بإجراء حساب إلى األمام طبقة تلو األخرى.
)@d2l.add_to_class(StackedRNNScratch
def forward(self, inputs, Hs=None):
outputs = inputs
)if Hs is None: Hs = [None] * len(inputs
for i in range(self.num_layers):
)]outputs, Hs[i] = self.rnns[i](outputs, Hs[i
return outputs, Hs
245 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
على سبيل المثال ،نقوم بتدريب نموذج GRUعميق على مجموعة بيانات The Time
( Machineكمايف القسم .)9.5لتبسيط األمور ،قمنا بتعيين عدد الطبقات على .2
gru_cells =
[tf.keras.layers.GRUCell(num_hiddens, dropout=dropout)
for _ in range(num_layers)]
self.rnn = tf.keras.layers.RNN(gru_cells,
return_sequences=True,
return_state=True, time_major=True)
10.3.3
في RNNsالعميقة ،يتم تمرير معلومات الحالة المخفية إلى الخطوة الزمنية التالية للطبقة
الحالية والخطوة الزمنية الحالية للطبقة التالية .توجد العديد من النكهات المختلفة لـ RNNs
العميقة ،مثل LSTMsأو GRUsأو .vanilla RNNsبشكل مالئم ،تتوفر جميع هذه النماذج
كأجزاء من واجهات برمجة التطبيقات عالية المستوى ألطر التعلم العميق .يتطلب تهيئة النماذج
االهتمام .بشكل عام ،تتطلب شبكات RNNالعميقة قدرًا كبيرًا من العمل (مثل معدل التعلم
والقص )clippingلضمان التقارب المناسب.
10.3.4
.1استبدل GRUبـ LSTMوقارن الدقة وسرعة التدريب.
.2قم بزيادة بيانات التدريب لتشمل كتبًا متعددة .إلى أي مدى يمكن أن تذهب على
مقياس االرتباك perplexity scale؟
.3هل تريد الجمع بين مصادر مؤلفين مختلفين عند نمذجة النص؟ لماذا هذه الفكرة
جيدة؟ ما الخطأ الذي يمكن أن يحدث؟
Bidirectional 10.4
Recurrent Neural Networks
حتى اآلن ،كان مثالنا العملي لمهمة التعلم المتسلسل هو نمذجة اللغة ،حيث نهدف إلى توقع
الرمز التالي مع األخذيف االعتبار جميع الرموز السابقةيف تسلسل.يف هذا السيناريو ،نرغب فقطيف
الشرط على السياق األيسر ،وبالتالي يبدو التسلسل أحادي االتجاه unidirectional chaining
لـ RNNالقياسي مناسبًا .ومع ذلك ،هناك العديد من سياقات مهام التعلم المتسلسلة األخرى
حيث يكون من الجيد تمامًا تكييف التنبؤيف كل خطوة زمنية على كل من السياق األيمن واأليسر.
ضعيف اعتبارك ،على سبيل المثال ،جزءًا من اكتشاف الكالم .part of speech detection
لماذا ال يجب أن نأخذ السياقيف كال االتجاهينيف االعتبار عند تقييم جزء الكالم المرتبط بكلمة
معينة؟
مهمة أخرى شائعة -غالبًا ما تكون مفيدة كتمرين مسبق قبل ضبط نموذج على مهمة فعلية مثيرة
لالهتمام -وهي إخفاء الرموز العشوائيةيف مستند نصي ثم تدريب نموذج تسلسل للتنبؤ بقيم
الرموز المفقودة .الحظ أنه بناءً على ما يأتي بعد الفراغ ،فإن القيمة المحتملة للرمز المفقود تتغير
بشكل كبير:
رسميًا ألي خطوة زمنية 𝑡 ،نعتبر إدخال الدفعات الصغيرة هو 𝑑×𝑛( 𝐗 𝑡 ∈ ℝعدد األمثلة، 𝑛:
عدد المدخالتيف كل مثال ) 𝑑:ودع دالة تنشيط الطبقة المخفية تكون 𝜙.يف البنية ثنائية االتجاه،
← →
الحاالت المخفية لألمام والخلف لهذه الخطوة الزمنية هي 𝐇𝑡 ∈ ℝ𝑛×ℎو ،𝐇𝑡 ∈ ℝ𝑛×ℎعلى
التوالي ،حيث ℎهو عدد الوحدات المخفية .تحديثات الحالة المخفية لألمام والخلف هي كما
يلي:
→ →
)𝑓( )𝑓( )𝑓(
𝑡𝐇 = 𝜙(𝐗 𝑡 𝐖𝑥ℎ + 𝐇𝑡−1 𝐖ℎℎ + 𝐛ℎ ),
← ←
)𝑏( )𝑏( )𝑏(
𝑡𝐇 = 𝜙(𝐗 𝑡 𝐖𝑥ℎ + 𝐇𝑡+1 𝐖ℎℎ + 𝐛ℎ ),
249 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
هنا ،مصفوفة الوزن 𝑞× 𝐖ℎ𝑞 ∈ ℝ2ℎوالتحيز 𝑞× 𝐛𝑞 ∈ ℝ1هما معلمات نموذج طبقة اإلخراج.
بينما من الناحية الفنية ،يمكن أن يكون لالتجاهين أعداد مختلفة من الوحدات المخفية ،إال أن
اختيار التصميم هذا نادرًا ما يتم إجراؤه عمليًا .نعرض اآلن تنفيذًا بسيطًا لـ RNNثنائي االتجاه
.bidirectional RNN
class BiRNNScratch(d2l.Module):
def __init__(self, num_inputs, num_hiddens,
sigma=0.01):
)(__super().__init
)(self.save_hyperparameters
self.f_rnn = d2l.RNNScratch(num_inputs,
)num_hiddens, sigma
self.b_rnn = d2l.RNNScratch(num_inputs,
)num_hiddens, sigma
self.num_hiddens *= 2 # The output dimension
will be doubled
يتم تحديث حاالت RNNsاألمامية والخلفية بشكل منفصل ،بينما يتم توصيل مخرجات
هاتين .RNNs
)@d2l.add_to_class(BiRNNScratch
def forward(self, inputs, Hs=None):
)f_H, b_H = Hs if Hs is not None else (None, None
)f_outputs, f_H = self.f_rnn(inputs, f_H
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 250
10.4.2.1
في RNNsثنائية االتجاه ،bidirectional RNNsيتم تحديد الحالة المخفية لكل خطوة
زمنيةيف وقت واحد بواسطة البيانات قبل وبعد الخطوة الزمنية الحالية RNNs .ثنائية االتجاه
مفيدةيف الغالب لتشفير التسلسل وتقدير المالحظاتيف سياق ثنائي االتجاه RNNs .ثنائية
االتجاه مكلفة للغاية للتدريب بسبب سالسل التدرج الطويلة .long gradient chains
10.4.2.2
.1إذا كانت االتجاهات المختلفة تستخدم عددًا مختلفًا من الوحدات المخفية ،فكيف
سيتغير الشكل 𝑡𝐇 ؟
.2صمم RNNثنائي االتجاه مع طبقات مخفية متعددة.
.3تعدد المعاني Polysemyشائعيف اللغات الطبيعية .على سبيل المثال ،لكلمة "" bank
معاني مختلفةيف السياقات " " i went to the bank to deposit cashو " i went
." to the bank to sit downكيف يمكننا تصميم نموذج شبكة عصبية بحيث يتم
إرجاع تمثيل متجه للكلمةيف السياقيف ضوء تسلسل السياق والكلمة؟ ما نوع البنى
العصبية المفضل للتعامل مع تعدد المعاني polysemy؟
العديد من المشاكل لها طابع التعيين mappingبين اثنين من هذه التتابعات "غير المحاذاة
." unalignedتتضمن األمثلة التعيين من مطالبات الحوار إلى الردود أو من األسئلة إلى
251 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
اإلجابات .بشكل عام ،تسمى هذه المشكالت مشاكل التسلسل إلى التسلسل sequence-to-
)seq2seq( sequenceوهي محور تركيزنا لكل من الجزء المتبقي من هذا الفصل والكثير من
القسم .11
في هذا القسم ،نقدم مشكلة الترجمة اآللية machine translationومثالًا لمجموعة البيانات
datasetالتي سنستخدمهايف األمثلة الالحقة .لعقود من الزمان ،كانت الصيغ اإلحصائية للترجمة
بين اللغات شائعة ( ،)1988 ،Brown et al. ،1990 ،Brown et al.حتى قبل أن يعمل
الباحثون على اتباع نهج الشبكة العصبية (غالبًا ما يتم تجميع الطرق معًا تحت مصطلح الترجمة
اآللية العصبية .)neural machine translation
أوالً ،سنحتاج إلى رمز جديد لمعالجة بياناتنا .على عكس نمذجة اللغة التي رأيناهايف القسم ،9.3
يتكون كل مثال هنا من تسلسلين نصيين منفصلين ،أحدهما بلغة المصدر واآلخر (الترجمة)يف
اللغة الهدف .ستوضح مقتطفات التعليمات البرمجية التالية كيفية تحميل البيانات المعالجة
مسبقًا إلى الدفعات الصغيرة للتدريب.
import os
import tensorflow as tf
from d2l import tensorflow as d2l
Downloading and 10.5.1
Preprocessing the Dataset
للبدء ،نقوم بتنزيل مجموعة بيانات إنجليزية-فرنسية تتكون من أزواج جمل ثنائية اللغة
bilingual sentence pairsمن مشروع .Tatoebaكل سطريف مجموعة البيانات عبارة عن
زوج محدد بعالمات جدولة يتكون من تسلسل نص إنجليزي وتسلسل نص فرنسي مترجم .الحظ
أن كل تسلسل نصي يمكن أن يكون مجرد جملة واحدة ،أو فقرة من جمل متعددة.يف مشكلة
الترجمة اآللية هذه حيث تتم ترجمة اللغة اإلنجليزية إلى الفرنسية ،تسمى اللغة اإلنجليزية لغة
المصدر source languageوتسمى الفرنسية اللغة الهدف .target language
)(data = MTFraEng
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 252
)(raw_text = data._download
)]print(raw_text[:75
! Go. Va
! Hi. Salut
!Run ! Cours
!Run ! Courez
?Who ? Qui
!Wow ! Ça alors
بعد تنزيل مجموعة البيانات ،datasetننتقل إلى العديد من خطوات المعالجة المسبقة لبيانات
النص الخام .على سبيل المثال ،نستبدل المسافات غير المنقسمة بمسافة ،ونحول األحرف
الكبيرة إلى أحرف صغيرة ،ونضع مسافة بين الكلمات وعالمات الترقيم.
@d2l.add_to_class(MTFraEng) #@save
def _preprocess(self, text):
# Replace non-breaking space with space
' text = text.replace('\u202f', ' ').replace('\xa0',
)'
# Insert space between words and punctuation marks
'?!no_space = lambda char, prev_char: char in ',.
' ' =! and prev_char
out = [' ' + char if i > 0 and no_space(char, text[i
- 1]) else char
]))(for i, char in enumerate(text.lower
)return ''.join(out
)text = data._preprocess(raw_text
)]print(text[:80
go . ! va
hi . ! salut
! run ! cours
! run ! courez
? who ? qui
! wow ! ça alors
Tokenization 10.5.2
على عكس الترميز على مستوى الحرفيف القسم ،9.3بالنسبة للترجمة اآللية ،فإننا نفضل الترميز
على مستوى الكلمات هنا (تستخدم النماذج الحديثة اليوم تقنيات ترميز أكثر تعقيدًا) .تقوم
طريقة _tokenizeالتالية بترميز أول أزواج تسلسل نصي ،max_examplesحيث يكون
كل رمز إما كلمة أو عالمة ترقيم .نلحق الرمز المميز "< ">eosبنهاية كل تسلسل لإلشارة إلى
نهاية التسلسل .عندما يتنبأ نموذج عن طريق إنشاء رمز تسلسلي بعد الرمز ،يمكن أن يشير إنشاء
253 الشبكات العصبية المتكررة الحديثة:الفصل العاشر
تُرجع الطريقة أدناه قائمتين من،يف النهاية.>" إلى اكتمال تسلسل اإلخراجeos<" الرمز المميز
هي قائمة من الرموز منsrc[i] ، على وجه التحديدtgt. وsrc :قوائم الرموز المميزة
هو ذلكيف اللغة الهدف (الفرنسيةtgt[i] تسلسل النصيف اللغة المصدر (اإلنجليزية هنا) و
.)هنا
@d2l.add_to_class(MTFraEng) #@save
def _tokenize(self, text, max_examples=None):
src, tgt = [], []
for i, line in enumerate(text.split('\n')):
if max_examples and i > max_examples: break
parts = line.split('\t')
if len(parts) == 2:
# Skip empty tokens
src.append([t for t in f'{parts[0]}
<eos>'.split(' ') if t])
tgt.append([t for t in f'{parts[1]}
<eos>'.split(' ') if t])
return src, tgt
#@save
def show_list_len_pair_hist(legend, xlabel, ylabel,
xlist, ylist):
"""Plot the histogram for list length pairs."""
d2l.set_figsize()
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 254
لتحقيق الكفاءة الحسابية ،ال يزال بإمكاننا معالجة مجموعة صغيرة من تسلسالت النصيف وقت
واحد عن طريق االقتطاع truncationوالحشو .paddingافترض أن كل تسلسليف نفس
الدفعات الصغيرة minibatchيجب أن يكون له نفس الطول .num_stepsإذا كان التسلسل
النصي يحتوي على أقل من num_stepsللرموز ،فسنستمريف إلحاق الرمز المميز "<">pad
بنهايته حتى يصل طوله إلى عدد_الخطوات .num_stepsخالفًا لذلك ،سنقوم باقتطاع
255 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
تسلسل النص من خالل أخذ الرموز لعدد الخطوات األولى num_stepsفقط والتخلص من
الباقي .بهذه الطريقة ،سيكون لكل تسلسل نصي نفس الطول ليتم تحميلهيف دفعات صغيرة من
نفس الشكل .إلى جانب ذلك ،نسجل أيضًا طول تسلسل المصدر باستثناء الرموز للحشو
.paddingستحتاج بعض النماذج إلى هذه المعلومات التي سنغطيها الحقًا.
نظرًا ألن مجموعة بيانات الترجمة اآللية تتكون من أزواج من اللغات ،يمكننا بناء مفردتين لكل
من اللغة المصدر واللغة الهدف بشكل منفصل .باستخدام الترميز على مستوى الكلمة ،سيكون
حجم المفردات أكبر بكثير من ذلك باستخدام الترميز على مستوى الحرف .للتخفيف من هذا،
نتعامل هنا مع الرموز غير المتكررة التي تظهر أقل من مرتين كرمز غير معروف ("<.)" >unk
كما سنشرح الحقًا (الشكل ،)10.7.1عند التدريب باستخدام التسلسالت المستهدفة ،يمكن
أن يكون إخراج وحدة مفكك الشفرة ( decoder outputرموز للتسمية )label tokensهو
نفس مدخالت مفكك الشفرة (رموز المستهدفة ، )target tokensوالتي يتم إزاحتها بواسطة
رمز واحد وسيتم استخدام الرمز لبداية التسلسل "< ">bosكأول رمز للدخل للتنبؤ بالتسلسل
المستهدف (الشكل .)10.7.3
@d2l.add_to_class(MTFraEng) #@save
def __init__(self, batch_size, num_steps=9,
num_train=512, num_val=128):
)(__super(MTFraEng, self).__init
)(self.save_hyperparameters
= self.arrays, self.src_vocab, self.tgt_vocab
(self._build_arrays
))(self._download
@d2l.add_to_class(MTFraEng) #@save
def _build_arrays(self, raw_text, src_vocab=None,
tgt_vocab=None):
def _build_array(sentences, vocab, is_tgt=False):
( pad_or_trim = lambda seq, t:
]'>seq[:t] if len(seq) > t else seq + ['<pad
)))* (t - len(seq
sentences = [pad_or_trim(s, self.num_steps) for
]s in sentences
if is_tgt:
sentences = [['<bos>'] + s for s in
]sentences
if vocab is None:
)vocab = d2l.Vocab(sentences, min_freq=2
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 256
@d2l.add_to_class(MTFraEng) #@save
def get_dataloader(self, train):
idx = slice(0, self.num_train) if train else
slice(self.num_train, None)
return self.get_tensorloader(self.arrays, train,
idx)
.الفرنسية-دعنا نقرأ الدفعة األولى من مجموعة البيانات اإلنجليزية
data = MTFraEng(batch_size=3)
src, tgt, src_valid_len, label =
next(iter(data.train_dataloader()))
print('source:', tf.cast(src, tf.int32))
print('decoder input:', tf.cast(tgt, tf.int32))
print('source len excluding pad:',
tf.cast(src_valid_len, tf.int32))
print('label:', tf.cast(label, tf.int32))
source: tf.Tensor(
[[ 79 5 0 3 4 4 4 4 4]
[ 28 150 2 3 4 4 4 4 4]
[ 69 0 3 4 4 4 4 4 4]], shape=(3, 9),
dtype=int32)
decoder input: tf.Tensor(
257 الشبكات العصبية المتكررة الحديثة:الفصل العاشر
[[ 3 49 37 6 0 4 5 5 5]
[ 3 206 31 0 4 5 5 5 5]
[ 3 210 6 0 4 5 5 5 5]], shape=(3, 9),
dtype=int32)
source len excluding pad: tf.Tensor([4 4 3], shape=(3,),
dtype=int32)
label: tf.Tensor(
[[ 49 37 6 0 4 5 5 5 5]
[206 31 0 4 5 5 5 5 5]
[210 6 0 4 5 5 5 5 5]], shape=(3, 9),
dtype=int32)
نعرض أدناه زوجًا من التسلسالت المصدر والهدف التي تتم معالجتها بواسطة طريقة
.)string format _ أعاله (في تنسيق السلسلةbuild_arrays
@d2l.add_to_class(MTFraEng) #@save
def build(self, src_sentences, tgt_sentences):
raw_text = '\n'.join([src + '\t' + tgt for src, tgt
in zip(
src_sentences, tgt_sentences)])
arrays, _, _ = self._build_arrays(
raw_text, self.src_vocab, self.tgt_vocab)
return arrays
يكون لكل منهم نفس الطول ليتم تحميله ف الدفعات الصغيرة .minibatchesغالبًا ما تستخدم
التطبيقات الحديثة تسلسالت بأطوال مماثلة لتجنب إهدار الحساب المفرط على الحشو.
10.5.6
.1جرب قيمًا مختلفة للوسيطة max_examplesيف طريقة ._tokenizeكيف يؤثر
ذلك على أحجام مفردات اللغة المصدر واللغة الهدف؟
.2ال يحتوي النصيف بعض اللغات مثل الصينية واليابانية على مؤشرات حدود الكلمات
(على سبيل المثال ،المسافة) .هل ال يزال الترميز على مستوى الكلمة فكرة جيدة لمثل
هذه الحاالت؟ لما ولما ال؟
Encoder-Decoder 10.6
Architecture
في مسائل seq2seqالعامة مثل الترجمة اآللية (القسم ،)10.5تكون المدخالت والمخرجات
ذات أطوال متفاوتة وغير محاذية .يتمثل النهج القياسي لمعالجة هذا النوع من البياناتيف تصميم
معمارية المشفر-مفكك الشفرة ( encoder-decoder architectureالشكل )10.6.1
تتكون من مكونين رئيسيين :المشفر encoderيأخذ تسلسلًا متغير الطول كمدخل ،ومفكك
الشفرة decoderيعمل كنموذج لغة شرطي ،مع األخذيف االعتبار المدخالت المشفرة والسياق
األيسر للتسلسل المستهدف والتنبؤ بالرمز التالييف التسلسل المستهدف.
لنأخذ الترجمة اآللية من اإلنجليزية إلى الفرنسية كمثال .بالنظر إلى تسلسل اإلدخال باللغة
اإلنجليزية ،”.“ ،“ watching" ،“ are" ،“ They" :تقوم معمارية المشفر-مفكك الشفرة
هذه أوالً بتشفير المدخالت ذات الطول المتغير إلى حالة ،ثم تقوم بفك تشفير الحالة إلنشاء
التسلسل المترجم ،رمزاً رمزاً ،كمخرج ."." ، " regardent" ، " Ils" :نظرًا ألن معمارية المشفر-
مفكك الشفرة تشكل أساسًا لنماذج seq2seqالمختلفةيف األقسام الالحقة ،فإن هذا القسم
سيحول هذه المعمارية إلى واجهة سيتم تنفيذها الحقًا.
Encoder 10.6.1
في واجهة المشفر ،نحدد فقط أن المشفر يأخذ تسلسالت متغيرة الطول كمدخل .Xسيتم توفير
التنفيذ بواسطة أي نموذج يرث كالس Encoderاألساسية هذه.
#@save
class Encoder(tf.keras.layers.Layer):
"""The base encoder interface for the encoder-
decoder architecture."""
def __init__(self):
super().__init__()
#@save
class Decoder(tf.keras.layers.Layer):
"""The base decoder interface for the encoder-
decoder architecture."""
def __init__(self):
super().__init__()
#@save
class EncoderDecoder(d2l.Classifier):
"""The base class for the encoder-decoder
"""architecture.
def __init__(self, encoder, decoder):
)(__super().__init
self.encoder = encoder
self.decoder = decoder
10.6.4
يمكن أن تتعامل معماريات المشفر-مفكك الشفرة مع المدخالت والمخرجات التي تتكون من
متواليات متغيرة الطول وبالتالي فهي مناسبة لمشاكل seq2seqمثل الترجمة اآللية .يأخذ المشفر
encoderتسلسلًا متغير الطول كمدخل ويحوله إلى حالة ذات شكل ثابت .يقوم مفكك الشفرة
decoderبتعيين الحالة المشفرة لشكل ثابت إلى تسلسل متغير الطول.
10.6.5
.1لنفترض أننا نستخدم الشبكات العصبية لتنفيذ معمارية المشفر-مفكك الشفرة .هل
يجب أن يكون المشفر ومفكك الشفرة من نفس نوع الشبكة العصبية؟
.2إلى جانب الترجمة اآللية ،هل يمكنك التفكيريف تطبيق آخر حيث يمكن تطبيق معمارية
الشفرة-مفكك الشفرة؟
261 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
هنا ،سيأخذ المشفر RNNتسلسلًا متغير الطول كمدخل ويحوله إلى حالة مخفية ذات شكل
ثابت .الحقًا،يف القسم ،11سنقدم آليات االنتباه ،attention mechanismsوالتي تسمح لنا
بالوصول إلى المدخالت المشفرة دون الحاجة إلى ضغط المدخالت بالكامليف تمثيل واحد ذي
طول ثابت.
بعد ذلك ،إلنشاء تسلسل اإلخراج ،رمز واحديف كل مرة ،سيتنبأ نموذج وحدة مفكك الشفرة
،decoder modelالذي يتكون من RNNمنفصل ،بكل رمز مستهدف متتالي بالنظر إلى كل
من تسلسل اإلدخال والرموز السابقةيف المخرجات .أثناء التدريب ،عادةً ما يكون مفكك الشفرة
مشروطًا بالرموز السابقةيف التسمية الحقيقية " "Ground-Truthالرسمي .ومع ذلك،يف وقت
االختبار ،سنرغبيف تكييف كل إخراج من مفكك الشفرة على الرموز التي تم توقعها بالفعل.
الحظ أنه إذا تجاهلنا المشفر ،فإن مفكك الشفرةيف بنية seq2seqتتصرف تمامًا مثل نموذج
اللغة العادي .يوضح الشكل 10.7.1كيفية استخدام RNNsتعلم التسلسل للتسلسليف الترجمة
اآللية.
في الشكل ،10.7.1يشير الرمز "< ">eosإلى نهاية التسلسل .يمكن أن يتوقف نموذجنا عن إجراء
تنبؤات بمجرد إنشاء هذا الرمز.يف الخطوة الزمنية األولية لمفكك شفرة ،RNNهناك قراران
تصميم خاصان يجب أن تكون على دراية بهما :أوالً ،نبدأ كل إدخال برمز لبداية التسلسل
"< .">bosثانيًا ،قد نقوم بتغذية الحالة المخفية النهائية للمشفريف مفكك الشفرةيف كل خطوة
زمنية لمفكك الشفرة (.)2014 ،Cho et al.يف بعض التصميمات األخرى ،مثل Sutskever
،)2014( .et alتُستخدم الحالة المخفية النهائية لمشفر RNNلبدء الحالة المخفية لمفكك
الشفرة فقطيف خطوة مفكك الشفرة األولى.
تطبيقنايف القسم 10.5.3بيانات تدريب مُعدّة إلجبار المعلم ،حيث يشبه تحويل الرموز للتعلم
تحت اإلشراف الذاتي تدريب النماذج اللغويةيف القسم .9.3تتمثل الطريقة البديلةيف تغذية الرمز
المتوقع من الخطوة الزمنية السابقة كمدخل حالي إلى مفكك الشفرة.
فيما يلي ،نشرح التصميم الموضحيف الشكل 10.7.1بمزيد من التفصيل .سنقوم بتدريب هذا
النموذج للترجمة اآللية على مجموعة البيانات اإلنجليزية-الفرنسية كما هو مقدميف القسم .10.5
import collections
import math
import tensorflow as tf
from d2l import tensorflow as d2l
Encoder 10.7.2
تذكر أن المشفر يحول تسلسل إدخال متغير الطول إلى متغير سياق ثابت الشكل (انظر الشكل
.)10.7.1
ضعيف اعتبارك مثال تسلسل واحد (حجم الدُفعة .)1افترض أن تسلسل اإلدخال هو 𝑇𝑥 𝑥1 , … ,
حيث 𝑡𝑥 هو 𝑡 thالرمز.يف الخطوة الزمنية 𝑡 ،يقوم RNNبتحويل متجه ميزة اإلدخال 𝑡𝐱 لـ 𝑡𝑥
263 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
والحالة المخفية 𝐡𝑡−1من الخطوة الزمنية السابقة إلى الحالة المخفية الحالية 𝑡𝐡 .يمكننا
استخدام دالة 𝑓 للتعبير عن تحول الطبقة المتكررة لـ :RNN
بشكل عام ،يحول المشفر الحاالت المخفيةيف جميع الخطوات الزمنية إلى متغير سياق من خالل
دالة مخصصة 𝑞:
على سبيل المثال،يف الشكل ،10.7.1متغير السياق هو فقط الحالة المخفية 𝑇 𝐡 المقابلة لتمثيل
المشفر RNNبعد معالجة الرمز النهائي لتسلسل اإلدخال.
فلنبدأ اآلنيف تنفيذ مشفر .RNNالحظ أننا نستخدم طبقة التضمين embedding layer
للحصول على متجه المعالم لكل رمزيف تسلسل اإلدخال .وزن طبقة التضمين هو مصفوفة ،حيث
يتوافق عدد الصفوف مع حجم مفردات اإلدخال ( )vocab_sizeويتوافق عدد األعمدة مع
أبعاد متجه المعالم ( .)embed_sizeبالنسبة ألي فهرس رمز إدخال 𝑖 ،تجلب طبقة التضمين
لـ 𝑖 thالصف (بدءًا من )0من مصفوفة الوزن إلرجاع متجه الميزة الخاص بها .هنا نقوم بتنفيذ
المشفر باستخدام GRUمتعدد الطبقات.
Decoder 10.7.3
بالنظر إلى تسلسل اإلخراج المستهدف 𝑦1 , 𝑦2 , … , 𝑦 𝑇 ′لكل خطوة زمنية ( 𝑡 ′نستخدم 𝑡 ′للتمييز
عن خطوات وقت تسلسل اإلدخال) ،يقوم مفكك الشفرة بتعيين احتمالية متوقعة لكل رمز ممكن
يحدثيف الخطوة 𝑦𝑡 ′ +1المشروطة بالرموز السابقةيف الهدف 𝑦1 , … , 𝑦𝑡 ′ومتغير السياق 𝐜 ،أي
)𝐜 . 𝑃(𝑦𝑡 ′ +1 ∣ 𝑦1 , … , 𝑦𝑡 ′ ,
265 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
للتنبؤ بالرمز الالحق 𝑡 ′ + 1يف التسلسل المستهدف ،يأخذ مفكك شفرة RNNالرمز الهدف
للخطوة السابقة ، 𝑦𝑡 ′وحالة RNNالمخفية من الخطوة الزمنية السابقة ، 𝐬𝑡 ′ −1ومتغير السياق
𝐜 كمدخالت ،ويحولهم إلى الحالة المخفية 𝐬𝑡 ′يف الخطوة الزمنية الحالية .يمكننا استخدام دالة
𝑔 للتعبير عن تحول الطبقة المخفية لمفكك الشفرة:
بعد الحصول على الحالة المخفية لمفكك الشفرة ،يمكننا استخدام طبقة اإلخراج وعملية
softmaxلحساب التوزيع التنبئي )𝐜 𝑝(𝑦𝑡 ′ +1 ∣ 𝑦1 , … , 𝑦𝑡 ′ ,على رمز اإلخراج التالي 𝑡 ′ +
.1
باتباع الشكل ،10.7.1عند تنفيذ مفكك الشفرة على النحو التالي ،فإننا نستخدم الحالة المخفية
مباشرةًيف الخطوة الزمنية النهائية للمشفر لتهيئة الحالة المخفية لمفكك الشفرة .يتطلب ذلك أن
يكون لمشفر RNNومفكك شفرة RNNنفس عدد الطبقات والوحدات المخفية .لمزيد من
دمج معلومات تسلسل اإلدخال المشفر ،يكون متغير السياق متسلسلًا مع إدخال مفكك الشفرة
في جميع خطوات الوقت .للتنبؤ بالتوزيع االحتمالي للرمز الناتج ،نستخدم طبقة متصلة بالكامل
لتحويل الحالة المخفيةيف الطبقة األخيرة من مفكك شفرة .RNN
class Seq2SeqDecoder(d2l.Decoder):
"""The RNN decoder for sequence to sequence
"""learning.
def __init__(self, vocab_size, embed_size,
num_hiddens, num_layers,
dropout=0):
)(__super().__init
= self.embedding
)tf.keras.layers.Embedding(vocab_size, embed_size
self.rnn = d2l.GRU(num_hiddens, num_layers,
)dropout
)self.dense = tf.keras.layers.Dense(vocab_size
Encoder- 10.7.4
Decoder for Sequence to Sequence Learning
:ينتج عن وضع كل ذلك معًايف التعليمات البرمجية ما يلي
def configure_optimizers(self):
# Adam optimizer is used here
return
)tf.keras.optimizers.Adam(learning_rate=self.lr
)@d2l.add_to_class(Seq2Seq
def loss(self, Y_hat, Y):
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 268
l = super(Seq2Seq, self).loss(Y_hat, Y,
averaged=False)
mask = tf.cast(tf.reshape(Y, -1) != self.tgt_pad,
tf.float32)
return tf.reduce_sum(l * mask) / tf.reduce_sum(mask)
Training 10.7.6
التسلسل على- للتعلم التسلسلRNN مفكك شفرة-اآلن يمكننا إنشاء وتدريب نموذج مشفر
.مجموعة بيانات الترجمة اآللية
data = d2l.MTFraEng(batch_size=128)
embed_size, num_hiddens, num_layers, dropout = 256, 256,
2, 0.2
with d2l.try_gpu():
encoder = Seq2SeqEncoder(
len(data.src_vocab), embed_size, num_hiddens,
num_layers, dropout)
decoder = Seq2SeqDecoder(
len(data.tgt_vocab), embed_size, num_hiddens,
num_layers, dropout)
model = Seq2Seq(encoder, decoder,
tgt_pad=data.tgt_vocab['<pad>'],
lr=0.001)
trainer = d2l.Trainer(max_epochs=50,
gradient_clip_val=1)
trainer.fit(model, data)
269 الشبكات العصبية المتكررة الحديثة:الفصل العاشر
Prediction 10.7.7.
يتم إدخال الرمز المتوقع من الخطوة الزمنية السابقةيف مفكك،للتنبؤ بتسلسل اإلخراجيف كل خطوة
تتمثل إحدى اإلستراتيجيات البسيطةيف أخذ عينة من أي رمز حدده مفكك.الشفرة كمدخل
،يف الخطوة الزمنية األولية، كما هو الحاليف التدريب.الشفرة ألعلى احتمال عند التنبؤيف كل خطوة
عملية التنبؤ هذه موضحةيف الشكل.<"( في مفكك الشفرةbos>") يتم تغذية رمز بداية التسلسل
. يكون تنبؤ تسلسل اإلخراج قد اكتمل، ("<eos>") عندما يتم توقع رمز نهاية التسلسل.10.7.3
.RNN مفكك شفرة- توقع رمز تسلسل الخرج برمز باستخدام مشفر10.7.3 الشكل
beam search سوف نقدم استراتيجيات أكثر تعقيدًا بناءً على البحث الشعاعي،في القسم التالي
.)10.8 (القسم
@d2l.add_to_class(d2l.EncoderDecoder) #@save
def predict_step(self, batch, device, num_steps,
save_attention_weights=False):
src, tgt, src_valid_len, _ = batch
enc_outputs = self.encoder(src, src_valid_len,
training=False)
dec_state = self.decoder.init_state(enc_outputs,
src_valid_len)
outputs, attention_weights =
[tf.expand_dims(tgt[:,0], 1), ], []
for _ in range(num_steps):
Y, dec_state = self.decoder(outputs[-1],
dec_state, training=False)
outputs.append(tf.argmax(Y, 2))
# Save attention weights (to be covered later)
if save_attention_weights:
attention_weights.append(self.decoder.attention_weights)
return tf.concat(outputs[1:], 1), attention_weights
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 270
( BLEUدراسة التقييم ثنائي اللغة ، )Bilingual Evaluation Understudyعلى الرغم من
اقتراحهايف األصل لتقييم نتائج الترجمة اآللية ( ، )2002 ،Papineni et al.فقد تم استخدامها
على نطاق واسعيف قياس جودة تسلسل المخرجات للتطبيقات المختلفة .من حيث المبدأ ،بالنسبة
ألي 𝑛 Grams-يف التسلسل المتوقع ،تقوم BLEUبتقييم ما إذا كانت هذه 𝑛 Grams-تظهر
في التسلسل المستهدف.
𝑛𝑝 تدل على دقة 𝑛 ،grams-وهي نسبة عدد 𝑛 Grams-المتطابقةيف التسلسل المتوقع
والهدف إلى عدد 𝑛 grams-يف التسلسل المتوقع .لشرح ،بالنظر إلى التسلسل المستهدف 𝐴 ،
𝐵 𝐹 ، 𝐸 ، 𝐷 ، 𝐶 ،والتسلسل المتوقع ، 𝐷 ، 𝐵 ، 𝐵 ، 𝐴،لدينا، 𝑝2 = 3/4 ، 𝑝1 = 4/5،
𝑝3 = 1/3و . 𝑝4 = 0إلى جانب ذلك ،ليكن lenlabelو lenpredأن يكون عدد الرموزيف
التسلسل المستهدف والتسلسل المتوقع ،على التوالي .بعد ذلك ،يتم تعريف BLEUعلى أنه
𝑘
lenlabel 𝑛1/2
exp (𝑚𝑖𝑛(0,1 − ∏ )) 𝑛𝑝 ,
lenpred
𝑛=1
استنادًا إلى تعريف BLEUيف ( ،)10.7.4كلما كان التسلسل المتوقع هو نفسه التسلسل
المستهدف ،يكون BLEUهو .1عالوة على ذلك ،نظرًا ألن مطابقة الغرام األطول أكثر صعوبة،
فإن BLEUتعين وزناً أكبر لدقة الغرام األطول .على وجه التحديد ،عندما يتم إصالح 𝑛𝑝 ،
𝑛1/ 𝑛1/2
𝑛𝑝) .عالوة على ذلك ،نظرًا ألن التنبؤ 𝑛𝑝 يزداد مع نمو 𝑛 (يستخدم الورق األصلي
بالتسلسالت األقصر يميل إلى الحصول على قيمة 𝑛𝑝 أعلى ،فإن المعامل قبل حد الضربيف
( ) 10.7.4يعاقب التسلسالت األقصر المتوقعة .على سبيل المثال ،عندما ، 𝑘 = 2بالنظر إلى
التسلسل المستهدف 𝐴 𝐹 ، 𝐸 ، 𝐷 ، 𝐶 ، 𝐵 ،والتسلسل المتوقع 𝐴 𝐵 ،على الرغم من أن
عامل الجزاء exp (1 − 6/2) ≈ 0.14اقل من .BLEU
engs = ['go .', 'i lost .', 'he\'s calm .', 'i\'m home
.']
fras = ['va !', 'j\'ai perdu .', 'il est calme .', 'je
suis chez moi .']
preds, _ = model.predict_step(
data.build(engs, fras), d2l.try_gpu(),
data.num_steps)
for en, fr, p in zip(engs, fras, preds):
translation = []
for token in data.tgt_vocab.to_tokens(p):
if token == '<eos>':
break
translation.append(token)
print(f'{en} => {translation}, bleu,'
f'{bleu(" ".join(translation), fr, k=2):.3f}')
go . => ['<unk>', '!'], bleu,0.000
i lost . => ["j'ai", '<unk>', '.'], bleu,0.000
he's calm . => ['<unk>', 'tom', '.'], bleu,0.000
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 272
10.7.10
.1هل يمكنك ضبط المعلمات الفائقة لتحسين نتائج الترجمة؟
.2أعد تشغيل التجربة بدون استخدام األقنعةيف حساب الخطأ .ما هي النتائج التي
تالحظها؟ لماذا؟
.3إذا اختلف المشفر encoderومفكك الشفرة decoderيف عدد الطبقات أو عدد
الوحدات المخفية ،فكيف يمكننا تهيئة الحالة المخفية لمفكك الشفرة؟
.4في التدريب ،استبدل إجبار المعلم بتغذية التنبؤيف الخطوة الزمنية السابقةيف مفكك
الشفرة .كيف يؤثر هذا على األداء؟
.5أعد تشغيل التجربة عن طريق استبدال GRUبـ .LSTM
.6هل هناك أي طرق أخرى لتصميم طبقة اإلخراج لمفكك الشفرة؟
بمجرد أن يخرج نموذجنا "<( ">eosأو نصل إلى الحد األقصى للطول ،)𝑇 ′يكتمل تسلسل
اإلخراج.
قد تبدو هذه اإلستراتيجية معقولة ،وهييف الحقيقة ليست سيئة للغاية! بالنظر إلى مدى تساهله
من الناحية الحسابية ،ستتعرض لضغوط شديدة للحصول على المزيد من الفوائد مقابل أموالك.
ومع ذلك ،إذا وضعنا الكفاءة جانباً لمدة دقيقة ،فقد يبدو من المعقول أكثر البحث عن التسلسل
األكثر احتماالً ،وليس تسلسل الرموز (المختارة بطمع) على األرجح .اتضح أن هذين الكائنين
يمكن أن يكونا مختلفين تمامًا .التسلسل األكثر احتماال هو الذي يقوم بتكبير التعبير
′
.∏𝑇𝑡 ′ =1يف مثال الترجمة اآللية لدينا ،إذا استعاد مفكك الشفرة )𝐜 𝑃(𝑦𝑡 ′ ∣ 𝑦1 , … , 𝑦𝑡 ′ −1 ,
حقًا احتماالت العملية التوليدية األساسية ،فإن هذا سيعطينا الترجمة األكثر احتمالية .لسوء
الحظ ،ليس هناك ما يضمن أن البحث الجشع سوف يعطينا هذا التسلسل.
دعونا نوضح ذلك بمثال .افترض أن هناك أربعة رموز مميزة " "Aو " "Bو " "Cو "<">eosيف
قاموس اإلخراج.يف الشكل ،10.8.1تمثل األرقام األربعة تحت كل خطوة زمنية االحتماالت
الشرطية لتوليد " "Aو " "Bو " "Cو "<">eosيف تلك الخطوة الزمنية ،على التوالي.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 274
الشكل 10.8.1يف كل خطوة زمنية ،يقوم البحث الجشع بتحديد الرمز أعلى احتمالية شرطية.
في كل خطوة زمنية ،يقوم البحث الجشع بتحديد الرمز بأعلى احتمالية شرطية .لذلك ،سيتم توقع
تسلسل الخرج " "Aو " "Bو " "Cو "<( ">eosالشكل .)10.8.1االحتمال الشرطي لتسلسل
اإلخراج هذا هو .0.5 × 0.4 × 0.4 × 0.6 = 0.048
بعد ذلك ،دعونا نلقي نظرة على مثال آخريف الشكل .10.8.2على عكس الشكل ،10.8.1يف
الخطوة الزمنية 2نختار الرمز المميز ""Cيف الشكل ،10.8.2والذي له ثاني أعلى احتمال شرطي.
الشكل 10.8.2تمثل األرقام األربعة الموجودة أسفل كل خطوة زمنية االحتماالت الشرطية
لتوليد " "Aو " "Bو " "Cو "<">eosيف تلك الخطوة الزمنية.يف الخطوة الزمنية ،2يتم تحديد
الرمز المميز " ،”Cالذي يحتوي على ثاني أعلى احتمالية شرطية.
نظرًا ألن المخرجات الالحقةيف الخطوتين 1و ،2التي تستند إليها الخطوة الزمنية ،3قد تغيرت
من " "Aو ""Bيف الشكل 10.8.1.إلى " "Aو ""Cيف الشكل ،10.8.2كما تغير االحتمال الشرطي
لكل رمزيف الخطوة الزمنية 3يف الشكل .10.8.2لنفترض أننا اخترنا الرمز ""Bيف الوقت الخطوة
.3اآلن الخطوة الزمنية 4مشروطة باإلخراج الالحقيف الخطوات الثالث األولى " "Aو " "Cو
" ،”Bوالتي تختلف عن " "Aو "“ Bو ""Cيف الشكل .10.8.1لذلك ،فإن االحتمال الشرطي
لتوليد كل رمزيف الخطوة الزمنية 4يف الشكل 10.8.2يختلف أيضًا عن ذلكيف الشكل .10.8.1
ونتيجة لذلك ،فإن االحتمال الشرطي لتسلسل المخرجات " "Aو " "Cو " "Bو "<">eosيف الشكل
I, 0.5 × 0.3 × 0.6 × 0.6 = 0.054 10.8.2أكبر من احتمال البحث الجشعيف الشكل
275 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
.1 .10.8يف هذا المثال ،تسلسل المخرجات " "Aو " "Bو " "Cو "< ">eosالذي تم الحصول
عليه عن طريق البحث الجشع ليس هو التسلسل األمثل.
الشكل 10.8.3عملية البحث الشعاعي (حجم الحزمة ،2 :الحد األقصى لطول تسلسل الخرج:
.)3تسلسالت اإلخراج المرشح هي 𝐴 و 𝐶 و𝐵𝐴 و 𝐸𝐶 و𝐷𝐵𝐴 و 𝐷𝐸𝐶.
. 𝑘،beam sizeيف الخطوة الزمنية ،1نختار الرموز بأعلى االحتماالت المتوقعة .سيكون كل
واحد منهم الرمز األول لتسلسل اإلخراج المرشح ،على التوالي.يف كل خطوة زمنية الحقة ،بناءً
على تسلسل اإلخراج المرشح 𝑘يف الخطوة الزمنية السابقة ،نواصل تحديد تسلسالت إخراج
المرشح 𝑘 ذات أعلى االحتماالت المتوقعة من الخيارات الممكنة.
يوضح الشكل 10.8.3عملية البحث الشعاعي مع مثال .لنفترض أن مفردات اإلخراج تحتوي
على خمسة عناصر فقط 𝒴 = {𝐴, 𝐵, 𝐶, 𝐷, 𝐸} :أحدها "< .">eosاجعل حجم الشعاع 2ويكون
الحد األقصى لطول تسلسل اإلخراج .3يف الخطوة الزمنية ،1افترض أن الرموز ذات االحتماالت
الشرطية األعلى )𝐜 ∣ 𝑃(𝑦1هي 𝐴 و 𝐶.يف الخطوة الزمنية ،2لكل 𝑦2 ∈ 𝒴,نحسب:
واختر أكبر قيمتين من بين هذه القيم العشر ،على سبيل المثال )𝐜 ∣ 𝐵 𝑃(𝐴,و)𝐜 ∣ 𝐸 . 𝑃(𝐶,
ثميف الخطوة الزمنية ،3لكل 𝒴 ∈ 𝑦3نقوم بحساب:
واختر أكبر قيمتين من بين هذه القيم العشر ،على سبيل المثال )𝐜 ∣ 𝐷 𝑃(𝐴, 𝐵,و∣ 𝐷 𝑃(𝐶, 𝐸,
𝐜).نتيجة لذلك ،نحصل على ست متواليات إخراج مرشحة:
في النهاية ،نحصل على مجموعة تسلسالت اإلخراج المرشح النهائية بناءً على هذه التسلسالت
الستة (على سبيل المثال ،تجاهل األجزاء بمايف ذلك وبعد "< .)">eosثم نختار التسلسل ذي
الدرجة األعلى من الدرجة التالية كتسلسل اإلخراج:
𝐿
1 1
𝛼
∑ 𝛼 = )𝐜 ∣ 𝐿𝑦 log 𝑃(𝑦1 , … , log 𝑃(𝑦𝑡 ′ ∣ 𝑦1 , … , 𝑦𝑡 ′ −1 , 𝐜),
𝐿 𝐿 ′
𝑡 =1
حيث 𝐿 هو طول تسلسل المرشح النهائي وعادة ما يتم تعيينه على .0.75نظرًا ألن التسلسل
األطول يحتوي على مصطلحات لوغاريتمية أكثريف جمع ( ،)10.8.4فإن المصطلح 𝛼𝐿يف المقام
يعاقب التسلسالت الطويلة.
التكلفة الحسابية للبحث الشعاعي هي ) .𝒪(𝑘|𝒴|𝑇 ′هذه النتيجة تقع بين نتيجة البحث الجشع
ونتائج البحث الشامل .يمكن التعامل مع البحث الجشع كحالة خاصة للبحث الشعاعي التي تنشأ
عند ضبط حجم الشعاع beam sizeعلى .1
277 الفصل العاشر :الشبكات العصبية المتكررة الحديثة
10.8.4
تتضمن استراتيجيات البحث المتسلسل البحث الجشع والبحث الشامل والبحث الشعاعي .يوفر
البحث الشعاعي مفاضلة بين الدقة مقابل التكلفة الحسابية من خالل اختياره المرن لحجم
الشعاع.
10.8.5
.1هل يمكننا التعامل مع البحث الشامل كنوع خاص من البحث الشعاعي؟ لما ولما ال؟
.2قم بتطبيق البحث الشعاعييف مشكلة الترجمة اآلليةيف القسم .10.7كيف يؤثر حجم
الشعاع على نتائج الترجمة وسرعة التنبؤ؟
.3استخدمنا نمذجة اللغة إلنشاء نص يتبع البادئات التي قدمها المستخدم user-
provided prefixesيف القسم .9.5ما نوع استراتيجية البحث التي تستخدمها؟ هل
يمكنك تحسينه؟
آليات االنتباه والمحوالت
11
279 الفصل الحادي عشر :آليات االنتباه والمحوالت
كان العلماء يدرسون االنتباه attentionيف مجال علم األعصاب اإلدراكي cognitive
neuroscienceمنذ القرن التاسع عشر.يف هذا الفصل ،سنبدأ بمراجعة إطار عمل شائع لشرح
كيفية نشر االنتباهيف المشهد المرئي .مستوحاة من إشارات االنتباه attention cuesيف هذا
اإلطار ،سنصمم نماذج تستفيد من إشارات االنتباه هذه .والجدير بالذكر أن انحدار نواة
Nadaraya-Watsonيف عام 1964هو عرض بسيط للتعلم اآللي مع آليات االنتباه attention
.mechanismsبعد ذلك ،سوف نقدم دوال االنتباه التي تم استخدامها على نطاق واسعيف
تصميم نماذج االنتباهيف التعلم العميق .على وجه التحديد ،سوف نوضح كيفية استخدام هذه
الدوال لتصميم انتباه باهدانو ،Bahdanau attentionوهو نموذج اهتمام رائديف التعلم العميق
يمكن أن يتماشى بشكل ثنائي االتجاه وقابل للتفاضل.
المحوالتيف مجاالت متنوعة مثل اللغة والرؤية والكالم والتعلم المعزز إلى أن األداء األفضل
يستفيد من النماذج األكبر ،والمزيد من بيانات التدريب ،والمزيد من حوسبة التدريب.
بما أن االقتصاد يدرس تخصيص الموارد النادرة ،فنحنيف عصر اقتصاد االنتباه attention
،economyحيث يتم التعامل مع االهتمام البشري على أنه سلعة محدودة وقيمة ونادرة يمكن
تبادلها .تم تطوير العديد من نماذج األعمال لالستفادة منها.يف الموسيقى أو خدمات بث الفيديو،
إما أن نولي اهتمامًا إلعالناتهم أو ندفع المال إلخفائها .للنمويف عالم األلعاب عبر اإلنترنت ،إما
أن نولي اهتمامًا للمشاركةيف المعارك ،التي تجذب العبين جددًا ،أو ندفع المال لنصبح أقوياء
على الفور .ال شيء يأتي بالمجان.
بشكل عام ،المعلوماتيف بيئتنا ليست نادرة ،االنتباه هو .عند فحص مشهد مرئي ،يتلقى العصب
البصري معلومات بترتيب 108بتاتيف الثانية ،وهو ما يتجاوز بكثير ما يمكن لدماغنا معالجته
بشكل كامل .لحسن الحظ ،تعلم أسالفنا من التجربة (المعروفة أيضًا باسم البيانات) أنه ليست
كل المدخالت الحسية متساوية .على مدار تاريخ البشرية ،مكنت القدرة على توجيه االنتباه إلى
جزء بسيط من المعلومات ذات األهمية عقولنا من تخصيص الموارد بشكل أكثر ذكاءً للبقاء
والنمو والتواصل االجتماعي ،مثل اكتشاف الحيوانات المفترسة والفرائس والرفاق.
تعتمد االشارة الالإرادية nonvolitional cueعلى بروز العناصريف البيئة ووضوحها .تخيل أن
هناك خمسة أشياء أمامك :جريدة وورقة بحث وفنجان قهوة ودفتر مالحظات وكتاب كمايف
الشكل .11.1.1بينما تتم طباعة جميع المنتجات الورقية باللونين األسود واألبيض ،فإن فنجان
القهوة باللون األحمر .بعبارة أخرى ،هذه القهوة بارزة بشكل جوهري وواضحةيف هذه البيئة
281 الفصل الحادي عشر :آليات االنتباه والمحوالت
المرئية ،وتلفت االنتباه تلقائيًا وال إراديًا .لذلك تقوم بإحضار النقرة المركزية ( foveaمركز البقعة
حيث تكون حدة البصر أعلى) على القهوة كما هو موضحيف الشكل .11.1.1
بعد شرب القهوة ،تصبح محتويًا على الكافيين وترغبيف قراءة كتاب .لذلك تدير رأسك ،وتعيد
تركيز عينيك ،وتنظر إلى الكتاب كما هو موضحيف الشكل .11.1.2يختلف عن الحالةيف الشكل
11.1.1حيث تحيزك القهوة نحو االختيار بناءً على النقطة المحفزة ،saliencyيف هذه الحالة
التي تعتمد على المهمة ،يمكنك تحديد الكتاب تحت التحكم المعرفي واإلرادي .باستخدام
االشارة اإلرادية volitional cueبناءً على معايير االختيار المتغيرة ،يكون هذا النوع من االنتباه
أكثر تعمقًا .كما أنها أكثر قوة مع الجهد التطوعي للموضوع.
الشكل 11.1.2باستخدام االشارة اإلرادية (الرغبةيف قراءة كتاب) الذي يعتمد على المهمة ،يتم
توجيه االنتباه إلى الكتاب تحت السيطرة اإلرادية.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 282
بادئ ذي بدء ،ضعيف اعتبارك الحالة األبسط حيث ال تتوفر سوى اإلشارات غير المنطقية .لتحيز
التحديد على المدخالت الحسية ،يمكننا ببساطة استخدام طبقة متصلة بالكامل ذات معلمات أو
حتى تجميع أقصى أو متوسط بدون معلمات.
لذلك ،فإن ما يميز آليات االنتباه عن تلك الطبقات أو طبقات التجميع المتصلة بالكامل هو
تضمين اإلشارات اإلرادية.يف سياق آليات االنتباه ،نشير إلى اإلشارات االرادية على أنها
استعالمات .queriesبالنظر إلى أي استفسار ،فإن آليات االنتباه تحيز االختيار bias selection
على المدخالت الحسية ( sensory inputsعلى سبيل المثال ،تمثيالت الميزات الوسيطة
)intermediate feature representationsعبر تجميع االنتباه .attention pooling
تسمى هذه المدخالت الحسية القيم valuesيف سياق آليات االنتباه .بشكل عام ،يتم إقران كل
قيمة بمفتاح ،keyوالذي يمكن التفكير فيه من خالل اإلشارة غير المنطقية لتلك المدخالت
الحسية .كما هو مبينيف الشكل ،11.1.3يمكننا تصميم تجميع االنتباه بحيث يمكن أن يتفاعل
االستعالم المحدد (اإلشارات اإلرادية) مع المفاتيح (اإلشارات غير االرادية) ،والتي توجه اختيار
التحيز على القيم (المدخالت الحسية).
الشكل 11.1.3تحيز االختيار آلليات االنتباه على القيم (المدخالت الحسية) من خالل
تجميع االنتباه ،والذي يتضمن االستعالمات (اإلشارات اإلرادية) والمفاتيح (اإلشارات غير
المنطقية).
283 آليات االنتباه والمحوالت:الفصل الحادي عشر
يمكننا تصميم نموذج، على سبيل المثال.الحظ أن هناك العديد من البدائل لتصميم آليات االنتباه
reinforcement انتباه غير قابل للتفاضل يمكن تدريبه باستخدام أساليب التعلم المعزز
ستكون،11.1.3 بالنظر إلى هيمنة إطار العمليف الشكل.)2014 ،Mnih et al.( learning
.النماذجيف هذا اإلطار محور اهتمامنايف هذا الفصل
import tensorflow as tf
from d2l import tensorflow as d2l
مصفوفات.show_heatmaps نحدد دالة،attention weights لرسم أوزان االنتباه
عدد، عدد األعمدة للعرض، لها الشكل (عدد الصفوف للعرضmatrices اإلدخال
.) عدد المفاتيح،االستعالمات
#@save
def show_heatmaps(matrices, xlabel, ylabel, titles=None,
figsize=(2.5, 2.5),
cmap='Reds'):
"""Show heatmaps of matrices."""
d2l.use_svg_display()
num_rows, num_cols = len(matrices), len(matrices[0])
fig, axes = d2l.plt.subplots(num_rows, num_cols,
figsize=figsize,
sharex=True,
sharey=True, squeeze=False)
for i, (row_axes, row_matrices) in
enumerate(zip(axes, matrices)):
for j, (ax, matrix) in enumerate(zip(row_axes,
row_matrices)):
pcm = ax.imshow(matrix.numpy(), cmap=cmap)
if i == num_rows - 1:
ax.set_xlabel(xlabel)
if j == 0:
ax.set_ylabel(ylabel)
if titles:
ax.set_title(titles[j])
fig.colorbar(pcm, ax=axes, shrink=0.6);
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 284
للتوضيح ،نعتبر حالة بسيطة حيث يكون وزن االنتباه واحدًا فقط عندما يكون االستعالم والمفتاح
متماثلين؛ وإال فهو صفر.
في األقسام التالية ،غالبًا ما نستدعي هذه الدالة لرسم أوزان االنتباه.
11.1.4
االهتمام (االنتباه) البشري Human attentionهو مورد محدود وقيِّم ونادر. •
الموضوعات توجه االنتباه بشكل انتقائي باستخدام كل من اإلشارات غير االرادية •
واإلرادية .األول يعتمد على النقطة المحفزة saliencyواألخير يعتمد على المهمة
.task
تختلف آليات االنتباه عن الطبقات المتصلة بالكامل أو طبقات التجميع بسبب تضمين •
اإلشارات اإلرادية.
تعمل آليات االنتباه على تحيز االختيار bias selectionعلى القيم (المدخالت •
الحسية) من خالل تجميع االنتباه ،والذي يتضمن االستعالمات (اإلشارات اإلرادية)
والمفاتيح (اإلشارات غير المنطقية) .المفاتيح والقيم مقترنة.
يمكننا رسم أوزان االنتباه بين االستعالمات والمفاتيح. •
285 الفصل الحادي عشر :آليات االنتباه والمحوالت
11.1.5
.1ماذا يمكن أن تكون االشارة اإلرادية عند فك تشفير رمز تسلسلي برمزيف الترجمة اآللية؟
ما هي اإلشارات غير االرادية والمدخالت الحسية؟
.2أنشئ مصفوفة بشكل عشوائي واستخدم عملية softmaxللتأكد من أن كل صف هو
توزيع احتمالي صالح .ارسم أوزان االنتباه الناتج.
نقوم هنا بإنشاء مجموعة بيانات اصطناعية artificial datasetوفقًا للدالة غير الخطية التالية
بمصطلح الضوضاء 𝜖:
حيث 𝜖 تخضع لتوزيع طبيعي بمتوسط صفري وانحراف معياري .0.5يتم إنشاء كل من أمثلة
التدريب 50و 50أمثلة التحقق .لتصور نمط االنتباه بشكل أفضل الحقًا ،يتم فرز مدخالت
التدريب.
class NonlinearData(d2l.DataModule):
def __init__(self, n, batch_size):
)(self.save_hyperparameters
f = lambda x: 2 * tf.sin(x) + x**0.8
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 286
self.x_train = tf.sort(tf.random.uniform((n,1))
* 5, 0)
self.y_train = f(self.x_train) +
tf.random.normal((n,1))
self.x_val = tf.range(0, 5, 5.0/n)
self.y_val = f(self.x_val)
n = 50
data = NonlinearData(n, batch_size=10)
f ودالة توليد بيانات الحقيقة،)توضح الدالة التالية جميع أمثلة التدريب (التي تمثلها الدوائر
.)"Pred" ودالة التنبؤ المكتسبة (المُسمى بـ،)"Truth" بدون مصطلح الضوضاء (المُسمى
def plot_kernel_reg(y_hat):
d2l.plot(data.x_val, [data.y_val, y_hat.numpy()],
'x', 'y', legend=['Truth', 'Pred'],
xlim=[0, 5], ylim=[-1, 5])
d2l.plt.plot(data.x_train, data.y_train, 'o',
alpha=0.5);
Average Pooling 11.2.2
استخدام:يف العالم لمشكلة االنحدار هذهestimator " مقدرdumbest نبدأ مع ربما "أغبى
:متوسط التجميع إلى المتوسط على جميع مخرجات التدريب
1
𝑓(𝑥) = 𝑛 ∑𝑛𝑖=1 𝑦𝑖 , )11.2.2(
y_hat = tf.repeat(tf.reduce_mean(data.y_train), n)
plot_kernel_reg(y_hat)
287 الفصل الحادي عشر :آليات االنتباه والمحوالت
حيث 𝑥 هو االستعالم وهو زوج المفتاح والقيمة ) 𝑖𝑦 .(𝑥𝑖 ,بمقارنة ( )11.2.4و (،)11.2.2
فإن تجميع االنتباه هنا هو متوسط االوزان للقيم 𝑖𝑦 .يتم تعيين وزن االنتباه ) 𝑖𝑥 𝛼(𝑥,يف
( )11.2.4إلى القيمة المقابلة 𝑖𝑦 بناءً على التفاعل بين االستعالم 𝑥 والمفتاح 𝑖𝑥 المصمم
بواسطة 𝛼 .بالنسبة ألي استعالم ،تعتبر أوزان االنتباه الخاصة به على جميع أزواج المفتاح-القيمة
توزيعًا احتماليًا صالحًا :فهي غير سالبة ويصل مجموعهم إلى واحد.
الكتساب حدس لتجميع االنتباه ،ما عليك سوى التفكيريف نواة غاوسية Gaussian kernel
مُعرَّفة على أنها
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 288
1 𝑢2
𝐾(𝑢) = exp (− ).
√2𝜋 2
سيحظى المفتاح 𝑖𝑥 األقرب إلى االستعالم المعطى 𝑥 بمزيد من االنتباه من خالل،)11.2.6( في
.𝑦𝑖 يتم تعيينه لقيمة المفتاح المقابلةlarger attention weight وزن انتباه أكبر
اآلن دعونا نلقي نظرة على أوزان االنتباه .هنا مدخالت التحقق من الصحة validation inputs
هي استعالمات بينما مدخالت التدريب training inputsهي مفاتيح .نظرًا ألنه يتم فرز كال
المدخالت ،يمكننا أن نرى أنه كلما اقترب زوج المفتاح-االستعالم ،زاد وزن االنتباهيف تجميع
االنتباه.
d2l.show_heatmaps([[attention_weights]],
xlabel='Sorted training inputs',
)'ylabel='Sorted validation inputs
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 290
على سبيل المثال ،يختلف قليالً عن (،)11.2.6يف المسافة التالية بين االستعالم 𝑥 والمفتاح 𝑖𝑥
يتم ضربه بمعامل قابل للتعلم 𝑤:
في باقي القسم ،سنقوم بتدريب هذا النموذج من خالل تعلم معامل تجميع االنتباهيف (.)11.2.7
افترض أن أول دفعة صغيرة تحتوي على 𝑛 مصفوفات 𝑛 𝐗 𝐗1 , … ,بالشكل 𝑏 × 𝑎 ،بينما تحتوي
الدفعة الثانية على 𝑛 مصفوفات 𝑛𝐘 𝐘1 , … ,بالشكل 𝑐 × 𝑏 .ينتج عن ضرب المصفوفة الدفعية
𝑛 مصفوفات 𝑛𝐘 𝑛 𝐗 𝐗1 𝐘1 , … ,بالشكل 𝑐 × 𝑎 .لذلك ،بالنظر إلى موترين من الشكل (𝑏،
𝑎 )𝑛،و ( 𝑐 ،)𝑛،𝑏 ،يكون شكل ناتج ضرب المصفوفة الدفعية هو (𝑐.)𝑛،𝑎 ،
)[[14.5]]], dtype=float32
291 آليات االنتباه والمحوالت:الفصل الحادي عشر
نحدد أدناه النسخة المعلمية من انحدار نواة،باستخدام ضرب مصفوفة الدفعات الصغيرة
.)11.2.7( استنادًا إلى تجميع االنتباه المعلمييفNadaraya-Watson
class NWKernelRegression(d2l.Module):
def __init__(self, keys, values, lr):
super().__init__()
self.save_hyperparameters()
self.w = tf.Variable(tf.ones(1), trainable=True)
def configure_optimizers(self):
return d2l.SGD(self.lr)
Training 11.2.4.3
يف. نقوم بتحويل مجموعة بيانات التدريب إلى مفاتيح وقيم لتدريب نموذج االنتباه،فيما يلي
القيمة- يأخذ أي إدخال تدريب فقط أزواج المفتاح، من أجل التبسيط،تجميع االنتباه المعلمي
.من جميع أمثلة التدريب للتنبؤ بمخرجاته
plot_kernel_reg(model.forward(data.x_val))
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 292
بالمقارنة مع تجميع االنتباه الالمعلمي ،تصبح المنطقة ذات أوزان االنتباه الكبيرة أكثر حدةيف
الضبط المعلمي.
d2l.show_heatmaps([[model.attention_weights]],
xlabel='Sorted training inputs',
)'ylabel='Sorted validation inputs
11.2.5
يعد انحدار نواة Nadaraya-Watsonمثاالً على التعلم اآللي بآليات االنتباه. •
293 الفصل الحادي عشر :آليات االنتباه والمحوالت
11.2.6
.1قم بزيادة عدد األمثلة التدريبية .هل يمكنك تعلم انحدار نواة Nadaraya-Watson
الالمعلمية بشكل أفضل؟
.2ما هي قيمة ما تعلمناه 𝑤يف تجربة تجميع االنتباه المعلمية؟ لماذا تجعل المنطقة
الموزونة أكثر حدة عند رسم أوزان االنتباه؟
.3كيف يمكننا إضافة المعلمات الفائقة إلى انحدار نواة Nadaraya-Watson
الالمعلمي للتنبؤ بشكل أفضل؟
.4صمم انتباهاً معلمياً آخر لتجميع االنتباه النحدار النواةيف هذا القسم .درب هذا النموذج
الجديد وارسم أوزان انتباهه.
على مستوى عالٍ ،يمكننا استخدام الخوارزمية أعاله إلنشاء مثيل إلطار آليات االنتباهيف الشكل
.11.1.3يوضح الشكل ،11.3.1الذي يشير إلى دالة تسجيل االنتباه من خالل 𝑎 ،كيف يمكن
حساب ناتج تجميع االنتباه كمجموع اوزان من القيم .نظرًا ألن أوزان االنتباه هي توزيع احتمالي،
فإن مجموع االوزان هويف األساس متوسط موزون.
المفتاح–القيمة أزواج و𝑚 𝑞𝐪 ∈ ℝ استعالمًا لدينا أن افترض رياضيًا،
) 𝑚𝐯 ،(𝐤1 , 𝐯1 ), … , (𝐤 𝑚 ,حيث كل 𝑘 𝐤 𝑖 ∈ ℝوكل 𝑣 .𝐯𝑖 ∈ ℝيتم إنشاء مثيل تجميع االنتباه
𝑓 كمجموع الوزن للقيم:
𝑚
حيث يتم حساب وزن االنتباه ( )scalarلالستعالم 𝐪 والمفتاح 𝑖 𝐤 من خالل عملية softmax
لدالة تسجيل االنتباه 𝑎 التي تعين متجهين إلى القيمة القياسية :scalar
كما نرى ،تؤدي الخيارات المختلفة لدالة تسجيل االنتباه 𝑎 إلى سلوكيات مختلفة لتجميع االنتباه
.attention poolingيف هذا القسم ،نقدم دالتين شائعتين للتسجيل سنستخدمهما لتطوير آليات
انتباه أكثر تعقيدًا الحقًا.
#@save
def masked_softmax(X, valid_lens):
"""Perform softmax operation by masking elements on
"""the last axis.
295 آليات االنتباه والمحوالت:الفصل الحادي عشر
if len(X.shape) == 3:
return tf.where(tf.expand_dims(mask, axis=-
1), X, value)
else:
return tf.where(mask, X, value)
if valid_lens is None:
return tf.nn.softmax(X, axis=-1)
else:
shape = X.shape
if len(valid_lens.shape) == 1:
valid_lens = tf.repeat(valid_lens,
repeats=shape[1])
else:
valid_lens = tf.reshape(valid_lens, shape=-
1)
# On the last axis, replace masked elements with
a very large negative
# value, whose exponentiation outputs 0
X = _sequence_mask(tf.reshape(X, shape=(-1,
shape[-1])), valid_lens,
value=-1e6)
return tf.nn.softmax(tf.reshape(X, shape=shape),
axis=-1)
، 2 × 4 ضعيف اعتبارك مجموعة صغيرة من مثالين لمصفوفة،لتوضيح كيفية عمل هذه الدالة
softmax نتيجة لعملية.حيث يكون األطوال الصالحة لهذين المثالين اثنين وثالثة على التوالي
. يتم إخفاء القيم التي تتجاوز األطوال الصالحة على أنها صفر،المقنعة
masked_softmax(tf.random.uniform(shape=(2, 2, 4)),
tf.constant([2, 3]))
<tf.Tensor: shape=(2, 2, 4), dtype=float32, numpy=
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 296
masked_softmax(tf.random.uniform((2, 2, 4)),
))]]tf.constant([[1, 3], [2, 4
=<tf.Tensor: shape=(2, 2, 4), dtype=float32, numpy
array([[[1. , 0. , 0. , 0.
],
[0.26554373, 0.36378106, 0.37067524, 0.
]],
#@save
class AdditiveAttention(tf.keras.layers.Layer):
297 آليات االنتباه والمحوالت:الفصل الحادي عشر
"""Additive attention."""
def __init__(self, key_size, query_size,
num_hiddens, dropout, **kwargs):
super().__init__(**kwargs)
self.W_k = tf.keras.layers.Dense(num_hiddens,
use_bias=False)
self.W_q = tf.keras.layers.Dense(num_hiddens,
use_bias=False)
self.w_v = tf.keras.layers.Dense(1,
use_bias=False)
self.dropout = tf.keras.layers.Dropout(dropout)
ناتج تجميع االنتباه له شكل (حجم. على التوالى،) 2،10،4( و، )2،10،2( ، )2،1،20(
.) حجم الميزة للقيم، عدد خطوات االستعالمات،الدُفعة
d2l.show_heatmaps(tf.reshape(attention.attention_weights
, (1, 1, 2, 10)),
xlabel='Keys', ylabel='Queries')
299 الفصل الحادي عشر :آليات االنتباه والمحوالت
𝑑√𝑎(𝐪, 𝐤) = 𝐪⊤ 𝐤/
قسمة الضرب النقطي على 𝑑√ .من الناحية العملية ،غالبًا ما نفكريف الدفعات الصغيرة من أجل
الكفاءة ،مثل االهتمام الحاسوبي لالستعالمات 𝑛 وأزواج القيمة والمفاتيح 𝑚 ،حيث تكون
االستعالمات والمفاتيح ذات طول 𝑑 والقيم ذات طول 𝑣 .يتم قياس انتباه الضرب النقطي
لالستعالمات 𝑑×𝑛 𝐐 ∈ ℝوالمفاتيح 𝑑×𝑚 𝐊 ∈ ℝوالقيم 𝑣×𝑚𝐕 ∈ ℝ
⊤ 𝐊𝐐
(softmax )𝐕 ∈ ℝ𝑛×𝑣 .
𝑑√
في التنفيذ التالي النتباه الضرب النقطي المقاس ،scaled dot product attentionنستخدم
التسرب dropoutمن أجل تسوية النموذج.
#@save
class DotProductAttention(tf.keras.layers.Layer):
""""""Scaled dot product attention.
def __init__(self, dropout, num_heads=None):
)(__super().__init
)self.dropout = tf.keras.layers.Dropout(dropout
self.num_heads = num_heads # To be covered
later
كما هو الحاليف عرض االنتباه اإلضافي ،additive attentionنظرًا ألن المفاتيح تحتوي على
نفس العنصر الذي ال يمكن تمييزه بأي استعالم ،يتم الحصول على أوزان انتباه موحدة
.uniform attention weights
d2l.show_heatmaps(tf.reshape(attention.attention_weights
, (1, 1, 2, 10)),
)'xlabel='Keys', ylabel='Queries
11.3.4
يمكننا حساب ناتج تجميع االنتباه كمتوسط الوزن للقيم ،حيث تؤدي االختيارات •
المختلفة لدالة تسجيل االنتباه إلى سلوكيات مختلفة لتجميع االنتباه.
عندما تكون االستعالمات والمفاتيح متجهات ذات أطوال مختلفة ،يمكننا استخدام •
دالة تسجيل االنتباه اإلضافي .عندما تكون متطابقة ،تكون دالة تسجيل انتباه المنتج
النقطي المقاسة أكثر كفاءة من الناحية الحسابية.
11.3.5
.1قم بتعديل المفاتيحيف مثال اللعبة وارسم أوزان االنتباه .هل االنتباه اإلضافي وانتباه
المنتج النقطي المقاس ال يزاالن ينتجان نفس أوزان االنتباه؟ لما ولما ال؟
.2باستخدام ضرب المصفوفة فقط ،هل يمكنك تصميم دالة تسجيل جديدة
لالستعالمات والمفاتيح ذات أطوال متجهات مختلفة؟
.3عندما يكون لالستعالمات والمفاتيح نفس طول المتجه ،فهل يعد جمع المتجهات
تصميمًا أفضل من حاصل الضرب النقطي لدالة التسجيل؟ لما ولما ال؟
Bahdanau 11.4
لقد درسنا مشكلة الترجمة اآلليةيف القسم ،10.7حيث صممنا معمارية المشفر-مفكك الشفرة
على أساس اثنين من RNNsلتعلم التسلسل-التسلسل sequence to sequence
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 302
.learningعلى وجه التحديد ،يقوم مشفر RNNبتحويل تسلسل متغير الطول إلى متغير سياق
ذو شكل ثابت ،ثم يقوم مفكك شفرة RNNبإنشاء رمز تسلسل اإلخراج (الهدف) بواسطة
الرمز tokenبناءً على الرموز المتولدة ومتغير السياق .ومع ذلك ،على الرغم من أن جميع رموز
اإلدخال (المصدر) ليست مفيدة لفك تشفير رمز معين ،إال أن متغير السياق نفسه الذي يشفر
تسلسل اإلدخال بالكامل ال يزال مستخدمًايف كل خطوة فك تشفير.
في تحدٍ منفصل ولكنه مرتبط بتوليد الكتابة اليدوية لتسلسل نصي معين ،صمم Gravesنموذجًا
مختلفًا لالنتباه لمحاذاة أحرف النص مع تتبع القلم األطول بكثير ،حيث تتحرك المحاذاةيف اتجاه
واحد فقط ( .)2013 ،Gravesمستوحاة من فكرة تعلم المحاذاة .Bahdanau et al ،اقترح
نموذج اهتمام متباين دون قيود المحاذاة أحادية االتجاه الشديدة (.)2014 ،Bahdanau et al.
عند توقع رمز ،إذا لم تكن جميع الرموز لإلدخال ذات صلة ،فإن النموذج يحاذي (أو يحضر
)attendsفقط ألجزاء من تسلسل اإلدخال ذات الصلة بالتنبؤ الحالي .يتم تحقيق ذلك من خالل
معاملة متغير السياق كناتج لتجميع االنتباه.
Model 11.4.1
عند وصف انتباه Bahdanauلمشفر-مفكك شفرة RNNأدناه ،سوف نتبع نفس الترميزيف
القسم .10.7النموذج الجديد القائم على االنتباه هو نفسه الموجوديف القسم 10.7فيما عدا أنه
يتم استبدال متغير السياق 𝐜يف ( )10.7.3بـ 𝐜𝑡 ′يف أي خطوة زمنية 𝐜𝑡 ′لفك التشفير .لنفترض أن
هناك رموزًا 𝑇يف تسلسل اإلدخال ،متغير السياقيف الخطوة الزمنية 𝑡 ′لفك التشفير هو ناتج تجميع
االنتباه:
𝑇
حيث تكون الحالة المخفية 𝐬𝑡 ′ −1لوحدة لمفكك الشفرةيف الخطوة الزمنية 𝑡 ′ − 1هي
االستعالم ،وتكون الحاالت المخفية 𝑡𝐡 للمشفر هي المفاتيح والقيم ،ويتم حساب وزن االنتباه
𝛼 كمايف ( )11.3.2باستخدام دالة تسجيل االنتباه اإلضافي المقاسة بواسطة (.)11.3.3
تختلف قليالً عن معمارية مشفر-مفكك شفرة vanilla RNNيف الشكل ،10.7.2 .تم توضيح
نفس المعمارية مع انتباه Bahdanauيف الشكل .11.4.1
303 الفصل الحادي عشر :آليات االنتباه والمحوالت
#@save
class AttentionDecoder(d2l.Decoder):
""""""The base attention-based decoder interface.
def __init__(self):
)(__super().__init
@property
def attention_weights(self):
raise NotImplementedError
فئة شفرة RNNمع انتباه Bahdanauيف مفكك نطبق دعنا اآلن
Seq2SeqAttentionDecoderالتالية .تتم تهيئة حالة مفكك الشفرة بـ ( )1حاالت
الطبقة النهائية المشفرة المخفيةيف جميع خطوات الوقت (كمفاتيح وقيم االنتباه) ؛ ( )2الحالة
المخفية لجميع طبقات المشفريف الخطوة الزمنية النهائية (لتهيئة الحالة المخفية لمفكك
الشفرة)؛ و ( )3الطول الصالح للمشفر (الستبعاد رموز الحشويف تجميع االنتباه).يف كل خطوة
زمنية لمفكك الشفرة ،تُستخدم الحالة المخفية للطبقة النهائية لمفكك الشفرةيف الخطوة الزمنية
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 304
يتم تسلسل كل من إخراج االنتباه وتضمين المدخالت، نتيجة لذلك.السابقة كاستعالم لالنتباه
.RNN كمدخالت لمفكك شفرة
class Seq2SeqAttentionDecoder(AttentionDecoder):
def __init__(self, vocab_size, embed_size,
num_hiddens, num_layers,
dropout=0):
super().__init__()
self.attention =
d2l.AdditiveAttention(num_hiddens, num_hiddens,
num_hiddens, dropout)
self.embedding =
tf.keras.layers.Embedding(vocab_size, embed_size)
self.rnn =
tf.keras.layers.RNN(tf.keras.layers.StackedRNNCells(
[tf.keras.layers.GRUCell(num_hiddens,
dropout=dropout)
for _ in range(num_layers)]),
return_sequences=True,
return_state=True)
self.dense = tf.keras.layers.Dense(vocab_size)
self._attention_weights.append(self.attention.attention_
weights)
# After fully connected layer transformation,
shape of outputs:
# (batch_size, num_steps, vocab_size)
outputs = self.dense(tf.concat(outputs, axis=1))
return outputs, [enc_outputs, hidden_state,
enc_valid_lens]
@property
def attention_weights(self):
return self._attention_weights
4 باستخدام الدفعات الصغيرة منBahdanau نختبر مفكك الشفرة المنفذ مع انتباه،فيما يلي
. خطوات زمنية7 مدخالت تسلسلية من
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 306
data = d2l.MTFraEng(batch_size=128)
embed_size, num_hiddens, num_layers, dropout = 256, 256,
2, 0.2
with d2l.try_gpu():
encoder = d2l.Seq2SeqEncoder(
len(data.src_vocab), embed_size, num_hiddens,
num_layers, dropout)
decoder = Seq2SeqAttentionDecoder(
len(data.tgt_vocab), embed_size, num_hiddens,
num_layers, dropout)
model = d2l.Seq2Seq(encoder, decoder,
tgt_pad=data.tgt_vocab['<pad>'],
lr=0.005)
trainer = d2l.Trainer(max_epochs=50,
gradient_clip_val=1)
trainer.fit(model, data)
307 آليات االنتباه والمحوالت:الفصل الحادي عشر
نستخدمه لترجمة بعض الجمل اإلنجليزية إلى الفرنسية وحساب نقاطهم،بعد تدريب النموذج
BLEU في
engs = ['go .', 'i lost .', 'he\'s calm .', 'i\'m home
.']
fras = ['va !', 'j\'ai perdu .', 'il est calme .', 'je
suis chez moi .']
preds, _ = model.predict_step(
data.build(engs, fras), d2l.try_gpu(),
data.num_steps)
for en, fr, p in zip(engs, fras, preds):
translation = []
for token in data.tgt_vocab.to_tokens(p):
if token == '<eos>':
break
translation.append(token)
print(f'{en} => {translation}, bleu,'
f'{d2l.bleu(" ".join(translation), fr,
k=2):.3f}')
go . => ['va', '!'], bleu,1.000
i lost . => ["j'ai", 'perdu', '.'], bleu,1.000
he's calm . => ['il', 'est', 'mouillé', '.'], bleu,0.658
i'm home . => ['je', 'suis', 'chez', 'moi', '.'],
bleu,1.000
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 308
من خالل رسم أوزان االنتباه عند ترجمة الجملة اإلنجليزية األخيرة ،يمكننا أن نرى أن كل استعالم
يعين أوزانًا غير موحدة على أزواج المفتاح-القيمة .يوضح أنهيف كل خطوة من خطوات فك
التشفير ،يتم تجميع أجزاء مختلفة من تسلسل اإلدخال بشكل انتقائييف تجميع االنتباه.
11.4.4
عند توقع رمز ،tokenإذا لم تكن جميع الرموز لإلدخال ذات صلة ،فإن مشفر-مفكك •
شفرة RNNمع انتباه Bahdanauتجمع بشكل انتقائي أجزاء مختلفة من تسلسل
اإلدخال .يتم تحقيق ذلك من خالل معاملة متغير السياق كناتج لتجميع االنتباه
اإلضافي.
309 الفصل الحادي عشر :آليات االنتباه والمحوالت
11.4.5
.1استبدل GRUبـ LSTMيف التجربة.
.2قم بتعديل التجربة الستبدال دالة تسجيل االنتباه اإلضافي additive attention
scoring functionبالمنتج النقطي المقاس .scaled dot-productكيف تؤثر
على كفاءة التدريب؟
الشكل 11.5.1االنتباه متعدد الرؤوس ،حيث يتم ربط عدة رؤوس متسلسلة ثم تحويلها خطيًا.
تحقيقًا لهذه الغاية ،بدالً من إجراء تجميع واحد لالنتباه ،يمكن تحويل االستعالمات والمفاتيح
والقيم باستخدام اإلسقاطات الخطية المكتسبة بشكل مستقل .ℎثم يتم إدخال هذه االستعالمات
والمفاتيح والقيم المتوقعة على شكل ℎيف تجميع االنتباه بشكل متوازٍ.يف النهاية ،يتم ربط نواتج
تجميع االنتباه ℎوتحويلها بإسقاط خطي مكتسب آخر إلنتاج الناتج النهائي .يُطلق على هذا
التصميم االهتمام متعدد الرؤوس ،multi-head attentionحيث يكون كل من مخرجات
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 310
تجميع االنتباه ℎرأسًا ( .)2017 ،Vaswani et al.باستخدام طبقات متصلة بالكامل إلجراء
تحويالت خطية قابلة للتعلم ،يصف الشكل 11.5.1االنتباه متعدد الرؤوس.
Model 11.5.1
قبل تقديم االنتباه متعدد الرؤوس ،دعنا نضفى الطابع الرسمي على هذا النموذج رياضيًا .بالنظر
إلى االستعالم 𝑞𝑑 𝐪 ∈ ℝوالمفتاح 𝑘𝑑 𝐤 ∈ ℝوالقيمة 𝑣𝑑 ،𝐯 ∈ ℝيتم حساب كل رأس انتباه
( 𝐡𝑖 )𝑖 = 1, … , ℎعلى أنه
)𝑞( )𝑘( )𝑣(
𝐡𝑖 = 𝑓(𝐖𝑖 𝐪, 𝐖𝑖 𝐤, 𝐖𝑖 𝐯) ∈ ℝ𝑝𝑣 ,
)𝑣( )𝑘( )𝑞(
𝑖𝐖، 𝑖𝐖و 𝑣𝑑× 𝑣𝑝∈ ℝ 𝑖𝐖و 𝑘𝑑× 𝑘𝑝∈ ℝ حيث المعلمات القابلة للتعلم 𝑞𝑑× 𝑞𝑝∈ ℝ
وهو عبارة عن تجميع لالنتباه ،مثل االهتمام اإلضافي واهتمام المنتج النقطي المقاسيف القسم
. 11.3ناتج االنتباه متعدد الرؤوس هو تحول خطي آخر عبر معلمات قابلة للتعلم ∈ 𝑜𝐖
𝑣𝑝 ℝ𝑝𝑜 ×ℎلتسلسل الرؤوس :ℎ
𝐡1
𝐖𝑜 [ ⋮ ] ∈ ℝ𝑝𝑜 .
𝐡ℎ
بناءً على هذا التصميم ،قد يحضر كل رأس أجزاء مختلفة من اإلدخال .يمكن التعبير عن دوال
أكثر تعقيدًا من متوسط الوزن البسيط.
#@save
class MultiHeadAttention(d2l.Module):
""""""Multi-head attention.
def __init__(self, key_size, query_size, value_size,
num_hiddens,
num_heads, dropout, bias=False,
**kwargs):
311 آليات االنتباه والمحوالت:الفصل الحادي عشر
super().__init__()
self.num_heads = num_heads
self.attention =
d2l.DotProductAttention(dropout, num_heads)
self.W_q = tf.keras.layers.Dense(num_hiddens,
use_bias=bias)
self.W_k = tf.keras.layers.Dense(num_hiddens,
use_bias=bias)
self.W_v = tf.keras.layers.Dense(num_hiddens,
use_bias=bias)
self.W_o = tf.keras.layers.Dense(num_hiddens,
use_bias=bias)
window_mask, **kwargs)
@d2l.add_to_class(MultiHeadAttention) #@save
def transpose_qkv(self, X):
"""Transposition for parallel computation of
multiple attention heads."""
# Shape of input X: (batch_size, no. of queries or
key-value pairs,
# num_hiddens). Shape of output X: (batch_size, no.
of queries or
# key-value pairs, num_heads, num_hiddens /
num_heads)
X = tf.reshape(X, shape=(X.shape[0], X.shape[1],
self.num_heads, -1))
# Shape of output X: (batch_size, num_heads, no. of
queries or key-value
# pairs, num_hiddens / num_heads)
X = tf.transpose(X, perm=(0, 2, 1, 3))
# Shape of output: (batch_size * num_heads, no. of
queries or key-value
# pairs, num_hiddens / num_heads)
return tf.reshape(X, shape=(-1, X.shape[2],
X.shape[3]))
@d2l.add_to_class(MultiHeadAttention) #@save
def transpose_output(self, X):
"""Reverse the operation of transpose_qkv."""
X = tf.reshape(X, shape=(-1, self.num_heads,
X.shape[1], X.shape[2]))
X = tf.transpose(X, perm=(0, 2, 1, 3))
return tf.reshape(X, shape=(X.shape[0], X.shape[1],
-1))
313 الفصل الحادي عشر :آليات االنتباه والمحوالت
دعونا نختبر فئة MultiHeadAttentionالمنفذة لدينا باستخدام مثال لعبة حيث المفاتيح
والقيم هي نفسها .نتيجة لذلك ،يكون شكل ناتج االنتباه متعدد الرؤوس هو (حجم_الدفعة
المخفية الحاالت عدد ،num_queries عدد_االستعالمات ،batch_size
.)num_hiddens
11.5.4
.1ارسم أوزان االنتباه لرؤوس متعددةيف هذه التجربة.
.2افترض أن لدينا نموذجًا مدربًا يعتمد على االنتباه متعدد الرؤوس ونريد تقليم رؤوس
االنتباه األقل أهمية لزيادة سرعة التنبؤ .كيف يمكننا تصميم تجارب لقياس أهمية رأس
االنتباه؟
االستعالمات والمفاتيح والقيم تأتي من نفس المكان ،فإن هذا يؤدي إلى االنتباه الذاتي self-
،)2017 ،Vaswani et al. ،2017 ،Lin et al.( attentionوالذي يُسمى أيضًا االنتباه
الداخلي Paulus et ،2016 ،Parikh et al. ،2016 ،Cheng et al.( intra-attention
.)2017 ،al.يف هذا القسم ،سنناقش ترميز التسلسل باستخدام االنتباه الذاتي ،بمايف ذلك
استخدام معلومات إضافية لترتيب التسلسل.
حسب تعريف تجميع االنتباه 𝑓يف ( .)11.3.1باستخدام االنتباه متعدد الرؤوس multi-head
،attentionيحسب مقتطف الكود التالي االنتباه الذاتي لموتّر ذي شكل (حجم الدُفعة ،عدد
الخطوات الزمنية أو طول التسلسل بالرموز .) 𝑑 ،موتر اإلخراج له نفس الشكل.
األقصر بين أي مجموعة من مواضع التسلسل يجعل من السهل تعلم التبعيات بعيدة المدى ضمن
التسلسل (.)2001 ،Hochreiter et al.
ضعيف اعتبارك طبقة تالفيفية حجم نواتها 𝑘 .سنقدم مزيدًا من التفاصيل حول معالجة التسلسل
باستخدام شبكات CNNيف فصول الحقة.يف الوقت الحالي ،نحتاج فقط إلى معرفة أنه نظرًا ألن
طول التسلسل هو 𝑛 ،فإن عدد قنوات اإلدخال واإلخراج كالهما 𝑑 ،فإن التعقيد الحسابي
للطبقة التالفيفية هو 𝑑 .وكما يوضح الشكل ،11.6.1فإن شبكات CNNمرتبة بشكل هرمي،
لذا توجد هناك ) 𝒪(1عمليات تسلسلية ويكون أقصى طول للمسير هو )𝑘 .𝒪(𝑛/على سبيل
المثال ،وضمن المجال المؤثر لشبكة CNNذات طبقتين بحجم نواة 3يف الشكل .11.6.1
عند تحديث الحالة المخفية لـ ،RNNsفإن ضرب مصفوفة الوزن 𝑑 × 𝑑 والحالة المخفية
ذات األبعاد 𝑑 لها تعقيد حسابي قدره ) .𝒪(𝑑 2نظرًا ألن طول التسلسل هو 𝑛 ،فإن التعقيد
الحسابي للطبقة المتكررة هو ) .𝒪(𝑛𝑑2وفقاً للشكل ،11.6.1توجد )𝑛(𝒪 عمليات متسلسلة
ال يمكن موازنتها ويكون طول المسير األقصى كذلك )𝑛(𝒪.
في االنتباه الذاتي ،تكون االستعالمات والمفاتيح والقيم كلها مصفوفات 𝑑 × 𝑛 .ضعيف اعتبارك
انتباه الضرب النقطي المقاسيف ( ،)11.3.5حيث يتم ضرب المصفوفة 𝑑 × 𝑛 بمصفوفة
𝑛 × 𝑑 ،ثم يتم ضرب المصفوفة الناتجة 𝑛 × 𝑛يف مصفوفة 𝑑 × 𝑛 .نتيجة لذلك ،االنتباه الذاتي
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 316
له تعقيد حسابي )𝑑 .𝒪(𝑛2كما نرىيف الشكل ،11.6.1يرتبط كل رمز بشكل مباشر بأي رمز
آخر من خالل االنتباه الذاتي .لذلك ،يمكن أن يكون الحساب موازيًا للعمليات المتسلسلة )𝒪(1
ويكون الحد األقصى لطول المسار وكذلك ).𝒪(1
الكليف الكل ،تتمتع كل من شبكات CNNواالنتباه الذاتي بحساب موازٍ واالنتباه الذاتي بأقصر
طول للمسار .ومع ذلك ،فإن التعقيد الحسابي التربيعي فيما يتعلق بطول التسلسل يجعل االنتباه
الذاتي بطيئًا للغاية للتسلسالت الطويلة جدًا.
افترض أن تمثيل اإلدخال 𝑑×𝑛 𝐗 ∈ ℝيحتوي على ذات األبعاد المضمنة 𝑑 لرموز 𝑛 التسلسل.
إخراج الترميز الموضعي 𝐏 𝐗 +باستخدام مصفوفة تضمين موضعية 𝑑×𝑛 𝐏 ∈ ℝمن نفس
الشكل ،يكون العنصر الموجوديف الصف 𝑖 thوالعمود (2𝑗)thأو العمود (2𝑗 + 1)thهو
𝑖
𝑗𝑝𝑖,2 ( = sin ),
𝑑100002𝑗/
𝑖
()11.6.2
𝑝𝑖,2𝑗+1 = cos (100002𝑗/𝑑 ).
للوهلة األولى ،يبدو تصميم الدالة المثلثية هذا غريبًا .قبل شرح هذا التصميم ،دعنا نطبقه أوالًيف
فئة PositionalEncodingالتالية.
#@save
class PositionalEncoding(tf.keras.layers.Layer):
""""""Positional encoding.
def __init__(self, num_hiddens, dropout,
max_len=1000):
)(__super().__init
)self.dropout = tf.keras.layers.Dropout(dropout
# Create a long enough P
))self.P = np.zeros((1, max_len, num_hiddens
X = np.arange(max_len,
(dtype=np.float32).reshape
(-1,1)/np.power(10000, np.arange
317 آليات االنتباه والمحوالت:الفصل الحادي عشر
0, num_hiddens, 2, dtype=np.float32) /
num_hiddens)
self.P[:, :, 0::2] = np.sin(X)
self.P[:, :, 1::2] = np.cos(X)
كما نرى ،فإن أقل بت ،وثاني أدنى بت ،وثالث أدنى بت ،تتناوب على كل رقم ،وكل رقمين،
وكل أربعة أرقام ،على التوالي.
for i in range(8):
)'}print(f'{i} in binary is {i:>03b
0 in binary is 000
1 in binary is 001
2 in binary is 010
3 in binary is 011
4 in binary is 100
5 in binary is 101
6 in binary is 110
7 in binary is 111
في التمثيالت الثنائية ،يكون للبت األعلى تردد أقل من البت األقل .وبالمثل ،كما هو موضحيف
خريطة الحرارة أدناه ،يقلل الترميز الموضعي الترددات على طول بُعد الترميز باستخدام الدوال
المثلثية .نظرًا ألن المخرجات عبارة عن أرقام عائمة ،فإن مثل هذه التمثيالت المستمرة تكون
أكثر كفاءةيف استخدام المساحة من التمثيالت الثنائية.
يمكن تفسير هذا اإلسقاط رياضيًا .للداللة 𝑑، 𝜔𝑗 = 1/100002𝑗/أي زوج من
) (𝑝𝑖,2𝑗 , 𝑝𝑖,2𝑗+1يف ( )11.6.2يمكن إسقاطه خطيًا الى يمكن إسقاط ألي إزاحة ثابتة 𝛿:
11.6.4
في االنتباه الذاتي ،self-attentionتأتي االستعالمات والمفاتيح والقيم من نفس •
المكان.
تتمتع كل من شبكات CNNواالنتباه الذاتي بحسابات موازية ويكون االنتباه الذاتي •
بأقصر طول للمسار .ومع ذلك ،فإن التعقيد الحسابي التربيعي فيما يتعلق بطول
التسلسل يجعل االنتباه الذاتي بطيئًا للغاية للتسلسالت الطويلة جدًا.
الستخدام معلومات ترتيب التسلسل ،يمكننا حقن معلومات موضعية مطلقة أو نسبية •
عن طريق إضافة ترميز موضعي positional encodingإلى تمثيالت اإلدخال.
11.6.5
.1افترض أننا نصمم بُنية عميقة لتمثيل تسلسل من خالل تكديس طبقات االنتباه الذاتي
مع الترميز الموضعي .ماذا يمكن أن تكون المشاكل؟
.2هل يمكنك تصميم طريقة ترميز موضعي قابلة للتعلم؟
.3هل يمكننا تخصيص تضمينات متعلمة learned embeddingsمختلفة وفقًا
الزاحات مختلفة بين االستعالمات والمفاتيح التي تتم مقارنتهايف االنتباه الذاتي؟
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 320
تلميح :يمكنك الرجوع إلى التضمينات ذات الموضع النسبي (،Huang et al.
.)2018 ،Shaw et al. ،2018
Model 11.7.1
كمثال على معمارية المشفر-مفكك الشفرة ،encoder-decoder architectureيعرض
الشكل 11.7.1المعمارية الكلية للمحول .كما نرى ،يتكون المحول من مشفر ومفكك شفرة.
يختلف عن انتباه Bahdanauلتعلم التسلسل إلى التسلسليف الشكل ،11.4.1تتم إضافة إدخال
(المصدر) واإلخراج (الهدف) المتسلسل مع الترميز الموضعي قبل إدخالهيف المشفر ومفكك
الشفرة الذي يكدس الوحدات بناءً على االنتباه الذاتي.
نقدم اآلن نظرة عامة على بُنية المحوالتيف الشكل .11.7.1على مستوى عالٍ ،يكون مشفر
المحول transformer encoderعبارة عن كومة من طبقات متعددة متطابقة ،حيث تحتوي
كل طبقة على طبقتين فرعيتين (يُشار إليهما على أنهما طبقة فرعية .)sublayerاألول هو
تجميع االنتباه الذاتي متعدد الرؤوس والثاني عبارة عن شبكة تغذية لألماميف موضعها .على وجه
التحديد،يف االنتباه الذاتي للمشفر ،تكون االستعالمات والمفاتيح والقيم كلها من مخرجات طبقة
التشفير السابقة .مستوحى من تصميم ResNetيف القسم ،8.6يتم استخدام اتصال متبقي حول
كلتا الطبقتين الفرعيتين.يف المحول ،ألي إدخال 𝑑𝐱 ∈ ℝيف أي موضعيف التسلسل ،نطلب
𝑑 sublayer(𝐱) ∈ ℝحتى يكون االتصال المتبقي 𝑑 𝐱 + sublayer(𝐱) ∈ ℝممكنًا .هذه
اإلضافة من االتصال المتبقي يتبعها مباشرة تسوية الطبقة ( .)2016 ،Ba et al.نتيجة لذلك،
يقوم مشفر المحول بإخراج تمثيل متجه ذات األبعاد 𝑑 لكل موضعيف تسلسل اإلدخال.
مفكك شفرة المحوالت transformer decoderهي أيضًا كومة من طبقات متطابقة متعددة
مع توصيالت متبقية وتسوية طبقة .إلى جانب الطبقتين الفرعيتين الموصوفتينيف المشفر ،تُدرج
وحدة مفكك الشفرة طبقة فرعية ثالثة ،تُعرف باسم انتباه مشفر-مفكك الشفرة encoder-
،decoder attentionبين هاتين الطبقتين.يف انتباه مشفر-مفكك الشفرة ،تكون االستعالمات
من مخرجات طبقة وحدة مفكك الشفرة السابقة ،والمفاتيح والقيم من مخرجات مشفر المحول.
في وحدة مفكك الشفرة ،يكون االنتباه الذاتي واالستعالمات والمفاتيح والقيم كلها من مخرجات
طبقة مفكك الشفرة السابقة .ومع ذلك ،يُسمح لكل موضعيف مفكك الشفرة بالحضور فقط إلى
جميع المواضعيف مفكك الشفرة حتى ذلك الموضع .يحافظ هذا االنتباه المقنع masked
attentionعلى خاصية االنحدار التلقائي ،مما يضمن أن التنبؤ يعتمد فقط على رموز اإلخراج
التي تم إنشاؤها.
لقد وصفنا بالفعل ونفذنا االنتباه متعدد الرؤوس استنادًا إلى عمليات ضرب نقطية مقاسة
scaled dot-productsيف القسم 11.5والترميز الموضعييف القسم .11.6.3فيما يلي سنقوم
بتنفيذ باقي نموذج المحوالت.
#@save
class PositionWiseFFN(tf.keras.layers.Layer):
""""""Positionwise feed-forward network.
def __init__(self, ffn_num_hiddens,
ffn_num_outputs):
)(__super().__init
= self.dense1
)tf.keras.layers.Dense(ffn_num_hiddens
)(self.relu = tf.keras.layers.ReLU
= self.dense2
)tf.keras.layers.Dense(ffn_num_outputs
في القسم ،8.5أوضحنا كيف أحدث تسوية الدُفعات وإعادة المقاييس عبر األمثلة داخل
.minibatchكما تمت مناقشتهيف القسم ،8.5.2.3فإن تسوية الطبقة هي نفسها تسوية الدُفعات
باستثناء أن األول يتم تسويته عبر بُعد الميزة ،وبالتالي االستمتاع بفوائد استقاللية المقياس
واستقاللية حجم الدُفعة .على الرغم من تطبيقاته المنتشرةيف الرؤية الحاسوبية ،فإن تسوية
الدفعات عادة ما يكون أقل فعالية من الناحية التجريبية من تسوية الطبقةيف مهام معالجة اللغة
الطبيعية ،والتي غالبًا ما تكون مدخالتها متواليات متغيرة الطول.
يقارن مقتطف الشفرة التالي التسوية عبر أبعاد مختلفة حسب تسوية الطبقة وتسوية الدُفعات.
)(ln = tf.keras.layers.LayerNormalization
)(bn = tf.keras.layers.BatchNormalization
)X = tf.constant([[1, 2], [2, 3]], dtype=tf.float32
))print('layer norm:', ln(X), '\nbatch norm:', bn(X
(layer norm: tf.Tensor
[[-0.998006 ]0.9980061
)[-0.9980061 0.998006 ]], shape=(2, 2), dtype=float32
(batch norm: tf.Tensor
] [[0.99950033 1.9990007
)[1.9990007 2.998501 ]], shape=(2, 2), dtype=float32
اآلن يمكننا تنفيذ فئة AddNormباستخدام اتصال متبقي متبوعًا بتسوية الطبقة .يتم تطبيق
التسرب Dropoutأيضًا للتنظيم .regularization
#@save
class AddNorm(tf.keras.layers.Layer):
"""Residual connection followed by layer
"""normalization.
def __init__(self, norm_shape, dropout):
)(__super().__init
)self.dropout = tf.keras.layers.Dropout(dropout
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 324
self.ln =
tf.keras.layers.LayerNormalization(norm_shape)
#@save
class TransformerEncoderBlock(tf.keras.layers.Layer):
"""Transformer encoder block."""
def __init__(self, key_size, query_size, value_size,
num_hiddens,
norm_shape, ffn_num_hiddens, num_heads,
dropout, bias=False):
super().__init__()
self.attention = d2l.MultiHeadAttention(
key_size, query_size, value_size,
num_hiddens, num_heads, dropout,
bias)
self.addnorm1 = AddNorm(norm_shape, dropout)
self.ffn = PositionWiseFFN(ffn_num_hiddens,
num_hiddens)
self.addnorm2 = AddNorm(norm_shape, dropout)
**kwargs)
return self.addnorm2(Y, self.ffn(Y), **kwargs)
. أي طبقةيف مشفر المحول ال تغير شكل المدخالت الخاصة بها،كما نرى
#@save
class TransformerEncoder(d2l.Encoder):
"""Transformer encoder."""
def __init__(self, vocab_size, key_size, query_size,
value_size,
num_hiddens, norm_shape,
ffn_num_hiddens, num_heads,
num_blks, dropout, bias=False):
super().__init__()
self.num_hiddens = num_hiddens
self.embedding =
tf.keras.layers.Embedding(vocab_size, num_hiddens)
self.pos_encoding =
d2l.PositionalEncoding(num_hiddens, dropout)
self.blks = [TransformerEncoderBlock(
key_size, query_size, value_size,
num_hiddens, norm_shape,
ffn_num_hiddens, num_heads, dropout, bias)
for _ in range(
num_blks)]
Decoder 11.7.5
كما هو مبينيف الشكل ،11.7.1يتكون مفكك شفرة المحول من عدة طبقات متطابقة .يتم تنفيذ
كل طبقةيف فئة TransformerDecoderBlockالتالية ،والتي تحتوي على ثالث طبقات
فرعية :االنتباه الذاتي لمفكك الشفرة ،وانتباه المشفر-مفكك الشفرة ،وشبكات التغذية األمامية
الموضعية .تستخدم هذه الطبقات الفرعية اتصالًا متبقيًا حولها متبوعًا بتطبيع الطبقة.
كما وصفنا سابقًايف هذا القسم،يف مفكك الشفرة االنتباه الذاتي متعددة الرؤوس المقنعة (الطبقة
الفرعية األولى) ،تأتي االستعالمات والمفاتيح والقيم من مخرجات طبقة مفكك الشفرة السابقة.
عند تدريب نماذج التسلسل إلى التسلسل ،تعرف الرموزيف جميع المواضع (الخطوات الزمنية)
لتسلسل اإلخراج .ومع ذلك ،أثناء التنبؤ ،يتم إنشاء تسلسل اإلخراج رمزًا؛ وبالتالي،يف أي خطوة
زمنية لمفكك الشفرة ،يمكن استخدام الرموز التي تم إنشاؤها فقطيف االنتباه الذاتي لمفكك
الشفرة .للحفاظ على االنحدار التلقائييف مفكك الشفرة ،يحدد االنتباه الذاتي المقنع
dec_valid_lensبحيث ال يحضر أي استعالم سوى جميع المواضعيف مفكك الشفرة
حتى موضع االستعالم.
class TransformerDecoderBlock(tf.keras.layers.Layer):
# The i-th block in the transformer decoder
def __init__(self, key_size, query_size, value_size,
num_hiddens,
norm_shape, ffn_num_hiddens, num_heads,
dropout, i):
327 آليات االنتباه والمحوالت:الفصل الحادي عشر
super().__init__()
self.i = i
self.attention1 = d2l.MultiHeadAttention(
key_size, query_size, value_size,
num_hiddens, num_heads, dropout)
self.addnorm1 = AddNorm(norm_shape, dropout)
self.attention2 = d2l.MultiHeadAttention(
key_size, query_size, value_size,
num_hiddens, num_heads, dropout)
self.addnorm2 = AddNorm(norm_shape, dropout)
self.ffn = PositionWiseFFN(ffn_num_hiddens,
num_hiddens)
self.addnorm3 = AddNorm(norm_shape, dropout)
# Self-attention
X2 = self.attention1(X, key_values, key_values,
dec_valid_lens,
**kwargs)
Y = self.addnorm1(X, X2, **kwargs)
# Encoder-decoder attention. Shape of
enc_outputs:
# (batch_size, num_steps, num_hiddens)
Y2 = self.attention2(Y, enc_outputs,
enc_outputs, enc_valid_lens,
**kwargs)
Z = self.addnorm2(Y, Y2, **kwargs)
return self.addnorm3(Z, self.ffn(Z), **kwargs),
state
مفكك الشفرة لالنتباه واإلضافةيف-لتسهيل عمليات الضرب النقطي المقاسةيف عمليات المشفر
) لمفكك الشفرة هو نفس بُعدnum_hiddens( يكون بُعد السمة،التوصيالت المتبقية
.المشفر
class TransformerDecoder(d2l.AttentionDecoder):
def __init__(self, vocab_size, key_size, query_size,
value_size,
num_hiddens, norm_shape,
ffn_num_hiddens, num_heads,
num_blks, dropout):
super().__init__()
self.num_hiddens = num_hiddens
self.num_blks = num_blks
self.embedding =
tf.keras.layers.Embedding(vocab_size, num_hiddens)
329 آليات االنتباه والمحوالت:الفصل الحادي عشر
self.pos_encoding =
d2l.PositionalEncoding(num_hiddens, dropout)
self.blks = [TransformerDecoderBlock(
key_size, query_size, value_size,
num_hiddens, norm_shape,
ffn_num_hiddens, num_heads, dropout, i)
for i in range(num_blks)]
self.dense = tf.keras.layers.Dense(vocab_size)
blk.attention1.attention.attention_weights)
# Encoder-decoder attention weights
self._attention_weights[1][i] = (
blk.attention2.attention.attention_weights)
return self.dense(X), state
@property
def attention_weights(self):
return self._attention_weights
Training 11.7.6
نحدد هنا أن كالً من مشفر المحول.مفكك الشفرة باتباع بُ نية المحول-لنبدأ نموذج المشفر
،10.7.6 على غرار القسم.ومفكك شفرة المحول لهما طبقتان باستخدام االنتباه رباعي الرؤوس
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 330
نقوم بتدريب نموذج المحول على تعلم التسلسل لتسلسل على مجموعة بيانات الترجمة اآللية
.الفرنسية-اإلنجليزية
data = d2l.MTFraEng(batch_size=128)
num_hiddens, num_blks, dropout = 256, 2, 0.2
ffn_num_hiddens, num_heads = 64, 4
key_size, query_size, value_size = 256, 256, 256
norm_shape = [2]
with d2l.try_gpu():
encoder = TransformerEncoder(
len(data.src_vocab), key_size, query_size,
value_size, num_hiddens,
norm_shape, ffn_num_hiddens, num_heads,
num_blks, dropout)
decoder = TransformerDecoder(
len(data.tgt_vocab), key_size, query_size,
value_size, num_hiddens,
norm_shape, ffn_num_hiddens, num_heads,
num_blks, dropout)
model = d2l.Seq2Seq(encoder, decoder,
tgt_pad=data.tgt_vocab['<pad>'],
lr=0.001)
trainer = d2l.Trainer(max_epochs=50,
gradient_clip_val=1)
trainer.fit(model, data)
331 آليات االنتباه والمحوالت:الفصل الحادي عشر
نستخدم نموذج المحول لترجمة بعض الجمل اإلنجليزية إلى الفرنسية وحساب،بعد التدريب
.BLEU نقاطهميف
engs = ['go .', 'i lost .', 'he\'s calm .', 'i\'m home
.']
fras = ['va !', 'j\'ai perdu .', 'il est calme .', 'je
suis chez moi .']
preds, _ = model.predict_step(
data.build(engs, fras), d2l.try_gpu(),
data.num_steps)
for en, fr, p in zip(engs, fras, preds):
translation = []
for token in data.tgt_vocab.to_tokens(p):
if token == '<eos>':
break
translation.append(token)
print(f'{en} => {translation}, bleu,'
f'{d2l.bleu(" ".join(translation), fr,
k=2):.3f}')
go . => ['va', '!'], bleu,1.000
i lost . => ["j'ai", 'perdu', '.'], bleu,1.000
he's calm . => ['il', 'est', 'mouillé', 'est',
'mouillé', 'est', 'mouillé', 'mouillé', '.'], bleu,0.343
i'm home . => ['je', 'suis', 'chez', 'moi', 'suis',
'chez', 'moi', 'suis', 'chez'], bleu,0.522
شكل.دعونا نتخيل أوزان انتباه المحوالت عند ترجمة الجملة اإلنجليزية األخيرة إلى الفرنسية
وعدد الخطوات أو، وعدد رؤوس االنتباه،أوزان االنتباه الذاتي للمشفر هو (عدد طبقات المشفر
.)القيمة- وعدد الخطوات أو عدد أزواج المفتاح،عدد االستعالمات
_, dec_attention_weights = model.predict_step(
data.build([engs[-1]], [fras[-1]]), d2l.try_gpu(),
data.num_steps, True)
enc_attention_weights = tf.reshape(
tf.concat(model.encoder.attention_weights, 0),
(num_blks, num_heads, -1, data.num_steps))
d2l.check_shape(enc_attention_weights,
(num_blks, num_heads, data.num_steps,
data.num_steps))
نظرًا. تأتي كل من االستعالمات والمفاتيح من تسلسل اإلدخال نفسه،في االنتباه الذاتي للمشفر
فال يوجد استعالم، مع تحديد طول صالح لتسلسل اإلدخال،ألن الرموز للحشو ال تحمل معنى
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 332
يحضر لمواضع الرموز للحشو .فيما يلي ،يتم تقديم طبقتين من أوزان االنتباه متعددة الرؤوس
صفًا تلو اآلخر .يحضر كل رئيس بشكل مستقل بناءً على فضاءات تمثيل منفصلة من
االستعالمات والمفاتيح والقيم.
(d2l.show_heatmaps
enc_attention_weights, xlabel='Key positions',
ylabel='Query positions',
titles=['Head %d' % i for i in range(1, 5)],
))figsize=(7, 3.5
لرسم كل من أوزان االنتباه الذاتي مفكك الشفرة وأوزان االنتباه الخاصة بالمشفر-مفكك الشفرة،
نحتاج إلى مزيد من التالعب بالبيانات .على سبيل المثال ،نمأل أوزان االنتباه المقنعة بصفر.
الحظ أن أوزان االنتباه الذاتي لمفكك الشفرة وأوزان االنتباه بالمشفر-مفكك الشفرة لها نفس
االستعالمات :رمز بداية التسلسل متبوعًا برموز اإلخراج وربما الرموز لنهاية التسلسل.
np.asarray(pd.DataFrame(dec_attention_weights_2d).fillna
(
))0.0).values).astype(np.float32
333 آليات االنتباه والمحوالت:الفصل الحادي عشر
dec_attention_weights =
tf.reshape(dec_attention_weights_filled, shape=(
-1, 2, num_blks, num_heads, data.num_steps))
dec_self_attention_weights, dec_inter_attention_weights
= tf.transpose(
dec_attention_weights, perm=(1, 2, 3, 0, 4))
d2l.check_shape(dec_self_attention_weights,
(num_blks, num_heads, data.num_steps,
data.num_steps))
d2l.check_shape(dec_inter_attention_weights,
(num_blks, num_heads, data.num_steps,
data.num_steps))
ال يوجد استعالم يحضر أزواج،نظرًا لخاصية االنحدار التلقائي لالنتباه الذاتي لمفكك الشفرة
.القيمة والمفتاح بعد موضع االستعالم
d2l.show_heatmaps(
dec_self_attention_weights[:, :, :, :],
xlabel='Key positions', ylabel='Query positions',
titles=['Head %d' % i for i in range(1, 5)],
figsize=(7, 3.5))
ال يوجد، عبر الطول الصحيح المحدد لتسلسل اإلدخال،على غرار الحالةيف االنتباه الذاتي للمشفر
.استعالم من تسلسل اإلخراج يحضر تلك الرموز للحشو من تسلسل اإلدخال
d2l.show_heatmaps(
dec_inter_attention_weights, xlabel='Key positions',
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 334
على الرغم من اقتراح بُنية المحوالتيف األصل للتعلم من التسلسل إلى التسلسل ،كما سنكتشف
الحقًايف الكتاب ،غالبًا ما يتم استخدام إما مشفر المحوالت أو مفكك شفرة المحوالت بشكل
فردييف مهام التعلم العميق المختلفة.
11.7.7
المحول transformerهو مثال على بُنية المشفر-مفكك الشفرة encoder- •
،decoder architectureعلى الرغم من أنه يمكن استخدام المشفر أو مفكك
الشفرة بشكل فردييف الممارسة العملية.
في المحول ،يتم استخدام االنتباه الذاتي متعدد الرؤوس لتمثيل تسلسل اإلدخال •
وتسلسل اإلخراج ،على الرغم من أن مفكك الشفرة يجب أن يحافظ على خاصية
االنحدار التلقائي عبر إصدار مقنع.
تعتبر كل من االتصاالت المتبقية وتسوية الطبقةيف المحول مهمة لتدريب نموذج عميق •
للغاية.
تعمل شبكة التغذية األمامية الموضعيةيف نموذج المحوالت على تحويل التمثيليف جميع •
مواضع التسلسل باستخدام نفس .MLP
335 الفصل الحادي عشر :آليات االنتباه والمحوالت
11.7.8
.1قم بتدريب محول أعمقيف التجارب .كيف تؤثر على سرعة التدريب وأداء الترجمة؟
.2هل من الجيد استبدال االنتباه المحسّن للضرب النقطي بانتباه إضافييف المحول؟
لماذا؟
.3لنمذجة اللغة ،هل يجب أن نستخدم مشفر المحول أو مفكك شفرة المحول أو كليهما؟
كيف تصمم هذه الطريقة؟
.4ما الذي يمكن أن يمثل تحديات للمحوالت إذا كانت تسلسالت اإلدخال طويلة جدًا؟
لماذا؟
.5كيفية تحسين كفاءة الحوسبة والذاكرة للمحوالت؟ تلميح :يمكنك الرجوع إلى مقالة
االستطالع التي أعدها .)2020 ،Tay et al( .Tay et al
بدون قيود محددة على حجم الرقعة ،تستخرج محوالت الرؤية vision transformers
( )ViTsرقعاً من الصور وتغذيهايف مشفر المحول transformer encoderللحصول على
تمثيل عالمي ،والذي سيتم تحويله أخيرًا من أجل التصنيف (.)2021 ،Dosovitskiy et al.
والجدير بالذكر أن المحوالت تُظهر قابلية تطوير أفضل من شبكات :CNNعند تدريب نماذج
أكبر على مجموعات بيانات أكبر ،تتفوق محوالت الرؤية على شبكات ResNetsبهامش كبير.
على غرار االرضية لتصميم معمارية الشبكةيف معالجة اللغة الطبيعية ،أصبحت المحوالت أيضًا
مغيرًا للعبةيف الرؤية الحاسوبية.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 336
Model 11.8.1
الشكل 11.8.1يصور العمارة النموذجية لمحوالت الرؤية .vision transformersتتكون هذه
البنية من جذع stemيقوم بتحويل الصور الى رقع ،patchesوجسم bodyيعتمد على مشفر
المحوالت متعدد الطبقات ،multi-layer transformer encoderورأس headيحول
التمثيل العام إلى تسمية اإلخراج .output label
شكل 11.8.1معمارية محوالت الرؤية.يف هذا المثال ،يتم تقسيم الصورة إلى 9رقع .patches
يتم تحويل الرمز المميز "< ">clsو 9رقع صورة مسطحة عبر تضمين التصحيح و𝑛 كتل مشفر
المحوالت إلى 10تمثيالت ،على التوالي .يتم أيضًا تحويل تمثيل "< ">clsإلى تسمية اإلخراج.
ضعيف اعتبارك صورة إدخال باالرتفاع ℎوالعرض 𝑤 والقنوات 𝑐 .تحديد ارتفاع وعرض الرقعة
على حد سواء ،يتم تقسيم الصورة إلى سلسلة من الرقع ، 𝑚 = ℎ𝑤/𝑝2حيث يتم تسوية كل
رقعة إلى متجه طول .𝑐𝑝2بهذه الطريقة ،يمكن معالجة رقع الصور بشكل مشابه للرموز tokens
في تسلسل النص بواسطة مشفر المحوالت .transformer encodersيتم عرض عالمة مميزة
337 الفصل الحادي عشر :آليات االنتباه والمحوالت
خاصة "<( ">clsفئة) ورقع الصورة المسطحة 𝑚 خطيًايف سلسلة من المتجهات ، 𝑚 + 1
مُلخَّصة بتضمينات موضعية قابلة للتعلم .يحول مشفر المحول متعدد الطبقات متجهات اإلدخال
إلى نفس المقدار من تمثيالت متجه اإلخراج بنفس الطول .إنه يعمل تمامًا بنفس طريقة مشفر
المحول األصلييف الشكل ،11.7.1ويختلف فقطيف موضع التسوية .نظرًا ألن الرمز "<">cls
يحضر جميع رقع الصور عبر االنتباه الذاتي (انظر الشكل ،)11.6.1فإن تمثيله من خرج مشفر
المحول سيتحول إلى تسمية اإلخراج.
import torch
from torch import nn
from d2l import torch as d2l
Patch Embedding 11.8.2
لتنفيذ محول الرؤية ،لنبدأ بتضمين الرقعةيف الشكل .11.8.1يمكن تبسيط تقسيم الصورة إلى
رقع وإسقاط هذه الرقع المسطحة خطيًا كعملية التفاف واحدة ،حيث يتم تعيين كل من حجم
النواة وحجم الخطوة على حجم الرقعة .patch size
class PatchEmbedding(nn.Module):
def __init__(self, img_size=96, patch_size=16,
num_hiddens=512):
)(__super().__init
def _make_tuple(x):
if not isinstance(x, (list, tuple)):
)return (x, x
return x
img_size, patch_size = _make_tuple(img_size),
)_make_tuple(patch_size
self.num_patches = (img_size[0] //
( * )]patch_size[0
)]img_size[1] // patch_size[1
self.conv = nn.LazyConv2d(num_hiddens,
kernel_size=patch_size,
)stride=patch_size
مخرجات تضمين الرقعة، كمدخالتimg_size أخذ صور بارتفاع وعرض،في المثال التالي
( رقع يتم عرضها خطيًا على متجهات بطولimg_size//patch_size)**2
.num_hiddens
class ViTMLP(nn.Module):
def __init__(self, mlp_num_hiddens, mlp_num_outputs,
dropout=0.5):
super().__init__()
self.dense1 = nn.LazyLinear(mlp_num_hiddens)
self.gelu = nn.GELU()
self.dropout1 = nn.Dropout(dropout)
self.dense2 = nn.LazyLinear(mlp_num_outputs)
self.dropout2 = nn.Dropout(dropout)
)))))self.dense1(x
يتبع تنفيذ كتلة مشفر محول الرؤية تصميم ما قبل التسوية الوارديف الشكل ،11.8.1حيث يتم
تطبيق التسوية مباشرة قبل االنتباه متعدد الرؤوس أو .MLPعلى عكس ما بعد التسوية (" add
" & normيف الشكل ،)11.7.1حيث يتم وضع التسوية مباشرة بعد التوصيالت المتبقية ،يؤدي
التسوية المسبقة إلى تدريب أكثر فعالية أو كفاءة للمحوالت (،2018 ،Baevski and Auli
Xiong ، 2019 ،Wang etوآخرون .)2020 ،
class ViTBlock(nn.Module):
def __init__(self, num_hiddens, norm_shape,
mlp_num_hiddens,
num_heads, dropout, use_bias=False):
)(__super().__init
)self.ln1 = nn.LayerNorm(norm_shape
= self.attention
d2l.MultiHeadAttention(num_hiddens, num_heads,
dropout,
)use_bias
)self.ln2 = nn.LayerNorm(norm_shape
self.mlp = ViTMLP(mlp_num_hiddens, num_hiddens,
)dropout
class ViT(d2l.Classifier):
تقنيات التعلم العميق الحديثة:التعمق في التعلم العميق 340
"""Vision transformer."""
def __init__(self, img_size, patch_size,
num_hiddens, mlp_num_hiddens,
num_heads, num_blks, emb_dropout,
blk_dropout, lr=0.1,
use_bias=False, num_classes=10):
super().__init__()
self.save_hyperparameters()
self.patch_embedding = PatchEmbedding(
img_size, patch_size, num_hiddens)
self.cls_token = nn.Parameter(torch.zeros(1, 1,
num_hiddens))
num_steps = self.patch_embedding.num_patches + 1
# Add the cls token
# Positional embeddings are learnable
self.pos_embedding = nn.Parameter(
torch.randn(1, num_steps, num_hiddens))
self.dropout = nn.Dropout(emb_dropout)
self.blks = nn.Sequential()
for i in range(num_blks):
self.blks.add_module(f"{i}", ViTBlock(
num_hiddens, num_hiddens,
mlp_num_hiddens,
num_heads, blk_dropout, use_bias))
self.head =
nn.Sequential(nn.LayerNorm(num_hiddens),
nn.Linear(num_hiddens,
num_classes))
11.8.6
قد تالحظ أنه بالنسبة لمجموعات البيانات الصغيرة مثل ،Fashion-MNISTفإن محول
الرؤية المطبق لدينا ال يتفوق على ResNetيف القسم .8.6يمكن إجراء مالحظات مماثلة حتى
على مجموعة بيانات 1.2( ImageNetمليون صورة) .هذا ألن المحوالت تفتقر إلى تلك
المبادئ المفيدةيف االلتفاف ،مثل ثبات الترجمة translation invarianceوالمحلية locality
(القسم .)7.1ومع ذلك ،تتغير الصورة عند تدريب نماذج أكبر على مجموعات بيانات أكبر
(على سبيل المثال 300 ،مليون صورة) ،حيث تتفوق محوالت الرؤية على شبكات ResNets
بهامش كبيريف تصنيف الصور ،مما يدل على التفوق الجوهري للمحوالتيف قابلية التوسع
.)2021 ،Dosovitskiy et al.( scalabilityأدى إدخال محوالت الرؤية إلى تغيير مشهد
تصميم الشبكة لنمذجة بيانات الصورة .وسرعان ما تم عرضها على مجموعة بيانات ImageNet
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 342
11.8.7
.1كيف تؤثر قيمة img_sizeعلى وقت التدريب؟
.2بدالً من إسقاط تمثيل الرمز "< ">clsعلى اإلخراج ،كيف يتم عرض تمثيالت الرقعة
المتوسطة؟ قم بتنفيذ هذا التغيير وانظر كيف يؤثر على الدقة.
.3هل يمكنك تعديل المعلمات الفائقة لتحسين دقة محول الرؤية؟
Large- 11.9
Scale Pretraining with Transformers
حتى اآلنيف تصنيف الصور وتجارب الترجمة اآللية ،تم تدريب النماذج على مجموعات البيانات
مع أمثلة المدخالت والمخرجات من البداية ألداء مهام محددة .على سبيل المثال ،تم تدريب
أحد المحوالت باستخدام أزواج من اإلنجليزية والفرنسية (القسم )11.7بحيث يمكن لهذا
النموذج ترجمة إدخال النص اإلنجليزي إلى الفرنسية .نتيجة لذلك ،يصبح كل نموذج خبيرًا
محددًا حساسًا حتى للتحول الطفيفيف توزيع البيانات (القسم .)4.7بالنسبة للنماذج المعممة
بشكل أفضل ،أو حتى المتخصصين األكثر كفاءة الذين يمكنهم أداء مهام متعددة مع أو بدون
تكيف ،فإن نماذج التدريب المسبق pretraining modelsعلى البيانات الكبيرة كانت شائعة
بشكل متزايد.
بالنظر إلى بيانات أكبر للتدريب المسبق ،تعمل بنية المحوالت بشكل أفضل مع زيادة حجم
النموذج وحساب التدريب ،مما يدل على سلوك القياس المتفوق .على وجه التحديد ،يتم قياس
أداء نماذج اللغة القائمة على المحوالت كقانون قوة مع مقدار معلمات النموذج ورموز التدريب
وحساب التدريب ( .)2020 ،Kaplan et al.تتضح قابلية تطوير المحوالت أيضًا من خالل
األد اء المعزز بشكل كبير من محوالت الرؤية األكبر المدربة على بيانات أكبر (تمت مناقشتهايف
القسم .)11.8تشمل قصص النجاح األحدث غاتو ،Gatoوهو نموذج عام يمكنه لعب أتاري،
والتعليق على الصور ،والدردشة ،والعمل كإنسان آلي ( Gato .)2022 ،Reed et alهو محول
واحد يتسع بش كل جيد عند اختباره مسبقًا على طرائق متنوعة بمايف ذلك النص والصور وعزم
343 الفصل الحادي عشر :آليات االنتباه والمحوالت
الدوران المشترك وضغط األزرار .والجدير بالذكر أن كل هذه البيانات متعددة الوسائط يتم
تسلسلها إلى تسلسل مسطح من الرموز ،tokensوالتي يمكن معالجتها على غرار الرموز النصية
( text tokensالقسم )11.7أو رقع الصور ( image patchesالقسم )11.8بواسطة
المحوالت.
قبل النجاح المقنع لمحوالت التدريب المسبق للبيانات متعددة الوسائط ،كانت المحوالت مقيدة
على نطاق واسع بكمية كبيرة من النصوص .تم اقتراح معمارية المحوالتيف الشكل 11.7.1يف
األصل للترجمة اآللية ،وتتألف من مشفر لتمثيل تسلسالت اإلدخال ومفكك شفرة لتوليد
متواليات الهدف.يف المقام األول ،يمكن استخدام المحوالتيف ثالثة أوضاع مختلفة :المشفر
فقط ،encoder-onlyوالمشفر-مفكك الشفرة encoder-decoderومفكك الشفرة فقط
.decoder-onlyيف ختام هذا الفصل ،سنراجع هذه األوضاع الثالثة ونوضح قابلية التوسعيف
المحوالت قبل التدريب.
Encoder-Only 11.9.1
عند استخدام مشفر المحول فقط ،يتم تحويل سلسلة من الرموز لإلدخال إلى نفس عدد
التمثيالت التي يمكن إسقاطها بشكل أكبريف اإلخراج (على سبيل المثال ،التصنيف) .يتكون
مشفر المحوالت من طبقات االنتباه الذاتي ،حيث تحضر جميع الرموز لإلدخال مع بعضها
البعض .على سبيل المثال ،محوالت الرؤية الموضحةيف الشكل 11.8.1هي عبارة عن مشفر
فقط ،encoder-onlyحيث تقوم بتحويل سلسلة من رقع صورة اإلدخال إلى تمثيل رمز
"< .">clsنظرًا ألن هذا التمثيل يعتمد على جميع الرموز لإلدخال ،فإنه يتم عرضه بشكل أكبريف
تسميات التصنيف .تم استلهام هذا التصميم من محول سابق يعمل بالمشفر فقط تم اختباره
مسبقًا على النص( BERT :تمثيالت التشفير ثنائية االتجاه من المحوالت Bidirectional
.)2018 ،Devlin et al.( )Encoder Representations from Transformers
تم تدريب BERTمسبقًا على تسلسالت النص باستخدام نمذجة اللغة ال ُمقنعة masked
:language modelingيتم إدخال نص اإلدخال مع الرموز ال ُمقنعة masked tokensعشوائيًا
في مشفر المحوالت للتنبؤ بالرموز المقنعة .كما هو موضحيف الشكل ،11.9.1تسلسل النص
األصلي " "Iو " "loveو " "thisو " "redو " "carمُجهز مسبقًا بالرمز "< ">clsو "<">mask
يستبدل الرمز بشكل عشوائي "“ love؛ ثم يتم التقليل من خطأ االنتروبيا بين الرمز المقنع ""love
وتنبؤاته أثناء التدريب المسبق .الحظ أنه ال يوجد قيديف نمط االنتباه الخاص بمشفرات
المحوالت (يمين الشكل ) 11.9.1لذلك يمكن لجميع الرموز أن تتعامل مع بعضها البعض.
وبالتالي ،فإن التنبؤ بـ " " loveيعتمد على رموز اإلدخال قبل وبعدهيف التسلسل .هذا هو السبب
في أن BERTهو "مشفر ثنائي االتجاه ." bidirectional encoderبدون الحاجة إلى وضع
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 344
التسميات اليدوية ،manual labelingيمكن استخدام بيانات نصية كبيرة الحجم من الكتب
وويكيبيديا للتدريب المسبق على .BERT
الشكل 11.9.1على اليسار :التدريب المسبق لـ BERTبنمذجة اللغة المقنعة .يعتمد توقع
رمز " " loveالمقنع على جميع رموز اإلدخال قبل وبعد " ." loveعلى اليمين :نمط االنتباهيف
مشفر المحوالت .كل رمز مميز على طول المحور الرأسي يحضر جميع رموز اإلدخال على
طول المحور األفقي.
قد تالحظ أن هذه المهام النهائية تتضمن فهم أزواج النص .يتسبب تدريب BERTالمسبقيف
خسارة أخرى للتنبؤ بما إذا كانت إحدى الجمل تتبع األخرى مباشرة .ومع ذلك ،تم العثور الحقًا
على هذه الخسارة غير مفيدة عند إجراء اختبار مسبق لـ ،RoBERTaوهو متغير BERTمن
نفس الحجم ،على 2000مليار رمز ( .)2019 ،Liu et al.مشتقات أخرى من BERTحسنت
معماريات النماذج أو أهداف ما قبل التدريب ،مثل ( ALBERTفرض مشاركة المعلمات)،
(( SpanBERT ،)2019,Lan et al.تمثل وتوقع مساحات النص representing and
( DistilBERT )2020,Joshi et al.( ،)predicting spans of textخفيف الوزن عبر
تقطير المعرفة ،)2019 ،Sanh et al.( )lightweight via knowledge distillation
و( ELECTRAاكتشاف الرموز المستبدلة ،Clark et al.( )replaced token detection
.)2020عالوة على ذلك ،استوحى BERTالمحوالت من التدريب المسبقيف الرؤية
الحاسوبية ،مثل محوالت الرؤية ( ،)2021 ،Dosovitskiy et al.ومحوالت Liu ( ،Swin
،)2021,et al.و( MAEالمشفرات التلقائية المقنعة He et ( )masked autoencoders
.)2022 ،al.
Encoder-Decoder 11.9.2
نظرًا ألن مشفر المحول يحول سلسلة من رموز اإلدخال إلى نفس عدد تمثيالت اإلخراج ،ال
يمكن لوضع المشفر فقط إنشاء سلسلة من الطول التعسفي كما هو الحاليف الترجمة اآللية .تم
اقتراح بُ نية المحوالتيف األصل للترجمة اآللية ،وتحتوي أيضًا على مفكك الشفرة تتنبأ بشكل
تلقائي بالتسلسل المستهدف للطول التعسفي ،رمزًا رمزًا ،مشروطًا بكل من إخراج المشفر
وإخراج مفكك الشفرة )1( :للتكييف على إخراج المشفر ،يسمح االنتباه المتبادل للمشفر-
مفكك الشفرة (االنتباه متعدد الرؤوس لمفكك الشفرةيف الشكل )11.7.1للرموز المستهدفة
بالحضور إلى جميع الرموز لإلدخال ؛ ( )2يتحقق التكييف على خرج مفكك الشفرة من خالل
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 346
نمط انتباه سببي ( causal attention patternاالنتباه المقنع متعدد الرؤوس لمفكك الشفرة
في الشكل ، ) 11.7.1حيث ال يمكن ألي رمز مستهدف أن يحضر إال إلى الرموز السابقة والحالية
في التسلسل المستهدف.
للتدريب المسبق لمشفر-مفكك شفرة المحوالت بما يتجاوز بيانات الترجمة اآللية التي تحمل
عالمات بشرية ،فإن )2019,Lewis et al.( ،BARTو )2020,Raffel et al.( ،T5هما
محوالت مقترحةيف نفس الوقت لمشفر-مفكك شفرة تم تدريبهما مسبقًا على نصوص كبيرة
الحجم .يحاول كالهما إعادة بناء النص األصلييف أهدافهم المدربة سابقاً ،بينما يؤكد األول على
المدخالت المزعجة ( noising inputعلى سبيل المثال ،اإلخفاء والحذف والتبديل والتناوب)
واألخير يسلط الضوء على توحيد المهام المتعددة مع دراسات االجتثاث الشاملة.
T5 11.9.2.1
كمثال على مشفر-مفكك شفرة المحوالت سابقة التدريب ،يوحِّد ( T5محول نقل النص إلى
نص )Text-to-Text Transfer Transformerالعديد من المهام مثل مشكلة النص إلى
النص نفسه :بالنسبة ألي مهمة ،يكون إدخال المشفر هو وصف المهمة (على سبيل المثال ،
"تلخيص )":" ، " Summarizeمتبوعًا بإدخال مهمة (على سبيل المثال ،سلسلة من الرموز
المميزة من مقالة ، )a sequence of tokens from an articleويتنبأ مفكك الشفرة بإخراج
ب المهمة (على سبيل المثال ،سلسلة من الرموز المميزة تلخص مقالة اإلدخال sequence of
.)tokens summarizing the input articleألداء النص إلى نص ،يتم تدريب T5على
إنشاء بعض نص الهدف المشروط على إدخال النص.
الشكل 11.9.3على اليسار :التدريب المسبق على T5من خالل توقع فترات متتالية .الجملة
األصلية هي " ،”car" ،”red" ،”this" ،”love" ،”Iحيث يتم استبدال " "loveبرمز "<،“>X
347 الفصل الحادي عشر :آليات االنتباه والمحوالت
ومتتالية " "car" ،”redاستبدالها برمز مميز "< .">Yالتسلسل المستهدف ينتهي برمز خاص
"< .">Zعلى اليمين :نمط االنتباهيف مشفر-مفكك شفرة المحوالت.يف االنتباه الذاتي للمشفر
(المربع السفلي) ،تحضر جميع الرموز لإلدخال بعضها البعض؛يف االنتباه المتبادل للمشفر
ومفكك الشفرة (المستطيل العلوي) ،يحضر كل رمز مستهدف جميع الرموز لإلدخال؛يف االنتباه
الذاتي لمفكك الشفرة (المثلث العلوي) ،يحضر كل رمز مميز الهدف الرموز الحالية والماضية
فقط (السببية .)causal
للحصول على مدخالت ومخرجات من أي نص أصلي ،يتم تدريب T5مسبقًا على التنبؤ بفترات
متتالية .على وجه التحديد ،يتم استبدال الرموز من النص بشكل عشوائي برموز خاصة حيث يتم
استبدال كل فترة متتالية بالرمز نفسه .تأمل المثاليف الشكل ،11.9.3حيث النص األصلي هو
" ."car" ،”red" ،”this" ،”love" ،”Iيتم استبدال الرموز " "car" ،”red" ،”loveبشكل عشوائي
برموز خاصة .نظرًا ألن " "redو " "carيمثالن امتدادًا متتاليًا ،يتم استبدالهما بنفس الرمز الخاص.
نتيجة لذلك ،تسلسل اإلدخال هو "”" ،“>"<X ،Iهذا" ،“>Y<" ،والتسلسل الهدف هو "<،“>X
" ،" >Z< "،" car "،" red " ،“>Y<" ،”loveحيث" <" >Zهو رمز آخر يشير إلى النهاية .كما هو
مبينيف الشكل ،11.9.3فإن مفكك الشفرة لديه نمط انتباه سببي لمنع نفسه من االنتباه بالرموز
المستقبلية أثناء التنبؤ بالتسلسل.
في ،T5يُشار أيضًا إلى التنبؤ بامتداد متتالي consecutive spanعلى أنه إعادة بناء نص تالف
.reconstructing corrupted textمع هذا الهدف ،يتم تدريب T5مسبقًا على 1000مليار
رمز من بيانات ) ،C4 (Colossal Clean Crawled Corpusوالتي تتكون من نص إنجليزي
نظيف من الويب (.)2020 ،Raffel et al.
يوضح الشكل 11.9.4ضبط T5بدقة باستخدام تلخيص النص كمثال.يف هذه المهمة المتلقية
للمعلومات ،تعتبر الرموز لوصف المهمة ” “Summarize”, “:متبوعة برموز المقالة المميزة هي
مدخالت إلى للمشفر.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 348
الشكل 11.9.4الضبط الدقيق لـ T5لتلخيص النص .يتم تغذية كل من وصف المهمة ورموز
المقالةيف مشفر المحول للتنبؤ بالملخص.
بعد الضبط الدقيق ،حققت ) T5 (T5-11Bالتي تبلغ 11مليار معلمة نتائج متطورة على معايير
الترميز المتعددة (مثل التصنيف) والتوليد (على سبيل المثال ،التلخيص) .منذ إطالقه ،تم
استخدام T5على نطاق واسعيف األبحاث الالحقة .على سبيل المثال ،تم تصميم محوالت
التبديل على أساس T5لتنشيط مجموعة فرعية من المعلمات لتحسين الكفاءة الحسابية
(.)2022 ،Fedus et al.يف نموذج تحويل النص إلى صورة يسمى ،Imagenيتم إدخال النص
إلى مشفر T5مجمد )T5-XXL( frozen T5 encoderمع 4.6مليار معلمة ( Saharia
.)2022 ،et al.تشير األمثلة الواقعية لتحويل النص إلى صورةيف الشكل 11.9.5إلى أن مشفر
T5وحده قد يمثل النص بشكل فعال حتى بدون ضبطه بدقة.
الشكل 11.9.5أمثلة على تحويل النص إلى صورة من خالل نموذج ،Imagenالذي يكون
مشفر النص الخاص به من ( T5األرقام مأخوذة من .))Saharia et al. (2022
349 الفصل الحادي عشر :آليات االنتباه والمحوالت
Decoder-Only 11.9.3
لقد راجعنا مشفر المحوالت فقط ومشفر-مفكك الشفرة المحوالت .بدالً من ذلك ،تزيل
مفكك شفرة المحوالت فقط كامل المشفر والطبقة الفرعية لمفكك الشفرة مع االنتباه المتبادل
للمشفر-مفكك الشفرة من بُنية المشفر-مفكك الشفرة األصلية الموضحةيف الشكل .11.7.1
في الوقت الحاضر ،كانت مفكك شفرة المحوالت فقط هي العمارة الفعليةيف نمذجة اللغة على
نطاق واسع (القسم ،)9.3والتي تستفيد من مجموعات النصوص غير المصنفة الوفيرةيف العالم
عبر التعلم تحت اإلشراف الذاتي.
الشكل 11.9.6اليسار :التدريب المسبق على GPTبنمذجة اللغة .التسلسل المستهدف هو
تسلسل اإلدخال الذي تم إزاحته بواسطة رمز واحد .كل من "< ">bosو "< ">eosهما رمزان
مميزان يرمزان إلى بداية ونهاية التسلسالت ،على التوالي .اليمين :نمط االنتباهيف مفكك شفرة
المحوالت .كل رمز مميز على طول المحور الرأسي يحضر فقط الرموز السابقة على طول
المحور األفقي (سببي).
بعد تدريب نموذج اللغة االنحدار الذاتي كما هو موضحيف القسم ،9.3.3يوضح الشكل 11.9.6
التدريب المسبق لـ GPTباستخدام مشفر المحوالت ،حيث يكون التسلسل المستهدف هو
تسلسل اإلدخال الذي تم إزاحته برمز واحد .الحظ أن نمط االنتباه السببييف وحدة مفكك شفرة
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 350
المحوالت يفرض أن كل رمز ال يمكن أن يحضر إال إلى الرموز السابقة (ال يمكن للتنبؤ بالرمز
المميز أن يحضر إلى الرموز المستقبلية).
تحتوي GPTعلى 100مليون معلمة وتحتاج إلى ضبطها لمهام downstreamالفردية .تم
تقديم نموذج لغة مفكك شفرة محول أكبر بكثير ، GPT-2 ،بعد عام واحد ( Radford et
.)2019 ،al.بالمقارنة مع مفكك شفرة المحوالت األصليةيف ،GPTتم اعتماد التسوية المسبقة
( pre-normalizationالذي تمت مناقشتهيف القسم )11.8.3والتهيئة المحسنة وقياس الوزن
في .GPT-2حصل GPT-2الذي تم تدريبه مسبقًا على 40غيغابايت من النص ،والذي يبلغ
حجمه 1.5مليار معلمة ،على أحدث النتائج المتعلقة بمعايير نمذجة اللغة والنتائج الواعدةيف
مهام أخرى متعددة دون تحديث المعلمات أو ال ُبنية.
GPT-3 11.9.3.2
أظهر GPT-2إمكانية استخدام نفس نموذج اللغة لمهام متعددة دون تحديث النموذج .يعد
هذا أكثر كفاءة من الناحية الحسابية من الضبط الدقيق ،والذي يتطلب تحديثات النموذج عبر
حساب التدرج.
قبل شرح االستخدام األكثر كفاءة من الناحية الحسابية لنماذج اللغة دون تحديث المعلمة ،تذكر
القسم 9.5أنه يمكن تدريب نموذج اللغة إلنشاء تسلسل نصي مشروط ببعض تسلسل نص
351 الفصل الحادي عشر :آليات االنتباه والمحوالت
البادئة .وبالتالي ،قد ينتج عن نموذج اللغة الذي تم اختباره مسبقًا إخراج المهمة كتسلسل بدون
تحديث المعلمة ،بشرط تسلسل اإلدخال مع وصف المهمة ،وأمثلة اإلدخال والمخرجات الخاصة
بالمهمة ،والموجه ( promptإدخال المهمة) .يمكن تصنيف نموذج التعلم هذا بشكل أكبر إلى
،one-shot ،zero-shotو ،few-shotعندما ال يكون هناك أمثلة على المدخالت
والمخرجات الخاصة بالمهمة ،أو أمثلة قليلة ،على التوالي (الشكل .)11.9.7
تم اختبار هذه اإلعدادات الثالثةيف ،)2020,Brown et al.( ،GPT-3الذي يستخدم أكبر
إصدار له البيانات وحجم النموذج بحوالي أمرين من حيث الحجم أكبر من تلك الموجودةيف
.GPT-2يستخدم GPT-3نفس بُنية مفكك شفرة المحوالتيف سلفها المباشر GPT-2
فيما عدا أن أنماط االنتباه (يمين الشكل )11.9.6تكون متناثرةيف الطبقات المتناوبة .نظرًا ألن
GPT-3مُدرب مسبقًا بـ 300مليار رمز ،فإنه يعمل بشكل أفضل مع حجم نموذج أكبر ،حيث
يزيد أداء عدد قليل من اللقطات بسرعة أكبر (الشكل .)11.9.8على الرغم من التمتع بكفاءة
حسابية ،إال أن التعلم قليل اللقطات لـ GPT-3كان أقل من أداء النماذج الحديثة التي تم ضبطها
والتي تتطلب تحديثات النموذج .ومع ذلك ،فقد قام GPT-3بتشغيل مجموعة واسعة من
التطبيقات النهائية عبر الويب :فقد كان ينتج 4.5مليار كلمة كل يوم حوالي تسعة أشهر من إصدار
APIالخاص به.
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 352
Scalability 11.9.4
يوضح الشكل 11.9.8بشكل تجريبي قابلية التوسع للمحوالتيف نموذج اللغة .GPT-3
بالنسبة لنمذجة اللغة ،اقترحت دراسات تجريبية أكثر شموالً حول قابلية توسيع المحوالت تدريب
محوالت أكبر بمزيد من البيانات والحسابات (.)2020 ،Kaplan et al.
الشكل 11.9.9يتحسن أداء نموذج لغة المحوالت بسالسة ألننا نزيد من حجم النموذج
وحجم مجموعة البيانات وكمية الحوسبة المستخدمة للتدريب .لتحقيق األداء األمثل ،يجب
رفع مستوى جميع العوامل الثالثة جنبًا إلى جنب .لألداء التجريبي عالقة قانون القوة مع كل
عامل على حدة عندما ال يتم اختناقهما من قبل العاملين اآلخرين (التسمية التوضيحية مقتبسة
والشكل مأخوذ من .))2020( .Kaplan et al
كما هو مبينيف الشكل ،11.9.9يمكن مالحظة دقة قانون القدرة المقاس power-law
scalingيف األداء فيما يتعلق بحجم النموذج (عدد المعلمات ،باستثناء طبقات التضمين)،
وحجم مجموعة البيانات (عدد الرموز للتدريب) ،وكمية حساب التدريب (PetaFLOP / s-
،daysباستثناء طبقات التضمين) .بشكل عام ،تؤدي زيادة كل هذه العوامل الثالثة جنبًا إلى جنب
إلى أداء أفضل .ومع ذلك ،ال تزال كيفية زيادتها جنبًا إلى جنب مسألة نقاش (( Hoffmann et
.)2022 ،.al
الشكل 11.9.10دورات تدريب نموذج لغة المحوالت (الشكل مأخوذ من .Kaplan et al
(.))2020
353 الفصل الحادي عشر :آليات االنتباه والمحوالت
إلى جانب األداء المتزايد ،تتمتع الطرز الكبيرة أيضًا بكفاءة أفضل للعينة من النماذج الصغيرة.
يوضح الشكل 11.9.10أن النماذج الكبيرة تحتاج إلى عدد أقل من عينات التدريب (الرموز التي
تمت معالجتها) ألداء نفس المستوى الذي تحققه النماذج الصغيرة ،ويتم قياس األداء بسالسة
باستخدام الحساب.
الشكل 11.9.11أداء ( GPT-3خطأ التحقق من االنتروبيا المتقاطعة) يتبع اتجاه قانون القوة
مع مقدار الحساب المستخدم للتدريب .سلوك قانون القوة الذي لوحظيف .Kaplan et al
( )2020يستمر لخطوتين إضافيتين من حيث الحجم مع انحرافات صغيرة فقط عن المنحنى
المتوقع .تُستثنى معلمات التضمين من عدد الحسابات والمعلمات (التسمية التوضيحية
مقتبسة والرقم مأخوذ من (.))2020,Brown et al.
لقد ألهمت قابلية تطوير المحوالتيف سلسلة GPTنماذج لغة المحوالت الالحقة .بينما تم اتباع
مفكك شفرة المحوالتيف GPT-3إلى حد كبيريف OPT (Open Pretrained
) )2022,Zhang et al.( ،Transformersباستخدام 7/1فقط من البصمة الكربونية للسابق،
التعمق في التعلم العميق :تقنيات التعلم العميق الحديثة 354
تم استخدام مفكك شفرة محول GPT-2يف تدريب - 530ميجاترون -تورينج NLG
(( )2022 ،.Smith et alبمليار متغير مع 270مليار من رموز التدريب .بعد تصميم GPT-
،2حقق )2021,Rae et al.( ،Gopherالذي يبلغ حجمه 280مليار معلمة والذي تم تدريبه
مسبقًا بـ 300مليار رمز أداءً متطورًا عبر الغالبيةيف حوالي 150مهمة متنوعة .إن وراثة نفس ال ُبنية
واستخدام نفس الميزانية الحسابية لـ )2022,Hoffmann et al.( ،Chinchilla ،Gopher
هو نموذج أصغر بكثير ( 70مليار معلمة) يتدرب لفترة أطول ( 1.4تريليون رمز تدريب) ،متفوقًا
على Gopherيف العديد من المهام .لمواصلة خط القياس لنمذجة اللغة( PaLM ،نموذج لغة
المسار ،)2022 ،Chowdhery et al.( )Pathway Language Modelمفكك شفرة
محول 540مليار متغير مع تصميمات معدلة تم اختبارها مسبقًا على 780مليار رمز ،تفوقت
على متوسط األداء البشري على BIG-Benchالمعيار ( .)2022 ،.Srivastava et alمزيد
من التدريب لـ PaLMعلى 38.5مليار رمز يحتوي على نتائج محتوى علمي ورياضييف
،)2022,Lewkowycz et al.( ،Minervaوهو نموذج لغوي كبير يمكنه اإلجابة على ما
يقرب من ثلث مشاكل المستوى الجامعي التي تتطلب التفكير الكمي ،مثل الفيزياء والكيمياء
وعلم األحياء واالقتصاد.
11.9.5
تم اختبار المحوالت مسبقًا على أنها مشفر فقط ( encoder-onlyعلى سبيل المثال،
،)BERTمشفر-مفكك شفرة ( encoder-decoderعلى سبيل المثال ،)T5 ،ومفكك
شفرة فقط ( decoder-onlyعلى سبيل المثال ،سلسلة .)GPTقد يتم تكييف النماذج سابقة
التدريب ألداء مهام مختلفة مع تحديث النموذج (على سبيل المثال ،الضبط الدقيق fine
)tuningأو ال (على سبيل المثال ،عدد قليل من اللقطات .)few shotتشير قابلية توسيع
المحوالت إلى أن األداء األفضل يستفيد من النماذج األكبر ،والمزيد من بيانات التدريب،
والمزيد من حوسبة التدريب .نظرًا ألن المحوالت تم تصميمها ألول مرة وفحصها مسبقًا للبيانات
النصية ،فإن هذا القسم يميل قليالً نحو معالجة اللغة الطبيعية .ومع ذلك ،يمكن العثور على تلك
النماذج التي تمت مناقشتها أعالهيف نماذج أحدث عبر طرائق متعددة .على سبيل المثال ،تم
تمديد ( )2022,Hoffmann et al.( ،)1إلى ،)2022,Alayrac et al.( ،Flamingoوهو
نموذج لغة بصرية للتعلم قليل اللقطات؛ ( )2019,Radford et al.( ،GPT-2 )2ومحول
الرؤية يشفر النص والصوريف ( CLIPالتدريب المسبق على اللغة المتباينة Contrastive
،)2021 ،Radford et al.( )Language-Image Pre-trainingالتي تم اعتماد صورتها
ونصها الحقًا.يف نظام تحويل النص إلى صورة .)2022 ،.Ramesh et al( DALL-E 2على
الرغم من عدم وجود دراسات منهجية حول قابلية التوسعيف المحوالتيف التدريب المسبق متعدد
الوسائط حتى اآلن ،فإن نموذج تحويل النص إلى صورة حديث بالكاملYu et ( ،Parti ،
355 الفصل الحادي عشر :آليات االنتباه والمحوالت
،)2022,al.يُظهر إمكانية التوسع عبر الطرائق :يُظهر Partiأكبر أكثر قدرة على إنشاء صور عالية
الدقة وفهم نص غني بالمحتوى (الشكل .)11.9.12
11.9.6
.1هل من الممكن ضبط T5باستخدام الدفعات الصغيرة يتكون من مهام مختلفة؟ لما
ولما ال؟ ماذا عن GPT-2؟
.2بالنظر إلى نموذج لغوي قوي ،ما هي التطبيقات التي يمكنك التفكير فيها؟
.3لنفترض أنه تمت مطالبتك بضبط نموذج لغة إلجراء تصنيف للنص عن طريق إضافة
طبقات إضافية .أين ستضيفهم؟ لماذا ا؟
.4ضعيف اعتبارك مشاكل التسلسل الى التسلسل (على سبيل المثال ،الترجمة اآللية) حيث
يكون تسلسل اإلدخال متاحًا دائمًا خالل تنبؤ تسلسل الهدف .ماذا يمكن أن تكون قيود
النمذجة باستخدام مفكك شفرة المحوالت فقط؟ لماذا؟
ئ