يوم جيد للجميع!
وقد فتحنا مرة أخرى دفقًا جديدًا لدورة
عالم البيانات المنقحة:
معلم ممتاز آخر ، برنامج محسن قليلاً يعتمد على التحديثات. حسنًا ، كالعادة ،
دروس مفتوحة ومجموعات من المواد المثيرة للاهتمام. سنبدأ اليوم تحليل نماذج seq2seq من Tensor Flow.
دعنا نذهب.
كما تمت مناقشته بالفعل في
البرنامج التعليمي لـ RNN (نوصي بأن تتعرف عليه قبل قراءة هذه المقالة) ، يمكن تدريس الشبكات العصبية المتكررة لنمذجة اللغة. ويطرح سؤال مثير للاهتمام: هل من الممكن تدريب الشبكة على بيانات معينة لتوليد إجابة ذات معنى؟ على سبيل المثال ، هل يمكننا تعليم شبكة عصبية للترجمة من الإنجليزية إلى الفرنسية؟ اتضح أننا نستطيع.
سيوضح لك هذا الدليل كيفية إنشاء وتدريب مثل هذا النظام الشامل. انسخ
مستودع Tensor Flow الأساسي ومستودع نموذج TensorFlow من GitHub . بعد ذلك ، يمكنك البدء ببدء برنامج الترجمة:
cd models/tutorials/rnn/translate python translate.py --data_dir [your_data_directory]

ستقوم بتنزيل البيانات للترجمة من الإنجليزية إلى الفرنسية من
WMT'15 ، وإعدادها للتدريب والتدريب. سيتطلب هذا حوالي 20 جيجابايت على محرك الأقراص الثابتة ووقتًا طويلاً للتنزيل والاستعداد ، حتى تتمكن من بدء العملية الآن ومتابعة قراءة هذا البرنامج التعليمي.
سيصل الدليل إلى الملفات التالية:
ملف | ماذا يوجد بها؟ |
---|
tensorflow / tensorflow / python / ops / seq2seq.py | مكتبة لإنشاء نماذج من تسلسل إلى تسلسل |
النماذج / البرامج التعليمية / rnn / translate / seq2seq_model.py | نماذج الترجمة العصبية من تسلسل إلى تسلسل |
نماذج / دروس / rnn / ترجمة / data_utils.py | وظائف المساعد لإعداد بيانات الترجمة |
النماذج / البرامج التعليمية / rnn / translate / translate.py | الثنائي الذي يقوم بتدريب وتشغيل نموذج الترجمة |
أساسيات التسلسل إلى التسلسليتكون النموذج الأساسي للتسلسل إلى التسلسل ، كما قدمه
تشو وآخرون ، 2014 (
pdf ) ، من شبكتين عصبيتين متكررتين (RNNs): جهاز تشفير (برنامج تشفير) يقوم بمعالجة بيانات الإدخال ، وجهاز فك تشفير (وحدة فك ترميز) يقوم بإنشاء البيانات الإخراج. تظهر البنية الأساسية أدناه:

