这是一个通过seq2seq和强化学习训练的聊天机器人。
序列2序列
Seq2seq是结构化学习的经典模型,它的输入和输出都是序列
NIPS '14 论文 Sequence to Sequence Learning with Neural Networks 中描述了普通的 seq2seq 模型,编码器和解码器是分开的
该存储库中的 seq2seq 模型由 2 个 LSTM 构建,类似于 ICCV '15 论文 Sequence to Sequence -- Video to Text 中描述的模型,编码器和解码器共享相同的权重
RL
在用足够的 epoch 训练聊天机器人后,我使用称为策略梯度的 RL 技术来进一步改进聊天机器人
通过这样做,聊天机器人可以针对奖励函数生成更有趣的响应
我的奖励函数类似于 EMNLP '16 论文 Deep Reinforcement Learning for Dialogue Generation 中描述的函数
让我向您展示一些聊天机器人的结果:
结果 1 (A 和 B 都是经过训练的聊天机器人)
A:你能帮我一个忙吗?
乙:什么都可以。
A:我要你让一个父亲屈服。
乙:当然。
A:我很抱歉我不是故意无礼的。
B:不明白,至少我已经尽力了。
结果 2 (A 和 B 都是经过训练的聊天机器人)
答:我没有做!我没有枪!
乙:你这个骗子。你还是想拿回你的钱。
答:事实有些错误。
B:我不想要任何钱,只是一点点,我不能从这里拿走。
答:怎么了。
乙:听我说。我现在很害怕。
A:啊,你需要所有的钱,我需要你的帮助。
结果 3 (A 和 B 都是经过训练的聊天机器人)
A:我忘记买可口可乐了。
B:我的头被东西卡住了。
A:没关系,我想这在很多狗屎中很常见。
B:我的意思是我们从小时候起就一直在一起。
答:更有理由。
B:不是他,是他的错,他是因为上帝才瞎的。
答:这是一个奇怪的故事。
您可以在此目录中找到聊天机器人的更多结果
这些结果的神经网络配置在文件名中描述
您对聊天机器人的结果感到惊讶吗? :D
您可以自己生成那些令人惊叹的对话框!
只需按照以下说明操作即可:
pip install -r 要求.txt
./脚本/下载.sh
./script/simulate.sh <模型路径> <模拟类型> <输入文件> <输出文件>
<模型路径>
要生成 seq2seq 对话框,请输入“ model/Seq2Seq/model-77 ”
要生成 RL 对话框,请输入“ model/RL/model-56-3000 ”
<模拟类型>
可以是 1 或 2
该数字代表聊天机器人考虑的前一句的数量
如果您选择 1,聊天机器人仅考虑最后一句话
如果您选择 2,聊天机器人将考虑最后两句话(一句来自用户,另一句来自聊天机器人本身)
<输入文件>
看一下 result/sample_input_new.txt
这是聊天机器人的输入格式,每一行是一个对话框的开始句。
为了方便起见,您可以仅使用示例文件。
<输出文件>
输出文件,输入您想要的任何文件名
如果您希望聊天机器人为每个问题仅生成一个响应
请按照以下说明操作:
pip install -r 要求.txt
./脚本/下载.sh
./script/run.sh <类型> <输入文件> <输出文件>
<类型>
要生成 seq2seq 响应,请输入“ S2S ”
要生成强化学习响应,请输入“ RL ”
<输入文件>
看一下 result/sample_input_new.txt
这是聊天机器人的输入格式,每一行是一个对话框的开始句。
为了方便起见,您可以仅使用示例文件。
<输出文件>
输出文件,输入您想要的任何文件名
我用 python2.7 训练了我的聊天机器人。
如果您想从头开始训练聊天机器人
您可以按照以下说明操作:
看一下 python/config.py,这里描述了所有训练配置。
您可以更改一些训练超参数,或者只保留原始参数。
我使用康奈尔电影对话语料库
您需要下载它,解压它,并将所有 *.txt 文件移动到 data/ 目录中
然后用pip下载一些库:
pip install -r 要求.txt
./脚本/parse.sh
./脚本/train.sh
让我们展示一下 seq2seq 模型的一些结果:)
./script/test.sh <模型路径> <输入文件> <输出文件>
并显示 seq2seq 模型的一些对话结果!
./script/simulate.sh <模型路径> <模拟类型> <输入文件> <输出文件>
<模拟类型>
可以是 1 或 2
该数字代表聊天机器人考虑的前一句的数量
如果您选择 1,聊天机器人将仅考虑用户的话语
如果您选择 2,聊天机器人将考虑用户的话语和聊天机器人的最后一句话
您需要更改 python/config.py 中的training_type参数
'normal' 用于 seq2seq 训练,'pg' 用于策略梯度
您需要首先使用“正常”训练一些时期直到稳定(强烈建议至少 30 个时期)
然后将方法更改为“pg”以优化奖励函数
./script/train_RL.sh
使用策略梯度训练时(pg)
你可能需要一个反向模型
反向模型也由康奈尔电影对话数据集训练,但源和目标相反。
您可以通过下载预训练的反向模型
./script/download_reversed.sh
或者你可以自己训练
如果您使用预先训练的反向模型,则不需要更改有关反向模型的任何设置
让我们生成一些 RL 模型的结果,并找出与 seq2seq 模型的不同之处:)
./script/test_RL.sh <模型路径> <输入文件> <输出文件>
并显示 RL 模型的一些对话结果!
./script/simulate.sh <模型路径> <模拟类型> <输入文件> <输出文件>
<模拟类型>
可以是 1 或 2
该数字代表聊天机器人考虑的前一句的数量
如果您选择 1,聊天机器人仅考虑最后一句话
如果您选择 2,聊天机器人将考虑最后两句话(一句来自用户,另一句来自聊天机器人本身)
操作系统:CentOS Linux 版本 7.3.1611(核心)
CPU:Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz
显卡:GeForce GTX 1070 8GB
内存:16GB DDR3
Python3(对于data_parser.py)和Python2.7(对于其他)
黄博志 / @pochih