หมายเหตุ: รหัสนี้ไม่ได้รับการดูแลอย่างแข็งขันอีกต่อไป
พื้นที่เก็บข้อมูลนี้มีรหัสที่พัฒนาขึ้นใน 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 ที่ดีขึ้น นอกจากนี้เรายังให้ซอร์สโค้ดสำหรับการใช้โมเดลส่วนใหญ่ที่จะกล่าวถึงในบทความนี้ในงานที่ซับซ้อนของการสรุปข้อความเชิงนามธรรม
- ใช้ 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 และคณะ เสนอแนวคิดของการสุ่มตัวอย่างตามกำหนดเวลาเพื่อหลีกเลี่ยงปัญหาอคติการเปิดรับแสง เมื่อเร็ว ๆ นี้ Goyal และคณะ เสนอการผ่อนคลายที่แตกต่างกันของวิธีนี้โดยใช้ soft-argmax ค่อนข้างแข็ง argmax ซึ่งแก้ไขข้อผิดพลาดในการแพร่กระจายกลับที่มีอยู่ในรุ่นนี้ นอกจากนี้ Ranzato และคณะ เสนอแบบจำลองง่าย ๆ อีกรุ่นที่เรียกว่า End2EndBackProp เพื่อหลีกเลี่ยงปัญหาอคติการเปิดรับแสง ในการฝึกอบรมแบบจำลองตามเอกสารเหล่านี้แต่ละฉบับเรามีธงที่แตกต่างกันดังนี้:
พารามิเตอร์ ค่าเริ่มต้น คำอธิบาย scheduled_sampling เท็จ ไม่ว่าจะทำการสุ่มตัวอย่างตามกำหนดเวลาหรือไม่ Sampling_probability 0 ค่า Epsilon สำหรับการเลือกความจริงพื้นดินหรือเอาต์พุตแบบจำลอง คงที่ _sampling_probability เท็จ ไม่ว่าจะใช้ความน่าจะเป็นตัวอย่างคงที่หรือการปรับตัว hard_argmax จริง ไม่ว่าจะใช้ soft argmax หรือ hard argmax Greedy_scheduled_sampling เท็จ ไม่ว่าจะใช้โลภหรือตัวอย่างสำหรับเอาต์พุตจริงหมายถึงโลภหมายเหตุ 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 ต่อท้าย) ซึ่งจะพร้อมที่จะทำงานพร้อมกับเปิดธงครอบคลุมสำหรับขั้นตอนการฝึกอบรมความครอบคลุม intradecoder เท็จ ใช้ความสนใจ intradecoder หรือไม่ use_temporal_attention จริง ไม่ว่าจะใช้ความสนใจทางโลกหรือไม่ matrix_attention เท็จ ใช้เมทริกซ์ความสนใจ Eq 2 ใน https://arxiv.org/pdf/1705.04304.pdf กทพ. 0 ปัจจัยการปรับขนาด RL/MLE, 1 หมายถึงใช้การสูญเสีย RL, 0 หมายถึงการใช้ MLE LOSS คงที่ _eta เท็จ ใช้ค่าคงที่สำหรับ ETA หรือ Adaptive ตามขั้นตอนทั่วโลก แกมม่า 0.99 ปัจจัยลดราคา RL รางวัล _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=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เราใช้รูจเป็นตัวชี้วัดการประเมินผล
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 dqn_replay_buffer_size 100000 ขนาดของบัฟเฟอร์เล่นซ้ำ dqn_batch_size 100 ขนาดชุดสำหรับการฝึกอบรมรุ่น DDQN dqn_target_update 10,000 อัปเดต Target Q Network ทุก 10 10 ขั้นตอน 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 averaging เพื่ออัปเดตพารามิเตอร์เครือข่ายเป้าหมาย Q: psi^{prime} = (tau * psi^{prime})+ (1-tau) * psi calculate_true_q เท็จ ไม่ว่าจะใช้ค่า Q ที่แท้จริงเพื่อฝึก DDQN หรือใช้การประมาณการของ DDQN เพื่อฝึกอบรม dqn_pretrain เท็จ pretrain เครือข่าย DDQN กับโมเดลนักแสดงคงที่ dqn_pretrain_steps 10,000 จำนวนขั้นตอนในการฝึกอบรม DDQN ล่วงหน้า
กรอบทั่วไปสำหรับโมเดลนักแสดงนักแสดงมีดังนี้:

ในการใช้งานของเรานักแสดงเป็นโมเดลตัวชี้ตัวชี้และนักวิจารณ์เป็นแบบจำลองการถดถอยที่ลดการประมาณค่า Q-value โดยใช้เครือข่าย Dous Deep Q (DDQN) รหัสถูกนำมาใช้เพื่อให้การฝึกอบรม DDQN อยู่ในเธรดที่แตกต่างจากเธรดหลักและเรารวบรวมประสบการณ์สำหรับเครือข่ายนี้แบบอะซิงโครนัสจากโมเดลนักแสดง ดังนั้นสำหรับแต่ละชุดเราจะรวบรวม (batch_size * max_dec_steps) สถานะสำหรับการฝึกอบรม DDQN เราใช้บัฟเฟอร์การเล่นซ้ำที่จัดลำดับความสำคัญ และในระหว่างการฝึกอบรม DDQN เรามักจะเลือกมินิแบทช์ของเราเพื่อให้พวกเขามีประสบการณ์ที่มีรางวัลบางส่วนที่ดีที่สุดตามสรุปความจริงพื้นดิน เราเพิ่มตัวเลือกในการฝึกอบรม DDQN ตามการประเมิน Q ที่แท้จริงและเสนอกระบวนการสุ่มตัวอย่างตามกำหนดเวลาสำหรับการฝึกอบรมเครือข่ายนี้ โปรดทราบว่าการฝึกอบรม DDQN โดยใช้การประเมิน Q ที่แท้จริงจะช่วยลดความเร็วของการฝึกอบรมได้อย่างมีนัยสำคัญเนื่องจากการรวบรวมค่า Q ที่แท้จริง ดังนั้นเราขอแนะนำให้เปิดใช้งานสิ่งนี้สำหรับการทำซ้ำสองสามครั้ง ตามที่แนะนำโดย 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 เราสามารถใช้เครือข่ายการดวลเพื่อฝึก 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 เราสามารถเรียกใช้นักแสดงใน GPU และนักวิจารณ์หนึ่งใน GPU อื่นเพียงแค่ใช้หมายเลข GPU อื่นสำหรับนักวิจารณ์โดยใช้ตัวเลือก dqn_gpu_num ดังที่ได้กล่าวไว้ก่อนหน้านี้เราควรหลีกเลี่ยงการใช้การประเมิน Q ที่แท้จริงเป็นเวลานานดังนั้นเราจึงใช้การประมาณค่าที่แท้จริงในการฝึกอบรม DDQN เพียง 1,000 การวนซ้ำ
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 โปรดทราบว่าเราไม่ได้ใช้ FLAG 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 สำหรับความช่วยเหลือในการเตรียมเอกสารนี้