استخدام Neural Text Generation لتوليد النصوص

242

يعتبر الكمبيوتر أمياً حيث لا يستطيع القراءة أو الكتابة. تتطلب القراءة وصف للكلمات بدلالة مفاهيم من ثقافتنا وبديهيات في حياتنا، وتتطلب الكتابة وصف لهذه المفاهيم والبديهيات إلى كلمات. حالياً لا نستطيع إعطاء الكمبيوتر قدرة تمكنه من الفهم ولو مثل طفل صغير، ولكن مجال الذكاء الاصطناعي قد طور حديثاً طريقة يمكنها تمثيل المفاهيم فيما يدعى مجال المعاني space of meanings وأيضاً تمثل نقاط في space of meaning إلى الكلمات. وهذا يحاكي عملية القراءة والكتابة. تستخدم هذه الطريقة ال Neural Networks لذلك تسمى Neural Text Generation.

الرسم السابق يوضح ال neural text generation. ال world state هي تمثيل للسياق كصورة أو جملة. ال encoder هو neural network تحول التمثيل إلى meaning space. هذا ال meaning space هو مجال متجهات (vectors) مثل تمثيل الكلمات في word2vec. المتجهات هي مجموعة من الأرقام مثل الرسم البياني في إحداثيات (x,y)، لكن في ال meaning space هناك مئات الإحداثيات بدلاً من إثنين فقط. ال decoder هو أيضاً neural network، ويمكن أن يكون هناك أكثر من decoder، كلٌ يمثل نسخة مختلفة من المعنى في لغة أو نمط محدد.

هناك العديد من الاستخدامات لل neural text generation. يعتبر الطريقة الأعلى كفاءة في الترجمة الآلية، حيث ال world state هي الجمل في اللغة الأولى، التي تمثل في ال meaning space ثم نقوم بال decoding للغة أخرى أو عدة لغات. يستخدم أيضاً في ال chatbots، حيث الجمل المدخلة في الحوار تمثل في meaning space ثم يحولها ال decoder إلى رد مناسب. يستخدم كذلك في وصف الصور بالكلام image captioning، حيث الصور تمثل في meaning space ثم تترجم إلى وصف كلامي للصورة. يمكننا أيضاً ترجمة ال meaning space إلى أنماط مختلفة في الكتابة. تخيل لو أن موقعك يمكنه ضبطه بطريقة آلية حيث يلائم لغة وتفضيلات كل مستخدم بذاته.

بينما يعد ال neural text generation مفيد للغاية، إلا أنه محدود بسبب نقصه فهم البديهيات. عادة ما يكون غير دقيق؛ لو أنك سألت المساعد الشخصي الذكي (مثل Siri) أن يحجز موعد يوم الثلاثاء، فربما يحجزه يوم الأربعاء لأن في تمثيله معاني هذه الأيام متقاربة جداً. وأحياناً يرتكب أخطاء لا يقترفها إنسان أبداً. مثلاً، في توصيف الصور يمكنه الخلط بين فرشاة الأسنان ومضرب البيسبول! لكن هناك ما يدعو للتفاؤل، فال neural networks تزداد قوة وقدرة على التعلم من كميات أكبر من الداتا. وال meaning space يقرب من تمثيل مفاهيم مثل الطفل الصغير، وعندها سنصل إلى مستوى من القراءة والكتابة مثل الأطفال. نحن نحبو كالأطفال في اتجاه الذكاء الحقيقي.

هذا المقال سيعرض ال neural text generation. سنبدأ بال sequence-to-sequence models، التي تقوم بعملية encoding للجمل المعطاة ثم تحولها بعملية decoding إلى الجمل المطلوبة، كما في الترجمة بين لغتين.

التعلم من أزواج من الجمل: Sequence-to-Sequence Models

مقدمة Seq2Seq

نموذج ال sequence-to-sequence (seq2seq) يتكون من encoder وdecoder، ويقوم بتحويل سلسلة من الكلمات إلى سلسلة أخرى من الكلمات. يقوم ال encoder بتحويل السلسلة الأولى من الكلمات (كجملة أو فقرة) إلى متجه في ال meaning space، ثم يحول ال decoder هذا المتجه إلى السلسلة الثانية من الكلمات (كجملة في لغة أخرى). عادة ما يكون ال encoder وال decoder من نوع recurrent neural network (RNN) ولكن هناك أنواع أخرى مثل ال convolutional. من أشهر استخدامات ال seq2seq هي الترجمة الآلية.

في الرسم التالي نرى عملية ال encoding. كلما أدخلت كلمة على ال encoder، يجمعها مع متجه ال hidden state h. المتجه h4 هو آخر state ويمثل الجملة كلها. يقع المتجه h4 في ال meaning space حيث يعبر عن معنى الجملة كلها.

أما ال decoding نراه في الرسم التالي. نبدأ من h4 الناتج من الخطوة السابقة. ثم نستخدم ال decoder لنولد أول كلمة، ثم يستخدم ال decoder ال state السابقة وآخر كلمة مولدة ليحَدِّث ال state الخاصة به h5. يظل ال decoder يولد الكلمات حتى يصدر رمز التوقف. نلاحظ أن عدد الكمات المولدة لا يشترط أن يكون مثل عدد الكلمات المدخلة. يقف ال decoder عند صدور رمز التوقف، في هذه الحالة النقطة “.”.

Encoders

