论文地址,论文作者为 Zhou, Hao, et al.,发表于 2017 年。
论文概要与引言
想要对话系统或者对话助手取得成功,对情绪的感知和表达是一个关键因素。本文提出 Emotional Chatting Machine(ECM),可产生带有情绪的回复,而不仅仅是合乎情理且语法准确的内容。
相关工作
目前在大规模对话生成中并没有工作提出情绪因素,但是有一些可控变量文本生成的研究。例如,基于语言的某一种属性(观点,时态等)生成语句。
- 提出一个可以根据语言某些特性来生成语句的生成模型,例如情绪和时态(sentiment and tenses)
- Affect Language Model 可以根据上下文词汇和感情类别(context words and affect categories)生成文本
- 与语法信息合作,为一个文档生成评论,使用了情绪和主题的因素(sentiment and topics)。
本文的工作与先前工作有两个方面不同:
- 以前的工作高度依赖语言学工具或者自定义的参数,但是我们的模型完全是数据驱动的,不依赖任何人工调整
- 以前的工作没有对交互过程中的输入和输出中包含的多种情绪建模,反而使生成的文本简单地延续了上下文中的情绪
ECM
背景:encoder-decoder框架
略。
任务定义和概要
此问题定义为:给定一个 post \(X = (x_1, x_2, \cdots, x_n)\) 以及一个待生成的回复的情绪类别 \(e\),目标是生成一个回复 \(Y = (y_1, y_2, \cdots, y_m)\),它与情绪类别 \(e\) 相关联。本质上来讲,模型估计概率:\(P(Y|X, e) = \prod^m_{t=1} P(y_t | y_{<t}, X, e)\)。情绪类别包括 {Angry, Disgust, Happy, Like, Sad, Other},继承自一个 Chinese emotion classification challenge 任务。
在我们的问题陈述中,因为情绪是高度主观的,所以我们假定待生成回复的情绪类别已经预先给定。给定一个 post,一句回复也许有多种情绪合适,这取决于回复者的态度。与以往的研究相比,psot 和 response 之间情感的灵活交互时一个重要区别。先前工作的做法是生成一个与输入句子相同情绪的回复,情绪无法做到灵活变换。
因此,由于这种主观的情绪回复,我们选择关注核心问题的解决,即给定一个 post 和一个待回复的情绪类别,生成一句情绪化的回复。注意,有多种方式能够使聊天机器人对一句回复选择一个情绪类别。一种是给予机器人一种人格或者一些背景知识;另一种是使用训练数据从而在给定 post 的情绪的情况下,找到最常见的回复的情绪类别,然后将它作为回复附带的情绪。此方法由于反应了人们的普遍情绪,所以是合理的。这将留给未来的工作。赋予机器人能够生成带有情绪的回复的能力
基于上一节的生成框架,提出了 ECM。第一,因为情绪类别是一个对情绪表达的高度抽象,ECM 嵌入情绪类别并且将其词向量喂入 decoder。第二,我们假定在解码期间,有一个内在的情绪状态,为了捕获到状态模糊的改变以及为了动态地平衡语法状态和情绪状态之间的权重,ECM 采用一个内部记忆模块(internal memory module)。第三,情绪显示的表达是通过外部记忆模块(external memory module)显示地选择一个通用(非情绪)或情绪词汇来建模的。ECM的基本介绍
ECM 的总览如图 1 所示。在训练步骤,处理过的回复对语料库被喂入一个情绪分类器,然后 ECM 在三元组(posts,responses and emotion)形式的回复的情绪标签上训练。在推理过程,post 被喂入 ECM 以生成基于不同情绪类别的情绪化回复。ECM 的流程
Emotion Category Embedding
因为一个情绪类别(例如 Angry,Disgust,Happy)是情绪表达的高度抽象,在回复生成上对情绪建模的最直观的方式是将待生成的回复的情绪类别作为额外输入。每一个情绪标签都是真实数值,一个低维的向量。对于每一个情绪类别 \(e\),我们都随机初始化为 \(v_e\),然后在训练阶段中学习。情绪嵌入,词嵌入以及上下文向量被喂入 decoder,然后更新 decoder 的状态 \(s_t\):训练情绪类别的嵌入 \[s_t = GRU(s_{t-1}, [c_t; e(y_{t-1}); v_e]) \]
Internal Memory
上一节提出的方法是相对静态的:情绪类别嵌入不会在生成步骤中改变,这个也许牺牲了语句在语法上的准确性,由 Ghosh et al. 2017 提出。受到心理学上成果的启发,情绪化回应是相对短暂的,是涉及到变化的并且是在情绪化回应中的动态情绪状态,因此我们设计了一个内部记忆模块去捕获在解码过程中情绪的动态变化。如下所示,我们模拟了情绪表达的过程:1)在解码过程开始之前,每一个类别都有一个内部情绪状态;2)每一个时间步,情绪状态都会有一定程度的衰减;3)一旦解码步骤完成,情绪状态应该衰减至 0,这意味着情绪被完全地表达出来了。
内部记忆模块的详细过程如图 2 所示。每一个时间步 \(s\),ECM 通过输入(前一个解码出的单词 \(e(y_{t-1})\) 的词向量)、前一个解码状态 \(s_{t-1}\)和当前上下文向量 \(c_t\),去计算一个 read gate \(g^r_t\)。write gate \(g^w_t\) 基于解码状态 \(s_t\) 计算。read gate 和 write gate 如下定义: \[ \begin{align} g^r_t & = sigmoid(W^r_g [e(y_{t-1}); s_{t-1}; c_t]) \\ g^w_t & = sigmoid(W^w_g s_t) \end{align} \] 然后 read 和 write gate 各自被用于读取和写入内部记忆。因此,情绪状态在每个时间步都会根据一定量(通过 \(g^w_t\))被擦除。尤其最后一个时间步,内部情绪状态将会衰减至 0。这一过程将由以下公式定义,其中 \(otimes\) 代表矩阵对应元素相乘运算。 \[ \begin{align} M^I_{r, t} & = g^r_t \otimes M^I_{r, t} \\ M^I_{e, t+1} & = g^w_t \otimes M^I_{e, t} \\ \end{align} \] GRU 根据前一个生成的目标词 \(e(y_{t-1})\),前一个解码的隐藏状态 \(s_{t-1}\),上下文向量 \(c_t\) 和更新过的情绪状态 \(M^I_{r,t}\) 生成状态 \(s_t\),如下所示: \[s^t = GRU(s_{t-1}, [c_t; e(y_{t-1}); M^I_{r, t}]) \] 然后根据这个状态 \(s_t\) 就可以通过 softmax 函数计算出生成单词的分布 \(o_t\)。
External Memory
在内部记忆模块中,内部情绪状态和被挑选出的单词之间的相互关系不是很清楚并且不是可直接观测。因为情感的表达和句子中情感词是显而易见的,例如 lovely 和 awesome 与通用词汇(非情感词,例如 person,day)相比携带了强烈的感情,所以我们提出了外部记忆模块,通过对情感词(emotion words)和通用词(generic words)分配不同的生成概率,从而对清晰的情感表达建模。因此模型可以从情感词汇表或者通用词汇表中选择地生成词汇。
带着外部机遇模块的编码器如图 3 所示。给定当前状态 \(s_t\),在情绪词表上计算出 emotion softmax \(P_e(y_t = w_e)\) 和 generic softmax \(P_g(y_t = w_g)\),它们分别读取自情绪词表(emotion vocabulary)和通用词表(generic vocabulary)。type selector \(\alpha_t\) 控制是否生成情绪或者通用词汇。最终通过两个概率分布的拼接向量计算出下一个单词的概率。该过程可由下公式描述: \[ \begin{align} \alpha_t & = sigmoid((v_u)^T s_t) \\ P_g(y_t = w_g) & = softmax(W^o_g s_t) \\ P_e(y_t = w_e) & = softmax(W^o_e s_t) \\ y_t \sim o_t = P(y_t) & = \begin{bmatrix} (1 - \alpha_t) P_g(y_t = w_g) \\ \alpha_t P_e(y_t = w_e) \end{bmatrix} \\ \end{align} \] 其中 \(\alpha_t \in [0,1]\) 是一个标量,用以平衡情绪词 \(w_e\) 和通用词 \(w_g\) 之间的选择。其他符号望文生义就不说了。
Loss Function
loss function 由三部分组成,一个用于内部记忆,强制使得内部记忆状态在最后一个解码步衰减至 0;另一个用于外部记忆,约束情感词或者通用词的选择。定义为: \[L(\theta) = -\sum^m_{t=1} p_t log(o_t) - \sum^m_{t=1} q_t log(\alpha_t) + \|M^I_{e,m}\| \] \(M^I_{e,m}\) 是最后一个时间步 m 的内部解码状态, \(\alpha_t\) 是选择情绪词还是通用词的概率,\(q_t \in {1, 2}\) 是选择情绪词还是通用词的真实值。所以第一项是预测下一个词的 loss,第二项被用于监督情绪词和通用词选择的概率的 loss,第三项被用于确保在解码完成时,内部隐藏状态被全部表达出来。
数据准备
由于没有现成的数据支持 ECM 的训练,所以我们先在 NLPCC 的情绪分类数据集上训练一个情绪分类器(emotion classifier),然后使用这个分类器标注 STC 对话数据集(Shang, Lu, and Li 2015),这样来构建我们自己的数据集。数据准备主要有两步:
- 构建情绪分类器:我们在 NLPCC 的数据集上训练了多个模型,然后选择了一个做好的用做自动标注。数据集选择 NLPCC2013 和 NLPCC2014 的情绪分类任务挑战。数据收集自微博,由人工标注成 8 个情绪分类。移除了低频的情绪(Fear(1.5%),Surprise(4.4%))之后,我们还剩 6 个。我们选择了 lexicon-based classifier (Liu 2012),RNN,LSTM,Bi-LSTM 等模型。实验证明 Bi-LSTM 是最好的。
- 标注 STC 数据集的情绪:我们使用 Bi-LSTM 对 STC 进行标注。这样就获得了情绪标签数据集,我们称之为 ESTC。尽管 ESTC 由于自动标注有很多噪声,但是实际上足够训练了(-.-真的吗?)。未来我们将研究分类误差是怎么样影响回复生成的。