本文将简要介绍聊天机器人的四种构建方法:检索、seq2seq、Reinforcement Learning、seqGAN。

  • 聊天机器人的现状
  • 检索
  • seq2seq
  • RL
    • 为什么要用强化学习
    • 强化学习的架构设计
    • Policy Gradient
    • Add Baseline
    • Reward设计
  • SeqGAN
    • 架构设计
    • 离散梯度的传导
    • 强化学习
    • Monte Carlo Search
    • Teaching Forcing
    • 评估模型
      • BLEU
      • 对话长度
      • 多样性
      • Synthetic data

聊天机器人的现状

聊天机器人从应用领域分为:

  • 专业型
  • 通用型

从技术上分为:

  • 检索型
  • 生成型

目前聊天机器人在专业领域利用检索的效果较好,正朝着通用领域生成型发展。

检索

检索方法的数据库是很多对话的pair,其原理是将query编码成vector,然后在数据库中找最接近的query,然后将最接近的query的回答输出。注意点如下:

  • query的编码方式LSI:使用词袋模型或tf-idf对数据库中的query集进行编码得到矩阵A
    ,行代表word,列代表document;对矩阵进行SVD分解得到A=USVT
    ,其中V
    表示文档在特征空间的特征向量;当新的queryq
    来临时,对其做变换S1UTq
    得到特征空间的向量,然后用余弦相似性计算与数据库中qeury的相似度即可。这种方法的缺点是当新数据越多的时候误差越大,需要重新计算SVD,同时对于同义词、一词多义等语义特征难以把握。
  • query的编码方式RNN:可以采用两个RNN。第一个RNN对每句话进行编码到一个向量;第二个RNN对第一个RNN的输出继续编码成一个向量。
  • query的编码方式auto-encoder,设定encoder的单元数,encoder前面加embeding等,相当于特征压缩。
  • query编码好之后的问题就转变成了一个retrivel的问题,采用KNN即可,同时可采用KD-Tree、LSH优化检索速度。

seq2seq

seq2seq使用两个RNN,一个作为输入的encoder,一个作为输出的decoder。需要注意的大致包含以下几点:

  • encoder中可以包含上一句,也可以包含上上一句。如果包含多个句子,可以采用启发式的encoder,训练2 step的RNN。第一个RNN负责对每个句子进行建模,第二个RNN负责对第一层RNN的输出进行建模输出变量。
  • decoder每个step可以采用attention
  • train的时候loss为C=Ct
    Ct=log(P(xt|x1,...,xt1))
    ,最小化loss等价于最大似然maxP(x|h)
    h
    代表encoder的输入,x
    代表decoder的输出。

RL

为什么要用强化学习

seq2seq有一些缺点:

  • 只能计算前缀部分的概率(改进可用recursive neural network)
  • 使用最大似然估计模型参数

第一个缺点使seq2seq不容易理解文本,因为AI-requires being able to understand bigger things from knowing about small parts.

第二个缺点使seq2seq的对话不像真实的对话,只考虑当前对话最大似然忽略了对话对未来的影响,容易出现“I don’t know”(因为其概率最大,其他方向的相互抵消);对话重复(不考虑上下文的关系)等问题。

针对第二个缺点,我们了解到概率最高的输出不一定等于好的输出,好的对话需要考虑长久的信息。可以引入强化学习,人为设计相关的reward让机器更好地学习。

强化学习的架构设计

强化学习的本质是根据reward,使模型参数朝着reward增长最大的方向移动。
强化学习的聊天机器人架构设计如下:

其模型本质还是seq2seq,模型参数是θ
,模型输入是h
,输出是x
,其与seq2seq不同的地方在于模型参数的更新方式:seq2seq按照cross entropy确定损失函数,然后最小化损失函数;DL最大化期望的reward。

期望reward的计算公式如下:

Rθ=hP(h)xPθ(x|h)R(h,x)=EhP(h),xPθ(x|h)[R(h,x)]=1NiR(hi,xi)

我们的优化目标是:

θ=argmaxθRθ

Policy Gradient

在上一节中,我们得到了目标函数与优化目标,这节中,我们考虑如何求目标函数的梯度Rθ

上一节中得到Rθ
的方式是通过采样,通过采样的方法自然无法计算梯度实现梯度的传递。解决的思路是:将Rθ
转化成梯度的采样。具体实现如下:

Rθ=hP(h)xPθ(x|h)R(h,x)=EhP(h),xPθ(x|h)[R(h,x)]=1NiR(hi,xi)

Rθ=hP(h)xPθ(x|h)R(h,x)=hP(h)xPθ(x|h)logPθ(x|h)R(h,x)=EhP(h),xPθ(x|h)[R(h,x)logPθ(x|h)]=1NiR(hi,xi)logPθ(xi|hi)

θ
的更新方式如下:

θθ+γRθ

