RNN系列:
聊聊RNN&LSTM
聊聊RNN与seq2seq
attention mechanism,称为注意力机制。基于Attention机制,seq2seq可以像我们人类一样,将“注意力”集中在必要的信息上。
Attention的结构
seq2seq存在的问题
seq2seq中使用编码器对时序数据进行编码,然后将编码信息传递给解码器。此时,编码器的输出是固定长度的向量。从正常的理解来看,固定长度的编码器输出迟早会有溢出上下文信息的情况。
编码器的改进
目前的seq2seq结构,只将LSTM层的最后的隐藏状态传递给解码器,但是编码器的输出的长度应该根据输入文本的长度相应地改变。因此我们可以使用LSTM各个时刻(各个单词)输出的隐藏状态向量,可以获得和输入的单词数相同数量的向量。使用编码器各个时刻(各个单词)的LSTM层的隐藏状态(这里表示为hs):
有一点可以确定的是,各个时刻的隐藏状态中包含了大量当前时刻的输入单词的信息。因此,最终编码器的输出hs具有和单词数相同数量的向量,各个向量中蕴含了各个单词对应的信息:
解码器的改进
改进一
由于编码器的输出包含了各个时刻的隐藏状态向量,因此解码器的输入,也需要增加这一层输入。因此解码器中就包含了某个时刻下,当前单词的主要信息,而如果可以找到这些主要信息并提取出来,对其做翻译,就能实现我们的目标。
从现在开始,我们的目标是找出与“翻译目标词”有对应关系的“翻译源词”的信息,然后利用这个信息进行翻译。也就是说,我们的目标是仅关注必要的信息,并根据该信息进行时序转换。这个机制称为Attention。
以上的逻辑流程其实就是在模仿人在翻译单词时的过程,尤其是中式翻译;逐字/成对的将中文汉字转换为对应的英语讲出来,我想这种例子在我们身边是很常见的。哈哈哈哈,很有画面感!
这个过程,也被称为 "对齐"。
改进二
增加一个表示各个单词重要度的权重(记为a)。此时,a像概率分布一样,各元素是0.0~1.0的标量,总和是1。然后,计算这个表示各个单词重要度的权重和单词向量hs的加权和,可以获得目标向量。其计算流程如下:
即 hs 向量 与 a 权重向量 的内积
计算单词向量的加权和,这里将结果称为上下文向量,并用符号c表示。
改进三
有了表示各个单词重要度的权重a,就可以通过加权和获得上下文向量,从而获取到主要信息。那么,怎么求这个a呢?
首先,从编码器的处理开始,到解码器第一个LSTM层输出隐藏状态向量的处理为止,流程如下
用h表示解码器的LSTM层的隐藏状态向量。此时,我们的目标是用数值表示这个h在多大程度上和hs的各个单词向量“相似”。
因此,可以直接将隐藏状态向量h 与编码器全时刻向量hs做点积
这里通过向量内积算出h和hs的各个单词向量之间的相似度,并将其结果表示为s。不过,这个s是正规化之前的值,也称为得分。再经过softmax函数对点积结果归一化
计算各个单词权重的计算图
hr向量只是扩大了h向量的部分,使其与hs向量行列一致。
汇总
如上,现在将单词权重的计算与权重加权两层逻辑合并起来,如下展示了获取上下文向量c的计算图的全貌
图中分为Weight Sum层和Attention Weight层进行了实现。
这里进行的计算是:Attention Weight层关注编码器输出的各个单词向量hs,并计算各个单词的权重a;
Weight Sum层计算a和hs的加权和,并输出上下文向量c。我们将进行这一系列计算的层称为Attention层。
以上就是Attention技术的核心内容。关注编码器传递的信息hs中的重要元素,基于它算出上下文向量,再继续流转传递。
编码器的输出hs被输入到各个时刻的Attention层,并输出当前时刻的上下文向量信息。最终,具有Attention层的解码器的层结构,如下所示,
总结
编码器层输出各个时刻的向量信息数据,不仅可以伸缩编码层的长度限制,更是存储了更重要的时序时刻数据信息。
而解码器层,根据Attention架构(注意力机制),增加权重矩阵a,计算出当前时刻的上下文向量信息,提取出对齐单词,进行翻译。