使聊天机器人具有个性
本文结构:
- 模型效果
- 模型的三个模块
- 模块细节
今天的论文是 《Assigning Personality/Identity to a Chatting Machine for Coherent Conversation Generation》
https://arxiv.org/pdf/1706.02861.pdf
当我们在和聊天机器人互动时,最开始往往很好奇的就是对方到底是人还是机器人呢,所以会问到一些关于对方身份的问题,这对于机器人能否通过图灵测试还是很重要的问题之一。
这篇论文提前预设好机器人的身份档案,并且做到在相关的问答中做到与设置的一致,就可以让机器人在回答时能够有一定的身份特征。和其他的区别是不用从对话中慢慢学习出个性。
模型效果:
假设机器人的预设档案为:
本论文的模型与普通的 seq2seq 效果比较为:
模型由三个模块组成:
- 一个档案检测器 Profile Detector,一是来决定是否要根据档案来回答,二是根据哪个关键字答复。
- 一个双向解码器 Bidirectional Decoder,用于从选定的档案值出发向前和向后生成答复。
- 一个位置检测器 position detector,用于预测选定的档案值后要从哪个位置开始解码,把位置传递给 decoder。
整体:
- 给定一个提问后,先看是否需要用档案内容回答,不需要的话,就用通常的 seq2seq 来生成回复; 需要的话,先用 Profile Detector 选择合适的 key-value。
- 然后用 Bidirectional Decoder 以这个 value 为起点向前向后生成答复。
- position detector 用来改善 training,test 集的差异问题,只在模型训练时用。
模型细节:
提问:x = x1x2···xn
, 被 Encoder 将 post 转化后的向量 x = x1x2 · · · xn
。x 的隐藏层状态由 GRU 获得 h = (h1, h2, · · ·, hn)
。
档案:{< ki, vi > |i = 1, 2, · · · , K}
回答:y=y1y2···ym
问题建模:
1. Profile Detector
1. 其中 P(z|x)
是根据提问 x,看需要用档案来回答的概率,由 Profile Detector 计算出。
由训练的二分类器得到 P (z|x) = P (z| h~) = σ(Wp h~)
,h~ 是所有 hj 的和,Wp 是分类器的参数。
βi = MLP([ h~, ki, vi]) =f(W ·[ h~;ki;vi])
,用来决定根据哪个关键字答复,其中 f 为 softmax 激活函数,选择概率最大的那一组 key-value。
2. Bidirectional Decoder:
2. Pfr(y|x)
是根据 x 生成 y,由通常的 forward decoder 生成。
3. Pbi(y|x, {< ki, vi >})
是根据 x 和档案生成 y,由 Bidirectional Decoder 生成:
即 y = (yb, v~, yf )
为生成的回复,v~ 是选中的 value:
先由 x,v~ 得到 yb,再由 x,v~,yb 得到 yf。
Pb,Pf
通过下式计算:
其中 sj
是 decoder 的相应状态,cj
是语境的向量:
P fr
和 P bi
的参数不是共享的。
3. position detector:
因为用于训练的问答句是从社交网站上获得的,前面识别出来的 value 可能并不会出现在答复中,这样 bidirectional decoder 就会不知道从哪个位置开始,所以在这一步会做相关的处理。
例如,
post x =“你-1 有-2 什么-3 特长-4 ?-5
response y =“我-1 非常-2 擅长-3 小提琴- 4
a profile key value pair “<特长, 钢琴>
那么 “小 提 琴-4 ” 的位置会传递给 decoder,然后替换成“钢 琴”。
用 P (j|y1y2 · · · ym, < k, v > )), 1 ≤ j ≤ m
来表示 yj 可以被 v 替换的概率。
计算方法用两个单词的距离:
P(j|y,< k,v >)) ∝ cos(yj,v)
损失函数:
由两部分组成:
L = L1 + αL2
1. L1 是生成答复的,根据最开始的问题模型可以得到:
D( c) 是只有 post-response 对的,D(pr) 是 post,value-response 的。
2. L2 是 profile detector 预测是否用档案及用哪个关键词的,根据前面定义过的 P(z|x)
和 βi
:
z=0 不用,z=1 用, k^ 是锁定的 key。
- [接口测试 - http.client篇] 14 源码初探及其工作机制分析
- 51Nod 1277 字符串中的最大值(KMP,裸题)
- Codeforces Round #345 (Div. 2)【A.模拟,B,暴力,C,STL,容斥原理】
- 07.移动先行之谁主沉浮----控件之轮流轰炸——布局类控件
- BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
- UVa 10341 - Solve It【经典二分,单调性求解】
- UVa 11461 - Square Numbers【数学,暴力】
- BZOJ 3097: Hash Killer I【构造题,思维题】
- Python Selenium设计模式-POM
- BZOJ 1207: [HNOI2004]打鼹鼠【妥妥的n^2爆搜,dp】
- HDU 1711 Number Sequence(KMP裸题,板子题,有坑点)
- BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】
- BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
- 洛谷 P1019 单词接龙【经典DFS,温习搜索】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一天一大 leet
- git使用经验
- 最长重复子数组 (难度:中等)-Day20200701
- Presto系列 | Presto基本介绍
- 如何在腾讯云中使用ExternalName类型的Service
- 一天一大 leet (990. 等式方程的可满足性)
- 一天一大 leet(有序矩阵中第 K 小的元素)难度:中等-Day20200702
- 一天一大 leet (126. 单词接龙 II)
- BigData--Yarn资源调度器
- 一天一大 leet(最长有效括号)难度:困难-Day20200704
- BigData--Zookeeper介绍和使用
- 一天一大 leet(通配符匹配)难度:困难-Day20200705
- 日志框架,选择Logback Or Log4j2?
- django-rest-framework配置json web token进行接口的认证
- spring中的SpEL表达式