这样更新的物理含义如下:

  • R(hi,xi)
    是正的,在更新后,Pθ(xi|hi)
    会提高
  • R(hi,xi)
    是负的,在更新后,Pθ(xi|hi)
    会降低

采用强化学习的模型与传统的seq2seq对比如下,其区别主要是强化学习对不同的loss用reward当做权重:

训练的整体过程如下:

Add Baseline

更新模型参数θ
的时候,如果reward都是正的,理想情况下对于单一的h
Pθ(xi|h)
根据R(h,xi)
的大小进行更新,可是采样的(h,xi)
不一定能覆盖所有的情况,所以对reward要做baseline的设置。最简单的baseline就是1NR(h,xi)

加入baseline之后的梯度为:

Rθ=1NiR(hi,xi)logPθ(xi|hi)1Ni(R(hi,xi)b)logPθ(xi|hi)

Reward设计

强化学习中,如果有人提供reward那是再好不过的了,不过这样投入的时间精力物力财力都很大,如何设计reward是这里讨论的问题。这里,提供三种reward的设计思路。

  • ease of answering

核心是P(“I don’t know”|response)比较小。

r1=1NSsS1NSlogPseq2seq(s|a)

虽然S
不可能覆盖所有的null回答空间,不过类似的回答在空间的位置都是很接近的,所以可以抽样去模拟。

  • non-repetitive

核心是希望agent在每一轮对话中都可以产生新的信息,因此对连续两轮相同的输出进行惩罚。

r2=logcos(hi,hi+1)

  • semantic coherence

为了保证产生的answer是合乎语言模型的,语义连贯。

rs=1Nalogseq2seqP(a|qi,pi)+1Nqilogbackwardseq2seqP(qi|a)aqi

最终的reward如下图所示:

SeqGAN

架构设计

SeqGAN与传统GAN一样,包括generator、discriminator。不同的是网络是condition的,也就是使用了condition GAN,generator condition的是query(因为RNN网络本身有随机性,所以这里不加随机的输入),discriminator condition的也是query。

SeqGAN训练的大致思路与GAN一致,对generator、discriminator分别训练。

离散梯度的传导

然而,若按上面传统GAN的架构设计,更新generator参数的时候梯度是无法传递的。原因是generator的输出是采样离散的,难以计算梯度进行梯度的反向传播。

简单的解决方案是采用WGAN,传递的不是采样离散的值而是分布。SeqGAN的解决方案借鉴了强化学习。

强化学习

采用强化学习的思路,将discriminator当做人,将discriminator的输出当做reward。利用policy gradient可以得到generator参数的更新方向(详见之前的强化学习部分),这样便解决了离散采样值梯度更新的问题。

使用强化学习,利用policy gradient解决了离散值梯度传递的问题后,还会出现对句子不同长度reward的分配问题。详见下图。这个问题在数据量大并且采样足够的情况不严重,在采样较少的情况较严重。

解决这个问题的思路是对每个generator的step都设置reward,具体如下。其中,Q(h,x)
代表当前genetor出来的相对输入h的好坏,如何度量它是一个问题。

解决度量Q(h,x)
的方法是蒙特卡洛,具体方法如下图。固定已知序列,用generator去生成未知序列,以已知序列为首的未知序列都可以用discriminator计算reward,最后取平均当做已知序列的reward。

Teaching Forcing

生成模型的训练通常很难,seqGAN中,初始的generator生成的x效果不好,因此discriminator给的reward很低,这样模型很难训练,因为它一直看到比较低的reward,也就是不好的数据,并不知道好的数据长什么样,自然很难像好的数据学习。

解决初始训练的思路是训练的时候更多的见到reward高的pair对,具体实施方法有两种:

  1. 按照reward采样,reward越大采样到的比例越高
  2. 增加更多的真实数据去训练

评估模型

这里涉及到如何去评估模型的好坏,传统的方式是BLEU,这里提供一种合成data的新思路。

BLEU

BLEU需要提供候选和参考集,采用n-gram计算:候选n-gram在参考集n-gram中出现的最大频数/候选n-gram的总数。需要注意的有两点:

  • 利用参考集n-gram的最大频数作为上限,防止重复大量n-gram得到较高的得分
  • 增大短句子的惩罚项,避免短句子得到较高的得分

其缺点如下:

  • 需要用reference data
  • 只关注当前的可能性,未关注对话的长期性持久性满意性

对话长度

对话长度一定程度上反应了对话的满意度。定义对话结束当且仅当产生”i dont know”这样的null response(方法参考ease to answer的reward设计)或者agent连着重复了两句同样的话(word overlapping的程度)。

多样性

对话应该是多样性的,这是检索模型的缺点,太固定了,而生成模型有一定的随机性。

方法是计算输出response中unigram、bigram的数量,同时用token长度做正则避免长句子分数较高。

Synthetic data

生成数据的方法,是先用LSTM(可以是random)产生很多pair作为真实数据。generator利用LSTM的数据学习,然后利用generator生成fake的answer,与真实的answer计算negative log likelihoood即可。

