ملاحظة: لم يعد هذا الرمز يتم الحفاظ عليه بنشاط.
يحتوي هذا المستودع على الرمز الذي تم تطويره في TensorFlow للورقة التالية:
إذا استخدمت هذا الرمز ، يرجى التفكير في ذكر الورقة التالية:
@article{keneshloo2018deep,
title={Deep Reinforcement Learning For Sequence to Sequence Models},
author={Keneshloo, Yaser and Shi, Tian and Ramakrishnan, Naren and Reddy, Chandan K.},
journal={arXiv preprint arXiv:1805.09461},
year={2018}
}
في السنوات الأخيرة ، يتم استخدام نماذج التسلسل إلى التسلسل (SEQ2SEQ) في مجموعة متنوعة من المهام من الترجمة الآلية ، وتوليد العنوان ، وتلخيص النص ، والكلام إلى النص ، إلى توليد تسمية التوضيح للصور. عادةً ما يكون الإطار الأساسي لجميع هذه النماذج شبكة عصبية عميقة تحتوي على تشفير وفك تشفير. يقوم المشفر بمعالجة بيانات الإدخال ويتلقى وحدة فك الترميز إخراج المشفر وإنشاء الإخراج النهائي. على الرغم من أنه ببساطة استخدام نموذج تشفير/وحدة فك ترميز ، فإن معظم الوقت ، ينتج نتيجة أفضل من الأساليب التقليدية في المهام المذكورة أعلاه ، اقترح الباحثون تحسينات إضافية على هذه التسلسل إلى نماذج التسلسل ، مثل استخدام نموذج قائم على الاهتمام على مدخلات ونماذج تلوين المؤشرات ونماذج الاعتداء الذاتي. ومع ذلك ، فإن كل نماذج SEQ2SEQ هذه تعاني من مشكلتين شائعتين: 1) تحيز التعرض و 2) عدم الاتساق بين قياس القطار/الاختبار. ظهرت وجهة نظر جديدة تمامًا في حل هاتين المشكلتين في نماذج SEQ2SeQ باستخدام طرق في التعلم التعزيز (RL). في هذه الأبحاث الجديدة ، نحاول أن ننظر إلى مشاكل SEQ2Seq من وجهة نظر RL ونحاول التوصل إلى صياغة يمكن أن تجمع بين قوة أساليب RL في صنع القرار والتسلسل إلى نماذج التسلسل في تذكر الذكريات الطويلة. في هذه الورقة ، سنلخص بعضًا من أحدث الأطر التي تجمع بين مفاهيم RL World إلى منطقة الشبكة العصبية العميقة وشرح كيف يمكن أن يستفيد هذان المجالان من بعضهما البعض في حل مهام SEQ2SEQ المعقدة. في النهاية ، سنقدم رؤى حول بعض مشاكل النماذج الحالية الحالية وكيف يمكننا تحسينها مع نماذج RL أفضل. نقدم أيضًا الكود المصدري لتنفيذ معظم النماذج التي ستتم مناقشتها في هذه الورقة حول المهمة المعقدة المتمثلة في تلخيص النص الجذاب.
- استخدم بيثون 2.7
يمكن تثبيت متطلبات Python على النحو التالي:
pip install -r python_requirements.txt
- Tensorflow 1.10.1
- كودا 9
- كودن 7.1
https://github.com/abisee/cnn-dailymail
https://summari.es/
لقد قدمنا رموز مساعد لتنزيل مجموعة بيانات CNN-Dailymail ومعالجة مجموعة البيانات ومجموعة البيانات. يرجى الرجوع إلى هذا الرابط للوصول إليهم.
لقد رأينا تحسنًا كبيرًا في مقياس Rouge باستخدام نسختنا المعالجة من مجموعات البيانات هذه في نتائج التلخيص ، لذلك ، نقترح بشدة استخدام هذه الملفات المعالجة مسبقًا لجميع التدريب.
هذا الرمز هو إطار عام لمجموعة متنوعة من الأوضاع المختلفة التي تدعم الميزات التالية:
Bengio et al. اقترح فكرة أخذ العينات المجدولة لتجنب مشكلة تحيز التعرض. في الآونة الأخيرة ، Goyal et al. اقترح الاسترخاء المتفرق لهذه الطريقة ، من خلال استخدام Argmax الناعمة بالأحرى الصلبة ، الذي يحل خطأ الانتشار الخلفي الموجود في هذا النموذج. أيضا ، Ranzato et al. اقترح نموذجًا بسيطًا آخر يسمى End2endbackProp لتجنب مشكلة تحيز التعرض. لتدريب نموذج يعتمد على كل من هذه الأوراق ، نقدم أعلامًا مختلفة على النحو التالي:
المعلمة تقصير وصف Scheduled_sampling خطأ شنيع سواء كنت تفعل أخذ العينات المجدولة أم لا sampling_probability 0 قيمة Epsilon لاختيار الإخراج الأرضي أو النموذج exped_sampling_probability خطأ شنيع سواء كنت تستخدم احتمال أخذ العينات الثابت أو التكييف Hard_argmax حقيقي سواء كنت تستخدم Argmax الناعمة أو Argmax الصلبة greedy_scheduled_sampling خطأ شنيع سواء كنت تستخدم الجشع أو العينة للإخراج ، فإن True تعني الجشع e2ebackprop خطأ شنيع سواء كنت تستخدم خوارزمية E2EbackProp لحل تحيز التعرض ألفا 1 حجة Argmax الناعمة
CUDA_VISIBLE_DEVICES=0 python src/run_summarization.py --mode=train --data_path= $HOME /data/cnn_dm/finished_files/chunked/train_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=scheduled-sampling-hardargmax-greedy --batch_size=80 --max_iter=40000 --scheduled_sampling=True --sampling_probability=2.5E-05 --hard_argmax=True --greedy_scheduled_sampling=TrueCUDA_VISIBLE_DEVICES=0 python src/run_summarization.py --mode=train --data_path= $HOME /data/cnn_dm/finished_files/chunked/train_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=scheduled-sampling-softargmax-sampling --batch_size=80 --max_iter=40000 --scheduled_sampling=True --sampling_probability=2.5E-05 --hard_argmax=False --greedy_scheduled_sampling=False --alpha=10CUDA_VISIBLE_DEVICES=0 python src/run_summarization.py --mode=train --data_path= $HOME /data/cnn_dm/finished_files/chunked/train_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=scheduled-sampling-end2endbackprop --batch_size=80 --max_iter=40000 --scheduled_sampling=True --sampling_probability=2.5E-05 --hard_argmax=True --E2EBackProp=True --k=4
المعلمة تقصير وصف rl_training خطأ شنيع ابدأ التدريب على تدرج السياسة convert_to_reinforce_model خطأ شنيع تحويل نموذج المؤشر إلى نموذج تعزيز. قم بتشغيل هذا وتشغيله في وضع القطار. سيتم نسخ طراز التدريب الحالي الخاص بك إلى إصدار جديد (نفس الاسم مع _cov_init ملحق) سيكون جاهزًا للتشغيل مع تشغيل علامة التغطية ، لمرحلة تدريب التغطية. intredecoder خطأ شنيع استخدم اهتمام intredecother أو لا use_temporal_attention حقيقي سواء كنت تستخدم الاهتمام الزمني أم لا Matrix_attention خطأ شنيع استخدم اهتمام المصفوفة ، Eq. 2 في https://arxiv.org/pdf/1705.04304.pdf إيتا 0 عامل تحجيم RL/MLE ، 1 يعني استخدام فقدان RL ، 0 يعني استخدام MLE فقدان MLE ثابت خطأ شنيع استخدم قيمة ثابتة لـ ETA أو Adaptive بناءً على الخطوة العالمية جاما 0.99 عامل خصم مكافأة RL arward_function rouge_l/f_score إما bleu أو أحد مقاييس Rouge (Rouge_1/f_score ، Rouge_2/f_score ، Rouge_L/F_Score)
بولس وآخرون. اقترح نموذج تراهن السياسة الذاتي لتلخيص النص الجذاب. يمثل الشكل التالي كيفية عمل هذه الطريقة وكيف قمنا بتنفيذ هذه الطريقة:

