بقلم ماهر أوصال

to كيف تبني منظمة العفو الدولية للمحادثة الحديثة من خلال نظام نقل التعلم

قبل بضع سنوات ، قد يستغرق إنشاء دردشة - كما كانت محدودة في ذلك الوقت - عدة أشهر ، من تصميم القواعد إلى كتابة الآلاف من الإجابات في الواقع لتغطية بعض مواضيع المحادثة.

مع التقدم الذي أحرز مؤخراً في التعلم العميق لـ NLP ، يمكننا الآن التخلص من هذا العمل التافه وبناء الذكاء التحادثي الأقوى بكثير في غضون ساعات - كما سترى في هذا البرنامج التعليمي.

لقد أعددنا عرضًا تجريبيًا لتشغيل النموذج المبتكر الذي سنبنيه معًا في هذا البرنامج التعليمي على convai.huggingface.co. تأكد من التحقق من ذلك!
عرض توضيحي عبر الإنترنت للنموذج القبلي الذي سنبنيه في هذا البرنامج التعليمي على convai.huggingface.co. يتم دعم

إليك ما سنتعلمه ونلعب معه اليوم:

  • كيف يمكنك استخدام Transfer Learning لإنشاء وكيل حوار حديث على أساس نماذج لغة OpenAI GPT و GPT-2 Transformer ،
  • كيف يمكنك إعادة إنتاج النموذج الذي استخدمناه في مسابقة الحوار NeurIPS 2018 ConvAI2 التي فازت في مسار المقاييس التلقائية ،
  • كيف قمنا بتقطير 3k + سطر من رمز المنافسة في أقل من 250 سطرًا من كود التدريب المعلق (مع خيارات موزعة و FP16!) ، و
  • كيف يمكنك تدريب هذا النموذج بأقل من 20 دولارًا في حالة سحابة ، أو مجرد استخدام نموذج التدريب المفتوح المصدر الخاص بنا.
جنبا إلى جنب مع هذا المنشور ، أصدرنا قاعدة رمز نظيفة وعلق مع نموذج prerained! تحقق من جيثب الريبو هنا

بدأت قصة هذا المنشور قبل بضعة أشهر في مونتريال ، حيث احتل Hugging Face المرتبة الأولى في المسار التلقائي لتحدي الذكاء التحادثي 2 (ConvAI2) ، وهي مسابقة حوار في NeurIPS 2018.

كانت صلصة السرية الخاصة بنا نموذجًا واسع النطاق للغة تم تدريبه مسبقًا ، وهو OpenAI GPT ، إلى جانب تقنية ضبط التعلم من Transfer Transfer.

مع الوتيرة السريعة للمنافسة ، انتهى بنا الأمر بأكثر من 3 آلاف سطر من التعليمات البرمجية لاستكشاف العديد من المتغيرات التدريبية والهندسية.

من الواضح أن نشر هذا الكود الخام لم يكن عادلاً.

في هذه الأثناء ، بدأنا في إنشاء مستودع مفتوح المصدر لنماذج تعلم النقل تسمى pytorch-pretrained-BERT والتي تم تنزيلها أكثر من 150 ألف مرة وعرضت تطبيقات لنماذج اللغة الواسعة النطاق مثل OpenAI GPT وخلفها GPT-2

قبل بضعة أسابيع ، قررت إعادة صياغة رمز المنافسة الخاص بنا في قاعدة تعليمات برمجية نظيفة ومعلَّقة مبنية على أساس PETorch-pretrained-BERT وكتابة منشور تفصيلي للمدونة يشرح منهجنا ورمزنا.

لذلك نحن هنا ، دعنا نغطس في

منظمة العفو الدولية مع شخصية

سنبني منظمة العفو الدولية للمحادثة مع شخصية.

سيكون لدى وكيل الحوار لدينا قاعدة معرفة لتخزين بعض الجمل التي تصف من هو (شخصية) ومحفوظات الحوار. عندما يتم استلام خطاب جديد من أحد المستخدمين ، سيقوم الوكيل بدمج محتوى قاعدة المعرفة مع الكلام الذي تم استلامه حديثًا لإنشاء رد.

هنا هو المخطط العام:

عندما ندرب وكلاء حوار يستند إلى التعلم العميق ، بطريقة شاملة ، فإننا نواجه مشكلة كبيرة:

