Catatan: Kode ini tidak lagi dipertahankan secara aktif.
Repositori ini berisi kode yang dikembangkan di TensorFlow untuk makalah berikut:
Jika Anda menggunakan kode ini, mohon pertimbangkan mengutip makalah berikut:
@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}
}
Dalam beberapa tahun terakhir, model urutan-ke-urutan (SEQ2SEQ) digunakan dalam berbagai tugas dari terjemahan mesin, generasi tajuk, ringkasan teks, ucapan ke teks, untuk gambar generasi caption. Kerangka kerja yang mendasari semua model ini biasanya merupakan jaringan saraf yang dalam yang berisi encoder dan decoder. Encoder memproses data input dan decoder menerima output encoder dan menghasilkan output akhir. Meskipun hanya menggunakan model enkoder/decoder akan, sebagian besar waktu, menghasilkan hasil yang lebih baik daripada metode tradisional pada tugas yang disebutkan di atas, para peneliti mengusulkan peningkatan tambahan atas urutan ini untuk model urutan, seperti menggunakan model berbasis perhatian pada input, model generasi pointer, dan swadaya. Namun, semua model SEQ2SEQ ini menderita dua masalah umum: 1) bias paparan dan 2) ketidakkonsistenan antara pengukuran kereta/pengujian. Baru -baru ini sudut pandang yang benar -benar segar muncul dalam memecahkan dua masalah ini dalam model SEQ2SEQ dengan menggunakan metode dalam pembelajaran penguatan (RL). Dalam penelitian baru ini, kami mencoba melihat masalah SEQ2SEQ dari sudut pandang RL dan kami mencoba untuk menghasilkan formulasi yang dapat menggabungkan kekuatan metode RL dalam pengambilan keputusan dan urutan untuk mengurutkan model dalam mengingat ingatan panjang. Dalam makalah ini, kami akan merangkum beberapa kerangka kerja terbaru yang menggabungkan konsep dari dunia RL ke area jaringan saraf yang dalam dan menjelaskan bagaimana kedua bidang ini dapat mengambil manfaat satu sama lain dalam menyelesaikan tugas -tugas Seq2Seq yang kompleks. Pada akhirnya, kami akan memberikan wawasan tentang beberapa masalah model yang ada saat ini dan bagaimana kami dapat meningkatkannya dengan model RL yang lebih baik. Kami juga menyediakan kode sumber untuk mengimplementasikan sebagian besar model yang akan dibahas dalam makalah ini tentang tugas kompleks ringkasan teks abstraktif.
- Gunakan Python 2.7
Persyaratan Python dapat diinstal sebagai berikut:
pip install -r python_requirements.txt
- TensorFlow 1.10.1
- CUDA 9
- Cudnn 7.1
https://github.com/abisee/cnn-dailyMail
https://summari.es/
Kami telah menyediakan kode helper untuk mengunduh dataset CNN-DailyMail dan pra-proses dataset dan dataset ruang berita ini. Silakan merujuk ke tautan ini untuk mengaksesnya.
Kami melihat peningkatan besar pada ukuran Rouge dengan menggunakan versi diproses kami dari kumpulan data ini dalam hasil peringkasan, oleh karena itu, kami sangat menyarankan menggunakan file yang telah diproses ini untuk semua pelatihan.
Kode ini adalah kerangka kerja umum untuk berbagai mode berbeda yang mendukung fitur -fitur berikut:
Bengio et al. mengusulkan gagasan pengambilan sampel yang dijadwalkan untuk menghindari masalah bias paparan. Baru -baru ini, Goyal et al. mengusulkan hubungan yang dapat dibedakan dari metode ini, dengan menggunakan soft-argmax agak keras-argmax, yang memecahkan kesalahan propagasi belakang yang ada dalam model ini. Juga, Ranzato et al. Diusulkan model sederhana lain yang disebut End2EndBackProp untuk menghindari masalah bias paparan. Untuk melatih model berdasarkan masing -masing makalah ini, kami menyediakan bendera yang berbeda sebagai berikut:
Parameter Bawaan Keterangan Terjadwal_Sampling PALSU apakah akan melakukan pengambilan sampel yang dijadwalkan atau tidak sampling_probability 0 Nilai Epsilon untuk memilih output-kebenaran tanah atau model fixed_sampling_probability PALSU Apakah akan menggunakan probabilitas pengambilan sampel tetap atau adaptif hard_argmax BENAR Apakah akan menggunakan soft argmax atau hard argmax Greedy_scheduled_sampling PALSU Apakah menggunakan serakah atau sampel untuk output, benar berarti serakah E2eBackprop PALSU Apakah menggunakan algoritma E2EbackProp untuk menyelesaikan bias paparan alfa 1 Argumen Soft 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
Parameter Bawaan Keterangan rl_training PALSU Mulailah pelatihan kebijakan-gradien Convert_to_reinforce_model PALSU Konversi model pointer ke model penguat. Hidupkan ini dan jalankan dalam mode kereta api. Model pelatihan Anda saat ini akan disalin ke versi baru (nama yang sama dengan _cov_init ditambahkan) yang akan siap dijalankan dengan flag cakupan dihidupkan, untuk tahap pelatihan cakupan. intradecoder PALSU Gunakan perhatian intradecoder atau tidak use_temporal_attention BENAR Apakah akan menggunakan perhatian temporal atau tidak Matrix_attention PALSU Gunakan perhatian matriks, Persamaan. 2 di https://arxiv.org/pdf/1705.04304.pdf Eta 0 Faktor penskalaan RL/MLE, 1 berarti menggunakan kerugian RL, 0 berarti menggunakan kehilangan MLE fixed_eta PALSU Gunakan nilai tetap untuk ETA atau adaptif berdasarkan langkah global gamma 0.99 Faktor diskon hadiah RL imbalan_function rouge_l/f_score Baik bleu atau salah satu ukuran rouge (rouge_1/f_score, rouge_2/f_score, rouge_l/f_score)
Paulus et al. mengusulkan model-polis-gradien kritik untuk ringkasan teks abstrak. Gambar berikut mewakili cara kerja metode ini dan bagaimana kami mengimplementasikan metode ini:

