참고 :이 코드는 더 이상 적극적으로 유지되지 않습니다.
이 저장소에는 다음 논문에 대해 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 (Sequence-to-Sequence) 모델은 기계 번역, 헤드 라인 생성, 텍스트 요약, 텍스트, 이미지 캡션 생성에 이르기까지 다양한 작업에 사용됩니다. 이 모든 모델의 기본 프레임 워크는 일반적으로 인코더와 디코더를 포함하는 깊은 신경망입니다. 인코더는 입력 데이터를 처리하고 디코더는 인코더의 출력을 수신하고 최종 출력을 생성합니다. 인코더/디코더 모델을 사용하면 단순히 위에서 언급 한 작업에서 전통적인 방법보다 더 나은 결과를 얻을 수 있지만, 연구원들은 입력, 포인터 생성 모델 및 자체 변환 모델에 대한주의 기반 모델을 사용하는 것과 같은 시퀀스 모델에 대한 추가 개선을 제안했습니다. 그러나 이러한 모든 SEQ2SEQ 모델은 1) 노출 편견과 2) 열차/시험 측정 사이의 불일치입니다. 최근에 RL (Rensforcement Learning)에서 방법을 사용하여 SEQ2SEQ 모델에서 이러한 두 가지 문제를 해결하는 데 완전히 새로운 관점이 나타났습니다. 이 새로운 연구에서, 우리는 RL 관점에서 SEQ2SEQ 문제를 살펴 보려고 노력하고 있으며, 의사 결정에서 RL 방법의 힘을 결합하고 오랜 기억을 기억할 때 시퀀스 모델과 결합 할 수있는 공식을 제시하려고 노력합니다. 이 논문에서는 RL World의 깊은 신경 네트워크 영역으로의 개념을 결합한 최신 프레임 워크 중 일부를 요약 하고이 두 영역이 복잡한 SEQ2SEQ 작업을 해결하는 데 어떻게 도움이 될 수 있는지 설명 할 것입니다. 결국, 우리는 현재 기존 모델의 일부 문제와 더 나은 RL 모델로이를 개선 할 수있는 방법에 대한 통찰력을 제공 할 것입니다. 또한 추상적 텍스트 요약의 복잡한 작업에 대해 본 논문에서 논의 될 대부분의 모델을 구현하기위한 소스 코드를 제공합니다.
- Python 2.7을 사용하십시오
파이썬 요구 사항은 다음과 같이 설치할 수 있습니다.
pip install -r python_requirements.txt
- 텐서 플로우 1.10.1
- CUDA 9
- CUDNN 7.1
https://github.com/abisee/cnn-mailymail
https://summari.es/
CNN-Dailymail 데이터 세트를 다운로드 하고이 데이터 세트 및 뉴스 룸 데이터 세트를 사전 프로세스하기위한 도우미 코드를 제공했습니다. 이 링크를 참조하여 액세스하십시오.
우리는 요약 결과에 처리 된 데이터 세트의 처리 된 버전을 사용하여 Rouge 측정 값을 크게 향상 시켰으므로 모든 교육에 미리 처리 된 파일을 사용하는 것이 좋습니다.
이 코드는 다음 기능을 지원하는 다양한 모드의 일반적인 프레임 워크입니다.
Bengio et al. 노출 바이어스 문제를 피하기위한 예정된 샘플링 아이디어를 제안했습니다. 최근에 Goyal et al. 이 모델에 존재하는 역 구조 오류를 해결하는 소프트 아그 락스 오히려 열심히 argmax를 사용 하여이 방법의 차별화 가능한 이완을 제안했습니다. 또한 Ranzato et al. 노출 바이어스 문제를 피하기 위해 end2endbackprop이라는 또 다른 간단한 모델을 제안했습니다. 이 논문들 각각을 기반으로 모델을 훈련시키기 위해 다음과 같이 다른 플래그를 제공합니다.
매개 변수 기본 설명 Scheduled_sampling 거짓 예정된 샘플링 여부 샘플링 _probability 0 지면 진실 또는 모델 출력을 선택하기위한 엡실론 값 고정 _sampling_probability 거짓 고정 샘플링 확률 또는 적응성 사용 여부 hard_argmax 진실 소프트 argmax 또는 하드 Argmax 사용 여부 greedy_scheduled_sampling 거짓 출력에 욕심이나 샘플을 사용할지 여부, True는 Greedy를 의미합니다. 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 appended와 동일한 이름)으로 복사됩니다. 세분화기 거짓 코더 내주의를 사용하는지 여부를 사용하십시오 use_temporal_attention 진실 일시적인 관심을 사용할지 여부 matrix_attention 거짓 매트릭스주의, Eq. 2 https://arxiv.org/pdf/1705.04304.pdf 에타 0 rl/mle 스케일링 계수, 1은 rl 손실을 사용하는 것을 의미합니다. 0은 MLE 손실을 사용하는 것을 의미합니다. 고정 _eta 거짓 ETA 또는 글로벌 단계를 기반으로 고정 된 값을 사용하십시오. 감마 0.99 RL 보상 할인 요인 reward_function rouge_l/f_score Bleu 또는 Rouge 측정 중 하나 (Rouge_1/F_Score, Rouge_2/F_Score, Rouge_L/F_Score)
Paulus 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=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=FalsePaulus 등이 제안한 바와 같이, 우리는 교차 엔트로피 손실에서 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 크기의 3 개의 밀집된 레이어를 생성합니다. dqn_replay_buffer_size 100000 재생 버퍼의 크기 dqn_batch_size 100 DDQN 모델 교육을위한 배치 크기 DQN_TARGET_UPDATE 10000 10000 단계마다 대상 Q 네트워크를 업데이트하십시오 DQN_SLEEF_TIME 2 2 초마다 DDQN 모델을 훈련시킵니다 DQN_GPU_NUM 1 DDQN을 훈련시키는 GPU 번호 dueling_net 진실 결투 네트워크를 사용하여 모델을 훈련 시킬지 여부 https://arxiv.org/pdf/1511.06581.pdf dqn_polyak_averaging 진실 대상 Q 네트워크 매개 변수를 업데이트하기 위해 Polyak Averaging을 사용할지 여부 : psi^{prime} = (tau * psi^{prime})+ (1-tau) * psi 계산 _true_q 거짓 DDQN을 훈련 시키거나 DDQN의 추정치를 사용하여 훈련을 위해 진정한 Q- 값을 사용하는지 여부 DQN_PRETRAIN 거짓 고정 된 액터 모델로 DDQN 네트워크를 사전에 전하십시오 DQN_PRETRAIN_STEPS 10000 DDQN을 미리 훈련하기위한 단계 수
액터 크리치 모델의 일반적인 프레임 워크는 다음과 같습니다.

