Deep Memory Network在Aspect Based Sentiment方向上的应用
前面的博文Deep Memory Network 深度记忆网络已经非常详细地介绍了该种网络架构,下面我们来研究一下其在基于方面的情感分类的应用。Aspect Based Sentiment是一种细粒度的情感分析问题,一个句子中可能有多个aspect,并且这些aspect的极性可能是不一样的。该任务来自SemEval-14 task 4,要求正确预测所有aspect的极性。基于方面的情感分析,以下全部使用简称ABSA。
Aspect Level Sentiment Classification with Deep Memory Network
首先介绍的第一篇论文来自哈工大(EMNLP 2016),现在被所有的ABSA论文作为baseline模型。
这应该是第一篇采用Deep Memory Network来实现ABSA的工作。他们使用的模型如上图所示,是一个三跳(层)的记忆网络。该模型把sentence当作passage,aspect当作question。值得注意的是,aspect可能包含多个词,在多个词的条件下,原论文会对所有词的词向量求和取平均作为该aspect的表示。
论文中的外置记忆 m m m由Context Word的词向量表示拼接而成,其中不包括Aspect的表示。
模型主要包括两大部分,Attention layer和Linear layer。在Attention Layer中,模型将aspect向量作为输入,以此为依据在记忆m中选择重要的evidences。线性层则执行一种线性变换以提高效果。原论文在层与层之间共享了attention layer以及linear layer的参数,即之前博文Deep Memory Network 深度记忆网络提到的Layer-wise架构,线性变换能提高效果也是该架构提出者发现的。
Attetnion Layer
Attention Layer主要计算两种形式Attention:Content Attention和Location Attention。
- Content Attention:是以记忆网络的attention形式计算sentence每一个词对于aspect的重要程度,比较直观;
- Location Attention:用来衡量与aspect不同距离的词的重要程度。因为直观上看,离aspect越近的词越重要。
Content Attention
计算记忆中所有元素的加权之和(
m
i
m_i
mi融合距离信息的计算方式在下面):
v
e
c
=
∑
i
=
1
k
α
i
m
i
vec=\sum_{i=1}^k\alpha_im_i
vec=i=1∑kαimi
其中
α
i
\alpha_i
αi是每个元素的权重,本质上是一种attention,计算方式如下:
g
i
=
t
a
n
h
(
W
a
t
t
[
m
i
;
v
a
s
p
e
c
t
]
+
b
a
t
t
)
g_i=tanh(W_{att}[m_i;v_{aspect}]+b_{att})
gi=tanh(Watt[mi;vaspect]+batt)
α
i
=
e
x
p
(
g
i
)
∑
j
=
1
k
e
x
p
(
g
j
)
\alpha_i=\frac{exp(g_i)}{\sum_{j=1}^k exp(g_j)}
αi=∑j=1kexp(gj)exp(gi)
作者认为该attention有两种优势:
- 可以根据记忆元素 m i m_i mi和aspect的语义相关程度来适应性地分配重要性得分。
- 可微,因此易于以端到端的方式实现。
Location Attention
作者在论文中一共提出了四种方式来计算location Attention。
-
方式1:
m i = e i ⊙ v i m_i=e_i \odot v_i mi=ei⊙vi
v i k = ( 1 − l i / n ) − ( k / d ) ( 1 − 2 × l i / n ) v_i^k=(1-l_i/n)-(k/d)(1-2\times l_i/n) vik=(1−li/n)−(k/d)(1−2×li/n)
其中 e i e_i ei是词 w i w_i wi的embedding, n n n是句子长度, k k k是跳数, l i l_i li是词 w i w_i wi在句子中的的位置。 -
方式2:
v i = 1 − l 1 / n v_i = 1-l_1/n vi=1−l1/n
即方式1的简化版本。 -
方式3:
m i = e i + v i m_i=e_i+v_i mi=ei+vi
把距离信息当作是参数,与embedding求和。 -
方式4:
m i = e i ⊙ σ ( v i ) m_i=e_i \odot\ \sigma(v_i) mi=ei⊙ σ(vi)
在距离表示上添加一个门控单元来控制写入记忆中的单词语义的量。
四种方式区别见上图
Multiple Hops
至于为什么是多跳,作者解释说多层能捕捉到多个层级的抽象信息。由于模型在一层计算的是加权平均,单层不能解决复杂的如否定(negative)、加强(intensification)、对比(contraction)等复杂的语言信息。多层可以学习到不同级别的文本抽象信息,能以更高、更抽象的级别获取表示。
Aspect Level Sentiment Classification
作者使用的loss函数是cross entropy,这个就不作解释了。
l
o
s
s
=
−
∑
(
s
,
a
)
∈
T
∑
c
∈
C
P
c
g
(
s
,
a
)
⋅
l
o
g
P
c
g
(
s
,
a
)
loss=-\sum_{(s,a)\in T}\sum_{c\in C}P_c^g(s,a) \cdot logP_c^g(s,a)
loss=−(s,a)∈T∑c∈C∑Pcg(s,a)⋅logPcg(s,a)
Deep Mask Memory Network with Semantic Dependency and Context Moment for Aspect Level Sentiment Classification
下面介绍的这篇论文来自IJCAI-2019,其结果也是目前非Bert模型中已发表论文的最高水平。这个模型相较于上面那一篇要复杂很多,是一篇名副其实的IJCAI论文。
这篇论文较于上一篇的改进之处在于:
- 整合了语义分析信息到记忆网络中而不是位置信息。
- 设计了辅助任务来学习整个句子的情感分布,这可以为目标aspect的情感分类提供想要的背景信息。
该论文提出模型被称作deep mask memory network with semantic dependency and context moment (DMMN-SDCM)。它基于记忆网络,引入语义分析信息来指导attention机制并有效学习其他aspect(非目标aspect)提供的信息。同时论文提出的context moment嵌入到了整个句子的情感分类,被设计用于为目标aspect提供背景信息。
模型主要包括以下三个部分:
- the semantic-dependency mask attention
- the inter-aspect semantic modeling
- the context-moment sentiment learning
- 除此之外还有基础的的embedding模块、memory building模块、实现分类的classification模块。
DMMN-SDCM整体架构
Embedding模块没有什么可讲的。
Memory Building模块使用一个双向的LSTM网络来获取记忆 m 1 ∗ , m 1 2 , . . . , m n ∗ {m_1^*,m_1^2,...,m_n^*} m1∗,m12,...,mn∗,其中 m i ∗ = ( h i ← , h i → ) m_i^*=(\overleftarrow{h_i},\overrightarrow{h_i}) mi∗=(hi,hi)
The semantic-dependency-mask attention模块提取语义信息,并且为不同层选择不同的记忆元素来指导attention机制,该模块的输出记作 v s d v_{sd} vsd
The inter-aspect semantic modeling模块使用语义依赖信息和attention机制来获取其他aspect的有用信息,其输出记为 v i m v_{im} vim。
The context-moment sentiment learning使用一个被称为context moment learning的任务来学习整个句子中所有aspect的信息,其输出记为 v c m v_{cm} vcm。
以上三个模块的输出构成了sentiment representation: v = { v s d , v i m , v c m } v=\{ v_{sd}, v_{im}, v_{cm}\} v={vsd,vim,vcm}。
Classification模块就是一个前馈网络,将 v v v映射到目标分类: y = s o f t m a x ( W c v + b c ) y=softmax(W_cv+b_c) y=softmax(Wcv+bc)
文中使用的loss包含三个部分,交叉熵+辅助任务loss+
L
2
L_2
L2正则:
L
=
∑
s
∈
S
(
−
∑
t
∈
T
∑
i
=
1
C
)
g
i
t
l
o
g
y
i
t
+
λ
m
l
m
(
s
)
+
λ
∥
θ
∥
2
2
L=\sum_{s\in S}(-\sum_{t\in T}\sum_{i=1}^C)g_i^tlogy_i^t+\lambda_ml_m(s) + \lambda \left \| \theta \right \|^2_2
L=s∈S∑(−t∈T∑i=1∑C)gitlogyit+λmlm(s)+λ∥θ∥22
辅助任务的loss稍后介绍。
Semantic-Dependency-Mask Attention
该模块依据语义依存分析树(semantic dependency parsing tree),来对不同计算跳数的context memory施加mask。在每一个计算步骤,该模块在aspect的表示和记忆单元之间使用attention机制。
语义分析树使用开源工具spaCy生成。
原作者将语义分析树上词到aspect的路径长度作为距离,来提取语义分析信息。施加掩码的语义分析信息如下:
m
i
∗
=
{
m
i
∗
,
i
f
d
i
s
t
(
w
i
,
w
t
)
≤
l
0
,
o
t
h
e
r
w
i
s
e
m_i^*=\begin{cases} m_i^*, \ if \ dist(w_i,w_t) \leq l \\ 0, \ otherwise \end{cases}
mi∗={mi∗, if dist(wi,wt)≤l0, otherwise
以上述方式得到整个层的
{
m
1
l
,
.
.
.
,
m
i
l
,
.
.
.
,
m
n
l
}
\{m_1^l,...,m_i^l,...,m_n^l\}
{m1l,...,mil,...,mnl}之后,以如下形式计算
l
l
l层的attention得分:
α
i
l
=
s
o
f
t
m
a
x
(
W
A
L
l
(
m
i
l
,
v
s
d
l
−
1
,
v
t
)
+
b
A
L
l
)
\alpha_i^l = softmax(W_{AL}^l(m_i^l,v_{sd}^{l-1},v_t)+b_{AL}^l)
αil=softmax(WALl(mil,vsdl−1,vt)+bALl)
其中
v
s
d
v_{sd}
vsd是上一层的计算结果,
v
t
v_t
vt是aspect的表示。
attention输出
i
l
A
L
i_l^{AL}
ilAL以如下方式进行计算:
i
l
A
L
=
∑
i
=
1
n
α
i
l
m
i
l
i_l^{AL}=\sum_{i=1}^n\alpha_i^lm_i^l
ilAL=i=1∑nαilmil
在最后一层,作者采用另一个先行层来施加线性变换,作为一个门控函数来控制传递的转化特征和输入特征的比例:
v
s
d
l
=
(
W
o
i
l
A
L
+
b
o
)
∗
T
+
v
s
d
l
−
1
∗
(
1
−
T
)
v_{sd}^l=(W_oi_l^{AL}+b_o)*T+v_{sd}^{l-1}*(1-T)
vsdl=(WoilAL+bo)∗T+vsdl−1∗(1−T)
门控
T
T
T由以下方式生成:
T
=
σ
(
W
t
v
s
d
l
−
1
)
+
b
t
T=\sigma(W_tv_sd^{l-1})+b_t
T=σ(Wtvsdl−1)+bt
Inter-Aspect Semantic Modeling
该模块将上一步得到的语义依存信息整合到attention机制。上一个模块得到了所有aspect的aspect-aware representation,组成了如下所示的aspect menory:
M
=
{
v
s
d
1
,
v
s
d
2
,
.
.
.
,
v
s
d
3
}
M=\{v_{sd1},v_{sd2},...,v_{sd3}\}
M={vsd1,vsd2,...,vsd3}
在此基础之上,为了得到aspect memory里面目标aspect的信息,再次使用依存分析信息进行了加权:
M
′
=
{
v
s
d
1
′
,
v
s
d
2
′
,
.
.
.
,
v
s
d
3
′
}
M'=\{v'_{sd1},v'_{sd2},...,v'_{sd3}\}
M′={vsd1′,vsd2′,...,vsd3′}
其中
v
s
d
1
′
=
λ
i
∗
(
v
s
d
i
,
v
s
d
t
)
v'_{sd1}=\lambda_i*(v_{sd_i},v_{sd_t})
vsd1′=λi∗(vsdi,vsdt),
λ
i
\lambda_i
λi由以下方式计算而来:
λ
i
=
1
−
d
i
s
t
(
w
i
,
w
t
)
d
e
p
t
h
\lambda_i=1-\frac{dist(w_i,w_t)}{depth}
λi=1−depthdist(wi,wt)
其中
d
i
s
t
(
w
i
,
w
t
)
dist(w_i,w_t)
dist(wi,wt)是语义距离(笔者认为是依存分析树上的距离),
d
e
p
t
h
depth
depth是依存分析树的高度,这些都make sense。
然后再次使用attention机制,来得到最终表示
v
i
m
v_{im}
vim
β
i
=
s
o
f
t
m
a
x
(
W
i
m
v
s
d
i
′
)
+
b
i
m
\beta_i=softmax(W_{im}v'_{sd_i})+b_{im}
βi=softmax(Wimvsdi′)+bim
v
i
m
=
∑
i
p
β
i
∗
v
s
d
i
′
v_{im}=\sum_i^{p}\beta_i*v'_{sd_i}
vim=i∑pβi∗vsdi′
Context-Moment Sentiment Learning
该模块实现辅助任务,目的是想借助aspect之间的关系来识别其极性。作者认为这种关系能为分类提供背景信息。moment实际上刻画的是所有aspect在句子s上的情感分布,它是概率统计学上的矩的意思。
Context Moment定义如下:
μ
i
=
E
(
(
x
−
μ
)
i
)
\mu_i=\textbf{E}((\textbf{x}-\mu)^i)
μi=E((x−μ)i)
其中
E
\textbf{E}
E是一个期望操作符,
x
x
x是情感分布随机变量,
i
i
i代表当前矩的阶。很明显,
i
i
i是奇数时,
μ
i
∈
[
−
1
,
1
]
\mu_i\in[-1, 1]
μi∈[−1,1],
i
i
i是偶数时,
μ
i
∈
[
1
,
0
]
\mu_i\in[1, 0]
μi∈[1,0],为了统一,作者也将所有的moment归一化到了
[
1
,
0
]
[1, 0]
[1,0]
论文中给出的一个示例,平均值被称为第一矩,方差被称为第二矩。平均值越高,说明整个句子的情感倾向越靠近postive。方差越接近1,说明句子里aspect之间越接近与对比关系(即一个aspect很差,另一个很好,或者反之;越接近0说明句子里的aspect直接的关系越接近于合作关系(它们极性越接近)。
作者再次使用了attention层再加上两层的前馈网络来学习表示mean的矩和表示variance的矩。附加任务使用的loss如下:
l
m
(
s
)
=
∑
i
=
1
k
μ
i
l
n
(
u
i
′
)
+
(
1
−
μ
i
)
l
n
(
1
−
u
i
′
)
l_m(s)=\sum_{i=1}^k\mu_iln(u'_i)+(1-\mu_i)ln(1-u'_i)
lm(s)=i=1∑kμiln(ui′)+(1−μi)ln(1−ui′)
其中
k
k
k表示使用的moment的最高阶(读到这里笔者可以断定moment表示的不是时刻,而是矩的意思,参见矩估计)。
论文中将前述的第一矩和第二矩作为学习目标。
第一矩由以下方式得到:
v
m
e
a
n
=
W
μ
1
v
s
1
v_{mean}=W_{\mu1}v_s^1
vmean=Wμ1vs1
μ
1
′
=
s
i
g
m
o
i
d
(
W
μ
1
(
v
m
e
a
n
;
v
g
l
o
b
a
l
)
)
\mu_1'=sigmoid(W_{}\mu_1(v_{mean};v_{global}))
μ1′=sigmoid(Wμ1(vmean;vglobal))
其中
v
g
l
o
b
a
l
v_{global}
vglobal由前面介绍的Semantic-Dependency-Mask Attention在一个句子上的所有aspect的输出取平均得到:
v
g
l
o
b
a
l
=
1
p
∑
i
p
v
s
d
i
v_{global}=\frac{1}{p}\sum_i^pv_{sd_i}
vglobal=p1i∑pvsdi
v
v
a
r
i
a
n
c
e
v_{variance}
vvariance以上述同样的方式计算得来,两者堆起来构成了模块的最终输出:
v
c
m
=
(
v
m
e
a
n
,
v
v
a
r
i
a
n
c
e
)
v_{cm}=({v_{mean}, v_{variance}})
vcm=(vmean,vvariance)
模型的最终效果以及各部分的贡献可以参见下表:
这篇论文实现的模型非常的复杂,是一篇名副其实的顶会论文,值得仔细去读一读。作者三次attention机制的使用,引入语法分析工具得到语义信息之后辅助任务的添加,等等思想非常值得借鉴。