学习路线参考:
https://blog.51cto.com/u_15298598/3121189
https://github.com/Ailln/nlp-roadmap
https://juejin.cn/post/7113066539053482021
https://zhuanlan.zhihu.com/p/100567371
https://cloud.tencent.com/developer/article/1884740
本节学习使用工具&阅读文章:
https://arxiv.org/pdf/1706.03762.pdf
http://jalammar.github.io/illustrated-transformer/
https://zhuanlan.zhihu.com/p/46990010
https://www.cnblogs.com/baobaotql/p/11662720.html
https://zhuanlan.zhihu.com/p/80377698
https://zhuanlan.zhihu.com/p/372279569
https://blog.csdn.net/guofei_fly/article/details/105601979
- 
Transformer概述 2017 年,Google 机器翻译团队发表的《Attention is All You Need》中提出了Transformer模型,完全抛弃了RNN和CNN等网络结构,仅仅采用Attention机制来进行机器翻译任务,取得了很好的效果。 
- 
模型结构总览 Transformer结构
模型分为两大部分:Encoder与Decoder。
- 
自编码器 这个结构最早在自编码器中出现。自编码器的原理很简单,可以理解为一个试图去还原其原始输入的系统。在深度学习中,自动编码器是一种无监督的神经网络模型,它可以学习到输入数据的隐含特征,这称为编码(coding),同时用学习到的新特征可以重构出原始输入数据,称之为解码(decoding)。 从直观上来看,自动编码器可以用于特征降维,类似主成分分析PCA,但是其相比PCA其性能更强,这是由于神经网络模型可以提取更有效的新特征。除了进行特征降维,自动编码器学习到的新特征可以送入有监督学习模型中,所以自动编码器可以起到特征提取器的作用。 自动编码器原理如图所示,将手写数字图片进行编码,编码后生成的 较完整的保留了原始图像的典型特征,因此可较容易地通过解码恢复出原始图像。 自编码器三大特点: - 自动编码器是数据相关的(data-specific 或 data-dependent),这意味着自动编码器只能压缩那些与训练数据类似的数据。比如,使用人脸训练出来的自动编码器在压缩别的图片,比如树木时性能很差,因为它学习到的特征是与人脸相关的。
- 自动编码器是有损的,意思是解压缩的输出与原来的输入相比是退化的,MP3,JPEG等压缩算法也是如此。这与无损压缩算法不同。
- 自动编码器是从数据样本中自动学习的,这意味着很容易对指定类的输入训练出一种特定的编码器,而不需要完成任何新工作。
 
- 
Transformer的编码器-解码器结构 在Transformer中,Encoder将输入读进去,Decoder进行输出。二者的结合方式如下: 编码器和解码器的结合方式在论文中,编码组件由六个Encoder组成,解码组件由六个Decoder组成。Encoder的输出会和每一层的Decoder进行结合。 
- 
输入前的处理 - 
Input Embedding 随机初始化词向量, 
- 
位置编码 经过 word embedding,我们获得了词与词之间关系的表达形式,但是词在句子中的位置关系还无法体现。由于 Transformer 是并行地处理句子中的所有词,因此需要加入词在句子中的位置信息。 Transformer使用了位置编码,利用一定的公式计算词的位置信息,随后与词向量相加就得到了输入。位置编码计算方法如下: 位置编码计算方法
 
- 
- 
Transformer的编码器 Transformer的编码器- 
Self-Attention Self-attention是一种attention机制,用来计算一个句子(中的token)的represetation,其包含了这个句子中token不同位置的关系。 第一步:从每个编码器的输入向量(在本例中是每个词的嵌入)创建三个向量。因此,对于每个单词,我们创建一个Q向量、一个K向量和一个V向量。这些向量是通过将嵌入向量乘以我们在 三个矩阵而创建的。这三个矩阵是可学习的。 计算Q、K、V向量第二步:计算一个score。假设我们正在计算本例中第一个词“Thinking”的自注意力。我们需要根据这个词对输入句子的每个词进行评分。当我们在特定位置对单词进行编码时,分数决定了将多少注意力放在输入句子的其他部分。分数是通过Q与我们正在评分的相应单词的K的点积计算得出的。如图所示: 计算得分第三步:将分数除以 8(目的是让梯度更稳定),然后通过 softmax 操作传递结果。Softmax 对分数进行归一化处理,使它们都为正且加起来为 1。 self-attention中的Softmax.png第四步:每个V乘以 softmax 分数(准备将它们相加)。这里的想法是保持我们想要关注的单词的值不变,并忽略不相关的单词。随后对加权值向量求和,产生自注意层的输出。 完整流程自注意力计算到此结束,生成的向量是我们可以发送到前馈神经网络的向量。 - 
多头自注意力 一组attention的权重参数只能够表达一种词与词之间的关系,在nlp任务中,一种关系可能不足以表达。所以通过配置多组attention权重矩阵,最后通过线性组合,来综合表达。 多头自注意力对于多头注意力,我们为每个头维护单独的 权重矩阵,从而产生不同的 矩阵。我们最终会得到八个不同的 Z 矩阵,随后连接这些矩阵,然后将它们乘以一个额外的权重矩阵 ,得到最终的Z矩阵。 
 整个Multi headed Self-Attention层可以描述为下图: Multi headed Self-Attention
