مرحبا بالجميع!
الجزء الثاني من الترجمة ، الذي نشرناه قبل أسبوعين ، استعدادًا لإطلاق الدفق الثاني من دورة
"عالم البيانات" . أمامنا مادة أخرى مثيرة للاهتمام ودرس مفتوح.
في غضون ذلك ، ذهبنا أبعد من ذلك إلى غابة النماذج.
نموذج الترجمة العصبيةفي حين أن جوهر نموذج التسلسل إلى التسلسل يتم إنشاؤه بواسطة وظائف من
tensorflow/tensorflow/python/ops/seq2seq.py
، لا تزال هناك بعض الحيل المستخدمة في نموذجنا للترجمة في
models/tutorials/rnn/translate/seq2seq_model.py
، حول جدير بالذكر.
عينة softmax وإسقاط الإخراجكما ذكر أعلاه ، نحن نريد استخدام softmax العينات للعمل مع قاموس مخرجات كبير. لفك تشفيرها ، يجب عليك تتبع إسقاط المخرجات. يتم إنشاء كل من اختبار softmax للعينة وإسقاط الإخراج بواسطة التعليمة البرمجية التالية في
seq2seq_model.py
.
if num_samples > 0 and num_samples < self.target_vocab_size: w_t = tf.get_variable("proj_w", [self.target_vocab_size, size], dtype=dtype) w = tf.transpose(w_t) b = tf.get_variable("proj_b", [self.target_vocab_size], dtype=dtype) output_projection = (w, b) def sampled_loss(labels, inputs): labels = tf.reshape(labels, [-1, 1])
أولاً ، لاحظ أننا نقوم بإنشاء softmax للعينات فقط إذا كان عدد العينات (512 افتراضيًا) أقل من حجم القاموس المستهدف. بالنسبة لقواميس أصغر من 512 ، من الأفضل استخدام فقد softmax القياسي.
ثم ، قم بإنشاء إسقاط الإخراج. هذا زوج يتكون من مصفوفة أوزان ومتجه للإزاحة. عند استخدامها ، تُرجع خلية rnn متجهات
target_vocab_size
لعدد عينات التدريب حسب
size
، وليس عدد عينات التدريب حسب
target_vocab_size
. لاستعادة السجلات ، تحتاج إلى ضربها بمصفوفة الأوزان وإضافة إزاحة ، والتي تحدث في الأسطر 124-126 في
seq2seq_model.py
.
if output_projection is not None: for b in xrange(len(buckets)): self.outputs[b] = [tf.matmul(output, output_projection[0]) + output_projection[1] for ...]
دلو والحشوبالإضافة إلى softmax التي تم أخذ عينات منها ، يستخدم نموذج الترجمة الخاص بنا أيضًا
bucketing ، وهي طريقة تتيح لك إدارة الجمل ذات الأطوال المختلفة بكفاءة. لتبدأ ، وشرح المشكلة. عند الترجمة من الإنجليزية إلى الفرنسية ، لدينا جمل إنجليزية بأطوال مختلفة L1 عند المدخل وجمل فرنسية بأطوال مختلفة L1 عند الخروج. نظرًا لأن الجملة الإنجليزية تُرسل كـ
encoder_inputs
، ويتم عرض الجملة الفرنسية كـ
decoder_inputs
(مع بادئة رمز GO) ، فمن الضروري إنشاء نموذج seq2seq لكل زوج (L1 ، L2 + 1) من أطوال الجمل الإنجليزية والفرنسية. نتيجة لذلك ، نحصل على رسم بياني ضخم يتكون من العديد من الرسومات الفرعية المشابهة. من ناحية أخرى ، يمكننا "توسيد" كل جملة بأحرف PAD خاصة. ثم نحتاج إلى نموذج seq2seq واحد فقط للأطوال "المعبأة". لكن هذا النموذج لن يكون فعالاً في جمل قصيرة - يجب عليك تشفير وفك تشفير الكثير من أحرف PAD عديمة الفائدة.
كحل وسط بين إنشاء رسم بياني لكل زوج من الأطوال والحشو لطول واحد ، نستخدم عددًا معينًا من الجرافات ونضع كل جملة على طول المجموعة أعلاه. في
translate.py
نستخدم المجموعات التالية افتراضيًا.
buckets = [(5, 10), (10, 15), (20, 25), (40, 50)]
وبالتالي ، إذا وصلت جملة باللغة الإنجليزية ذات 3 رموز إلى المدخلات ، وكانت الجملة الفرنسية المقابلة تحتوي على 6 رموز في الخرج ، فستنتقل إلى المجموعة الأولى وسيتم ملؤها حتى الطول 5 عند إدخال المشفر والطول 10 عند إدخال وحدة فك التشفير. وإذا كان هناك 8 رموز في العرض الإنجليزي ، وفي الفرنسية المقابلة 18 ، فإنها لن تدخل في المجموعة (10 ، 15) وسيتم نقلها إلى المجموعة (20 ، 25) ، أي ، سيزداد العرض الإنجليزي إلى 20 رمزًا ، والعرض الفرنسي إلى 25.
تذكر أنه عند إنشاء إدخال وحدة فك الترميز ، نضيف حرف
GO
الخاص إلى الإدخال. يحدث هذا في
get_batch()
في
seq2seq_model.py
، والتي تقلب الجملة الإنجليزية أيضًا. ساعد تقليب المدخلات على تحسين نتائج نموذج الترجمة العصبية لـ
Sutskever et al.، 2014 (pdf). لمعرفة ذلك في النهاية ، تخيل أن هناك جملة "أذهب". عند الإدخال ، مقسم إلى الرموز
["I", "go", "."]
، وفي الإخراج هناك جملة "Je vais." ، تم كسرها في الرموز المميزة
["Je", "vais", "."]
. ستتم إضافتها إلى المجموعة (5 ، 10) ، مع تمثيل برنامج تشفير الإدخال
[PAD PAD "." "go" "I"]
[PAD PAD "." "go" "I"]
وإدخال وحدة فك التشفير
[GO "Je" "vais" "." EOS PAD PAD PAD PAD PAD]
[GO "Je" "vais" "." EOS PAD PAD PAD PAD PAD]
.
قم بتشغيلهلتدريب النموذج الموصوف أعلاه ، ستحتاج إلى فرقة أنجلو-فرنسية كبيرة. للتدريب ، سوف نستخدم 10 ^ 9 فيلق اللغة الإنجليزية والفرنسية من
موقع WMT'15 ،
ونختبر الأخبار من نفس الموقع كعينة عاملة. سيتم تحميل
train_dir
البيانات في
train_dir
عند تشغيل الأمر التالي.
python translate.py --data_dir [your_data_directory] --train_dir [checkpoints_directory] --en_vocab_size=40000 --fr_vocab_size=40000
ستحتاج إلى 18 جيجابايت من مساحة القرص الصلب وعدة ساعات لإعداد مبنى التدريب. يتم فك
data_dir,
ويتم إنشاء ملفات القاموس في
data_dir,
وبعد ذلك يتم تحويل
data_dir,
إلى الحالة وتحويلها إلى معرفات عدد صحيح. انتبه إلى المعلمات المسؤولة عن حجم القاموس. في المثال أعلاه ، سيتم تحويل جميع الكلمات خارج الكلمات الأكثر استخدامًا والتي يبلغ عددها 40.000 كلمة إلى رمز UNK يمثل كلمة غير معروفة. وبالتالي ، عند تغيير حجم القاموس ، سيقوم الثنائي بإعادة إصلاح الهيكل بواسطة الرمز المميز. بعد بدء التدريب على إعداد البيانات.
القيم المحددة في
translate
عالية جدًا بشكل افتراضي. تُظهر النماذج الكبيرة التي تتعلم لفترة طويلة نتائج جيدة ، ولكن قد تستغرق وقتًا طويلاً جدًا أو ذاكرة GPU أكثر من اللازم. يمكنك تحديد تجريب نموذج أصغر ، كما في المثال أدناه.
python translate.py --data_dir [your_data_directory] --train_dir [checkpoints_directory] --size=256 --num_layers=2 --steps_per_checkpoint=50
سيقوم الأمر أعلاه بتدريب النموذج بطبقتين (افتراضيًا هناك 3) ، لكل منها 256 وحدة (افتراضي - 1024) ، مع نقطة تفتيش في كل 50 خطوة (افتراضي - 200). قم بتجربة هذه الخيارات لمعرفة أي طراز من الحجم مناسب لجرافيك الخاص بك.
أثناء التدريب ،
steps_per_checkpoin
كل خطوة من خطوات
steps_per_checkpoin
t الثنائية إحصاءات عن الخطوات السابقة. مع المعلمات الافتراضية (3 طبقات من حجم 1024) ، تكون الرسالة الأولى كما يلي:
global step 200 learning rate 0.5000 step-time 1.39 perplexity 1720.62 eval: bucket 0 perplexity 184.97 eval: bucket 1 perplexity 248.81 eval: bucket 2 perplexity 341.64 eval: bucket 3 perplexity 469.04 global step 400 learning rate 0.5000 step-time 1.38 perplexity 379.89 eval: bucket 0 perplexity 151.32 eval: bucket 1 perplexity 190.36 eval: bucket 2 perplexity 227.46 eval: bucket 3 perplexity 238.66
لاحظ أن كل خطوة تستغرق أقل من 1.4 ثانية ، مما يحير عينة التدريب ويحير عينة العمل في كل مجموعة. بعد حوالي 30 ألف خطوة ، نرى كيف أن حيرة الجمل القصيرة (المجموعتان 0 و 1) لا لبس فيها. يحتوي مبنى التدريب على حوالي 22 مليون جملة ، يستغرق التكرار الواحد (تشغيل واحد لبيانات التدريب) حوالي 340 ألف خطوة مع عدد عينات التدريب التي تبلغ 64. في هذه المرحلة ، يمكن استخدام النموذج لترجمة الجمل الإنجليزية إلى الفرنسية باستخدام خيار -
--decode
.
python translate.py --decode --data_dir [your_data_directory] --train_dir [checkpoints_directory] Reading model parameters from /tmp/translate.ckpt-340000 > Who is the president of the United States? Qui est le président des États-Unis ?
ما التالي؟يوضح المثال أعلاه كيفية إنشاء المترجم الإنجليزي والفرنسي الخاص بك من طرف إلى طرف. قم بتشغيله وانظر كيف يعمل النموذج. الجودة مقبولة ، لكن لا يمكن الحصول على نموذج ترجمة مثالي باستخدام المعلمات الافتراضية. إليك بعض الأشياء التي يمكنك تحسينها.
أولاً ، نستخدم
basic_tokenizer
data_utils
البدائي ، الوظيفة الأساسية لـ
basic_tokenizer
في
data_utils
. يمكن العثور على
رمز مميز أفضل على
موقع الويب WMT'15 . إذا كنت تستخدمه وقاموسًا كبيرًا ، يمكنك تحقيق ترجمات أفضل.
بالإضافة إلى ذلك ، لا يتم تكوين المعلمات الافتراضية لنموذج الترجمة تمامًا. يمكنك محاولة تغيير سرعة التعلم والتوهين وتهيئة أوزان النموذج. يمكنك أيضًا استبدال
GradientDescentOptimizer
القياسي في
seq2seq_model.py
بشيء أكثر تقدمًا ، مثل
AdagradOptimizer
. حاول وشاهد للحصول على نتائج أفضل!
أخيرًا ، يمكن استخدام النموذج المقدم أعلاه ليس فقط للترجمة ، ولكن أيضًا لأي مهمة تتابع تسلسل. حتى إذا كنت ترغب في تحويل تسلسل إلى شجرة ، على سبيل المثال ، إنشاء شجرة تحليل ، يمكن لهذا النموذج أن ينتج نتائج حديثة ، كما هو موضح من قبل
Vinyals & Kaiser et al. ، 2014 (pdf) . لذلك لا يمكنك إنشاء مترجم فحسب ، بل يمكنك أيضًا إنشاء محلل أو برنامج محادثة روبوت أو أي برنامج آخر تريده. التجربة!
هذا كل شئ!
نحن في انتظار التعليقات والأسئلة الخاصة بك هنا أو ندعوك لطرح
معلمهم في
درس مفتوح .