Seq2Seq Attention输入输出维度分析-最详细

1. Attention

注意力机制就是为了解决当解码的序列太长时,越到后面效果就越差。因为在未引入注意力机制之前,解码时仅仅只依靠上一时刻的输出而忽略的编码阶段每个时刻的输出(“称之为记忆”)。注意力机制的思想在于,希望在解码的时刻能够参考编码阶段的记忆,对上一时刻输出的信息做一定的处理(也就是只注意其中某一部分),然后再喂给下一时刻做解码处理。这样就达到了解码当前时刻时,仅仅只接受与当前时刻有关的输入,类似与先对信息做了一个筛选(注意力选择)。Encoder 把所有的输入序列编码成了一个c向量,然后使用c向量来进行解码,因此, 向量中必须包含了原始序列中的所有信息,所以它的压力其实是很大的,而且由于 RNN 容易把前面的信息“忘记”掉,所以基本的 Seq2Seq 模型,对于较短的输入来说,效果还是可以接受的,但是在输入序列比较长的时候, 向量存不下那么多信息,就会导致生成效果大大折扣。

解码的时候参考编码阶段的记忆,对于encoder输出的信息做一定的筛选,保留重要的一部分,前筛。既然一个上下文c向量保存的信息有限,那么就引入多个c向量,称之为c_1, c_2,...。在解码的时候,这里的c_i对应着Decoder的解码位次,每次解码就利用对应的c_i向量来解码.这里的每个c_i向量其实包含了当前将要输出与输入序列各个部分重要性的相关信息。
下图是一个seq-seq模型中的参数维度。

Seq2Seq Attention输入输出维度分析-最详细_第1张图片 图1 Seq2Seq模型中参数维度

上图右边的输入部分的实线表示是训练时的输入,虚线表示预测时的输入。注意向量(attention vector)是由解码部分每个时刻的计算产生的,此处以计算第一个时刻为例。

2. encoder-decoder中的变量和其维度

英文句子“I am a student”被输入到一个两层的LSTM编码网络(蓝色部分),经过编码(encoder)后输入到另外一个两层的LSTM解码网络(棕色部分)。当网络在按时刻进行翻译decoder(解码)的时候,第一个时刻输出的就是图中的h_1。在前面我们说到,我们希望网络也能同我们人脑的思考过程一样,在依次翻译每个时刻时,网络所“联想”到的都是与当前时刻最相关(相似)的映射。换句话说,在神经网络将"I am a student"翻译成中文的过程中,当解码到第一个时刻时,我们希望网络仅仅只是将注意力集中到单词"I"上,而尽可能忽略其它单词的影响。可这说起来容易,具体该怎么做,怎么体现呢?

\overline{h_1}是encoder部分的hiden layer

2.1 attention score

我们知道h_1 是第一个解码时刻的隐含状态,同时以上帝视角来看,最与h_t相关的部分应该是"I"对应的编码状态\overline{h_1}。因此,只要网络在解码第一个时刻时,将注意力主要集中于\overline{h_1},也就算达成目的了。但我们怎么才能让解码部分的网络也能知道这一事实呢?好在此时的h_t与编码部分的隐含状态都处于同一个Embedding space,所以我们可以通过相似度对比来告诉解码网络:哪个编码时刻的隐含状态与当前解码时刻的隐含状态最为相似。这样,在解码当前时刻时,网络就能将“注意力”尽可能多的集中于对应编码时刻的隐含状态。

简单的来说做下encoder与decoder的相似度
相似度得分有两种计算方式

                       e_{ts} = score(h_t, \overline{h_s})=\left\{\begin{matrix} h_t^TW\overline{h_s}, \;\;\;\;\;\;\; \;\;\;\;\;\;\;\;\;\;\;\;\;[Luong's \; multiplicative\; style ] \\ v^Ttanh(w_1h_t+w_2\overline{h_s}), \;\;[Bahdanau's \;additive\; style] \end{matrix}\right. \;\;\;\;\;\;\; \;\;\;\;\;\;(1)

e_{ts}成为attention score

2.2 attention weights

把相似度得分进行标准化也就是使用softmax,就会得到一个0-1之间的值,找个值就是对应的attention weights

                                                                \alpha_{ts} = \frac{exp(e_{ts})}{\sum_{k=1}^{S}exp(e_{tk})} \;\;\;\;\;\;\; \;\;\;\;\;\;(2)

2.3 context vector

当网络分别得到当前解码时刻与所有编码时刻对应的相似度系数之后(图中的attention weights),再以加权求和的形式得到context vector。虽然此时的h_1仅仅只与\overline{h_1}最为相关,但同样也受其它编码状态的影响(例如到句型复杂的时候)。但是,若是换了应用场景,只进行对应权重乘以对应隐含状态,不进行累加也是可以的。

                                                                  c_t=\sum_{k=1}^{S}\alpha_{ts}\overline{h_k} \;\;\;\;\;(3)

attention vector是context vector与decoder端的hiden layer h_1做的concatenate,即[c_1;h_1]。

2.4 后续

通过attention vector 计算得到

                                                           \widehat{h_t}=tanh(W_c[c_t;h_t])

再由\widehat{h_t}得到目标单词(target word)的概率分布

                                                         p(y_t | y_{<t},x)=softmax(W_s\widehat{h_t})

3. 额外说明

到这里attention机制如何工作以及计算介绍完成,attention就是一个找相似度的过程。但是将attention机制放到哪一层hiden layer是可以改变的。例如,decoder中只有一层的RNN时,我们可以通过计算如下的attention score来获得context vector c_t

e_{ts} = score(h_{t-1}, \overline{h_s})​​​​​​​

并将context vector与decoder的输入层concatenate,再输入到RNN中。所以这个例子中,我们将context vector加到了RNN的输入层。

而图1中的例子,我们将context vector加到了decoder的hidden layer 2上。

你可能感兴趣的:(神经网络,神经网络,深度学习)