إذا نظرنا إلى ال encoder وكيف يدخل الكلمات الجديدة في ال hidden state h، سنجد أن نماذج ال seq2seq تمثل الكلمات بمتجهات مخزنة في جدول للمفردات (embeddings)، هذا الجدول يمثل كل كلمة بمتجه له حجم ثابت، مثلا 300 بعد. في الحالة البسيطة، يكون هناك عدد ثابت من الكلمات (fixed vocabulary)، مثلا 50 ألف. فيكون لدينا جدول مرادفات من حجم 50,000 * 400 كما في الرسم التالي.

هذه المتجهات يتم تعلمها كجزء من عملية التعلم، وينتج عنها word vectors، مثل تلك التي تنتج عن word2vec. يمكننا أيضاً تقسيم الكلمات إلى أجزاء (sub-words) ونتعلم متجهات لهذه الأجزاء بدلاً من الكلمات. هذه الطريقة تمكننا من التعامل مع كلمات لم نرها من قبل، بينما في حالة العدد الثابت من الكلمات سنعامل كل الكلمات التي لم تظهر من قبل ككلمة مجهولة ونعطيها رمز ثابت مثل “UNK”. هناك طرق لمعرفة أفضل طريقة لتقسيم الكلمات لكن لا نستعرضها هنا.

بعد أن تحدثنا عن كيفية وصف الكلمات، لنرى كيف ندخلها في ال hidden state لل encoder. كل خلية (الدوائر الصفراء في الرسم) هي neural network لها معاملات، وكل خلية في ال encoder تشارك نفس المعاملات مع باقي الخلايا. المخرج من الخلية يدخل ثانية في نفس الخلية، ولهذا تسمى recurrent أي متكررة. في الرسومات التالية نراها وكأنها منبسطة unrolled.

ملحوظة: هذا توضيح لأبسط صور ال recurrent من أجل التوضيح. عادة ما نستخدم الأكثر تعقيداً LSTM أو GRU.

Decoders

يقوم ال decoder بعملية فك unrolling للمتجه في ال meaning space إلى الجملة المخرجة. نوضح خلية decoder بالأسفل.

يقوم ال decoder بتوليد probability distribution على الكلمات التي يصدرها في كل خطوة، كما يولد ال state التالية. في الحالة البسيطة، نقوم بضرب ال state h بمصفوفة بحجم 300 * 50,000. الناتج هو متجه بحجم 50,000 الذي نقوم بتحويله ل probability distribution على جميع الكلمات. يمكن حينها اختيار الكلمة الأعلى احتمالاً.

كيف يمكننا استخدام أزواج من الجمل لتعلم ال encoder وال decoder؟ أبسط طريقة هي استخدام ال teacher forcing. يستغل ال teacher forcing أننا نعرف الكلمة الصحيحة عند كل خطوة. نحسب ال error باستخدام ال negative log likelihood لاحتمالية أن يصدر النموذج الكلمة الصحيحة في الخطوة الحالية. نستخدم ال backpropagation لنضبط معاملات ال decoder ومن ثم ال encoder. تطبيق هذه العملية للتعلم قد يكون معقداً، لكن لحسن الحظ يمكننا استخدام المكتبات مثل Tensorflow وPyTorch.

بعد انتهاء تعلم ال neural network، نستطيع استخدامها على جمل لم ترها من قبل. هذه المرحلة أحياناً تسمى inference. في هذه المرحلة لا يكون لدينا الإجابة الصحيحة عند كل مرحلة. يمكن الاعتماد في كل خطوة على الكلمة الأعلى احتمالية (greedy) ولكن هذه قد يؤدي لنتائج سيئة. طريقة أخرى هي أن نولد جميع تسلسلات الكلمات بطول معين ونأخذ التسلسل الأعلى احتمالية بمجمله، ولكن هناك عدد كبير جداً من التسلسلات ما يجعل هذه الطريقة غير واقعية. الحل الوسط هو ال beam search. نبدأ بتوليد الكلمة الأولى ونبقى أعلى 10 كلمات احتمالية، ثم نضيف عليهم في الخطوة التالية. أحيانا تكون هناك مشاكل في الجمل الناتجة عنه وهناك تعديلات اقترحت لتحسينه.

Attention

نلاحظ في ال encoder وال decoder أن حجم ال state vector h يظل كما هو حتى حينما ندخل المزيد من الكلمات. هذا يبدو مخالف للبديهي، فلابد أنه يضيع جزء من المعلومات كلما زادت. هذا يحدث بالفعل! من طرق حل هذه المشكلة هي ال attention، كما في الرسم التالي.

في الخطوة السادسة، حينما نبدأ عملية الكتابة، يعطينا ال attention القدرة على النظر في كل ال encoded states السابقة وليس الأخيرة فقط h5 كما شرحنا مسبقاً. نأخذ weighted average لهذه المتجهات، ونتعلم هذه ال weights أثناء عملية التعلم. الرسم التالي يوضح كيف نستخدم ال attention مع ال seq2se2.

يعطي ال attention نتائج مذهلة، لدرجة أن هناك نموذج لا يستخدم إلا ال attention.

تطبيقات ال seq2seq

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

يمكن تعميم الفكرة لتستخدم في ال image captioning. كل ما نحتاجه هو تبديل ال encoder ب convolutional neural network للصور. بالطبع نحتاج داتا لكثير من الصور مع وصفها الكلامي.

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

المصادر:

https://blog.usejournal.com/generating-natural-language-text-with-neural-networks-e983bb48caad

تعليقات