Untuk mereplikasi percobaan mereka, kita dapat menggunakan set proses berikut:
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=FalseDi sini, kami menggunakan GPU yang berbeda untuk evaluasi, tetapi kami dapat menggunakan GPU yang sama jika kami mengurangi jumlah batch. Dalam implementasi kami, kami menggunakan ukuran batch 8 untuk evaluasi tetapi untuk setiap langkah eval, kami mengulangi dataset validasi 100 kali. Ini mirip dengan menemukan kesalahan evaluasi pada ukuran batch 800. Ini akan membantu mengurangi memori yang dibutuhkan oleh proses evaluasi dan memberikan opsi untuk menjalankan pelatihan dan evaluasi pada satu GPU.
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=FalseSeperti yang disarankan oleh Paulus et al, kami menggunakan transisi linier dari kehilangan silang ke kehilangan RL sehingga pada akhirnya kami benar-benar mengandalkan kehilangan RL untuk melatih model. Parameter ETA mengontrol transisi ini. Kami mengatur ETA menjadi ETA = 1/(iterasi Max RL).
Pertama, tambahkan parameter pelatihan yang diperlukan ke model:
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=TrueKemudian, mulailah menjalankan model dengan kehilangan pelatihan 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=TrueKami menggunakan Rouge sebagai metrik evaluasi.
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
Parameter Bawaan Keterangan ac_training PALSU Gunakan pembelajaran aktor-kritis oleh DDQN. dqn_scheduled_sampling PALSU Apakah akan menggunakan pengambilan sampel yang dijadwalkan untuk menggunakan estimasi model DDQN vs nilai-nilai Q-estimates yang sebenarnya dqn_layers 512.256.128 Ukuran lapisan tersembunyi DDQN padat. Ini akan membuat tiga lapisan padat dengan ukuran 512, 256, dan 128 dqn_replay_buffer_size 100000 Ukuran buffer replay dqn_batch_size 100 Ukuran batch untuk melatih model DDQN dqn_target_update 10000 Perbarui Target Jaringan Q Setiap 10000 Langkah dqn_sleep_time 2 Latih model ddqn setiap 2 detik dqn_gpu_num 1 Nomor GPU untuk melatih DDQN dueling_net BENAR Apakah akan menggunakan jaringan dueling untuk melatih model https://arxiv.org/pdf/1511.06581.pdf dqn_polyak_averaging BENAR Apakah akan menggunakan poliak rata-rata untuk memperbarui parameter jaringan q target: psi^{prime} = (tau * psi^{prime})+ (1-tau) * psi Calculated_true_q PALSU Apakah akan menggunakan nilai-Q sejati untuk melatih DDQN atau menggunakan perkiraan DDQN untuk melatihnya DQN_PRATRAIN PALSU Pretrain jaringan DDQN dengan model aktor tetap dqn_prain_steps 10000 Jumlah Langkah untuk Pra-Pelatihan DDQN
Kerangka umum untuk model aktor-kritis adalah sebagai berikut:

Dalam implementasi kami, aktor adalah model pointer-generator dan kritik adalah model regresi yang meminimalkan estimasi nilai-Q menggunakan jaringan Q ganda Deep Q (DDQN). Kode ini diimplementasikan sedemikian rupa sehingga pelatihan DDQN ada di utas yang berbeda dari utas utama dan kami mengumpulkan pengalaman untuk jaringan ini secara tidak sinkron dari model aktor. Oleh karena itu, untuk setiap batch, kami mengumpulkan (batch_size * max_dec_steps) menyatakan untuk pelatihan DDQN. Kami menerapkan buffer replay yang diprioritaskan. Dan selama pelatihan DDQN kami selalu memilih batch mini kami sehingga mereka berisi pengalaman yang memiliki hadiah parsial terbaik sesuai dengan ringkasan kebenaran tanah. Kami menambahkan opsi untuk melatih DDQN berdasarkan estimasi Q sejati dan menawarkan proses pengambilan sampel yang dijadwalkan untuk melatih jaringan ini. Harap dicatat bahwa pelatihan DDQN menggunakan Estimasi Q sejati akan secara signifikan mengurangi kecepatan pelatihan, karena pengumpulan nilai-Q sejati. Oleh karena itu, kami menyarankan untuk hanya mengaktifkan ini untuk beberapa iterasi. Seperti yang disarankan oleh Bahdanau et al. Juga baik untuk menggunakan aktor pra-terlatih tetap untuk melakukan pra-melatih model kritik terlebih dahulu dan kemudian mulai melatih kedua model, secara bersamaan. Misalnya, kita dapat menggunakan set kode berikut untuk menjalankan percobaan yang sama seperti 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 Kita dapat menggunakan jaringan duel untuk melatih DDQN dengan mengaktifkan bendera dueling_net . Selain itu, kami dapat memilih untuk memperbarui jaringan target menggunakan Polyak Averaging oleh dqn_polyak_averaging BENDERA.
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 Gunakan bendera dqn_pretrain_steps untuk menetapkan berapa banyak iterasi yang ingin Anda latih pra-pelatihan.
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 Kita dapat menjalankan aktor dalam satu GPU dan kritik di GPU lain hanya dengan menggunakan nomor GPU yang berbeda untuk kritik menggunakan opsi dqn_gpu_num . Juga seperti yang disebutkan sebelumnya, kita harus menghindari penggunaan Estimasi Q sejati untuk waktu yang lama, oleh karena itu, kami menggunakan estimasi yang sebenarnya untuk melatih DDQN hanya untuk 1000 iterasi.
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 Harap dicatat bahwa kami tidak menggunakan bendera calculate_true_q lagi.
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 Harap dicatat bahwa kita dapat menggunakan opsi seperti intradecoder , temporal_attention , E2EBackProp , scheduled_sampling , dll dalam model aktor-kritis juga. Menggunakan opsi ini akan membantu memiliki model aktor yang berkinerja lebih baik.
Terima kasih @Artorfi atas bantuannya untuk menyiapkan dokumentasi ini.