#### [تحديث 2017-03-14]
- الترقية إلى Tensorflow v1.0.0 ، لا يوجد متطابق مع TensorFlow لقد تغيرت كثيرًا.
- تتم إضافة نموذج تدريب مسبقًا مع Twitter Corpus ، فقط
./go_exampleللدردشة! (أو معاينة مثال الدردشة الخاص بي)- يمكنك البدء من تتبع هذا البرنامج النصي
go_exampleلمعرفة كيف تعمل الأشياء!
هذا هو نموذج SEQ2SEQ تم تعديله من مثال TensorFlow.
app.py خادم قارورة خفيف الوزن ليكون الواجهة الخلفية لتطبيق Facebook Messenger. شرحت بعض التفاصيل حول الميزات وبعض الحيل التنفيذ هنا.
git clone github.com/Marsan-Ma/tf_chatbot_seq2seq_antilm.git
قد تجد مجموعة مثل الدردشة على Twitter أو Tongerme Subtitle أو PTT من مستودع Corpus Corpus الخاص بي. تحتاج إلى وضعه تحت الطريق مثل:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/train/chat.txt
وصياغة بعض جمل الاختبار (كل جملة لكل سطر) في:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/test/test_set.txt
python3 main.py --mode train --model_name <MODEL_NAME>
بعد تدريب النموذج الخاص بك حتى يصبح الحيون أقل من 50 عامًا أو نحو ذلك ، يمكنك القيام بذلك:
python3 main.py --mode test --model_name <MODEL_NAME>
[ملاحظة !!!] إذا وضعت أي كتاب معلمة فوق هذا commmand main.py ، تأكد من تطبيق كل من التدريب والاختبار ، أو فقط التعديل في lib/config.py لـ Failsafe.
python3 app.py --model_name <MODEL_NAME>
قد ترى هذا مثال FB_Messenger على الأقل لمزيد من التفاصيل مثل إعداد SSL و WebHook وعمليات العمل عن الأخطاء المعروفة.
فيما يلي مقارنة مثيرة للاهتمام: البحث عن الشعاع الممكّن من المحادثة اليسرى مع شعاع = 10 ، بالكاد تكون الاستجابة أفضل من "أنا لا أعرف". استخدمت المحادثة الصحيحة أيضًا البحث عن الشعاع ، بالإضافة إلى ذلك ، نموذج مكافحة اللغة الممكّن. هذا من المفترض أن يقمع الاستجابة العامة ، ويبدو أن الاستجابة أفضل.
[تحديث 2017-03-09] التعلم التعزيز لا يعمل الآن ، انتظر الإصلاح.
إذا كنت تريد بعض الفرص لتحسين النموذج الخاص بك ، فقد قمت هنا بتطبيق بنية التعلم التعزيز المستوحاة من Li et al. ، 2016. فقط قم بتمكين خيار Rodforce_Learn في config.py ، فقد ترغب في إضافة القاعدة الخاصة بك في وظيفة step_rf() في lib/seq2seq_mode.py .
لاحظ أنه يجب عليك التدريب في الوضع العادي للحصول على نموذج لائق أولاً! ، نظرًا لأن تعلم التعزيز سوف يستكشف العالم الجديد الشجاع مع هذا النموذج الذي تم تدريبه مسبقًا. سوف ينتهي الأمر بالاستمتاع إلى الأبد لتحسين نفسه إذا بدأت بنموذج سيء.
SEQ2Seq هو نموذج رائع أصدرته تشو وآخرون ، 2014. في البداية يتم استخدامه للقيام بالترجمة الآلية ، وسرعان ما يجد الناس أن أي شيء عن تعيين شيء ما إلى شيء آخر يمكن أن يتحققه نموذج SEQ2Seq. chatbot هي واحدة من هذه المعجزات ، حيث نعتبر حوار متتالي نوعًا من العلاقة "رسم الخرائط".
فيما يلي صورة مقدمة كلاسيكية ، وهي بنية طراز SEQ2Seq ، اقتبس من هذه المدونة حول ميزة Gmail Auto-Reply.
المشكلة هي ، حتى الآن لم نجد وظيفة موضوعية أفضل لـ chatbot. ما زلنا نستخدم MLE (أقصى تقدير محتمل) ، والذي يقوم بعمل جيد للترجمة الآلية ، ولكن دائمًا ما ننشئ استجابة عامة مثل "أنا أيضًا" ، "أعتقد ذلك" ، "أحبك" أثناء إجراء الدردشة.
هذه الردود ليست مفيدة ، ولكن لديها احتمال كبير --- لأنها تميل إلى الظهور عدة مرات في تدريب مجموعة. لا يمكننا الرد دائمًا على هذه الدردشة ، لذلك نحتاج إلى إيجاد طريقة لجعل روبوتنا أكثر "مثيرًا للاهتمام" ، من الناحية الفنية ، لزيادة "الحيرة" في الاستجابة.
هنا نعيد إنتاج عمل لي. وآخرون ، 2016 حاول حل هذه المشكلة. تتمثل الفكرة الرئيسية في استخدام نموذج SEQ2Seq نفسه كنموذج لغة ، للحصول على الكلمات المرشحة ذات الاحتمال الكبير في كل طابع زمني فك تشفيره كضادة الطراز ، ثم نعاقب هذه الكلمات دائمًا على احتمال كبير لأي مدخلات. من خلال هذا مضاد النموذج ، يمكن أن نحصل على استجابة مميزة وغير واضحة وغنية بالمعلومات.
العمل الأصلي للي. وآخرون يستخدمون Mert (OCH ، 2003) مع Bleu كمقاييس للعثور على أفضل ترجيح احتمال ( λ و γ في الدرجة (t) = p (t | s)-λu (t) + γNT ) من نموذج مضاد اللغات المقابل. لكنني أجد أن درجة Bleu في Corm Corpus تميل دائمًا إلى أن تكون صفرًا ، وبالتالي لا يمكن الحصول على نتيجة ذات مغزى هنا. إذا كان لدى أي شخص أي فكرة عن هذا ، فقم بإسقاط رسالة ، شكرًا!
هناك بعض الخيارات لتدريب النماذج والتنبؤ في lib/config.py. في الأساس ، يتم توضيحها ذاتيا ويمكن أن تعمل مع القيمة الافتراضية لمعظم الحالات. نحن هنا فقط سرد شيء تحتاجه لتكوينه:
حول البيئة
| اسم | يكتب | وصف |
|---|---|---|
| وضع | خيط | وضع العمل: القطار/الاختبار/الدردشة |
| model_name | خيط | اسم النموذج ، يؤثر على مسار العمل الخاص بك (تخزين البيانات ، nn_model ، مجلدات النتائج) |
| SCOPE_NAME | خيط | في TensorFlow إذا كنت بحاجة إلى تحميل اثنين من الرسم البياني في نفس الوقت ، فأنت بحاجة إلى حفظها/تحميلها في مساحة اسم مختلفة. (إذا كنت بحاجة إلى طراز SEQ2Seq واحد فقط ، فاتركه على أنه افتراضي) |
| vocab_size | عدد صحيح | يعتمد على لغة المجموعة الخاصة بك: للغة الإنجليزية ، 60000 جيد بما فيه الكفاية. للصينية تحتاج إلى 100000 أو 200000 على الأقل. |
| GPU_USAGE | يطفو | TensorFlow GPU Memory جزء مستخدم ، الافتراضي هو 1 وسيشغل TensorFlow 100 ٪ من وحدة معالجة الرسومات الخاصة بك. إذا كان لديك وظائف متعددة تشارك مورد GPU الخاص بك ، اجعله 0.5 أو 0.3 ، لمدة 2 أو 3 وظائف. |
| تعزيز | int | تعيين 1 لتمكين وضع التعلم التعزيز |
حول فك التشفير
| اسم | يكتب | تقصير | وصف |
|---|---|---|---|
| beam_size | int | 10 | حجم بحث الشعاع ، الإعداد 1 يساوي البحث الجشع |
| مضاد | يطفو | 0 (معطل) | يعاقب وزن النموذج المضاد باللغة |
| n_bonus | يطفو | 0 (معطل) | مكافأة الوزن من طول الجملة |
يتم تعطيل functin المضاد لـ LM بشكل افتراضي ، قد تبدأ من إعداد Antilm = 0.5 ~ 0.7 و N_Bonus = 0.05 لمعرفة ما إذا كنت تحب الفرق في النتائج.
للتدريب ، يوصى GPU لأن SEQ2Seq هو نموذج كبير ، فأنت بحاجة إلى قوة حوسبة معينة للقيام بالتدريب والتنبؤ بكفاءة ، خاصة عند تعيين حجم بحث كبير.
متطلبات DRAM ليست صارمة مثل وحدة المعالجة المركزية/وحدة معالجة الرسومات ، لأننا نقوم بتدرج ستوكاستيك لائق.
إذا كنت جديدًا على التعلم العميق ، فستنظر أشياء مثل GPU ، وبيئة Python مزعجة لك ، وإليك Dockers لبيئة التعلم الآلي الخاص بي:
(Docker الإصدار غير GPU) / (إصدار GPU Docker)
Seq2Seq هو نموذج له العديد من التمهيديات ، لقد قضيت بعض الوقت في الاستقصاء ، وهنا بعض أفضل المواد التي تفيدني كثيرًا:
أفضل Blogpost يشرح RNN و LSTM و GRU و SEQ2SEQ: فهم شبكات LSTM بواسطة كريستوفر أولا.
يساعدني هذا العمل Sherjilozair/char-rnn-TensorFlow على تعلم الكثير عن نموذج اللغة والرسم البياني للتنفيذ في TensorFlow.
إذا كنت مهتمًا بمزيد من السحر حول RNN ، فإليك مدونة لا بد من قراءة: الفعالية غير المعقولة للشبكات العصبية المتكررة من قبل Andrej Karpathy.
إصدار Vanilla SEQ2Seq+الانتباه: Nicolas-Ivanov/TF_SEQ2SEQ_CHATBOT. سيساعدك ذلك على معرفة التدفق الرئيسي لنموذج الفانيليا SEQ2Seq ، وأنا أقوم بإنشاء هذا المستودع بناءً على هذا العمل.
حاليًا أقوم ببناء Beam-Search خارج الرسم البياني ، مما يعني --- إنه بطيء جدًا. هناك مناقشات حول بنائه على الرسم البياني هنا وهناك. ولكن لسوء الحظ ، إذا كنت تريد إضافة شيء أكثر من البحث عن شعاع ، مثل هذا العمل المضاد لـ LM ، فأنت بحاجة إلى أكثر بكثير من مجرد البحث عن شعاع ليكون في حالة من الرسم البياني.
لم أكن أعرف كيف يمكن لـ Mert with Bleu تحسين وزن نموذج مضاد لـ LM ، نظرًا لأن Bleu حاليًا غالبًا ما يكون الصفر.