نماذج التسلسل إلى التسلسل الجزء الأول

يوم جيد للجميع!

وقد فتحنا مرة أخرى دفقًا جديدًا لدورة عالم البيانات المنقحة: معلم ممتاز آخر ، برنامج محسن قليلاً يعتمد على التحديثات. حسنًا ، كالعادة ، دروس مفتوحة ومجموعات من المواد المثيرة للاهتمام. سنبدأ اليوم تحليل نماذج 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 .

يتبع.

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


All Articles