#### [更新2017-03-14]
- 升级到TensorFlow V1.0.0,由于TensorFlow发生了很大变化,因此没有向后兼容。
- 添加了带有Twitter语料库的预训练的模型,仅为
./go_example聊天! (或预览我的聊天示例)- 您可以从跟踪此
go_example脚本开始以了解事情的工作方式!
这是从TensorFlow示例修改的SEQ2SEQ模型。
app.py包括为Facebook Messenger应用后端。 我在此处解释了一些有关功能和一些实现技巧的细节。
git clone github.com/Marsan-Ma/tf_chatbot_seq2seq_antilm.git
您可能会从我的聊天语料库存储库中找到诸如Twitter聊天,打开电影字幕或PTT论坛之类的语料库。您需要将其放在以下路径之下:
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/train/chat.txt
并手工制作一些测试句子(每行每句话):
tf_chatbot_seq2seq_antilm/works/<YOUR_MODEL_NAME>/data/test/test_set.txt
python3 main.py --mode train --model_name <MODEL_NAME>
训练模型直到50岁以下的困惑之后,您可以做:
python3 main.py --mode test --model_name <MODEL_NAME>
[注意!!!]如果您将任何参数覆盖在此Main.py Command中,请确保同时应用训练和测试,或者只是在lib/config.py中修改FOLSAFE。
python3 app.py --model_name <MODEL_NAME>
您可能会看到此最小fb_messenger示例,以获取更多详细信息,例如为已知错误设置SSL,Webhook和Work-Arounds。
这是一个有趣的比较:左对话启用了横梁= 10,响应比往常“我不知道”好。正确的对话还使用了光束搜索,并启用了抗语言模型。这应该抑制通用的响应,并且反应似乎更好。
[更新2017-03-09]钢筋学习现在不起作用,等待修复。
如果您希望有机会进一步改进模型,那么在这里,我实现了一个受强化学习体系结构,灵感来自Li et al。,2016年。只需在config.py中启用readforce_learn选项,您可能需要在lib/seq2seq_mode.py中的step_rf()函数中添加自己的规则。
请注意,您应该在正常模式下训练,以便首先获得体面的模型! ,由于强化学习将通过这种预训练的模型探索勇敢的新世界。如果您从不良的模型开始,它将永远需要自己的改善。
Seq2Seq是Cho等人,2014年发布的出色模型。起初它用于进行机器翻译,很快人们发现Seq2Seq模型也可以实现有关将某物映射到另一件事的任何内容。聊天机器人是这些奇迹之一,我们认为连续的对话是某种“映射”关系。
这是经典的介绍图片显示SEQ2SEQ模型体系结构,该博客文章引用了有关Gmail Auto-Reply功能的报价。
问题是,到目前为止,我们还没有为聊天机器人找到更好的目标功能。我们仍在使用MLE(最大可能的估计),这对机器翻译非常有用,但始终会产生像“我也是我”,“我认为”,“我爱你”的通用响应。
这些反应不是信息丰富的,但是它们确实具有很大的概率 - 因为它们往往在培训语料库中出现很多次。我们不会聊天机器人总是回复这些非污点,因此我们需要找到一些方法来使我们的机器人更加“有趣”,以增加依据的“困惑”。
在这里,我们重现了李的工作。等人,2016年尝试解决这个问题。主要思想是将相同的SEQ2SEQ模型作为语言模型,以使每个解码时间戳中的候选单词作为反模型,然后我们将这些单词始终是任何输入的概率很高。通过这种反模型,我们可以得到更多特殊,非传播,内容丰富的回应。
李的原始作品。等人将MERT(OCH,2003)与BLEU用作指标,以找到相应抗语言模型的最佳概率加权(分数(T)= P (T)= P(T)= P(T | S)-λU(T) +γnt )。但是我发现聊天语料库中的BLEU得分往往总是为零,因此在这里无法获得有意义的结果。如果有人对此有任何想法,请给我留言,谢谢!
在lib/config.py中,有一些模型培训和预测的选项。基本上,它们是自我解释的,并且可以在大多数情况下使用默认值。在这里,我们仅列出您需要配置的内容:
关于环境
| 姓名 | 类型 | 描述 |
|---|---|---|
| 模式 | 细绳 | 工作模式:火车/测试/聊天 |
| model_name | 细绳 | 模型名称,会影响您的工作路径(存储数据,nn_model,结果文件夹) |
| scope_name | 细绳 | 在TensorFlow中,如果您需要同时加载两个图,则需要将它们保存/加载它们在不同的名称空间中。 (如果仅需要一个SEQ2SEQ模型,请将其保留为默认模型) |
| vocab_size | 整数 | 取决于您的语言语言:对于英语,60000足够好。对于中文,您至少需要100000或200000。 |
| gpu_usage | 漂浮 | 使用TensorFlow GPU内存分数,默认值为1,TensorFlow将占用您的GPU的100%。如果您有共享GPU资源的多个工作,则将其用于2或3个工作,将其设置为0.5或0.3。 |
| REANFORCE_LEARN | int | 设置1以启用加固学习模式 |
关于解码
| 姓名 | 类型 | 默认 | 描述 |
|---|---|---|---|
| beam_size | int | 10 | 梁搜索尺寸,设置1等于贪婪的搜索 |
| 安提姆 | 漂浮 | 0(禁用) | 惩罚反语言模型的重量 |
| n_bonus | 漂浮 | 0(禁用) | 句子长度的奖励重量 |
默认情况下,抗LM函数是禁用的,您可以从设置Antilm = 0.5〜0.7和N_BONUS = 0.05开始,以查看您是否喜欢结果的差异。
对于培训,建议使用GPU,因为SEQ2SEQ是一个大型型号,因此您需要某些计算能力来进行训练并有效预测,尤其是在设置大型梁搜索尺寸时。
由于我们正在做随机梯度不错,因此DRAM要求并不是严格的CPU/GPU。
如果您是深度学习的新手,设置诸如GPU之类的东西,Python环境对您来说很烦人,这里有我的机器学习环境的码头机:
(非GPU版本Docker) /(GPU版本Docker)
Seq2Seq是一个有许多预赛的模型,我花了很多时间进行调查,这里有一些最佳材料,使我受益匪浅:
解释RNN,LSTM,GRU和SEQ2SEQ模型的最佳博客文章:Christopher Olah的LSTM网络。
这项工作Sherjilozair/char-rnn-TensorFlow可以帮助我在TensorFlow中了解很多有关语言模型和实现图的知识。
如果您对RNN更感兴趣,这是Andrej Karpathy的重复神经网络的不合理效果。
Vanilla版本SEQ2SEQ+注意:Nicolas-ivanov/tf_seq2seq_chatbot。这将帮助您弄清楚香草Seq2Seq模型的主要流程,并且我根据这项工作构建了此存储库。
目前,我从图形中构建了横梁搜索,这意味着 - - 非常慢。在这里和那里进行了有关建造壁画的讨论。但是不幸的是,如果您想添加比横梁搜索更多的东西,例如这种反LM工作,那么您不仅需要光束搜索才能成为内在。
我还没有弄清楚使用BLEU的MERT如何优化抗LM模型的重量,因为当前BLEU通常为零。