学习时间:2022.04.22~2022.04.24
文章目录
6. 从Encoder-Decoder到Transformer
6.1 Encoder-Decoder框架
Encoder-Decoder 通常称作 编码器-解码器,是深度学习中常见的模型框架,很多常见的应用都是利用编码-解码框架设计的。
-
编码(encode),由一个编码器将输入序列转化成一个固定维度的稠密向量;
-
解码(decode),就是将之前生成的固定维度的稠密向量再转化成输出序列。
![img](https://i-blog.csdnimg.cn/blog_migrate/9756f954e0c7c19dee71d9ab82839b78.jpeg)
Encoder-Decoder 并不是一个具体的模型,而是一个通用的框架,并不是特指某一个具体的算法。Encoder 和 Decoder 部分可以是任意文字,语音,图像,视频数据,模型可以是 CNN,RNN,LSTM,GRU,Attention 等等。所以,基于 Encoder-Decoder,我们可以设计出各种各样的模型。
特别说明:
- 不管输入序列和输出序列长度是什么,中间的「向量 C」长度都是固定的,而输入序列和输出序列的长度是可变的;
- 中间向量的长度固定也是它的一个缺陷:向量压缩损失了信息;存在长程梯度消失问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有有效信息,即便 LSTM 加了门控机制可以选择性遗忘和记忆,随着所需翻译的句子难度怎能更加,这个结构的效果仍然不理想;
- 不同的任务可以选择不同的编码器和解码器 (RNN,CNN,LSTM,GRU);
- Encoder-Decoder的一个显著特征就是:它是一个end-to-end的学习算法,只要符合这种框架结构的模型都可以统称为Encoder-Decoder模型。
6.2 Seq2Seq序列到序列
Seq2Seq(Sequence-to-Sequence)如字面意思,输入一个序列,输出另一个序列。Seq2Seq是Encoder-Decoder模型框架的一个典型代表,可以看作是Encoder-Decoder针对某一类任务的模型框架。
![img](https://i-blog.csdnimg.cn/blog_migrate/db06b134bafead0d8cb515366cb43a1c.png)
所谓的Seq2Seq任务主要是泛指一些Sequence到Sequence的映射问题,Sequence在这里可以理解为一个字符串序列,当我们在给定一个字符串序列后,希望得到与之对应的另一个字符串序列(如 翻译后的、如语义上对应的)时,这个任务就可以称为Seq2Seq了。
Encoder-Decoder强调的是模型设计(编码-解码的一个过程),Seq2Seq强调的是任务类型/目的(序列到序列的问题),满足输入序列,输出序列的任务都可以统称为Seq2Seq模型。
应用场景:机器翻译、文本生成、语言模型、语音识别、抽象文本摘要、文本摘要、语义分析、问答、语音转换。
以机器翻译为例,可以将法语翻译成英语,满足这样任务的模型也可以叫做Seq2Seq。
早期的Seq2Seq,其编码和解码都使用RNN、LSTM、GRU等(最早的提出就用了两个RNN),但缺点显而易见:
一是语义向量无法完全表示整个序列的信息;二是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了,输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有获得输入序列足够的信息, 那么解码的准确度自然也就要打折扣。
因此,后续又提出了Attention机制、或者采用CNN(CNN可以并行,改善了lstm的性能瓶颈)来改善任务效果。
目前的Seq2Seq模型主要分为三种:
- 一种是以RNN为基础的模型, 一般是LSTM+Attention,顺序处理输入信息;
- 一种是以CNN为基础的模型,比如Fairseq;
- 一种是完全依靠Attention的模型,如谷歌的Transformer。
补充:Seq2Seq模型使用技巧——“Teacher Forcing”
Teacher Forcing 用于训练阶段,主要针对上面第三种Decoder模型来说的,第三种Decoder模型神经元的输入包括了上一个神经元的输出 y ′ y' y′。如果上一个神经元的输出是错误的,则下一个神经元的输出也很容易错误,导致错误会一直传递下去。
而 Teacher Forcing 可以在一定程度上缓解上面的问题,在训练 Seq2Seq 模型时,Decoder 的每一个神经元并非一定使用上一个神经元的输出,而是有一定的比例采用正确的序列作为输入。即把正确的输出当做输入的一部分。
6.3 Attention注意力机制
为了解决上面的弊端,提升模型效果,就需要用到Attention注意力机制来解决该问题(Attention一般是跟Seq2Seq模型一起用的)。
在解码的时候,让生成词不是只能关注全局的语义编码向量C,而是增加了一个“注意力范围”来动态处理和解码(即没有把所有的内容都放到一个向量中)。在解码当前词时,会寻找于原语句中相对应的几个词语,然后结合之前已经翻译的序列来翻译下一个词。
通过这种方法,模型能够有选择地关注输入序列的有用部分,从而了解它们之间的对齐关系,有助于模型更好地处理输入较长的句子。
直观理解:
当我们翻译 Knowledge 时,我们只需要将注意力集中在 “知识” 上面,翻译 “is” 的时候,只需要将注意力集中在 “就是” 上面,翻译 “力量” 时将注意力集中在 “power” 上面。这样,当 Decoder 在预测目标翻译的时候,就可以看到 Encoder 的所有信息,而不仅局限于模型的定长隐向量,并且不会丢失重要信息。
6.3.1 模型概述
本部分参考:Attention原理详解。Seq2Seq +Attention的实现大致如下:
语义编码C随着decode的不同时刻,内容是动态变化的。用decode的每一个时刻的隐藏层输出去和encode的所有时刻的隐藏层输出计算一个Attention Score, 也就是decode当前时刻和enocde的每一个时刻的相关性,相关性大的计算的权重就大,最后对enocde的隐藏层做一个加权和作为decode当前时刻的语义编码C,这个C和decode的隐藏层做连接,然后接个全连接层(维度变一致)作为decode当前时刻的输出。
在Attention模型中,语义编码c1、c2、c3各不相同,y1、y2、y3的生成方法为: y 1 = f 1 ( C 1 ) ; y 2 = f 1 ( C 2 , y 1 ) ; y 3 = f 1 ( C 3 , y 1 , y 2 ) y_1 = f1(C_1);\ y_2 = f1(C_2, y_1); y_3 = f1(C_3,y_1,y_2) y1=f1(C1); y2=f1(C2,y1);y3=f1(C3,y1,y2)。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/40d1169d074c2fda9fbcf97d2ce32ee2.png#pic_center)
比如输入的是英文句子:Tom chase Jerry,生成:“汤姆”,“追逐”,“杰瑞”。注意力分配概率分布值的通用计算过程如下(以第一个词“Tom”为例):
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4481bdf1a9bdeec48eefef0e688c99e0.png#pic_center)
当前输出词 Y i Y_i Yi针对某一个输入词j的注意力权重由当前的隐层 H i H_i Hi,以及输入词j的隐层状态 h j h_j hj共同决定;然后再接一个Softmax得到 [ 0 , 1 ] [0, 1] [0,1]的概率值。即通过函数 F ( h j , H i ) F(h_j,H_i) F(hj,Hi)来获得目标单词 Y i Y_i Yi和每个输入单词对应的对齐可能性。 a i j a_{ij} aij 衡量编码中第 j j j阶段的 h j h_j hj和解码时第 i i i阶段的相关性,最终解码中第 i i i阶段的输入的上下文信息 C i C_i Ci就来自于所有 h j h_j hj对 a i j a_{ij} aij的加权和。
那么整个翻译过程就可以表示为(每一个 C C C会自动去选取与当前所要输出的 y y y最合适的上下文信息):
C 汤 姆 = g ( 0.6 × f 2 ( T o m ) , 0.2 × f 2 ( C h a s e ) , 0.2 × f 2 ( J e r r y ) ) C 追 逐 = g ( 0.2 × f 2 ( T o m ) , 0.7 × f 2 ( C h a s e ) , 0.1 × f 2 ( J e r r y ) ) C 杰 瑞 = g ( 0.3 × f 2 ( T o m ) , 0.2 × f 2 ( C h a s e ) , 0.5 × f 2 ( J e r r y ) ) C_{汤姆} = g(0.6×f2(Tom),\ 0.2×f2(Chase),\ 0.2×f2(Jerry))\\ C_{追逐} = g(0.2×f2(Tom),\ 0.7×f2(Chase),\ 0.1×f2(Jerry))\\ C_{杰瑞} = g(0.3×f2(Tom),\ 0.2×f2(Chase),\ 0.5×f2(Jerry)) C汤姆=g(0.6×f2(Tom), 0.2×f2(Chase