يمثل كل مستطيل في الصورة أعلاه خلية في RNN ، وعادة ما تكون خلية GRU - كتلة تكرار خاضعة للتحكم ، أو خلية LSTM - ذاكرة قصيرة المدى (اقرأ برنامج
RNN التعليمي لمعرفة المزيد عنها). يمكن أن يكون لأدوات التشفير وأجهزة فك التشفير أوزان مشتركة ، أو تستخدم مجموعات مختلفة من المعلمات في أغلب الأحيان. تم استخدام الخلايا متعددة الطبقات بنجاح في نماذج من تسلسل إلى تسلسل ، على سبيل المثال ، لترجمة
Sutskever وآخرون ، 2014 (
pdf ).
في النموذج الأساسي الموصوف أعلاه ، يجب ترميز كل إدخال في ناقل الحالة ذي الحجم الثابت ، لأن هذا هو الشيء الوحيد الذي يتم إرساله إلى وحدة فك الترميز. لإعطاء مفكك الشفرة مزيدًا من الوصول المباشر إلى بيانات الإدخال ، تم إدخال آلية الانتباه في
Bahdanau et al.، 2014 (
pdf ). لن ندخل في تفاصيل آلية الانتباه (لهذا يمكنك التعرف على العمل هنا) ؛ يكفي أن نقول أنه يسمح لمفكك الشفرة بالنظر في بيانات الإدخال في كل خطوة من خطوات فك التشفير. شبكة متعددة الطبقات من تسلسل إلى تسلسل مع خلايا LSTM وآلية الانتباه في مفكك الشفرة هي كما يلي:
مكتبة TensorFlow seq2seqكما ترى أعلاه ، هناك نماذج مختلفة من تسلسل إلى تسلسل. يمكن لجميعهم استخدام خلايا RNN مختلفة ، لكنهم جميعًا يقبلون بيانات إدخال جهاز التشفير وبيانات إدخال جهاز التشفير. هذا هو أساس واجهة مكتبة TensorFlow seq2seq (tensorflow / tensorflow / python / ops / seq2seq.py). يعمل هذا النموذج الأساسي ، RNN ، الترميز ، من تسلسل إلى تسلسل كما يلي.
outputs, states = basic_rnn_seq2seq(encoder_inputs, decoder_inputs, cell)
في المكالمة المشار إليها أعلاه ،
encoder_inputs
عبارة عن قائمة بأسماء
encoder_inputs
تمثل بيانات الإدخال الخاصة ببرنامج التشفير ، المقابلة للحروف A و B و C من الصورة أعلاه. وبالمثل ، فإن
decoder_inputs
فك التشفير هي
decoder_inputs
تمثل بيانات إدخال مفكك الشفرة. GO ، W ، X ، Y ، Z من الصورة الأولى.
وسيطة
cell
هي مثيل لفئة
tf.contrib.rnn.RNNCell
التي تحدد الخلية التي سيتم استخدامها في النموذج. يمكنك استخدام الخلايا الموجودة ، على سبيل المثال ،
GRUCell
أو
LSTMCell
، أو يمكنك كتابة الخلايا الخاصة بك. بالإضافة إلى ذلك ، يوفر
tf.contrib.rnn
قذائف لإنشاء خلايا متعددة الطبقات ، وإضافة استثناءات لإدخال الخلية
tf.contrib.rnn
، أو تحويلات أخرى. تحقق من
دروس RNN للحصول على أمثلة.
تقوم استدعاء
basic_rnn_seq2seq
بإرجاع
basic_rnn_seq2seq
:
outputs
states
. كلاهما يمثل قائمة tensors من نفس طول
decoder_inputs
. تقابل المخرجات بيانات خرج مفكك الشفرة في كل خطوة زمنية ، في الصورة الأولى هي W ، X ، Y ، Z ، EOS. تمثل
states
المرتجعة الحالة الداخلية لمفكك الشفرة في كل خطوة زمنية.
في العديد من التطبيقات التي تستخدم نموذج التسلسل إلى التسلسل ، يتم إرسال خرج مفكك الشفرة في الوقت t مرة أخرى إلى الإدخال إلى مفكك الشفرة في الوقت t + 1. أثناء الاختبار ، أثناء فك تشفير التسلسل ، هذه هي الطريقة التي يتم بها إنشاء واحدة جديدة. من ناحية أخرى ، أثناء التدريب ، من المعتاد إرسال بيانات الإدخال الصحيحة إلى مفكك التشفير في كل خطوة زمنية ، حتى إذا كان مفكك الشفرة مخطئًا مسبقًا. تدعم الوظائف في
seq2seq.py
كلا الوضعين باستخدام وسيطة
feed_previous
. على سبيل المثال ، خذ بعين الاعتبار الاستخدام التالي لنموذج RNN المتداخل.
outputs, states = embedding_rnn_seq2seq( encoder_inputs, decoder_inputs, cell, num_encoder_symbols, num_decoder_symbols, embedding_size, output_projection=None, feed_previous=False)
في نموذج
embedding_rnn_seq2seq
، تكون جميع بيانات الإدخال (كل من
encoder_inputs
و
decoder_inputs
) عبارة عن
decoder_inputs
صحيحة تعكس قيمًا منفصلة. سيتم دمجها في تمثيل ضيق (للحصول على تفاصيل حول المرفق ، ارجع إلى
دليل طرق العرض المتجه ) ، ولكن لإنشاء هذه المرفقات ، تحتاج إلى تحديد الحد الأقصى لعدد الأحرف المنفصلة:
num_encoder_symbols
على جانب التشفير و
num_decoder_symbols
على جانب وحدة فك الترميز.
في المكالمة أعلاه ، قمنا بتعيين
feed_previous
إلى False. وهذا يعني أن مفكك التشفير سوف يستخدم
decoder_inputs
بالشكل الذي يتم توفيرها به. إذا قمنا بتعيين
feed_previous
على True ، فلن يستخدم مفكك التشفير سوى أول عنصر
decoder_inputs
. سيتم تجاهل جميع الموترات الأخرى من القائمة ، وسيتم استخدام قيمة إخراج وحدة فك الترميز السابقة بدلاً من ذلك. يُستخدم هذا لفك تشفير الترجمات في نموذج الترجمة الخاص بنا ، ولكن يمكن استخدامه أيضًا أثناء التدريب لتحسين استقرار النموذج لأخطائه. تقريبًا كما في
Bengio et al. ، 2015 (
pdf ).
حجة مهمة أخرى مستخدمة أعلاه هي
output_projection
. بدون توضيحات ، ستكون استنتاجات النموذج المضمن عبارة عن موتر من شكل عدد عينات التدريب لكل
num_decoder_symbols
، لأنها تمثل منطق كل رمز تم إنشاؤه. عندما تكون نماذج التدريب ذات قواميس إخراج كبيرة ، على سبيل المثال مع
num_decoder_symbols
كبيرة ، يصبح تخزين هذه
num_decoder_symbols
الكبيرة غير عملي. بدلاً من ذلك ، من الأفضل إرجاع موترات أصغر ، والتي سيتم
output_projection
بعد ذلك على الموتر الكبير باستخدام
output_projection
. هذا يسمح لنا باستخدام نماذج seq2seq مع خسائر softmax التي تم أخذ عينات منها ، كما هو موضح بواسطة
Jean et. al. ، 2014 (
pdf ).
بالإضافة إلى
basic_rnn_seq2seq
و
embedding_rnn_seq2seq
، هناك العديد من نماذج التسلسل إلى التسلسل في
seq2seq.py
. انتبه لهم. جميعهم لديهم واجهة مماثلة ، لذلك لن نتعمق في تفاصيلهم. لنموذج الترجمة أدناه ، استخدم
embedding_attention_seq2seq
.
يتبع.