مجموعات بيانات الحوار صغيرة ومن الصعب أن تتعلم ما يكفي عن اللغة والحس السليم منها لتتمكن من توليد استجابات بطلاقة وذات صلة.

تحاول بعض الطرق حل هذا الأمر عن طريق تصفية إخراج النموذج لتحسين الجودة باستخدام بحث الحزمة الذكية. هنا سنتخذ مسارًا آخر جمع اهتمامًا كبيرًا على مدار الأشهر الماضية: نقل التعلم.

الفكرة وراء هذا النهج بسيطة للغاية:

  • ابدأ بتدريس نموذج اللغة على مجموعة كبيرة جدًا من النص لتتمكن من توليد فترات طويلة من النص المترابط المتجاور ،
  • قم بضبط نموذج اللغة هذا لتكييفه مع مهمتنا النهائية: الحوار.

تعتبر عملية تخويل نموذج اللغة عملية باهظة الثمن ، لذلك من الأفضل عادة البدء من نموذج تم تجريبه بالفعل وتوظيفه من مصادر مفتوحة.

ماذا سيكون نموذجا جيدا قبل التدريب لغرض هدفنا؟

كلما كان ذلك أفضل ، ولكننا نحتاج أيضًا إلى نموذج يمكنه إنشاء نص. إن نموذج NLP الأكثر استخدامًا قبل التدريب ، BERT ، يتم إجراؤه على جمل كاملة فقط ولا يمكنه إكمال الجمل غير المكتملة. نموذجان آخران ، مفتوحان من OpenAI ، هما أكثر إثارة للاهتمام لحالة الاستخدام لدينا: GPT & GPT-2.

دعونا نلقي نظرة سريعة عليهم

نماذج OpenAI GPT و GPT-2

في عامي 2018 و 2019 ، افتتح أليك رادفورد وجيفري وو وزملاؤهم في OpenAI المصادر المفتوحة لنموذجين للغة تم تدريبهم على كمية كبيرة جدًا من البيانات: GPT و GPT-2 (حيث GPT تعني المحول العام التوافقي المسبق).

وحدة فك الترميز / محول السببية يحضر إلى السياق الأيسر لإنشاء الكلمات التالية

GPT و GPT-2 هما نموذجان لغويان متشابهان للغاية يستندان إلى محول وتسمى هذه النماذج نماذج فك الترميز أو السببية مما يعني أنها تستخدم السياق الأيسر للتنبؤ بالكلمة التالية (انظر الشكل الأيسر).

تصف العديد من المقالات المنشورة والمدونات نماذج المحولات وكيفية استخدامها لآليات الاهتمام لمعالجة المدخلات المتسلسلة ، لذا لن أقضي وقتًا في تقديمها بالتفاصيل. بعض المؤشرات إذا لم تكن معتادًا على هذه الطرز: تعد شرائح EMNLP من Emma Strubell هي الشخصية المفضلة لدي ، وجاي ألمار "Illustrated Transformer" هو مقدمة مفصلة للغاية.

لغرضنا ، سيكون نموذج اللغة مجرد نموذج يأخذ كمدخلات متسلسلة من الرموز ويولد توزيع الاحتمالات على المفردات للرمز التالي الذي يلي تسلسل الإدخال. عادة ما يتم تدريب نماذج اللغة بطريقة متوازية ، كما هو موضح في الشكل أعلاه ، من خلال التنبؤ بالرمز المميز الذي يتبع كل رمز في تسلسل إدخال طويل.

تعتبر عملية تدشين هذه الطرز على مجموعة كبيرة عملية مكلفة ، لذلك سنبدأ من نموذج ورمز رمزي قبل OpenAI. سيعتني الرمز المميز بتقسيم سلسلة إدخال في الرموز (الكلمات / الكلمات الفرعية) وتحويل هذه الرموز المميزة في الأرقام الرقمية الصحيحة لمفردات النموذج.

في نموذج pytorch-pretrained-BERT OpenAI GPT ، يمكن بسهولة إنشاء الرمز المميز وتحميله من نقطة التفتيش قبل الاختبار مثل هذا:

