Примечание. Этот код больше не поддерживается активно.
Этот репозиторий содержит код, разработанный в 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 в область глубокой нейронной сети, и объяснит, как эти две области могут извлечь выгоду друг от друга при решении сложных задач 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 и предварительного обработки этого набора данных и набора данных. Пожалуйста, обратитесь к этой ссылке, чтобы получить к ним доступ.
Мы увидели значительное улучшение меры Rouge, используя нашу обработанную версию этих наборов данных в результатах суммирования, поэтому мы настоятельно рекомендуем использовать эти предварительно обработанные файлы для всего обучения.
Этот код является общей структурой для различных режимов, которые поддерживают следующие функции:
Bengio et al. предложила идею запланированной выборки для избежания проблемы смещения воздействия. Недавно Goyal et al. предложил дифференцируемое расслабление этого метода, используя Soft-Argmax довольно жесткий ArgMax, который решает ошибку обратного распространения, которая существует в этой модели. Кроме того, Ranzato et al. предложила еще одну простую модель под названием End2endbackprop для избежания проблемы смещения воздействия. Чтобы обучить модель на основе каждой из этих бумаг, мы предоставляем разные флаги следующим образом:
Параметр По умолчанию Описание warduled_sampling ЛОЖЬ сделать ли запланированные выборки или нет Shape_Probobility 0 Значение Epsilon для выбора вывода и модели модели или модели fixed_sampling_probability ЛОЖЬ Использовать ли фиксированную вероятность выборки или адаптивные hard_argmax Истинный Использовать ли Soft Argmax или жесткий Argmax greedy_scheduled_sampling ЛОЖЬ Использовать ли жадный или образец для вывода, 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), которая будет готова к запуску с включенным флагом покрытия, для этапа обучения. Intradecoder ЛОЖЬ Используйте внимание внутрикодера или нет USE_TEREMAL_ATTUTION Истинный Использовать ли временное внимание или нет Matrix_Attention ЛОЖЬ Используйте Матрицу Внимание, уравнение 2 в https://arxiv.org/pdf/1705.04304.pdf ETA 0 Коэффициент масштабирования RL/MLE, 1 означает использование потерь RL, 0 означает использование потери MLE fixed_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Здесь мы используем другой графический процессор для оценки, но мы можем использовать один и тот же графический процессор, если уменьшим количество партий. В нашей реализации мы используем размер партии 8 для оценки, но для каждого этапа оценки мы идентифицируем набор данных валидации в 100 раз. Это похоже на обнаружение ошибки оценки на размере партии 800. Это поможет уменьшить память, необходимую процессу оценки, и предоставить варианты для подготовки обучения и оценки на одном графическом процессоре.
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/(максимальная итерация).
Во -первых, добавьте необходимый параметр обучения в модель:
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 dqn_replay_buffer_size 100000 Размер буфера воспроизведения dqn_batch_size 100 Размер партии для обучения модели DDQN dqn_target_update 10000 Обновить целевую Q Network каждые 10000 шагов dqn_sleep_time 2 Тренировать модель DDQN каждые 2 секунды dqn_gpu_num 1 Номер графического процессора для обучения DDQN dueling_net Истинный Использовать ли дуэльную сеть для обучения модели https://arxiv.org/pdf/1511.06581.pdf DQN_POLYAK_AVERAGING Истинный Способно ли использовать усреднение Polyak, чтобы обновить целевые параметры сети Рассчитывать_true_q ЛОЖЬ Использовать ли истинные Q-значения для обучения DDQN или использовать оценки DDQN для его обучения dqn_pretrain ЛОЖЬ Предварительно посадить сеть DDQN с фиксированной моделью актера dqn_pretrain_steps 10000 Количество шагов для предварительного обучения DDQN
Общая структура для актерской модели заключается в следующем:

В нашей реализации актер является моделью указателя-генератора, а критик является регрессионной моделью, которая сводит к минимуму оценку Q-значения с использованием сети двойной глубокой Q (DDQN). Код реализован таким образом, что обучение DDQN находится в другом потоке от основного потока, и мы собираем опыт для этой сети асинхронно из модели актера. Поэтому для каждой партии мы собираем (batch_size * max_dec_steps) для обучения DDQN. Мы реализовали приоритетный буфер воспроизведения. И во время обучения DDQN мы всегда выбираем наши мини-партии, так что они содержат опыт, который имеет наилучшее частичное вознаграждение в соответствии с резюме по имени земли. Мы добавили возможность обучения DDQN на основе истинного Q-оценки и предложили процесс запланированного состава для обучения этой сети. Обратите внимание, что обучение DDQN с использованием истинной Q-оценки значительно снизит скорость обучения из-за сбора истинных 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 Мы можем использовать дуэльную сеть для обучения 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 Мы можем запустить актера в одном графическом процессоре и критике в другом графическом процессоре, просто используя другой номер графического процессора для критика, используя опцию dqn_gpu_num . Также, как уже упоминалось ранее, мы должны избегать использования истинной Q-оценки в течение длительного времени, поэтому мы используем истинную оценку для обучения DDQN всего за 1000 итераций.
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 Обратите внимание, что мы можем использовать такие параметры, как intradecoder , temporal_attention , E2EBackProp , scheduled_sampling и т. Д. И т. Д. И в актерских моделях. Использование этих вариантов поможет иметь лучшую модель актера.
Спасибо @astorfi за помощь в подготовке этой документации.