Motivation
首先,在当时之前存在的传统的机器学习方法中的SVM和传统的神经网络方法有着不小的弊端。大体和我在《Effective LSTMs for Target-Dependent Sentiment Classification》这篇博文中介绍的 Motivation(中的自我总结)部分相同。
其次,作者指出了 LSTM 的弊端,即 LSTM 虽然可以考虑到很多 context 信息,但是其不容易做到有侧重点(例如 sequence 中有的词对于 target sentimental classification 帮助不大,但是 LSTM 对 seqence 中的每个 word 只能做到一视同仁。尽管不同 wrod 会被记住或忘记,但是对每个 word 控制的规则是一样的)
任务定义
给一句话 s = w 1 , w 2 , … , w i , … w n s = {w_1,w_2,…,w_i,…w_n} s=w1,w2,…,wi,…wn,其中包含 n words 和一个 aspect word w i w_i wi(出现在 s 中,所以其是 aspect term 而非 aspect catagory)。
之后通过预测句子 s 的情感极性来当作该 aspect 的情感极性。
方法概述
作者的总体的思路是针对 aspect 找对于其最重要的 context 。
作者用的方法是 deep memory network,这种方法不仅不需要情感词典,甚至也不需要句法分析器。
方法详述
整体流程
首先给出作者提出的这个方法的示意图(Figure 1):
![](https://i-blog.csdnimg.cn/blog_migrate/fcf4360709608841edf3b723fa8df4a8.png)
下面来说明该图:
- 图左边部分,给定一个句子 s = w 1 , w 2 , … , w i , … w n s = {w_1,w_2,…,w_i,…w_n} s=w1,w2,…,wi,…wn 和 aspect word w i w_i wi,并获取每个 word 的 embedding vector 分别记为 e 1 , e 2 , … , e i , … e n e_1,e_2,…,e_i,…e_n e1,e2,…,ei,…en(因为实际情况中 aspect 可能不止一个单词,所以为了方便能都用 w i w_i wi 表示,在 aspect 为多个 word 的情况时,得到其中每个 word 的 embedding vector 之后求和取平均。),之后将这些 words 分为两部分—— aspect 部分和 context 部分,其中 context 部分的 word vectors { e 1 , e 2 , … , e i − 1 , e i + 1 , … e n } \{e_1,e_2,…,e_{i-1},e_{i+1},…e_n\} {e1,e2,…,ei−1,ei+1,…en} 被合在一起作为外部记忆 m ∈ R d × ( n − 1 ) m ∈ R^{d×(n-1)} m∈Rd×(n−1)。
- 图右边部分实右多个计算层组成,每个计算层都是两路的,一路是 attention layer,另一路是 linear layer(作者加入 linear layer 的原因是实验结果驱动的,即加入了效果就是要好一点儿,也没什么理论依据)。
- 在 hop 1 中作者利用 Attention mechinsm 来实现对外部记忆的内容寻址外部记忆,其中 aspect vector 作为 Attention 中的查询向量。之后将Attention layer 的结果和 aspect vector 经过 linear transformation(线性变换)之后的结果求和作为最终结果,并作为下一个 hop 的 input。
- 之后按 hop1 同样的方式执行多次,这样可以使更多的外部记忆中的内容(context 内容)被选择。因为当第一次 context 中有的部分被送入 Attention 中,那么第二次查询时,查询向量就包含了一部分原本是 context 的内容,那么之后找到的内容肯定更多(因为查询中有 context 内容,所以能匹配的内容也更多)。
- 最后,最后一层的 hop 的输出将作为整个句子的 represntation,用于情绪分类部分。
- 补充:每个计算层(hop)中的参数是共享的,所以无论构建一个计算层还是多个计算层其参数量是相同的。
Attention 部分
Attention 部分包含 Content Attention(注意内容)和 Location Attention(注意地址)两部分。在分别介绍这两部分之前,我们需要知道作者是如何将这二者结合起来的。
首先我们知道 Attention 一般过程为用打分函数计算每个元素(在目前任务中即每个 word)与查询向量的匹配程度,归一化之后得到每个元素的权重,最后累加就得到一个最终表示(这个表示包含了所有元素信息,包含的每个元素的信息量是根据之前算得的权重得到的)。
那么现在问题来了,如果我们先进行了一个 attention 部分得到了一个最终表示,那么怎么再加入另一个 attention 部分呢?
作者的做法是,先做 Location Attention 部分,但是只进行到累加的前一步,即计算各个元素(word)与对应权重相乘之后不将它们加在一块儿。这样,我们得到的结果仍然是 n 个 vector(n 为句子长度),之后将这 n 个 vector 存入外部记忆中分别代表对应 word 的 vector。
之后再进行 Content Attention,即将刚刚得到的 n 个 vector 根据与 aspect 的匹配程度做 attention,这次得到最终表示,Attention 部分也到此结束。
Content Attention
Attention 的应用比较简单,即常用的使用方法,输入 aspect vector
v
a
s
p
e
c
t
∈
R
d
×
1
v_{aspect} ∈ R^{d×1}
vaspect∈Rd×1 作为查询向量,来选择与处理外部记忆
m
∈
R
d
×
k
m ∈ R^{d×k}
m∈Rd×k (k 为 memory size)中的单词,以形成最后 attention 部分的输出向量
v
e
c
∈
R
d
×
1
vec ∈ R^{d×1}
vec∈Rd×1,对应公式如下:
v
e
c
=
∑
i
=
1
k
α
i
m
i
(1)
vec = \sum_{i=1}^{k}α_im_i \tag1
vec=i=1∑kαimi(1)
其中
α
i
∈
[
0
,
1
]
α_i ∈ [0,1]
αi∈[0,1] 是每个记忆片段
m
i
m_i
mi 的权重,并且
∑
i
α
i
=
1
\sum_iα_i = 1
∑iαi=1 。打分函数如下:
g
i
=
t
a
n
h
(
W
a
t
t
[
m
i
;
v
a
s
p
e
c
t
]
+
b
a
t
t
)
(2)
g_i = tanh(W_{att}[m_i;v_{aspect}]+b_{att}) \tag2
gi=tanh(Watt[mi;vaspect]+batt)(2)
获得了
{
g
1
,
g
2
,
…
g
k
}
\{g_1,g_2,…g_k\}
{g1,g2,…gk} 之后就是正常的 attention 操作,即通过
s
o
f
t
m
a
x
softmax
softmax 函数得到权重
{
α
1
,
α
2
,
…
,
α
k
}
\{α_1,α_2,…,α_k\}
{α1,α2,…,αk},公式如下:
α
i
=
e
x
p
(
g
i
)
∑
j
=
1
k
e
x
p
(
g
j
)
(3)
α_i = \frac{exp(g_i)}{\sum_{j=1}^{k}exp(g_j)} \tag3
αi=∑j=1kexp(gj)exp(gi)(3)
作者认为自己设计的这种 attention model 有两点优势:
- 这个 attention model 可以自适应地得到每个记忆片段与 aspect 的关联程度。因为其打分函数是一个正反馈神经网络,即 t a n h ( W a t t [ m i ; v a s p e c t ] + b a t t ) tanh(W_{att}[m_i;v_{aspect}]+b_{att}) tanh(Watt[mi;vaspect]+batt),可以看到,其中 input 为记忆 m i m_i mi 和 aspect vector v a s p e c t v_{aspect} vaspect 的拼接,然后送入激活函数为 t a n h tanh tanh 的单个神经元。这样就可以通过该网络根据情况学得参数 W a t t W_{att} Watt 和 b a t t b_{att} batt,达到自适应的目的。
- 这个 attention model 是可微的,这样其就可以随着其他部件一起训练、优化,可以实现端到端这种方式。
Location Attention
上面的 Attention 部分是基于内容的,即选出与 aspect 更相符的上下文。但是往往在实际情况中,距离 aspect term 更近的上下文对 aspect sentiment cliassification 帮助更大。
基于上面的想法,作者提出了 Location Attention,他赋予句子中每个词一个位置信息(方式是用绝对距离来表示,即其距离大小为该 word 处在句子中的第几个位置)。具体作者怎么利用这个位置信息来实现 Location Attention 的呢?作者给出了下面 4 个方法(model)。
-
Model 1:作者用下面这个公式计算 memory vector m i m_i mi
m i = e i ⊙ v i (4) m_i = e_i⊙v_i \tag4 mi=ei⊙vi(4)
其中 ⊙ ⊙ ⊙ 代表 element-wise multiplication(即按对应元素相乘), v i ∈ R d × 1 v_i ∈ R^{d×1} vi∈Rd×1 是 word w i w_i wi 的位置向量(位置向量即指根据位置信息计算得到的向量,也可以将其近似地理解成是每个 word 对应的位置未归一化的权重向量,由下面公式(5)可以看出,这个向量是由一个标量张成的,即该向量的每个元素值都相等),其计算公式如下:
v i k = ( 1 − l i / n ) − ( k / d ) ( 1 − 2 × l i / n ) (5) v_i^k = (1-l_i/n)-(k/d)(1-2×l_i/n) \tag5 vik=(1−li/n)−(k/d)(1−2×li/n)(5)
其中 n n n 是句子长度, k k k 是 hop 数(即指 hop k), l i l_i li 是 w i w_i wi 的位置值。 -
Model 2:这是 Model 1 的简化版,即简化了 v i v_i vi 部分。简化内容:首先,不同的 hop 中的 v i v_i vi 均相同;其次,本身的计算公式也简化了。总之,整个简化部分可以用下面这个公式代表。
v i = 1 − l i / n (6) v_i = 1 - l_i/n \tag6 vi=1−li/n(6) -
Model 3:在这个 model 中,作者将 v i v_i vi 视作一个参数,并利用加法来计算 m i m_i mi,具体如下:
m i = e i + v i (7) m_i = e_i + v_i \tag 7 mi=ei+vi(7)
从公式中我们可以看到, v i v_i vi 就如同全连接网络中的 bais 变量一样,所以作者说将 v i v_i vi 视作一个参数。 -
Model 4: 在这个 model 中位置向量同样被视作参数,只不过不同于 Model 3,Model 4 的做法是通过一个门神经元,输入为 v i v_i vi,输出为一个控制程度(也就是我们常说的 Attention 中的权重信息)。公式如下:
m i = e i ⊙ σ ( v i ) (8) m_i = e_i⊙σ(v_i) \tag8 mi=ei⊙σ(vi)(8)
多层计算层的必要性
首先多层计算层在得到抽象表示方面被广泛使用。
因为单层计算层只包含一个 attention layer,不足以处理复杂计算,即模型能力不强,所以使用多层计算层来提升模型的处理能力。
分类部分
直接使用 s o f t m a x softmax softmax 来进行分类。
存在的问题
- 对 target 的处理比较粗糙。
- 虽然多层 Attention 增加了模型的表示能力,但是每层 Attention 得到的结果又成为了下一层的查询向量,这样可能会导致每次 Attention 得到的结果都是一句话中特定几个词的权重大。