في هذا المشروع قمت بتدريب نموذج محول لتوليد نكت قصيرة. ثم مع تعديل طفيف لطريقة الاستدلال، تمكنت من استخدام نفس النموذج بحيث يحاول النموذج إكماله بطريقة فكاهية، وذلك بالنظر إلى سلسلة أولية كمدخل.
هناك نوعان من دفاتر الملاحظات يقومان بنفس المهمة.
نتيجة جيل النكتة
نتيجة إكمال الجملة
نتائج
في مهمتنا سوف نستخدم مجموعة البيانات المتوفرة في Kaggle. إنه ملف CSV يحتوي على أكثر من 200000 نكتة قصيرة تم حذفها من Reddit.
ملحوظة: نظرًا لأن مجموعة البيانات تم حذفها ببساطة من مواقع فرعية مختلفة، فإن عددًا كبيرًا من النكات الموجودة في مجموعة البيانات عنصرية ومتحيزة جنسيًا. نظرًا لأن أي ذكاء اصطناعي يفترض أن بيانات التدريب الخاصة به هي مصدر واحد للمعرفة، فمن المتوقع أن يولد نموذجنا في بعض الأحيان نكاتًا مماثلة.
بمجرد أن نقوم بترميز سلسلة النكتة الخاصة بنا، نضيف رمز start_token
ورمز end_token
في نهاية القائمة المميزة. أيضًا، نظرًا لأن سلسلة النكتة الخاصة بنا يمكن أن تكون ذات أطوال مختلفة، فإننا أيضًا نطبق الحشو في جميع السلاسل على max_length
المحدد للطول بحيث تكون جميع الموترات ذات شكل مماثل في دفعاتنا.
يمكن العثور على الكود الخاص بذلك في دفتر الملاحظات Joke Generation.ipynb
. في هذا سنقوم باستيراد نموذج GPT2Tokenizer وTFGPT2LMHead من مكتبة HuggingFace. الكود مكتوب بلغة Tensorflow2. يحتوي دفتر الملاحظات على تعليقات تقدم شرحًا للكود في أماكن مناسبة. كما يوفر HuggingFace Docs توثيقًا جيدًا لماهية معلمات الإدخال وقيمة الإرجاع للنموذج. للاطلاع على التنفيذ القائم على PyTorch، راجع مستودع Tanul Singh's Humour.ai
يمكن العثور على الكود الخاص بذلك في دفتر الملاحظات Joke_Completion_Pure_TF2_Implementation.ipynb
. أخذ المشروع خطوة أخرى إلى الأمام لفهم أعمق لكيفية عمل الأشياء، حاولت بناء محول بدون مكتبة خارجية. لقد أشرت إلى البرنامج التعليمي الخاص بـ Transformers المقدم من Tensorflow وقمت بوضع بعض التوضيحات المذكورة في البرنامج التعليمي الخاص بهم في دفتر ملاحظاتي مع شرح إضافي حتى يكون من السهل فهم ما يجري.
لقد قمت أولاً بإنشاء رمز مميز لمجموعة البيانات الخاصة بنا وقمت بترميز السلاسل باستخدامه. بعد ذلك، قم ببناء طبقة Positional Encodings
و MultiHeadAttention
. كما استخدمت Lambda layer
لإنشاء الأقنعة المناسبة لبياناتنا.
ثم قمت بإنشاء decoder layer
واحدة لجهاز فك التشفير الخاص بنا. فيما يلي بنية طبقة وحدة فك ترميز واحدة.
بالنسبة لنموذج transformer
النهائي، فإنه يأخذ رموز الإدخال، ويمررها عبر طبقة lamda للحصول على القناع ويمرر كل من القناع والرموز إلى وحدة فك ترميز اللغة الخاصة بنا والتي يتم بعد ذلك تمرير مخرجاتها عبر طبقة كثيفة. فيما يلي بنية نموذجنا النهائي.