构建聊天机器人:检索、seq2seq、RL、SeqGAN相关推荐

  1. 问答系统实践(二)构建聊天机器人小天1.0

    口水简介 本文主要教你如何构建基于模糊检索和深度学习的聊天机器人.之前在专栏的一篇文章已经介绍了FAQ客服机器人的基本构建流程,所以本文就不重复介绍了.详细请参看: 其实无论客服机器人还是聊天机器人都 ...

  2. Keras深度学习实战(34)——构建聊天机器人

    Keras深度学习实战(34)--构建聊天机器人 0. 前言 1. 模型与数据集分析 1.1 命名实体识别 1.2 数据集分析 1.3 模型分析 2. 实现聊天机器人 2.1 命名实体提取模型 2.2 ...

  3. ChatterBot构建聊天机器人

    一.预备知识 机器人应答逻辑(Logic Adapter),针对每个部分设计了不同的适配器 Closet Match Adapter:字符串模糊匹配(编辑距离) Closet Meaning Adap ...

  4. python构建聊天机器人之录制声音保存为音频文件(利用pyaudio进行录音)

    最近心血来潮想利用 python构建一个智能语音聊天机器人,这样就能在我们无聊的时候和我们聊天以此打发时间啦:). 要想最终实现聊天机器人的构建需要经过一系列过程功能的实现,大致思路为程序接受用户的语 ...

  5. 【NLP】第 8 章:使用基于注意力的神经网络构建聊天机器人

  6. 深度操作系统 机器学习_深度学习如何构建情感聊天机器人,第2部分对话系统...

    深度操作系统 机器学习 情感聊天机器人(emotional chatbot) From part 1, we have built the BERT sentiment predictor, we n ...

  7. python nltk lemmatizer_Python聊天机器人–使用NLTK和Keras构建第一个聊天机器人

    什么是聊天机器人? 聊天机器人是一款智能软件,能够传达和执行类似于人类的动作.聊天机器人可以直接与客户互动,在社交网站上进行营销以及即时向客户发送消息等方面被广泛使用.根据聊天机器人的构建方式,它有两 ...

  8. chatscript_如何使用ChatScript构建您的第一个聊天机器人

    chatscript by Giorgio Robino 通过乔治·罗宾诺(Giorgio Robino) 如何使用ChatScript构建您的第一个聊天机器人 (How to build your ...

  9. 10分钟构建人人都能学会的个性化聊天机器人-使用AIML(王小草博客)

    本文主要介绍什么是aiml, 如何python环境安装aiml,如何使用与制作一个属于自己的聊天机器人 1 aiml初识 1.1 demo展示 用aiml写了一个简单的微信聊天机器人的demo,暂且叫 ...

最新文章

  1. fft 重叠加法_FFT重叠相加法 参数如何定 h M?
  2. 11、InnoDB存储引擎
  3. Win10一周更新系统开始面向企业分支推送
  4. dubbo控制中心部署,权重配置,以及管控台中各个配置的简单查看
  5. HTML <cite> 标签
  6. [USACO]地震 (二分答案+最优比率生成树详解)
  7. 大量html乱码seo,HTTPS改造之后网页错位乱码,影响SEO和正常访问,应该这样改
  8. python统计输入学生的总分和平均分_C输入函数和成绩显示函数并计算每位同学总分和平均分对成绩排名输出.doc...
  9. angular 字符串转换成数字_Python成为专业人士笔记–String字符串方法
  10. SentinelResource注解配置中_客户自定义限流处理_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0046
  11. 《中国人工智能学会通讯》——11.34 基于近似动态规划的优化控制研究及 在电力系统中的应用...
  12. 大数据分析会遇到哪些误区
  13. React Native 仿天猫物流跟踪时间轴
  14. 互联网进入智慧互联时代 CSS将推进行业安全生态建设
  15. 使用Uchihash处理恶意软件中的嵌入式哈希
  16. gps 数据解析-NMEA 0183协议
  17. 网格布局---grid
  18. lemon/cena C++ SPJ姿势
  19. 基于matlab的磁悬浮控制系统,基于MATLAB的磁悬浮球系统PID控制器设计与实现
  20. PHP单例模式的本质

热门文章

  1. 计算机书籍-机器学习预测分析Go语言实现
  2. 招聘|字节跳动计算机视觉算法实习生
  3. 汇总|目标检测中的数据增强、backbone、head、neck、损失函数
  4. java与fabric区块链--fabric-ca-server 登记---(2)
  5. Survey | 基于图卷积网络的药物发现方法
  6. 【代码片段收集】Python解析AndroidManifest.xml
  7. 边缘分布律_概率论笔记-Ch3随机向量及其分布
  8. python or的用法_python中and和or的用法
  9. microbiomeMarker:整合多种biomarker分析工具的R包
  10. ggClusterNet---一条代码完成全内容微生物网络