ربما لاحظت أننا قمنا بتحميل نموذج يسمى OpenAI GPT Double Heads Model والذي يبدو أكثر تعقيدًا قليلاً من نموذج اللغة الذي تحدثنا عنه للتو وأنت على حق!

هذا لأننا نحتاج إلى تكييف نموذجنا للحوار. دعونا نرى كيف ستسير الامور!

model تكييف نموذج اللغة لمهمة الحوار

يتم تدريب نموذج اللغة لدينا مع إدخال واحد: سلسلة من الكلمات.

ولكن كما رأينا سابقًا ، في إعداد الحوار ، سيتعين على نموذجنا استخدام عدة أنواع من السياقات لإنشاء تسلسل إخراج:

  • جملة أو عدة جمل شخصية ،
  • تاريخ الحوار مع ما لا يقل عن الكلام الأخير من المستخدم ،
  • الرموز المميزة لتسلسل المخرجات التي تم إنشاؤها بالفعل منذ أن أنشأنا كلمة تسلسل الإخراج بكلمة.
كيف يمكننا بناء مدخلات لنموذجنا من هذه السياقات المختلفة؟

الإجابة البسيطة هي فقط لسَلسَلة مقاطع السياق في تسلسل واحد ، ووضع الرد في النهاية. يمكننا بعد ذلك إنشاء إكمال الرمز المميز للرد بواسطة الرمز المميز من خلال متابعة التسلسل:

تسلسل الإدخال: تسلسل للشخصية (الأزرق) ، والتاريخ (الوردي) والرد (الأخضر) مع المحددات (وردي فاتح). هنا نقوم بإنشاء كلمة

هناك مشكلتان في هذا الإعداد البسيط:

  • محول لدينا هو لون أعمى! تعطي الرموز المميزة المحددة فقط فكرة ضعيفة عن الجزء الذي تنتمي إليه كل كلمة. على سبيل المثال ، تتم الإشارة إلى كلمة "NYC" باللون الأزرق (persona) في الرسم التوضيحي الخاص بنا ولكن نموذجنا سيواجه صعوبة في استخراج هذه المعلومات من المحددات وحدها: يجب أن نضيف مزيدًا من المعلومات حول القطاعات.
  • محول لدينا هو موقف أعمى! الانتباه هو منتج نقطي متماثل ، لذا يجب علينا إضافة معلومات موضع لكل رمز.

تتمثل إحدى الطرق السهلة لإضافة هذه المعلومات في إنشاء ثلاثة متواليات مدخلات متوازية لكلمة ، وموضع ، وشرائح ، ودمجها في تسلسل واحد ، مع تلخيص ثلاثة أنواع من الزخارف: كلمة ، موضع ، ومقاطع زفاف:

تلخيص ثلاثة أنواع من مدخلات حفلات الزفاف تشير إلى الكلمات (الرمادي) والموضع (التدرج) والشرائح (الأزرق / الوردي / الأخضر)

كيف ننفذ هذا؟

أولاً ، سنضيف رموزًا خاصة لمفرداتنا الخاصة بالمحددات ومؤشرات المقطع. لم تكن هذه الرموز المميزة جزءًا من تدريبنا النموذجي لذلك سنحتاج إلى إنشاء وتدريب حفلات زفاف جديدة لهم.

تعد إضافة الرموز المميزة والزخارف الجديدة إلى المفردات / النموذج أمرًا بسيطًا جدًا مع فصول pytorch-pretrained-BERT. دعنا نضيف خمسة رموز خاصة إلى مفردات ومفردات رمز الرمز المميز لدينا:

تضيف طرق الرموز المميزة هذه ، على التوالي ، الرموز المميزة الخمس الخاصة بنا إلى مفردات الرمز المميز وخلق خمسة زخارف إضافية في النموذج.

الآن لدينا كل ما نحتاج إليه لبناء تسلسل مدخلاتنا من سياقات الشخصية والتاريخ وبدء الرد. اليك مثال بسيط:

losses خسائر متعددة المهام

لقد قمنا الآن بتهيئة نموذج ما قبل التدريب الخاص بنا وبناء مدخلاتنا التدريبية ، كل ما تبقى هو اختيار خسارة لتحسينها أثناء التحسين.