우리의 구현에서 액터는 포인터 제너레이터 모델이며 비평가는 DDQN (Double Deep Q Network)을 사용하여 Q- 값 추정을 최소화하는 회귀 모델입니다. 코드는 DDQN 교육이 기본 스레드와 다른 스레드에 있도록 구현 되며이 네트워크에 대한 경험을 배우 모델에서 비동기 적으로 수집합니다. 따라서 각 배치마다 DDQN 교육을 위해 (batch_size * max_dec_steps) 상태를 수집합니다. 우선 순위가 정해진 재생 버퍼를 구현했습니다. 그리고 DDQN 훈련 중에 우리는 항상 진실 요약에 따라 가장 부분적으로 보상을받는 경험이 포함되어 있도록 항상 미니 배치를 선택합니다. 실제 Q- 평가를 기반으로 DDQN을 교육하는 옵션을 추가 했으며이 네트워크를 훈련하기위한 예약 샘플링 프로세스를 제공했습니다. 실제 Q- 평가를 사용하여 DDQN을 훈련하면 실제 Q- 값 수집으로 인해 교육 속도가 크게 줄어 듭니다. 따라서 몇 가지 반복에 대해서만 활성화하는 것이 좋습니다. Bahdanau et al. 고정 된 미리 훈련 된 액터를 사용하여 비평가 모델을 먼저 미리 훈련 한 다음 동시에 두 모델을 모두 훈련하기 시작하는 것이 좋습니다. 예를 들어, 다음 코드 세트를 사용하여 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 결투 네트워크를 사용하여 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에서 배우와 다른 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=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에게 감사드립니다.