注意力机制和Seq2seq模型

注意力机制和Seq2seq模型

在“编码器—解码器(seq2seq)”⾥,解码器在各个时间步依赖相同的背景变量(context vector)来获取输⼊序列信息。当编码器为循环神经⽹络时,背景变量来⾃它最终时间步的隐藏状态。将源序列输入信息以循环单位状态编码,然后将其传递给解码器以生成目标序列。然而这种结构存在着问题,尤其是RNN机制实际中存在长程梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息,所以随着所需翻译句子的长度的增加,这种结构的效果会显著下降。

与此同时,解码的目标词语可能只与原输入的部分词语有关,而并不是与所有的输入有关。例如,当把“Hello world”翻译成“Bonjour le monde”时,“Hello”映射成“Bonjour”,“world”映射成“monde”。在seq2seq模型中,解码器只能隐式地从编码器的最终状态中选择相应的信息。然而,注意力机制可以将这种选择过程显式地建模。

Image Name

注意力机制框架

Attention 是一种通用的带权池化方法,输入由两部分构成:询问(query)和键值对(key-value pairs)。\(𝐤_𝑖∈ℝ^{𝑑_𝑘}, 𝐯_𝑖∈ℝ^{𝑑_𝑣}\). Query \(𝐪∈ℝ^{𝑑_𝑞}\) , attention layer得到输出与value的维度一致 \(𝐨∈ℝ^{𝑑_𝑣}\). 对于一个query来说,attention layer 会与每一个key计算注意力分数并进行权重的归一化,输出的向量\(o\)则是value的加权求和,而每个key计算的权重与value一一对应。

为了计算输出,我们首先假设有一个函数\(\alpha\) 用于计算query和key的相似性,然后可以计算所有的 attention scores \(a_1, \ldots, a_n\) by

\[a_i = \alpha(\mathbf q, \mathbf k_i). \]

我们使用 softmax函数 获得注意力权重:

\[b_1, \ldots, b_n = \textrm{softmax}(a_1, \ldots, a_n). \]

最终的输出就是value的加权求和:

\[\mathbf o = \sum_{i=1}^n b_i \mathbf v_i. \]

Image Name

不同的attetion layer的区别在于score函数的选择

点积注意力

The dot product 假设query和keys有相同的维度, 即 $\forall i, 𝐪,𝐤_𝑖 ∈ ℝ_𝑑 $. 通过计算query和key转置的乘积来计算attention score,通常还会除去 \(\sqrt{d}\) 减少计算出来的score对维度𝑑的依赖性,如下

\[𝛼(𝐪,𝐤)=⟨𝐪,𝐤⟩/ \sqrt{d} \]

假设 $ 𝐐∈ℝ^{𝑚×𝑑}$ 有 \(m\) 个query,\(𝐊∈ℝ^{𝑛×𝑑}\)\(n\) 个keys. 我们可以通过矩阵运算的方式计算所有 \(mn\) 个score:

\[𝛼(𝐐,𝐊)=𝐐𝐊^𝑇/\sqrt{d} \]

它支持一批查询和键值对。此外,它支持作为正则化随机删除一些注意力权重.

多层感知机注意力

在多层感知器中,我们首先将 query and keys 投影到 \(ℝ^ℎ\) .为了更具体,我们将可以学习的参数做如下映射
\(𝐖_𝑘∈ℝ^{ℎ×𝑑_𝑘}\) , \(𝐖_𝑞∈ℝ^{ℎ×𝑑_𝑞}\) , and \(𝐯∈ℝ^h\) . 将score函数定义

\[𝛼(𝐤,𝐪)=𝐯^𝑇tanh(𝐖_𝑘𝐤+𝐖_𝑞𝐪) \]

.
然后将key 和 value 在特征的维度上合并(concatenate),然后送至 a single hidden layer perceptron 这层中 hidden layer 为 ℎ and 输出的size为 1 .隐层激活函数为tanh,无偏置.

posted @ 2020-02-20 00:00  yu212223  阅读(310)  评论(0编辑  收藏  举报