سنستخدم خسارة متعددة المهام تجمع بين نمذجة اللغة وهدف تنبؤ الجملة التالية.
هدف الجملة التالية للتنبؤ هو جزء من اختبار بيرت التدريبي. وهو يتألف من عينات مشتت عشوائيًا من مجموعة البيانات وتدريب النموذج على التمييز بين ما إذا كان تسلسل الإدخال ينتهي برد ذهبي أو مشتت. إنه يدرب النموذج على النظر إلى الأجزاء العالمية بمعنى إلى جانب السياق المحلي.

الآن ترى لماذا قمنا بتحميل نموذج "مزدوج الرأس". يقوم أحد الرؤوس بحساب توقعات نمذجة اللغة بينما يتنبأ الرأس الآخر بتسمية تصنيف الجملة التالية. دعنا نلقي نظرة على كيفية حساب الخسائر:

الهدف التدريبي متعدد المهام - يتم تزويد النموذج برأسين للتنبؤ بنمذجة اللغة (برتقالي) وتصنيف الجملة التالية (الأزرق)

ستكون الخسارة الإجمالية هي المبلغ المرجح لخسارة نمذجة اللغة وخسارة التنبؤ في الجملة التالية والتي يتم حسابها على النحو التالي:

  • نمذجة اللغة: نحن نعرض الحالة الخفية على مصفوفة تضمين الكلمة للحصول على السجلات وتطبيق خسارة الانتروبيا على جزء من الهدف المطابق للرد الذهبي (الملصقات الخضراء في الشكل أعلاه).
  • تنبؤ الجملة التالية: نمرر الحالة الخفية للرمز الأخير (رمز نهاية التسلسل) من خلال طبقة خطية للحصول على درجة وتطبيق خسارة الانتروبيا لتصنيف إجابة ذهبية بشكل صحيح بين المشتتات.

دعونا نرى كيف يمكننا ترميز هذا:

لدينا الآن جميع المدخلات التي يتطلبها نموذجنا ، ويمكننا تشغيل التمرير الأمامي للنموذج للحصول على الخسارة والخسارة الكلية (كمبلغ مرجح):

نحن على استعداد لبدء التدريب

التدريب على مجموعة بيانات الحوار

استخدمت مسابقة ConvAI2 مجموعة بيانات مثيرة للاهتمام تم إصدارها بواسطة Facebook العام الماضي: PERSONA-CHAT.

إنها عبارة عن مجموعة كبيرة من مجموعات الحوار (مربعات حوار 10 آلاف) والتي تم إنشاؤها من خلال التعهيد الجماعي للجمل الشخصية وطلب من العمال الزائرين المقترنين التحدث عبر الدردشة أثناء لعب جزء من شخصية معينة (يتم تقديم مثال على الشكل الأيسر).

تتوفر مجموعة البيانات هذه بتنسيق نص رمزي خام في مكتبة ParlAI الرائعة على Facebook. للتمهيد لك ، قمنا أيضًا بتحميل إصدار منسق من JSON يمكنك تنزيله وإدخال الرمز المميز باستخدام الرمز المميز لـ GPT مثل هذا:

توفر نسخة JSON من PERSONA-CHAT وصولاً سريعًا إلى جميع المدخلات ذات الصلة لتدريب نموذجنا كقاموس متداخل من القوائم:

تنظيم إصدار JSON من PERSONA-CHAT

باستخدام إطار إشعال PyTorch الرائع وواجهة برمجة التطبيقات (API) الجديدة للدقة التلقائية المختلطة (FP16 / 32) المقدمة من قمة NVIDIA ، تمكنا من استخلاص خطوط 3K من رمز المنافسة في أقل من 250 سطرًا من رمز التدريب مع خيارات موزعة و FP16!

لقد غطينا الأجزاء الأساسية من الشفرة في gist أعلاه ، لذلك لن أسمح لك فقط بقراءة الكود الذي تم التعليق عليه لترى كيف يناسب الجميع.

رمز التدريب (train.py) هنا ➱

يستغرق تدريب هذا النموذج على مثيل AWS باستخدام GPU 8 V100 أقل من ساعة (حاليًا أقل من 25 دولارًا على أكبر نسخة AWS p3.16xlarge) ويعطي نتائج قريبة من SOTA التي تم الحصول عليها خلال مسابقة ConvAI2 مع Hits @ 1 على 79 ، حيرة من 20.5 و F1 من 16.5.

