这项工作试图重现神经对话模型(又名谷歌聊天机器人)的结果。它使用 RNN(seq2seq 模型)进行句子预测。它是使用 python 和 TensorFlow 完成的。
该程序的加载语料库部分受到 macournoyer 的 Torch Neuralconvo 的启发。
目前,DeepQA 支持以下对话语料库:
--corpus opensubs
。--corpus scotus
。请参阅安装说明。--corpus ubuntu
可用。请参阅安装说明。为了加速训练,还可以使用预先训练的词嵌入(感谢 Eschnou)。更多信息请点击这里。
该程序需要以下依赖项(使用 pip 即可轻松安装: pip3 install -r requirements.txt
):
您可能还需要下载其他数据才能使 nltk 工作。
python3 -m nltk.downloader punkt
康奈尔大学数据集已包含在内。对于其他数据集,请查看各自文件夹中的自述文件(位于data/
内)。
Web 界面需要一些额外的包:
还可以使用 Docker 安装。更详细的说明请参见此处。
要训练模型,只需运行main.py
。训练完成后,您可以使用main.py --test
(在“save/model/samples_predictions.txt”中生成的结果)或main.py --test interactive
(更有趣)来测试结果。
这里有一些可能有用的标志。如需更多帮助和选项,请使用python main.py -h
:
--modelTag
:允许为当前模型命名,以便在测试/训练时区分它们。--keepAll
:如果在测试时想要查看不同步骤的预测,则在训练时使用此标志(看到程序随着训练进度更改其名称和年龄可能很有趣)。警告:如果不增加--saveEvery
选项,它会很快占用大量存储空间。--filterVocab 20
或--vocabularySize 30000
:限制词汇表大小并优化性能和内存使用。将使用次数少于 20 次的单词替换为
标记,并设置最大词汇量。--verbose
:测试时,将打印计算出的句子。--playDataset
:显示数据集中的一些对话样本(如果这是您想要执行的唯一操作,可以与--createDataset
结合使用)。要使用 TensorBoard 可视化计算图和成本,只需运行tensorboard --logdir save/
。
默认情况下,网络架构是标准编码器/解码器,具有两个 LSTM 层(隐藏大小为 256),词汇表嵌入大小为 32。网络使用 ADAM 进行训练。最大句子长度设置为 10 个单词,但可以增加。
一旦接受培训,就可以使用更加用户友好的界面与其聊天。服务器将查看复制到save/model-server/model.ckpt
模型。第一次使用它时,您需要进行以下配置:
export CHATBOT_SECRET_KEY= " my-secret-key "
cd chatbot_website/
python manage.py makemigrations
python manage.py migrate
然后,要在本地启动服务器,请使用以下命令:
cd chatbot_website/
redis-server & # Launch Redis in background
python manage.py runserver
启动后,该界面应在 http://localhost:8000/ 上可用。如果要将程序部署在服务器上,请改用python manage.py runserver 0.0.0.0
。更多信息请点击这里。
令人惊讶的是,只需 1 或 2 小时的训练(在 GeForce GT 740M 上)就可以获得一些结果,方法是将输入序列大幅减少到 5 个单词,输出到 3 个单词(加上go
和eos
令牌)并使用一个小的嵌入大小(大约 25)。从那时起,我修改了代码,现在输出长度必须与输入长度匹配,但您仍然可以使用此版本重现原始结果。当然,网络不会真的很闲聊:
Q: Hi
A: Hi.
Q: What is your name ?
A: Laura.
Q: What does that mean ?
A: I dunno.
Q: How old are you ?
A: thirty-five.
Q: Will Google hire me ?
A: No.
Q: Tell me the alphabet
A: Fuck you.
Q: That's not nice
A: Yeah.
这是一些失败的情况:
Q: Who is Laura ?
A: My brother.
Q: Say 'goodbye'
A: Alright.
Q: What is cooking ?
A: A channel.
Q: Can you say no ?
A: No.
Q: Two plus two
A: Manny...
对于较长的句子,网络的训练速度要慢得多。在 maxLength=10 的 250000 次迭代之后,网络仍然主要给出回避的答案(通过“我不知道”回答大多数开放式问题),但它似乎集成了一些基本语义:
Q: When are the fireworks ?
A: Tomorrow.
Q: What color ?
A: Gray.
Q: Which apple ?
A: That's the first one.
Q: What time is it ?
A: Eleven o'clock.
Q: Who is Skywalker ?
A: She's a freelance bio-exorcist.
Q: Who is John ?
A: The old man.
Q: Who is Jenny ?
A: The man who killed herself.
Q: When were you born ?
A: Soon.
正如最后一个问题所示,网络在性别和现在/未来之间仍然存在一些混淆。我也尝试了一些更深层次的哲学问题,或多或少取得了成功。
Q: What is the purpose of being intelligent ?
A: The man are obsolete.
Q: What is immoral ?
A: The truth.
Q: What is morality ?
A: The worst.
Q: What is the purpose of existence ?
A: It 's private.
Q: What happens if machines can think ?
A: I think I'll just lie with you.
我训练的模型受到我放置的嵌入大小及其大小以及训练语料库大小的很大限制。它的“思想向量”也可能太小,无法回答以下问题:
Q: My name is David. What is my name ?
A: Debbie.
Q: My name is John. What is my name ?
A: Carl Smith.
Q: How many legs does a cat have ?
A: Four.
Q: How many legs does a spider have ?
A: Four.
Q: Do you prefer football or soccer ?
A: Whiskey.
它似乎也过度拟合,因为有时它只会从训练集中弹出与问题无关的句子。添加一些 dropout 应该可以减少这个问题。
Q: I play tennis. What do I play ?
A: I'm going to get laid.
Q: What color is the sky ?
A: One of the deputies is everywhere.
注意:链接不再有效。
您可以在这里找到预先训练的模型,默认语料库的训练。使用方法:
DeepQA/save/
中的 zip 文件save/model-pretrainedv2/dataset-cornell-old-lenght10-filter0-vocabSize0.pkl
复制到data/samples/
。./main.py --modelTag pretrainedv2 --test interactive
。感谢 Nicholas C.,这里(原始)是一些针对不同数据集的额外预训练模型(与 TF 1.2 兼容)。该文件夹还包含 Cornell、OpenSubtitles、Ubuntu 和 Scotus 的预处理数据集(移动到data/samples/
内部)。如果您不想自己处理数据集,则需要这些。
如果您拥有高端 GPU,请毫不犹豫地使用超参数/语料库来训练更好的模型。从我的实验来看,学习率和 dropout 率对结果的影响最大。另外,如果您想分享您的模型,请随时与我联系,我会将其添加到此处。
除了尝试更大/更深的模型之外,还有很多可以测试的小改进。如果您实现了其中之一,请毫不犹豫地发送拉取请求。以下是一些想法:
tf.nn.seq2seq.rnn_decoder
的loop_function
参数相结合,添加起来应该不会太困难。之后,应该可以使用 SoftMax 温度来获得更保守或奇异的预测。model.py
上将embedding_rnn_seq2seq
替换为embedding_attention_seq2seq
应该很简单。Q:Sentence 1. Sentence 2. => A:Sentence X. Sentence Y.
我们可以生成 3新样本: Q:Sentence 1. Sentence 2. => A:Sentence X.
、 Q:Sentence 2. => A:Sentence X. Sentence Y.
和Q:Sentence 2. => A:Sentence X.
警告:其他组合如Q:Sentence 1. => A:Sentence X.
将不起作用,因为它会破坏将问题与答案链接起来的转换2 => X
)
和
,以便编码器知道对话者何时发生变化。但我不确定简单的 seq2seq 模型是否足以捕获句子之间的长期依赖关系。添加桶系统将相似的输入长度分组在一起可以极大地提高训练速度。