Python 自然语言处理笔记(六)—— 基于seq-to-seq的自动问答,DeepQA

基于seq-to-seq的自动问答——DeepQA

模型Github地址 : https://github.com/Conchylicultor/DeepQA

一. 使用预训练模型

  1. Extract the zip file inside DeepQA/save/
  2. Copy the preprocessed dataset from save/model-pretrainedv2/dataset-cornell-old-lenght10-filter0-vocabSize0.pklto data/samples/.
  3. Run ./main.py --modelTag pretrainedv2 --test interactive.

按照github的流程下载好后运行后,出现错误

NotFoundError (see above for traceback): Restoring from checkpoint failed. This is most likely due to a Variable name or other graph key that is missing from the checkpoint. Please ensure that you have not altered the graph expected based on the checkpoint. Original error:

Tensor name "embedding_rnn_seq2seq/embedding_rnn_decoder/rnn_decoder/output_projection_wrapper/bias" not found in checkpoint files C:\Users\asus\Desktop\DeepQA-master\save\model-pretrainedv2\model.ckpt
         [[node save/RestoreV2 (defined at C:\Users\asus\Desktop\DeepQA-master\chatbot\chatbot.py:174) ]]

错误原因:安装tensorflow的版本过高

解决方案:pip install tensorflow==1.0.0

二. 自己训练模型

默认参数

这里我使用了GPU来对模型进行训练,首先安装一些必要的库来支持,这里要注意版本

pip install tensorflow-gpu==1.0.0

训练代码:

python main.py --device gpu

这是默认的模型参数效果,仍未进行调整。

初步结果:

1

**测试结果:**可以看出训练三十轮出来的结果并不理想,回答问题的质量不高

2

分析

训练Tricks:

  • train word embedding model with other data 用其他数据训练embedding模型
  • pretrain RNN with non-dialogue corpus 用非对话语料库预训练RNN

为什么输出结果这么多无意义的回答语句?

例如
I'm sorry
I'm not
No

这些答案看似没错,但是对于我们的QA是毫无意义的,回答过于通用,由此看出训练效果差,没有达到智能回答的程度。

原因:

  • generic utterances appear often in training set
    • 这些通用的话语经常出现在训练集中
  • many words are punctuation marks or pronouns, making context RNN difficult to learn topics/concepts
    • 许多单词都是标点符号或代词,使context RNN变得难以学习主题或概念。
  • Injections to context RNN is from encoder outputs which largely encode local structure of a sentence, making context RNN difficult to capture structures of whole sentences
    • context RNN的注入来自编码器输出,编码器输出主要对句子的局部结构进行编码,使得context RNN难以捕获整个句子的结构。

解决办法:

  • 增加训练次数,降低loss
  • 更多的更好的训练集
  • 使用注意力机制attention,使得context RNN能捕获整个句子的意思,而不是局限于句子的局部。

调参过程

可调参数有很多,可以看下图

3

增加隐层cell的数量以及加深层数
  • hiddenSize = 512
  • numLayers = 3

测试结果:QA比之前更加具有智能,基本可以回答问题。loss与Perplexity继续下降

6

5

增加训练的epoch

epoch = 40

调低学习率

在训练后期,变化变小,此时降低学习率有利于模型继续收敛。

lr = 0.0005

增加embedding_size

embedding_size:向量值太简单了,没有相关性,无法直接用于计算卷积神经网络,所以在训练模型过程中用embedding算法得出每个向量值在多个维度的语义和相关性数据。

embedding_size = 128

最终结果:

loss在1.80~1.90之间

Perplexity可以控制在6~7之间

7

QA运行结果:具有一定的智能

8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值