لتكرار تجربتهم ، يمكننا استخدام مجموعة العمليات التالية:
CUDA_VISIBLE_DEVICES=0 python src/run_summarization.py --mode=train --data_path= $HOME /data/cnn_dm/finished_files/chunked/train_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=intradecoder-temporalattention-withpretraining --batch_size=80 --max_iter=20000 --use_temporal_attention=True --intradecoder=True --rl_training=Falseهنا ، نستخدم وحدة معالجة الرسومات المختلفة للتقييم ، ولكن يمكننا استخدام وحدة معالجة الرسومات نفسها إذا قللنا من عدد الدُفعات. في تنفيذنا ، نستخدم حجم دفعة 8 للتقييم ولكن لكل خطوة تقييم ، نكرر على مجموعة بيانات التحقق من صحة 100 مرة. هذا مشابه لإيجاد خطأ التقييم على حجم الدفعة 800. سيساعد ذلك على تقليل الذاكرة المطلوبة من خلال عملية التقييم وتوفير خيارات لتشغيل كل من التدريب وإجراء تقييم على وحدة معالجة الرسومات.
CUDA_VISIBLE_DEVICES=1 python src/run_summarization.py --mode=eval --data_path= $HOME /data/cnn_dm/finished_files/chunked/val_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=intradecoder-temporalattention-withpretraining --batch_size=8 --use_temporal_attention=True --intradecoder=True --rl_training=Falseكما اقترح Paulus et al ، نستخدم انتقالًا خطيًا من فقدان الإدخال المتقاطع إلى فقدان RL بحيث نعتمد تمامًا على فقدان RL لتدريب النموذج. المعلمة ETA تتحكم في هذا الانتقال. قمنا بتعيين ETA ليكون ETA = 1/(أقصى تكرار RL).
أولاً ، أضف معلمة التدريب المطلوبة إلى النموذج:
CUDA_VISIBLE_DEVICES=0 python src/run_summarization.py --mode=train --data_path= $HOME /data/cnn_dm/finished_files/chunked/train_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=intradecoder-temporalattention-withpretraining --batch_size=80 --max_iter=40000 --intradecoder=True --use_temporal_attention=True --eta=2.5E-05 --rl_training=True --convert_to_reinforce_model=Trueثم ، ابدأ تشغيل النموذج مع خسارة التدريب MLE+RL:
CUDA_VISIBLE_DEVICES=0 python src/run_summarization.py --mode=train --data_path= $HOME /data/cnn_dm/finished_files/chunked/train_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=intradecoder-temporalattention-withpretraining --batch_size=80 --max_iter=40000 --intradecoder=True --use_temporal_attention=True --eta=2.5E-05 --rl_training=TrueCUDA_VISIBLE_DEVICES=1 python src/run_summarization.py --mode=eval --data_path= $HOME /data/cnn_dm/finished_files/chunked/val_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=intradecoder-temporalattention-withpretraining --batch_size=8 --use_temporal_attention=True --intradecoder=True --rl_training=Trueنستخدم Rouge كمقاييس التقييم.
CUDA_VISIBLE_DEVICES=0 python src/run_summarization.py --mode=decode --data_path= $HOME /data/cnn_dm/finished_files/chunked/test_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=intradecoder-temporalattention-withpretraining --rl_training=True --intradecoder=True --use_temporal_attention=True --single_pass=1 --beam_size=4 --decode_after=0
المعلمة تقصير وصف ac_training خطأ شنيع استخدم التعلم الفاعل الناقد بواسطة DDQN. dqn_scheduled_sampling خطأ شنيع ما إذا كنت تريد استخدام أخذ العينات المجدولة لاستخدام تقديرات نموذج DDQN مقابل قيم Q الفعلية dqn_layers 512،256،128 DDQN حجم الطبقة الخفية الكثيفة. سيخلق ثلاث طبقات كثيفة بحجم 512 و 256 و 128 dqn_replay_buffer_size 100000 حجم المخزن المؤقت لإعادة التشغيل dqn_batch_size 100 حجم الدُفعة لتدريب نموذج DDQN dqn_target_update 10000 تحديث شبكة Q الهدف كل 10000 خطوة dqn_sleep_time 2 تدريب نموذج DDQN كل ثانيتين DQN_GPU_NUM 1 رقم GPU لتدريب DDQN Dueling_net حقيقي ما إذا كنت تريد استخدام شبكة المبارزة لتدريب نموذج https://arxiv.org/pdf/1511.06581.pdf dqn_polyak_averaging حقيقي ما إذا كان لاستخدام متوسط polyak لتحديث معلمات شبكة Q الهدف: psi^{prem} = (tau * psi^{prime})+ (1-tau) * psi حساب_true_q خطأ شنيع سواء كنت تستخدم قيم Q الحقيقية لتدريب DDQN أو استخدام تقديرات DDQN لتدريبها dqn_pretrain خطأ شنيع ما قبل الشبكة DDQN مع نموذج الممثل الثابت dqn_pretrain_steps 10000 عدد الخطوات لتدريب DDQN قبل
الإطار العام للنموذج الناقص الممثل هو كما يلي:

في تنفيذنا ، يكون الممثل هو نموذج المولود للمؤشر والناقد هو نموذج الانحدار الذي يقلل من تقدير قيمة Q باستخدام شبكة Q Double Deep (DDQN). يتم تنفيذ الرمز بحيث يكون تدريب DDQN في مؤشر ترابط مختلف عن الخيط الرئيسي ونجمع تجارب لهذه الشبكة بشكل غير متزامن من نموذج الممثل. لذلك ، لكل دفعة ، نجمع (Batch_size * max_dec_steps) لتدريب DDQN. قمنا بتنفيذ المخزن المؤقت لإعادة التشغيل الأولوية. وخلال تدريب DDQN ، نختار دائمًا دفعاتنا المصغرة بحيث تحتوي على تجارب لها أفضل مكافأة جزئية وفقًا لملخص الحقيقة الأرضية. لقد أضفنا خيارًا لتدريب DDQN استنادًا إلى تقدير Q الحقيقي وعرضنا عملية أخذ عينات مجدولة لتدريب هذه الشبكة. يرجى ملاحظة أن تدريب DDQN باستخدام تقدير Q الحقيقي سيقلل بشكل كبير من سرعة التدريب ، بسبب جمع القيم Q الحقيقية. لذلك ، نقترح تنشيط هذا فقط لبعض التكرارات. كما اقترح بهداناو وآخرون. من الجيد أيضًا استخدام ممثل ثابت تم تدريبه مسبقًا لتدريب نموذج الناقد أولاً ثم البدء في تدريب كلا النموذجين ، في وقت واحد. على سبيل المثال ، يمكننا استخدام المجموعة التالية من الرموز لتشغيل تجربة مماثلة مثل Bahdanau et al.:
CUDA_VISIBLE_DEVICES=0 python src/run_summarization.py --mode=train --data_path= $HOME /data/cnn_dm/finished_files/chunked/train_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=actor-critic-ddqn --batch_size=80 --max_iter=20000 يمكننا استخدام شبكة المبارزة لتدريب DDQN عن طريق تنشيط dueling_net . علاوة على ذلك ، يمكننا اختيار تحديث الشبكة المستهدفة باستخدام متوسط polyak بواسطة علامة dqn_polyak_averaging .
CUDA_VISIBLE_DEVICES=0,1 python src/run_summarization.py --mode=train --data_path= $HOME /data/cnn_dm/finished_files/chunked/train_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=actor-critic-ddqn --batch_size=80 --max_iter=21000 --ac_training=True --dueling_net=True --dqn_polyak_averaging=True --convert_to_reinforce_model=True --dqn_gpu_num=1 استخدم علامة dqn_pretrain_steps لتعيين عدد التكرار الذي تريده لتدريب الناقد مسبقًا.
CUDA_VISIBLE_DEVICES=0,1 python src/run_summarization.py --mode=train --data_path= $HOME /data/cnn_dm/finished_files/chunked/train_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=actor-critic-ddqn --batch_size=80 --ac_training=True --dqn_pretrain=True --dueling_net=True --dqn_polyak_averaging=True --dqn_gpu_num=1 يمكننا تشغيل الممثل في وحدة معالجة الرسومات والنقود في وحدة معالجة الرسومات الأخرى ببساطة باستخدام رقم وحدة معالجة الرسومات المختلفة للناقد باستخدام خيار dqn_gpu_num . كما ذكرنا من قبل ، يجب أن نتجنب استخدام تقدير Q الحقيقي لفترة طويلة ، لذلك ، نستخدم تقديرًا حقيقيًا لتدريب DDQN على 1000 تكرار فقط.
CUDA_VISIBLE_DEVICES=0,1 python src/run_summarization.py --mode=train --data_path= $HOME /data/cnn_dm/finished_files/chunked/train_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=actor-critic-ddqn --batch_size=80 --max_iter=22000 --ac_training=True --dueling_net=True --dqn_polyak_averaging=True --calculate_true_q=True --dqn_gpu_num=1 يرجى ملاحظة أننا لا نستخدم علامة calculate_true_q بعد الآن.
CUDA_VISIBLE_DEVICES=0,1 python src/run_summarization.py --mode=train --data_path= $HOME /data/cnn_dm/finished_files/chunked/train_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=actor-critic-ddqn --batch_size=80 --max_iter=40000 --ac_training=True --dueling_net=True --dqn_polyak_averaging=True --dqn_gpu_num=1CUDA_VISIBLE_DEVICES=0 python src/run_summarization.py --mode=decode --data_path= $HOME /data/cnn_dm/finished_files/chunked/test_ * --vocab_path= $HOME /data/cnn_dm/finished_files/vocab --log_root= $HOME /working_dir/cnn_dm/RLSeq2Seq/ --exp_name=actor-critic-ddqn --ac_training=True --dueling_net=True --dqn_polyak_averaging=True --dqn_gpu_num=1 --single_pass=1 --beam_size=4 يرجى ملاحظة أنه يمكننا استخدام خيارات مثل intradecoder ، temporal_attention ، E2EBackProp ، scheduled_sampling ، إلخ في النماذج الفاعلة الفاعلة أيضًا. سيساعد استخدام هذه الخيارات في الحصول على نموذج ممثل أفضل أداء.
شكرا astorfi لمساعدته في إعداد هذه الوثائق.