把有限的注意力放到重要的地方
。
在这一节中,我们将了解如何使得我们的网络也具有产生注意力的能力,以及这样的注意力能够给网络表现带来怎样的改变。
让我们从循环神经网络的老大难问题——机器翻译问题入手。
我们知道,普通的用目标语言中的词语来代替原文中的对应词语是行不通的,因为从语言到另一种语言时词语的语序会发生变化。比如英语的“red”对应法语的“rouge”,英语的“dress”对应法语“robe”,但是英语的“red dress”对应法语的“robe rouge”。
为了解决这个问题,我们创造了Encoder-Decoder结构的循环神经网络。
但是问题在于,中间状态
由于来自于输入网络最后的隐藏层,一般来说它是一个大小固定的向量。既然是大小固定的向量,那么它能储存的信息就是有限的,当句子长度不断变长,由于后方的decoder网络的所有信息都来自中间状态,中间状态需要表达的信息就越来越多。
如果句子的信息实在太多,我们的网络就有点把握不住了。比如现在你可以尝试把下面这句话一次性记住并且翻译成中文:
It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way — in short, the period was so far like the present period, that some of its noisiest authorities insisted on its being received, for good or for evil, in the superlative degree of comparison only.
.
– A Tale of Two Cities, Charles Dickens.
别说翻译了,对于人类而言,光是记住这个句子就有着不小的难度。如果不能一边翻译一边回头看,我们想要翻译出这个句子是相当不容易的。
Encoder-Decoder网络就像我们的短时记忆一样,存在着容量的上限
,在语句信息量过大时,中间状态就作为一个信息的瓶颈阻碍翻译了。
可惜我们不能感受到Encoder-Decoder网络在翻译这个句子时的无奈。但是我们可以从人类这种翻译不同句子时集中注意力在不同的语句段
的翻译方式中受到启发,得到循环神经网络中的Attention机制。
我们现在把Encoder网络中的隐藏层
记为
h
(
t
)
h^{(t)}
h(t) ,把Decoder网络中的隐藏层记为
H
(
t
)
H^{(t)}
H(t),第
t
t
t 个输出词记为
y
(
t
)
y^{(t)}
y(t),我们原先的Decoder网络中的式子就可以写做:
H
(
t
)
=
f
(
H
(
t
−
1
)
,
y
(
t
−
1
)
)
H^{(t)}=f(H^{(t-1)}, y^{(t-1)})
H(t)=f(H(t−1),y(t−1))
我们要使得网络在翻译不同的句子时,可以注意到并利用原文中不同的词语和语句段,那我们就可以把Decoder网络式子写作:
H
(
t
)
=
f
(
H
(
t
−
1
)
,
y
(
t
−
1
)
,
C
t
)
H^{(t)}=f(H^{(t-1)}, y^{(t-1)}, C_t)
H(t)=f(H(t−1),y(t−1),Ct)
其中
C
t
C_t
Ct 指的是在时刻
t
t
t 的上下文向量(Context Vector)。我们把它定义为所有的原文隐藏层值
h
(
t
)
h^{(t)}
h(t) 加权平均的结果
C
t
=
∑
i
=
1
T
x
α
t
i
h
(
t
)
C_t=\sum^{T_x}_{i=1}\alpha_{t_i}h^{(t)}
Ct=∑i=1Txαtih(t),而如何分配权重就体现了输出这个
H
(
t
)
H^{(t)}
H(t) 的时候,应该给哪些原文词语更高的注意力
。
我们给
h
(
t
)
h^{(t)}
h(t) 分配的权重就叫做全局对齐权重
(Global Alignment Weights)
全局对齐权重 α k \alpha_k αk 很好的体现了在计算第 k k k 个输出词语时,应该给所有的 h ( t ) h^{(t)} h(t) 怎样的权重,其中 α k i \alpha_{ki} αki 就代表着计算第 k k k个输出词语时, h ( i ) h^{(i)} h(i)分配到的权重大小。于是我们的 C k = ∑ i = 1 T x α k i h ( i ) C_k=\sum_{i=1}^{T_x}\alpha_{ki}h^{(i)} Ck=∑i=1Txαkih(i) 。
翻译一个句子的时候,每一步的
C
k
C_k
Ck 都应该是不同的,下图展示的是把法语句子“L’accord sur l’Espace économique européen a été signé en août 1992.” 翻译成英语句子“The agreement on the European Economic Area was signed in August 1992.”时,每一个输出英文词汇的
α
k
\alpha_{k}
αk 构成的对齐矩阵:
上图中,每一列就代表着输出一个英语单词时,它的
α
k
\alpha_k
αk 权重是如何分布于原文向量
h
(
t
)
h^{(t)}
h(t) 中的,图中越亮的像素块对于着越大的权重。
这个图告诉了我们几个重要信息:
于是乎我们的带有Attention的Encoder-Decoder网络的迭代过程就是如下几步:
计算
α
k
\alpha_k
αk 的时候,我们很自然的就会想到:
α
k
\alpha_k
αk 也可以使用一个小神经网络计算出来,而由于
α
k
t
\alpha_{kt}
αkt 表达的含义是我们在输出到第
k
k
k 个词,也就是面对 时,应该给 分配多少的权重,我们可以设计一个以 为输入的网络:
参考资料:https://zhuanlan.zhihu.com/p/380892265