- 
- 
Feed Forward Neural Network 在进行了Attention操作之后,对向量先使用一个线性变换,再针对该线性变换的输出使用RELU函数,最后再针对RELU函数的输出使用一个线性变换。其效果与加上一层卷积核大小为1*1的CNN是一样的。 
 
- 
- 
Add&Normalize 每个编码器中的每个子层周围都有一个残差连接,然后是LayerNormalize步骤。 Add&Normalize
Layer Normalization是作用于每个时序样本的归一化方法,其作用主要体现在:
- 作用于非线性激活函数前,能够将输入拉离激活函数非饱(防止梯度消失)和非线性区域(保证非线性);
- 保证样本输入的同分布。
在CNN类模型中,常用的归一化方法是Batch Normalization,即统计和学习跨样本各通道内的归一化方法;RNN类模型中,或者更一般的讲,在序列问题中,由于序列的天然时序性以及序列长度的不一致性,采用Layer Normalization更为合理。
Transformer在各层的MultiHead-Attention和FFN中均采用了Layer Normalization的技术,同时配以skip-connection,以提高信息的流通通道,提高模型的可训练性。
- 
Transformer的解码器 编码器与解码器解码器的组件与编码器基本完全相同,但有一定的区别: - Self-Attention:也是计算输入的Self-Attention,但是因为是生成过程,因此在时刻 i 的时候,大于 i 的时刻都没有结果,只有小于 i 的时刻有结果,因此需要做Mask。因此这里实际上是Masked multi-head Self-Attention。
- 增加了一个Encoder-Decoder Attention。该层同样因为只能获取到当前时刻之前的输入,因此只对时刻 t 之前的时刻输入进行Attention计算,需要做Mask。同时该层的K和V是由Encoder提供的,而非点积得来的。
 Transformer工作流程1Transformer工作流程2
- 
Linear + Softmax 线性变换层是一个简单的全连接神经网络,它可以把解码组件产生的向量投射到一个比它大得多的、被称作对数几率(logits)的向量里。不妨假设我们的模型从训练集中学习一万个不同的英语单词(我们模型的“输出词表”)。因此对数几率向量为一万个单元格长度的向量——每个单元格对应某一个单词的分数。 接下来的Softmax 层便会把那些分数变成概率(都为正数、上限1.0)。概率最高的单元格被选中,并且它对应的单词被作为这个时间步的输出,同时将Decoder的堆栈输出作为输入,从底部开始,最终进行单词预测。 
- 
Transformer的优势 - 长距离的信息捕捉。虽然RNN通过gate的引入,能在一定上改善长距离依赖,但自回归模型的梯度消失/爆炸仍限制了RNN模型的使用。而CNN模型的专场在于捕捉local特征,虽然可以通过空洞卷积和层次化的结构扩大感受野,但对于长距离的信息捕捉仍然较弱。而self-attention直接摆脱了距离的限制,能够很好的捕捉远距离的文本信息关系。
- 计算上的优势。RNN的另外一大缺点在于自回归模型无法实现并行计算,而self-attention的自交互式计算则没有这个问题,可以非常方便的进行并行计算。此外,一般embedding的维度是大于文本长度的,所以transformre的计算量更小。
- 性能上的优势。由于Transformer的self-attention对每两个token间的信息进行了交互,同时multi-head的方式也能够从各sub-space捕获更多的特征细节,所以用Transformer作为特征抽取器的模型在各种下游任务上的表现均明显优于传统的CNN和RNN模型。所以,Transformer在后续GPT、Bert、XLNet等预训练模型上的大火也就不难理解了。
 














