注意力机制是一种很有用的提高措施,在机器翻译、图像描述生成、图像语义分割等方面都有很重要的作用。今天我想要重点回顾和学习一下注意力机制的各种使用场合。
从机器翻译开始
机器翻译,准确点说应该是神经机器翻译(NMT),从2014年出现,到目前(2019年),已经成为NLP领域里面最成功的一个应用。在传统机器翻译中,由于不同语种的语法各有不同,词序、表达方式的差异导致机器翻译最大的一个难题就是对齐规则的学习。相比于统计机器翻译(SMT),NMT最大的优点是end-to-end,不需要额外的人工构建规则或者特征工程,完全由模型自主学习如何得到翻译结果。
假设输入句子为x
,输出句子为y
,机器翻译的根本目的是要最大化输出概率,即
m
a
x
P
(
y
^
∣
x
)
maxP(\hat{y}|x)
maxP(y^∣x)。在SMT中,根据贝叶斯公式,会把这个目的分解成两个部分,
P
(
y
∣
x
)
=
P
(
x
∣
y
)
P
(
y
)
P
(
x
)
∝
P
(
x
∣
y
)
P
(
y
)
P(y|x) = \frac{P(x|y)P(y)}{P(x)} \propto P(x|y)P(y)
P(y∣x)=P(x)P(x∣y)P(y)∝P(x∣y)P(y)
其中 P ( x ∣ y ) P(x|y) P(x∣y)是翻译模型根据平行语料计算出来的,而 P ( y ) P(y) P(y)即为输出句子的语言模型。但我们不能保证概率大就是好,因为不同语言的语序是不一样,所以还必须学习一个对其规则 a a a,于是上式改为 P ( y , a ∣ x ) P(y,a|x) P(y,a∣x)。在 a a a这块需要用到比较复杂的规则或者算法,需要大量的人工维护和特征工程构建,笔者也没有仔细学习过,所以需要详细深入的朋友请查阅相关资料。
然而,人类进行翻译的时候并不需要将任务细分,所以一种跟接近。人类习惯的方法(NMT)就被提出来了。最初提出用以解决NMT问题的是Seq2Seq的网络结构,即一个RNN用作将输入序列编码成hidden state,另一个RNN对hidden state解码回序列。这个网络结构并不局限于机器翻译,而是可以广泛用于自动摘要、对话机器人等。Seq2Seq网络结构大概是这样的
图一 seq2seq网络结构
红色的RNN用于对这串法文进行编码,到最后一个输出的hidden state用作解码器(绿色的RNN)的initial state,然后这一部分就相当于是一个语言模型。
Seq2Seq的训练跟语言模型(详情请戳这里)的训练差不多,都是逐个output计算负对数概率再汇总
图二 seq2seq的训练
Seq2Seq这个过程确实挺类似人类的翻译习惯:先阅读原语言的文字,再翻译成一句目标语言的连贯的话。但是从上图给出一个很直观的感受就是,Seq2Seq会比语言模型更难训练,因为梯度消失/梯度爆炸的风险更高。然后对于人类习惯而言,我们并不总是阅读完整句话再去翻译,所以翻译时所需的信息并不总是由输入文本的末尾得到,这也是翻译任务重“对齐”的重要性和难度的体现。
Attention机制
1.Attention机制简析——以NMT为例
上面提到,我们并不总是看完整句话再去进行翻译,但上面提到的这个Seq2Seq框架却需要网络去做这样的事,因此它最大的瓶颈在于,编码器的最后一个时间步需要获取整个输入文本的所有信息,否则它就无法准确地把输入语言的内容很好地传递给解码器。其次,也就是上面提到的,我最直观的感受就是它比普通语言模型肯定要更难训练,因为它相当于在语言模型之前接入了一个额外的东西。
Attention机制的出现使得这些问题都得到了解决,可以说得上Attention极大地改进了NMT。一开始听说Attention强大的威力的时候,我还以为是个多么复杂的东西,直至后面看了一些文章和论文,才发现其实是个很简单但却很巧妙地设计。
回想到上面提到的第二个问题,既然我们翻译时所需要的信息因为语序问题或者语言习惯问题,并不总是从原语言最后一步就能完整得到的,那么我们能不能就不从最后一步得到呢?
当然是可以的!因为在解码器生成每一个词的时候,它对原语言内容的参考是会有侧重点的,那么我们在生成目标语言的时候同时参考前面编码过程的所有hidden state就好了!而“侧重点”,我们可以用权重来实现。
图三 Attention机制
如上图所示,编码器每一个time step的输出hidden state都会与解码器的hidden state进行交互计算得一个权值,这个权值再乘上对应的编码器hidden state得到图上所写的Attention output。接着这个Attention output会与解码器的hidden state拼接起来再计算output。
这个过程用数学公式描述就是:
- 解码器第t步的hidden state
s
t
s_t
st与编码器各个step的hidden state [
h
1
h_1
h1,…,
h
N
h_N
hN]交互:
e t = [ s t T h 1 , s t T h 2 , . . . , s t T h N ] e_t = [s_t^{T}h_{1},s_t^{T}h_{2},...,s_t^{T}h_{N}] et=[stTh1,stTh2,...,stThN] - 标准化权值:
α t = s o f t m a x ( e t ) \alpha_t = softmax(e_t) αt=softmax(et) - 对编码信息进行加权平均:
a t = ∑ i = 1 N α i t h i a_t = \sum_{i=1}^{N}{\alpha_{i}^{t}h_{i}} at=i=1∑Nαithi - 拼接Attention output与解码器hidden staten,用于预测目标词:
y ^ t = f ( [ a t ; s t ] ) \hat{y}_t = f([a_t;s_t]) y^t=f([at;st])
2.Attention机制的几种变形
上面提到 s t s_t st与 [ h 1 , . . . , h N ] [h_1,...,h_N] [h1,...,hN]的交互操作是内积,我们称其为内积Attention(Basic dot-product attention)。这种操作很直观,也很容易理解,因为两个向量内积越大,相关程度通常也越高,所以以其归一化的内积作为权重,是非常简单直白的。
但是内积attention要求
s
⃗
\vec{s}
s和
h
⃗
\vec{h}
h两个向量必须是同样的长度,否则内积无法计算。为了解决这个尴尬,我们可以宽松一点,引入一个矩阵
W
∈
R
d
2
×
d
1
W\in{R^{d_{2}\times{d_1}}}
W∈Rd2×d1作为模型参数,这种形式的attention我们称为乘性Attention(Multiplicative Attention),上面步骤1的交互操作变成:
e
t
=
[
s
t
T
W
h
1
,
s
t
T
W
h
2
,
.
.
.
,
s
t
T
W
h
N
]
e_t=[s_t^{T}Wh_{1},s_t^{T}Wh_{2},...,s_t^{T}Wh_{N}]
et=[stTWh1,stTWh2,...,stTWhN]
此外还有一种加性Attention(Additive Attention),这种Attention相当于是一个隐藏层,添加了两个额外的权值矩阵分别为
W
1
∈
R
d
3
×
d
1
W_1 \in R^{d_3\times{d_1}}
W1∈Rd3×d1和
W
2
∈
R
d
3
×
d
2
W_2 \in R^{d_3\times{d_2}}
W2∈Rd3×d2,以及一个权值向量
v
∈
R
d
3
v \in {R^{d_3}}
v∈Rd3,交互形式是
e
i
=
v
T
t
a
n
h
(
W
1
h
i
+
W
2
s
t
)
e_i = v^{T}tanh(W_{1}h_i+W_{2}s_t)
ei=vTtanh(W1hi+W2st)
上面提到的三种变体,其实都只是修改了四个步骤里面的第一个步骤,而其余三个步骤,不管是哪种Attention都是一样的。三种不同类型的attention它们的适用场合不尽一致,但总体而言,点积Attention的计算效率最高且空间要求最低。
3.Attention机制的理解
我们可以把Attention理解成一个检索系统,
s
t
s_t
st相当于我们检索时发出的query
,而
[
h
1
,
.
.
.
,
h
N
]
[h_1,...,h_N]
[h1,...,hN]代表了资源的键key
,另外还有对应的资源内容value
(由于Attention场景的特殊性,它的键和值其实是同样的东西)。通常,像搜索引擎一样,检索系统会自动计算query
和各个key
之间的吻合程度,把内容按相关程度倒序排列呈现出来。不过,小孩子才做选择,咱们成年人,当然全都要,咱们按这个“相关程度”对所有value
加权,这样咱们就可以获取这个query
在检索系统里面所能获取的信息了。
再来一个例子。
在Image captioning任务中,我们需要以输入图像来获取相关的图像描述文本。一个关键的困难在于图像里面包含很多信息,也包含很多噪音,但生成文本时每个时间步都只需要考虑特定的信息而非图像所呈现的全局信息。Show,Attention and Tell这个框架采用了CNN+Attention+RNN的结构,利用CNN编码图像信息,Attention模块给feature map加权捕获对应位置的信息,就像视觉热力图一样,最后RNN负责根据这个综合信息来生成文本。
图四 Attention机制用于图像描述
图五 加性Attention机制