注意:此代碼不再積極維護。
該存儲庫包含在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)火車/測試測量之間的不一致。最近,通過使用增強學習方法(RL)在SEQ2SEQ模型中解決這兩個問題的一種完全新的觀點。在這些新研究中,我們試圖從RL的角度看SEQ2SEQ問題,並嘗試提出一種表述,該公式可以將RL方法在決策和序列中的力量結合到記憶長期記憶中的序列模型中。在本文中,我們將總結一些結合了從RL世界到深神經網絡領域的概念的最新框架,並解釋這兩個領域如何在解決複雜的SEQ2SEQ任務中彼此受益。最後,我們將提供有關當前現有模型的某些問題以及如何通過更好的RL模型改進它們的一些見解。我們還提供了用於實施大多數模型的源代碼,這些模型將在本文中討論有關抽象文本摘要的複雜任務。
- 使用Python 2.7
Python要求可以安裝如下:
pip install -r python_requirements.txt
- TensorFlow 1.10.1
- 庫達9
- Cudnn 7.1
https://github.com/abisee/cnn-dailmail
https://summari.es/
我們提供了輔助代碼來下載CNN-DailMail數據集並預處理此數據集和新聞編輯室數據集。請參閱此鏈接以訪問它們。
我們通過在摘要結果中使用這些數據集的加工版本,在胭脂度量上看到了很大的改進,因此,我們強烈建議使用這些預處理的文件進行所有培訓。
該代碼是各種支持以下功能的多種不同模式的一般框架:
Bengio等。提出了預定抽樣的想法,以避免暴露偏見問題。最近,Goyal等。通過使用Soft-Argmax相當硬的Argmax,提出了對該方法的可區分相關性,該相對於硬化誤差解決了此模型中存在的後傳播誤差。另外,Ranzato等。提出了另一個稱為End2EndbackProp的簡單模型,用於避免曝光偏置問題。要根據每篇論文培訓模型,我們提供不同的標誌,如下所示:
範圍 預設 描述 計劃_s採樣 錯誤的 是否進行計劃抽樣 Sampling_probability 0 選擇地面真相或模型輸出的Epsilon值 fixe_sampling_probability 錯誤的 是使用固定採樣概率還是自適應 hard_argmax 真的 是使用軟argmax還是硬grgmax greedy_scheduled_smpling 錯誤的 無論是使用貪婪還是樣品進行輸出,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附加的同名),該版本將準備運行,並打開覆蓋範圍,以便在覆蓋範圍訓練階段。 內部模塊 錯誤的 是否使用不關注核管模型 USE_TEMPORAL_ENTISTENTION 真的 是否使用暫時關注 matrix_ateention 錯誤的 使用矩陣注意,等式。 2在https://arxiv.org/pdf/1705.04304.pdf中 ETA 0 RL/MLE縮放係數,1表示使用RL損失,0表示使用MLE損失 fixed_eta 錯誤的 根據全球步驟使用固定值或自適應 伽瑪 0.99 RL獎勵折扣係數 獎勵_功能 rouge_l/f_score BLEU或ROUGE度量之一(Rouge_1/f_score,rouge_2/f_score,rouge_l/f_score)
Paulus等。提出了一種自我批評的政策梯度模型,用於抽象文本摘要。下圖表示該方法的工作原理以及我們如何實現此方法:

為了複製他們的實驗,我們可以使用以下一組過程:
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在這裡,我們使用不同的GPU進行評估,但是如果減少批次數量,我們可以使用相同的GPU。在實施中,我們使用批次大小為8進行評估,但是對於每個評估步驟,我們迭代驗證數據集100次。這類似於在800批次大小上找到評估誤差。這將有助於減少評估過程所需的內存,並為在一個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=False正如Paulus等人所建議的那樣,我們使用了從跨膜損失到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我們將胭脂作為評估指標。
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使用Actor-Critic學習。 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 每10000個步驟更新目標Q網絡 dqn_sleep_time 2 火車DDQN型號每2秒 dqn_gpu_num 1 GPU編號訓練DDQN dueling_net 真的 是否使用決鬥網絡訓練模型https://arxiv.org/pdf/1511.06581.pdf dqn_polyak_averaging 真的 是否要使用PolyAk平均來更新目標Q網絡參數:psi^{prime} =(tau * psi^{prime})+(1-tau) * psi 計算_true_q 錯誤的 是使用真正的Q值訓練DDQN還是使用DDQN的估計值訓練它 dqn_pretrain 錯誤的 用固定演員模型預處理DDQN網絡 dqn_pretrain_steps 10000 預先訓練DDQN的步驟數
參與者批評模型的一般框架如下:

在我們的實施中,演員是指針生成器模型,評論家是一種回歸模型,可將Q值估計最小化,使用雙重Q網絡(DDQN)。該代碼的實現使DDQN培訓與主線程不同,並且我們從Actor模型中不同步收集了該網絡的經驗。因此,對於每批,我們收集(批次_size * max_dec_steps)進行DDQN培訓。我們實施了優先的重播緩衝區。在DDQN培訓期間,我們始終選擇我們的迷你批次,以便根據基本真相的摘要,它們具有最好的部分獎勵的經驗。我們添加了基於真正的Q估計的培訓DDQN的選項,並提供了一個計劃訓練該網絡的計劃採樣過程。請注意,由於收集了真正的Q值,使用真實Q估計的訓練DDQN將大大降低訓練速度。因此,我們建議僅在一些迭代中激活它。如Bahdanau等人的建議。最好使用固定的預訓練的演員先預先培訓評論家模型,然後同時開始訓練這兩個模型。例如,我們可以使用以下一組代碼來運行與Bahdanau等人相似的實驗:
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我們可以使用Dueling網絡通過激活dueling_net標誌來訓練DDQN。此外,我們可以選擇使用dqn_polyak_averaging標誌的polyak平均來更新目標網絡。
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選項使用其他GPU編號來在另一個GPU中運行Actor,並在另一個GPU中運行Actor。另外,如前所述,我們應該避免長期使用真實的Q-估計,因此,我們使用真實的估計僅用於1000個迭代訓練DDQN。
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請注意,我們也可以在Actor-Critic模型中使用諸如intradecoder , temporal_attention , E2EBackProp , scheduled_sampling等選項。使用這些選項將有助於具有更好的性能演員模型。
感謝@astorfi在準備此文檔方面的幫助。