تشرح بعض الاختلافات الدرجات الأقل قليلاً مقابل نموذج المنافسة لدينا ، ويتم تفصيلها في الملف التمهيدي لـ repo code هنا وتتألف في الغالب من التغيير والتبديل في عمليات تزيين الموضع واستخدام وحدة فك ترميز مختلفة.

التحدث مع النموذج - وحدة فك الترميز

إن الشيء المذهل في نماذج الحوار هو أنه يمكنك التحدث معهم

للتفاعل مع نموذجنا ، نحتاج إلى إضافة شيء واحد: وحدة فك ترميز من شأنها بناء تسلسل كامل من التنبؤات الرمزية التالية لطرازنا.

لقد حدثت الآن تطورات مهمة للغاية في أجهزة فك التشفير على مدار الأشهر القليلة الماضية ، وأردت تقديمها سريعًا هنا لإطلاعك على آخر التطورات.

كان أكثر جهازي الشفرات شيوعًا لتوليد اللغة هما فك التشفير الجشع والبحث عن الشعاع.

توليد كلمة جملة بكلمة (مصدر)

إن فك التشفير الجشع هو أبسط طريقة لإنشاء جملة: في كل خطوة زمنية ، نختار الرمز التالي الأكثر احتمالًا وفقًا للنموذج حتى نصل إلى الرموز المميزة في نهاية التسلسل. أحد المخاطر في فك التشفير الجشع هو أن رمز مميز محتمل للغاية قد يكون مختبئًا بعد رمز مميز قليل الاحتمال ويضيع.

حاول Beam-search تخفيف هذه المشكلة عن طريق الحفاظ على حزمة من عدة سلاسل محتملة نقوم ببناء كلمة تلو الأخرى. في نهاية العملية ، نختار أفضل جملة بين الحزم. على مدار السنوات القليلة الماضية ، كان البحث عن الشعاع خوارزمية فك التشفير القياسية لجميع مهام توليد اللغة تقريبًا بما في ذلك مربع الحوار (انظر الأخيرة [1]).

ومع ذلك حدثت عدة تطورات في 2018 / أوائل 2019. أولاً ، كان هناك دليل متزايد على أن البحث عن الشعاع كان حساسًا بشدة لطول المخرجات ويمكن الحصول على أفضل النتائج عندما يتم التنبؤ بطول المخرجات قبل فك التشفير ([2 ، 3] في EMNLP 2018). في حين أن هذا أمر منطقي بالنسبة للمهام ذات الإنتروبيا المنخفضة مثل الترجمة حيث يمكن التنبؤ بطول تسلسل الإخراج تقريبًا من المدخلات ، إلا أنه يبدو تعسفيًا للمهام عالية الإنتروبيا مثل الحوار وتوليد القصص حيث تكون المخرجات ذات الأطوال المختلفة على نطاق واسع صالحة عادةً.

في موازاة ذلك ، نُشرت ورقتان مؤثرتان على الأقل ([4 ، 5]) عن مهام توليد الانتروبيا العالية ، حيث تم استبدال فك تشفير البحث عن الجشع / الشعاع بأخذ عينات من التوزيع الرمزي التالي في كل خطوة زمنية. استخدمت هذه الأوراق نوعًا مختلفًا من أخذ العينات يُسمى أخذ العينات top-k ، حيث أخذت عينة وحدة فك الترميز فقط من الرموز الأكثر احتمالا من الأعلى k (k هي معلمة مفرطة).

آخر حجر في هذا الاتجاه الحديث للعمل هو الدراسة التي نشرها مؤخرًا أري هولتزمان وآخرون. [6] التي أظهرت أن توزيعات الكلمات في النصوص التي تم إنشاؤها باستخدام البحث عن الحزمة وفك الترميز الجشع مختلفة تمامًا عن توزيعات الكلمات في النصوص التي يولدها الإنسان. بوضوح ، تفشل عملية البحث عن الحزمة وفك التشفير الجشع في إعادة إنتاج بعض الجوانب التوزيعية للنصوص البشرية كما لوحظ في [7 ، 8] في سياق أنظمة الحوار:

