学习笔记:深度学习(7)——从Encoder-Decoder到Transformer
时间:2022-10-17 01:00:01
学习时间:2022.04.22~2022.04.24
文章目录
- 6. 从Encoder-Decoder到Transformer
-
- 6.1 Encoder-Decoder框架
- 6.2 Seq2Seq序列到序列
- 6.3 Attention注意力机制
-
- 6.3.1 模型概述
- 6.3.2 过程详解
- 6.3.3 Score评分函数
- 6.3.4 基于seq2seq的Attention实例
- 6.4 Self-Attention机制
-
- 6.4.1 机制详解
-
- 1. 关键值注意力
- 2. Q、K、V矩阵
- 3. 尺度标度 d k \sqrt d_k dk
- 6.4.2 计算过程
-
- 1. 输入向量
- 2. 计算分数
- 3. 归一化
- 4. 乘值向量
- 5. 汇总加权
- 6. 遍历循环
- 6.4.3 三种类型
- 6.4.4 作用与优势
- 6.5 Transformer
-
- 6.5.1 整体结构
-
- 1. Encoder层结构
- 2. Decoder层结构
- 3. Positional Encoding
- 4. 计算流程
- 6.5.2 细节信息
-
- 1. Multi-Head Attention多头注意机制
- 2. Add&Norm
- 3. Feed Forward
- 4. Masked Mutil-Head Attetion
- 5. Encoder-Decoder Attention
- 6. Linear & Softmax
- 6.5.3 总结
- 其他
- 6.6 Transformer-XL
6. 从Encoder-Decoder到Transformer
6.1 Encoder-Decoder框架
Encoder-Decoder 通常称作 编码器-解码器是深度学习中常见的模型框架,许多常见的应用程序都是由编码-解码框架设计的。
-
编码(encode),输入序列由编码器转化为固定维度的致密向量;
-
解码(decode),将之前生成的固定维度的密度向量转化为输出序列。
Encoder-Decoder 它不是一个特定的模型,而是一个通用的框架,而不是特定的算法。Encoder 和 Decoder 部分可以是任意文字,语音,图像,视频数据,模型可以是 CNN,RNN,LSTMGRU,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针对某一类任务的模型框架。
所谓的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)。
比如输入的是英文句子:Tom chase Jerry,生成:“汤姆”,“追逐”,“杰瑞”。注意力分配概率分布值的通用计算过程如下(以第一个词“Tom”为例):
当前输出词 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), 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))
如下图所示,红色代表输入输出相关性很强,相应的权重会很大,比如“ I ”和“我”的相关性就很大,“China” 和 “中”、“国” 两个输入的相关性很大。
输入的序列是“我爱中国”,因此,Encoder中的h1、h2、h3、h4就可以分别看做是“我”、“爱”、“中”、“国”所代表的信息。在翻译成英语时,第一个上下文c1应该和“我”这个字最相关,因此对应的 a11就比较大,而相应的 a12 、a13 、 a14 就比较小。c2应该和“爱”最相关,因此对应的 a22 就比较大。最后的c3和h3、h4最相关,因此 a33 、 a34的值就比较大。
总结一下就是:通过为每个单词分配一个权重,注意力机制能够保证当前翻译的单词对原文各个单词的关注点不同(就是对照着原文翻译)。由于这个权重可能大于1,为了方便我们使用softmax进行归一化,得到归一化权重,然后计算Encoder隐藏状态和其对应归一化权重的加权和,得上下文向量C(语义编码)。
6.3.2 过程详解
注意力层的实现可以分为7个步骤。
- 计算Encoder的隐藏状态和Decoder的隐藏状态
首先计算第一个解码器隐藏状态(红色)和所有可用的编码器隐藏状态(绿色)。下图中有4个编码器隐藏状态和当前解码器的隐藏状态。要想输出Decoder的第一个隐藏的状态,需要给Decoder一个初始状态和一个输入,例如采用Encoder的最后一个状态作为Decoder的初始状态,输入为0。
- 获取每个编码器隐藏状态对应的分数(Attention Score)
计算Decoder的第一个隐藏状态(当前单词)和Encoder所有的隐藏状态的相关性。计算相似性/相似度的方法有很多(比如dot、general、concat等),这里采用点积的方式(默认两个向量长度一样)。
- 通过softmax归一化分数
把得到的分数输入到softmax层进行归一化,归一化之后的分数(标量)加起来等于1,归一化后的分数代表注意力分配的权重 。
- 用每个编码器的隐藏状态乘以其softmax得分
通过将每个编码器的隐藏状态与其softmax之后的分数(标量)相乘,我们得到对齐向量 或标注向量。这正是对齐产生的机制。
- 把所有对齐的向量加起来
对齐向量进行求和,生成上下文向量 C 1 C_1 C1(语义编码)。上下文向量是前一步对齐向量的聚合信息。
- 将上下文向量输入到Decoder中
将上下文向量输入到Decoder中进行解码,具体的解码器输入方式和模型有关。
Decoder每个时刻都会将第5步的注意力权重输入到Decoder中,此时Decoder中的输入有:Encoder的输出向量,以及Decoder上一时刻的隐向量。
-
反向传播
通过不断迭代,更新编码器和解码器的权重参数(以及Score中的权重,如果有的话),Decoder可以输出最终翻译的序列。
-
完整过程如下
6.3.3 Score评分函数
score函数涉及点积运算(点积、余弦相似度等),其思想是度量两个向量之间的相似度。对于前馈神经网络评分函数,其思想是让模型在变换的同时学习对齐权值。
下图是几种主要的计算方式:
6.3.4 基于seq2seq的Attention实例
接下来会介绍3个基于Seq2Seq的NMT(Neural Machine Translation,机器翻译)架构,通过了解具体的使用方式来加深对Attention的理解,来源:Attention原理详解。
- 《Neural Machine Translation by Learning to Jointly Align and Translate》
注意力机制用于机器翻译的开篇之作,作者在WMT’14英语 - 法语数据集上获得了26.75的BLEU分数。
[BLEU得分](https://blog.csdn.net/weixin_36815313/article/details/106649367#:~:text=BLEU 得分是一个有用的单一实数评估指标,用于评估生成文本的算法,判断输出的结果是否与人工写出的参考文本的含义相似。 不过它并没有用于语音识别(,speech recognition )。):是一个有用的单一实数评估指标(a single real number evaluation metric),用于评估生成文本的算法,判断输出的结果是否与人工写出的参考文本的含义相似。
标题中的“Align”意思是在训练模型的同时直接调整负责得分的权重。以下是该模型的特点:
-
编码器是一个双向(正向+反向)门控循环单元(BiGRU)。解码器是一个GRU,其初始隐藏状态是从反向编码器GRU的最后隐藏状态修改而来的向量;
-
注意层中的score函数是Additive/Concat;
-
下一个解码器时间步的输入是前一个解码器时间步(粉红色)的输出与当前时间步(深绿色)的上下文向量之间的拼接。
- 《[Effective Approaches to Attention-based Neural Machine Translation](http://diyhpl.us/~bryan/papers2/ai/speech-recognition/Effective approaches to attention-based neural machine translation - 2015.pdf)》
在WMT’15英德测试中,该模型的BLEU得分为25.9。这篇论文的关键点如下:
- Encoder是两层的LSTM网络。 Decoder也一样,其初始隐藏状态是最后一个编码器的隐藏状态;
- 他们实验的score函数是(i) additive/concat, (ii) 点积,(iii) location-based,和(iv) “general”;
- 来自当前解码器时间步长的输出与来自当前时间步长的上下文向量之间的串联被输入到前馈神经网络,以给出当前解码器时间步长的最终输出(粉红色)。
- 《Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation》
GNMT,Google的神经机器翻译,是前面两个例子的组合(深受第一个例子的启发)。该模型在WMT’14英法测试上达到38.95 BLEU,在WMT’14英德测试上达到24.17 BLEU。这篇论文的关键点如下:
- 编码器由8个LSTM组成,其中第一个LSTM是双向的(其输出是拼接起来的),来自连续层的输出之间存在残差连接(从第3层开始)。残差连接用曲线箭头表示。解码器是8个单向LSTM的独立堆叠;
- 使用的score函数是additive/concat,类似于第一个例子;
- 同样,就像第一个例子中一样,下一个解码器时间步的输入是前一个解码器时间步(粉红色)的输出和当前时间步(深绿色)的上下文向量之间的连接。
6.4 Self-Attention机制
Self Attention是提出Transformer的论文《Attention is all you need》中提出的一种新的注意力机制。
在机器翻译中,一般输入Source和输出Target内容是不一样的,如英文翻译成中文,Source是英文,Target是中文,上一节所讲的Attention机制发生在Target元素和Source中所有元素之间。
而Self-Attention顾名思义,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target = Source的特殊情况下的Attention机制。其具体计算过程是一样的,只是计算对象发生了变化而已。
因此,我们可以把上一节所讲的Attention机制称为Seq2Seq Attention或传统Attention机制,Self Attention也可以被称为intra Attention(内部Attention)。
Seq2Seq Attention:本质上是目标语单词和源语单词之间的一种单词对齐机制;
Self Attention:可以捕获同一个句子中单词之间的一些句法特征或者语义特征。
6.4.1 机制详解
本节来源:超详细图解Self-Attention。
在谈论Self Attention之前我们首先认识一下以KQV模型来解释的Attention机制,这也是Transformer最核心的部分。键值对Attention最核心的公式如下图。
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt d_k})V Attention(Q,K,V)=softmax(dkQKT)V
其中, Q Q Q是Query、 K K K是Key、 V V V是Value。假定词的输入为 Q Q Q(Query),内存中以键值对 ( K , V ) (K,V) (K,V)形式存储其上下文。那么任何注意力机制其实都是Query到一系列键值对(Key, Value)上的映射函数。而Self Attention也即是Key=Value=Query。
接下来一步步拆解:
1. 键值对注意力
我们先抛开Q、K、V三个矩阵不谈,Self-Attention最原始的形态其实长这样(X是一个矩阵):
S o f t m a x ( X X T ) X Softmax(XX^T)X Softmax(XXT)X