今天讲的内容主要参考了清华大学黄民烈老师团队在2018年在AAAI会议上发表的paper《Emotional Chatting Machine: Emotional Conversation Generation with Internal and External Memo》。
这篇paper针对的场景是聊天机器人,使用的基本模型也是encoder-decoder架构。但是不同的是在聊天机器人生成对话的过中加入了情感信息,因为论文说加入了具有情感感知的能力本身就是机器智能的一个重要表现,因此加入了情感信息的chatbot产出的内容更符合人类的表达习惯,因为是加入了情感信息的chatbot,所以又叫做ECM(
Emotional Chatting Machine)。整个ECM的架构图如下所示:
可以看出这里的原始训练语料是一个pair对(post,response),但是为了能够体现出情感信息,故文章使用了一个情感分类器Emotion classifier对原始的训练pair打上情感标签。这里的情感分类器,作者对比了几种常见的模型后最终选择了双向LSTM。然后针对每一类的情感类别,都进行embedding操作,转换成低维的向量。接下来就进入了模型的训练过程,首先来稍微说一下基本的encoder-decoder的工作过程,这里以GRU为例:
st=GRU(st−1,[ct;e(yt−1)])
s
t
=
G
R
U
(
s
t
−
1
,
[
c
t
;
e
(
y
t
−
1
)
]
)
yt
y
t
~ ot=P(yt|y1,y2.....yt−1,ct)=softmax(Wost)
o
t
=
P
(
y
t
|
y
1
,
y
2
.
.
.
.
.
y
t
−
1
,
c
t
)
=
s
o
f
t
m
a
x
(
W
o
s
t
)
这里的ct
c
t
可以使用attention机制,这里就不再赘述了。如果加入情感embedding,上述公式变成如下:
st=GRU(st−1,[ct;e(yt−1);ve])
s
t
=
G
R
U
(
s
t
−
1
,
[
c
t
;
e
(
y
t
−
1
)
;
v
e
]
)
这里的ve
v
e
就是情感向量
yt
y
t
~ ot=P(yt|y1,y2.....yt−1,ct)=softmax(Wost)
o
t
=
P
(
y
t
|
y
1
,
y
2
.
.
.
.
.
y
t
−
1
,
c
t
)
=
s
o
f
t
m
a
x
(
W
o
s
t
)
但是在具体操作中,作者又引入两个操作Internal Memory和External Memory:
Internal Memory
这个结构设置的目的是针对语言现象“Inspired by the psychological findings that emotional responses are relatively short lived and involve changes ”,也就是带有情感色彩回复中包含的情感信息一般在很短的距离内就衰减了。体现在模型中就是说在decoder过程中情感向量ve
v
e
必须体现出这种衰减,于是作者又设置两种门结构read gate和write gate,用来控制情感embeddingve
v
e
的信息流流向,结构如下图所示:
公式如下所示:
grt=sigmoid(Wrg[e(yt−1);st−1;ct])
g
t
r
=
s
i
g
m
o
i
d
(
W
g
r
[
e
(
y
t
−
1
)
;
s
t
−
1
;
c
t
]
)
read门
gwt=sigmoid(Wwgst)
g
t
w
=
s
i
g
m
o
i
d
(
W
g
w
s
t
)
write 门
MIr,t=grt⨀MIe,t
M
r
,
t
I
=
g
t
r
⨀
M
e
,
t
I
MIe,t+1=gwt⨀MIe,t
M
e
,
t
+
1
I
=
g
t
w
⨀
M
e
,
t
I
st=GRU(st−1,[ct;e(yt−1);MIr,t)
s
t
=
G
R
U
(
s
t
−
1
,
[
c
t
;
e
(
y
t
−
1
)
;
M
r
,
t
I
)
其中MIe,t
M
e
,
t
I
初始化为ve
v
e
,最终为了体现情感是一直衰减的,MIe,t
M
e
,
t
I
最终是要趋近于0的。
External Memory
这个结构是用在最后的输出部分,在是否对情感词进行输出进行了区分,文中把词典分成了2部分:一部分由情感词组成,另一部分由普通词组成。在进行输出词语概率预测的时候,会首先对是否要输出一个情感词进行类似二分类的预测,整个公式如下所示:
αt=sigmoid(vTust)
α
t
=
s
i
g
m
o
i
d
(
v
u
T
s
t
)
对是否输出情感词进行预测
Pg(yt=wg)=softmax(Wogst)
P
g
(
y
t
=
w
g
)
=
s
o
f
t
m
a
x
(
W
g
o
s
t
)
如果是情感词的话,输出在情感词词典中的概率值分布
Pe(yt=we)=softmax(Woest)
P
e
(
y
t
=
w
e
)
=
s
o
f
t
m
a
x
(
W
e
o
s
t
)
如果是普通词的话,输出在普通词词典中的概率值分布
yt
y
t
~ot
o
t
=p(yt)=
=
p
(
y
t
)
=
(1−αt)Pg(yt=wg)
(
1
−
α
t
)
P
g
(
y
t
=
w
g
)
or
αtPe(yt=we)
α
t
P
e
(
y
t
=
w
e
)
最终模型的loss function如下所示:
L(θ)=−∑mt=1ptlog(ot)−∑mt=1qtlog(αt)+||MIe,m||
L
(
θ
)
=
−
∑
t
=
1
m
p
t
l
o
g
(
o
t
)
−
∑
t
=
1
m
q
t
l
o
g
(
α
t
)
+
|
|
M
e
,
m
I
|
|
其中第一项就是正常生成过程中针对每一个词语的预测误差,第二项是生成过程中对每一个词语是否为情感词的预测误差,最后一项是每一句话在decoder的最后一个时刻的情感状态值,这样设置是为了尽可能的使最终的情感向量状态值趋向于0,对应回复中的情感信息很快衰减的现象。
实际使用的时候,针对每一个post,要指定情感给chatbot,它就能输出能回答这个post不同情感的response。文中说这样的方式更具有人工智能。