يحاول هذا العمل إعادة إنتاج نتائج نموذج المحادثة العصبي (المعروف أيضًا باسم Google chatbot). ويستخدم RNN (نموذج seq2seq) للتنبؤات الجملة. يتم ذلك باستخدام python و TensorFlow.
جزء تحميل البرنامج مستوحى من Torch neuralconvo من macournoyer.
في الوقت الحالي، يدعم DeepQA مجموعة الحوار التالية:
--corpus opensubs
.--corpus scotus
. انظر تعليمات التثبيت.--corpus ubuntu
. انظر تعليمات التثبيت.لتسريع التدريب، من الممكن أيضًا استخدام تضمينات الكلمات المدربة مسبقًا (بفضل Eschnou). مزيد من المعلومات هنا.
يتطلب البرنامج التبعيات التالية (سهلة التثبيت باستخدام النقطة: pip3 install -r requirements.txt
):
قد تحتاج أيضًا إلى تنزيل بيانات إضافية حتى يعمل nltk.
python3 -m nltk.downloader punkt
تم تضمين مجموعة بيانات كورنيل بالفعل. بالنسبة لمجموعات البيانات الأخرى، انظر إلى الملفات التمهيدية في المجلدات الخاصة بها (داخل data/
).
تتطلب واجهة الويب بعض الحزم الإضافية:
يتوفر أيضًا تثبيت Docker. تعليمات أكثر تفصيلا هنا.
لتدريب النموذج، ما عليك سوى تشغيل main.py
. بمجرد التدريب، يمكنك اختبار النتائج باستخدام main.py --test
(النتائج التي تم إنشاؤها في 'save/model/samples_predictions.txt') أو main.py --test interactive
(أكثر متعة).
فيما يلي بعض الأعلام التي قد تكون مفيدة. لمزيد من المساعدة والخيارات، استخدم python main.py -h
:
--modelTag
: السماح بإعطاء اسم للنموذج الحالي للتمييز بينهما عند الاختبار/التدريب.--keepAll
: استخدم هذه العلامة عند التدريب إذا كنت تريد رؤية التنبؤات في خطوات مختلفة أثناء الاختبار (قد يكون من المثير للاهتمام رؤية البرنامج يغير اسمه وعمره مع تقدم التدريب). تحذير: يمكن أن يستغرق الأمر مساحة تخزين كبيرة بسرعة إذا لم تقم بزيادة خيار --saveEvery
.--filterVocab 20
أو --vocabularySize 30000
: تحديد حجم المفردات وتحسين الأداء واستخدام الذاكرة. استبدل الكلمات المستخدمة أقل من 20 مرة بالرمز
وقم بتعيين الحد الأقصى لحجم المفردات.--verbose
: عند الاختبار، سيتم طباعة الجمل كما تم حسابها.--playDataset
: اعرض بعض نماذج الحوار من مجموعة البيانات (يمكن استخدامها مع --createDataset
إذا كان هذا هو الإجراء الوحيد الذي تريد تنفيذه). لتصور الرسم البياني الحسابي والتكلفة باستخدام TensorBoard، ما عليك سوى تشغيل tensorboard --logdir save/
.
افتراضيًا، تكون بنية الشبكة عبارة عن جهاز تشفير/وحدة فك تشفير قياسي مع طبقتين LSTM (حجم مخفي 256) وحجم تضمين لمفردات 32. يتم تدريب الشبكة باستخدام ADAM. الحد الأقصى لطول الجملة هو 10 كلمات، ولكن يمكن زيادتها.
بمجرد التدريب، من الممكن الدردشة معه باستخدام واجهة أكثر سهولة في الاستخدام. سينظر الخادم إلى النموذج المنسوخ إلى save/model-server/model.ckpt
. في المرة الأولى التي تريد فيها استخدامه، ستحتاج إلى تهيئته باستخدام:
export CHATBOT_SECRET_KEY= " my-secret-key "
cd chatbot_website/
python manage.py makemigrations
python manage.py migrate
ثم، لتشغيل الخادم محليًا، استخدم الأوامر التالية:
cd chatbot_website/
redis-server & # Launch Redis in background
python manage.py runserver
بعد الإطلاق، يجب أن تكون الواجهة متاحة على http://localhost:8000/. إذا كنت تريد نشر البرنامج على خادم، فاستخدم python manage.py runserver 0.0.0.0
بدلاً من ذلك. مزيد من المعلومات هنا.
من المثير للدهشة أنه من الممكن الحصول على بعض النتائج بعد ساعة أو ساعتين فقط من التدريب (على GeForce GT 740M)، عن طريق تقليل تسلسل الإدخال بشكل كبير إلى 5 كلمات والإخراج إلى 3 (بالإضافة إلى الرموز المميزة go
و eos
) وباستخدام رمز صغير حجم التضمين (حوالي 25). منذ ذلك الحين قمت بتعديل الكود والآن يجب أن يتطابق طول الإخراج مع الإدخال ولكن لا يزال بإمكانك إعادة إنتاج النتائج الأصلية باستخدام هذا الإصدار. بالطبع، لن تكون الشبكة ثرثارة حقًا:
Q: Hi
A: Hi.
Q: What is your name ?
A: Laura.
Q: What does that mean ?
A: I dunno.
Q: How old are you ?
A: thirty-five.
Q: Will Google hire me ?
A: No.
Q: Tell me the alphabet
A: Fuck you.
Q: That's not nice
A: Yeah.
فيما يلي بعض الحالات التي فشل فيها:
Q: Who is Laura ?
A: My brother.
Q: Say 'goodbye'
A: Alright.
Q: What is cooking ?
A: A channel.
Q: Can you say no ?
A: No.
Q: Two plus two
A: Manny...
مع الجمل الأطول، تكون الشبكة أبطأ بكثير في التدريب. بعد 250000 تكرار مع maxLength=10، لا تزال الشبكة تقدم إجابات مراوغة بشكل أساسي (من خلال الإجابة على معظم الأسئلة المفتوحة بـ "لا أعرف") ولكن يبدو أنها دمجت بعض الدلالات الأساسية:
Q: When are the fireworks ?
A: Tomorrow.
Q: What color ?
A: Gray.
Q: Which apple ?
A: That's the first one.
Q: What time is it ?
A: Eleven o'clock.
Q: Who is Skywalker ?
A: She's a freelance bio-exorcist.
Q: Who is John ?
A: The old man.
Q: Who is Jenny ?
A: The man who killed herself.
Q: When were you born ?
A: Soon.
كما هو موضح في الأسئلة الأخيرة، لا تزال الشبكة تخلط بين الجنسين والحاضر/المستقبل. لقد جربت أيضًا بعض الأسئلة الفلسفية الأعمق بنجاح أكبر أو أقل.
Q: What is the purpose of being intelligent ?
A: The man are obsolete.
Q: What is immoral ?
A: The truth.
Q: What is morality ?
A: The worst.
Q: What is the purpose of existence ?
A: It 's private.
Q: What happens if machines can think ?
A: I think I'll just lie with you.
النموذج الذي قمت بتدريبه محدود تمامًا بحجم التضمين الذي وضعته وحجمه وحجم مجموعة التدريب. ربما يكون "متجه الفكر" الخاص به أيضًا صغيرًا جدًا بحيث لا يمكنه الإجابة على هذا النوع من الأسئلة التالية:
Q: My name is David. What is my name ?
A: Debbie.
Q: My name is John. What is my name ?
A: Carl Smith.
Q: How many legs does a cat have ?
A: Four.
Q: How many legs does a spider have ?
A: Four.
Q: Do you prefer football or soccer ?
A: Whiskey.
يبدو أيضًا أنه يفرط في التناسب لأنه في بعض الأحيان سيخرج جملًا من مجموعة التدريب الخاصة به لا علاقة لها بالسؤال. يجب أن تؤدي إضافة بعض التسرب إلى تقليل المشكلة.
Q: I play tennis. What do I play ?
A: I'm going to get laid.
Q: What color is the sky ?
A: One of the deputies is everywhere.
ملاحظة: الروابط لم تعد تعمل.
يمكنك العثور على نموذج تم تدريبه مسبقًا هنا ، تم تدريبه على المجموعة الافتراضية. لاستخدامه:
DeepQA/save/
save/model-pretrainedv2/dataset-cornell-old-lenght10-filter0-vocabSize0.pkl
إلى data/samples/
../main.py --modelTag pretrainedv2 --test interactive
. بفضل Nicholas C.، إليك (النسخة الأصلية) بعض النماذج الإضافية المدربة مسبقًا (المتوافقة مع TF 1.2) لمجموعات البيانات المتنوعة. يحتوي المجلد أيضًا على مجموعة البيانات المُجهزة مسبقًا لـ Cornell وOpenSubtitles وUbuntu وScotus (للتنقل داخل data/samples/
). هذه مطلوبة إذا كنت لا تريد معالجة مجموعات البيانات بنفسك.
إذا كان لديك وحدة معالجة رسومات متطورة، فلا تتردد في اللعب باستخدام المعلمات الفائقة/المجموعة لتدريب نموذج أفضل. من خلال تجاربي، يبدو أن معدل التعلم ومعدل التسرب لهما التأثير الأكبر على النتائج. وأيضًا إذا كنت ترغب في مشاركة نماذجك، فلا تتردد في الاتصال بي وسأضيفها هنا.
بالإضافة إلى تجربة نموذج أكبر/أعمق، هناك الكثير من التحسينات الصغيرة التي يمكن اختبارها. لا تتردد في إرسال طلب سحب إذا قمت بتنفيذ أحد هذه الطلبات. وهنا بعض الأفكار:
loop_function
لـ tf.nn.seq2seq.rnn_decoder
، فلن يكون من الصعب جدًا إضافتها. بعد ذلك، يجب أن يكون من الممكن التلاعب بدرجة حرارة SoftMax للحصول على توقعات أكثر تحفظًا أو غرابة.embedding_rnn_seq2seq
بـ embedding_attention_seq2seq
على model.py
.Q:Sentence 1. Sentence 2. => A:Sentence X. Sentence Y.
يمكننا إنشاء 3 عينات جديدة: Q:Sentence 1. Sentence 2. => A:Sentence X.
, Q:Sentence 2. => A:Sentence X. Sentence Y.
و Q:Sentence 2. => A:Sentence X.
. تحذير: مجموعات أخرى مثل Q:Sentence 1. => A:Sentence X.
لن تعمل لأنها ستقطع الانتقال 2 => X
الذي يربط السؤال بـ إجابة)
و
حتى يعرف برنامج التشفير متى يتغير المحاور. لست متأكدًا من أن نموذج seq2seq البسيط سيكون كافيًا لالتقاط التبعيات طويلة المدى بين الجمل. يمكن أن تؤدي إضافة نظام دلو لتجميع أطوال الإدخال المتشابهة معًا إلى تحسين سرعة التدريب بشكل كبير.