يسار: الاحتمالية المخصصة للرموز التي أنشأها البشر والبحث في الحزمة باستخدام GPT-2 (لاحظ التباين القوي في النص البشري غير المستنسخ بواسطة البحث عن الشعاع). إلى اليمين: توزيعات N-gram في النصوص التي يتم إنشاؤها بواسطة الإنسان والآلة (لاحظ الفصل الكامل بين أساليب البحث عن الجش / الشعاع وفك تشفير العينات).

حاليا ، المرشحان الواعدان الأكثر نجاحًا في فك تشفير البحث عن الحزمة / الجشع هما أخذ العينات من أعلى ك ونواة (أو أعلى ع). يتمثل المبدأ العام لهاتين الطريقتين في أخذ عينات من التوزيع التالي للرمز بعد تصفية هذا التوزيع للحفاظ على الرموز المميزة من الأعلى إلى الأعلى (top-k) أو الرموز المميزة الأعلى ذات الاحتمال التراكمي فقط فوق العتبة (النواة / top-) ع).

إليك الطريقة التي يمكننا بها فك تشفير استخدام أخذ العينات top-k و / أو أخذ العينات nucleus / top-p:

نحن الآن على استعداد للتحدث مع نموذجنا

النص التفاعلي موجود هنا (react.py) وإذا كنت لا ترغب في تشغيل البرنامج النصي ، فيمكنك أيضًا تشغيل العرض التوضيحي المباشر الخاص بنا الموجود هنا

هنا مثال على الحوار:

مثال على استخدام البرامج النصية التفاعلية مع الإعدادات الافتراضية - شخصية بوت: أقرأ عشرين كتابًا سنويًا. أنا حيلة ضعف وظيفتي الثانية. أنا فقط أكل كوشير. لقد تربيت في أسرة واحدة الوالد.

الخاتمة

لقد وصلنا إلى نهاية هذا المنشور الذي يصف كيف يمكنك إنشاء نظام حديث بسيط للمحادثة باستخدام التعلم الانتقالي ونموذج لغة واسع النطاق مثل OpenAI GPT.

كما تعلمنا في Hugging Face ، فإن تشغيل الذكاء الاصطناعي الخاص بك وتشغيله بسرعة هو أفضل وصفة للنجاح ، لذلك نأمل أن يساعد ذلك بعضًا منك!

تأكد من مراجعة العرض التوضيحي والكود المرتبط:

  • عرض حي هنا و
  • رمز مفتوح المصدر ونماذج prerained هنا.

كما هو الحال دائمًا ، إذا أعجبك هذا المنشور ، فامنحنا عددًا هائلاً لإعلامنا ومشاركة الأخبار من حولك!

المراجع:

[1] ^ أهمية استراتيجية البحث في نمذجة الحوار العصبي بقلم إيليا كوليكوف ، ألكسندر هـ. ميلر ، كيونغيون تشو ، جايسون ويستون (http://arxiv.org/abs/1811.00907)

[2] ^ Correcting Length Bias in Neural Machine Translation by Kenton Murray ، David Chiang (http://arxiv.org/abs/1808.10006)

[3] ^ Breaking the Beam Search Curse: A Study of (Re-) Scoring Methoding and Stopping Criteria for Neural Machine Translation by Yilin Yang، Liang Huang، Mingbo Ma (https://arxiv.org/abs/1808.09582)

[4] ^ جيل القصة العصبية الهرمية بقلم أنجيلا فان ، مايك لويس ، يان دوفين (https://arxiv.org/abs/1805.04833)

[5] ^ نماذج اللغة هي متعلمين متعدد المهام غير خاضعين للرقابة من قبل أليك رادفورد ، جيف وو ، ريون تشايلد ، ديفيد لوان ، داريو أمودي ، وإيليا سوتسكيفر (https://openai.com/blog/better-language-models/)

[6] ^ The Curious Case of Neural Text Degeneration by Ari Holtzman، Jan Buys، Maxwell Forbes، Yejin Choi (https://arxiv.org/abs/1904.09751)

[7] ^ Retrieve and Refine: Improved Sequence Generation Models For Dialogue by Jason Weston، Emily Dinan، Alexander H. Miller (https://arxiv.org/abs/1808.04776)

[8] ^ The Challenges Intelligence Challenge (ConvAI2) by Emily Dinan et al. (https://arxiv.org/abs/1902.00098)