注:このコードは積極的に維持されなくなりました。
このリポジトリには、次の論文のために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モデルは、2つの一般的な問題に悩まされています。1)暴露バイアスと2)列車/テスト測定間の矛盾。最近、補強学習(RL)の方法を使用することにより、SEQ2SEQモデルでこれら2つの問題を解決する際に、完全に新鮮な視点が現れました。これらの新しい研究では、RLの観点からのseq2seqの問題を調べようとします。また、意思決定におけるRLメソッドの力を組み合わせて、長い記憶を思い出す際にモデルをシーケンスする定式化を考え出そうとします。この論文では、RLの世界から深いニューラルネットワーク領域までの概念を組み合わせた最新のフレームワークのいくつかを要約し、複雑なSEQ2SEQタスクを解く際にこれら2つの領域が互いにどのように利益を得るかを説明します。最終的に、現在の既存のモデルの問題のいくつかと、より良いRLモデルでそれらを改善する方法についての洞察を提供します。また、抽象的なテキスト要約の複雑なタスクについてこのペーパーで説明するほとんどのモデルを実装するためのソースコードを提供します。
- Python 2.7を使用します
Python要件は次のようにインストールできます。
pip install -r python_requirements.txt
- Tensorflow 1.10.1
- CUDA 9
- Cudnn 7.1
https://github.com/abisee/cnn-dailymail
https://summari.es/
CNN-Dailymailデータセットをダウンロードし、このデータセットとニュースルームデータセットを前処理するヘルパーコードを提供しました。アクセスするには、このリンクを参照してください。
これらのデータセットの処理版を要約結果に使用することにより、ルージュの尺度が大幅に改善されたため、すべてのトレーニングにこれらの前処理ファイルを使用することを強くお勧めします。
このコードは、次の機能をサポートするさまざまなモードの一般的なフレームワークです。
Bengio et al。露出バイアスの問題を回避するためのスケジュールされたサンプリングのアイデアを提案しました。最近、Goyal et al。このモデルに存在するバックプロパゲーションエラーを解決するソフトアルグマックスを使用することにより、この方法の微分可能な関係を提案しました。また、Ranzato et al。露出バイアスの問題を回避するために、End2EndbackPropという別の簡単なモデルを提案しました。これらの各論文に基づいてモデルをトレーニングするには、次のように異なるフラグを提供します。
パラメーター デフォルト 説明 Scheduled_Sampling 間違い スケジュールされたサンプリングを行うかどうか sampling_probability 0 グラウンドトゥルースまたはモデル出力を選択するためのepsilon値 sixt_sampling_probability 間違い 固定サンプリング確率を使用するか、適応型を使用するか hard_argmax 真実 ソフトArgmaxまたはhard argmaxを使用するかどうか greedy_scheduled_sampling 間違い 貪欲なものを使用するか、出力にサンプルを使用するか、真の意味 e2ebackprop 間違い e2ebackpropアルゴリズムを使用して暴露バイアスを解決するかどうか アルファ 1 ソフトヨットの引数
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 Appleddedと同じ名前)にコピーされます。 イントラアデコーダー 間違い イントラアデコーダーの注意を使用するかどうか use_temporal_attention 真実 一時的な注意を使うかどうか matrix_attention 間違い マトリックスの注意を使用してください、eq。 2 https://arxiv.org/pdf/1705.04304.pdf ETA 0 RL/MLEスケーリング係数、1はRL損失を使用することを意味し、0はMLE損失を使用することを意味します sixed_eta 間違い グローバルステップに基づいてETAまたはAdaptiveに固定値を使用する ガンマ 0.99 RL報酬割引率 reward_function rouge_l/f_score ブルーまたはルージュメジャーのいずれか(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ここでは、評価には別のGPUを使用しますが、バッチの数を減らすと同じGPUを使用できます。実装では、評価には8のバッチサイズ8を使用しますが、評価ステップごとに、検証データセットを100回反復します。これは、800のバッチサイズで評価エラーを見つけることに似ています。これは、評価プロセスに必要なメモリを減らし、1つの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=FalsePaulus 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=TrueRougeを評価メトリックとして使用します。
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-estimates値を使用する dqn_layers 512,256,128 ddqn密な隠れ層サイズ。 512、256、および128サイズの3つの密な層が作成されます DQN_REPLAY_BUFFER_SIZE 100000 リプレイバッファのサイズ dqn_batch_size 100 DDQNモデルをトレーニングするためのバッチサイズ dqn_target_update 10000 10000ステップごとにターゲットQネットワークを更新します dqn_sleep_time 2 2秒ごとにDDQNモデルを訓練します DQN_GPU_NUM 1 DDQNをトレーニングするGPU番号 dueling_net 真実 デュエルネットワークを使用してモデルをトレーニングするかどうかhttps://arxiv.org/pdf/1511.06581.pdf dqn_polyak_averaging 真実 PolyAK平均化を使用してターゲットQネットワークパラメーターを更新するかどうか:psi^{prime} =(tau * psi^{prime})+(1-tau) * psi calculate_true_q 間違い 真のQ値を使用してDDQNをトレーニングするか、DDQNの推定値を使用してトレーニングするかどうか DQN_PRETRAIN 間違い 固定されたアクターモデルを使用してDDQNネットワークを前処理します DQN_PRETRAIN_STEPS 10000 DDQNを事前に訓練するためのステップ数
俳優criticモデルの一般的なフレームワークは次のとおりです。

実装では、アクターはポインタージェネレーターモデルであり、批評家は、ダブルディープQネットワーク(DDQN)を使用したQ値推定を最小限に抑える回帰モデルです。このコードは、DDQNトレーニングがメインスレッドとは異なるスレッド上にあるように実装されており、このネットワークのエクスペリエンスをアクターモデルから非同期に収集します。したがって、各バッチについて、DDQNトレーニングのために(batch_size * max_dec_steps)状態を収集します。優先順位のあるリプレイバッファーを実装しました。また、DDQNトレーニング中に、グラウンドトゥルースの要約に従って最良の部分的な報酬を持つ経験が含まれるように、常にミニバッチを選択します。真のQ推定に基づいてDDQNをトレーニングするオプションを追加し、このネットワークをトレーニングするためのスケジュールされたサンプリングプロセスを提供しました。真のQ推定を使用してDDQNをトレーニングすると、真のQ値の収集により、トレーニングの速度が大幅に低下することに注意してください。したがって、いくつかの反復に対してのみこれをアクティブにすることをお勧めします。 Bahdanauらによって示唆されているように。また、固定された事前に訓練された俳優を使用して、批評家モデルを最初に事前訓練し、次に同時に両方のモデルのトレーニングを開始することも良いことです。たとえば、次のコードセットを使用して、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=20000dueling_netフラグをアクティブにすることにより、Dueling Networkを使用してDDQNをトレーニングできます。さらに、 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=1dqn_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=1dqn_gpu_numオプションを使用して批評家に別のGPU番号を使用するだけで、あるGPUで俳優と別のGPUの批評家を実行できます。また、前述のように、真の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=1calculate_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がこのドキュメントを準備するのを助けてくれてありがとう。