李宏毅机器学习笔记——Transformer

本章主要是介绍了Transformer(全自注意力网络):
1. 通过sequence-to-sequence模型中的RNN存在问题——不能并行计算,CNN替换可以解决一部分问题,但也存在缺陷。
2.由CNN缺陷引入了Self-Attention Layer来替代RNN的sequence-to-sequence模型——Transformer。
3.讲解Self-Attention的基本原理与具体过程。
4.讲解了一种叫做“多头”注意力(“multi-headed” attention)的机制,进一步完善了自注意力层。
5.为了解决在Self-Attention中词的顺序信息是不重要的问题,而提出Position Encoding操作。
6.重点是Transformer的整体架构,Transformer采用了Encoder-Decoder框架,以机器翻译为具体实例做了过程讲解;
7.Attention visualization(可视化)与Transformer的实际应用和变形。

一、Transformer的引入

一般的sequence-to-sequence模型是用RNN(单方向或者双向)来做,RNN输入是一串sequence,输出是另外一串sequence。RNN常被用于input是一个序列的情况,但是有一个问题——不容易平行化(并行化计算)。
例如下图中左边的模型就是RNN结构的sequence-to-sequence模型,(假设是单向RNN)想要求出b4就得先从a1输入开始一步一步往后求,直到求出b4,而不能对a1,a2,a3,a4一起计算。(如下图左侧!)

解决办法:为了能够进行并行计算,于是提出了使用CNN代替RNN的方法,如上图右侧基于CNN的sequence-to-sequence模型:
(1)将三个vector的内容串起来与filter内部的参数做内积,得到一个数值,将filter扫过sequence,产生一排不同的数值。
(2)会有多个不同(颜色不同)的filter,产生另外一排不同的数值。

用CNN也可以做到和RNN类似的效果:输入一个sequence,输出一个sequence,表面上CNN和RNN都可以有同样的输入输出。但是每个CNN只能考虑很有限的内容(三个vector),而RNN是考虑了整个句子再决定输出。
(其实CNN也可以考虑更长的信息,只要叠加多层CNN,上层的filter就可以考虑更加多的信息。)
使用CNN的优点:可以并行化计算,全部的filter可以同时进行计算。
使用CNN的缺陷:是必须叠加多层filter,才可以看到长时间的信息,如果要在第一层filter就要看到长时间的信息,那是无法做到的。

那要怎么解决使用CNN的缺陷呢?我们引入了 一个新的想法:Self-Attention!

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。

二、Self-Attention

2.1 Self-Attention具体原理及过程

首先我们知道Transformer是用Self-Attention Layer来替代RNN的sequence-to-sequence模型。Transformer模型在质量上更优越,同时更具可并行性,并且需要的训练时间更少。

Self-Attention做的事情就是取代RNN原本要做的事情,Self-Attention Layer 与双向RNN有同样的能力,**每一个输出都是看过整个input sequence,**并且 b1,b2, b3, b4 是可以同时算出来的,可以并行计算!如下图:

Self-attention 的具体过程(Self-attention is all you need):

第一步:
输入sequence x1-x4,通过乘上一个W权重矩阵来得到向量a1~a4,然后丢入Self-attention层,每一个输入都分别乘上三个不同的transformation matrix(变换矩阵,是随机初始化的),产生三个不同的向量 q,k,v。其中vector q,k,v分别代表:(如下图)
q代表query,用来match其他单词;
k代表key,用来被query匹配的;
v代表要被抽取出来的information。

第二步:

拿每个query q去对每个key k 做attention,我们这里用到的计算attention的方法是scaled dot-product Attention ,attention本质就是输入两个向量,输出一个分数**(这个分数就是attention的体现)**。(做attention的方法有很多)

**除以根号d的原因:**d是q和k的维度,q和k做内积,所以q和k的维度是一样的为d。除以根号d的直观解释为q和k做内积/点乘的数值会随着维度增大 ,它的方差越大,所以除以根号d来进行平衡(防止梯度消失,d较大时,点积的值较大,相对差距也较大,导致最大值softmax→1,剩下的→0,两端化,梯度更新时大的越大小的越小)。

第三步:

通过一个softmax函数(下图右上角),将α11—α14变形得到一个新的α^ (11-14),然后用变形α^(11-14)分别乘以Vi 然后求和计算得到b1 。
下图是计算b1的过程,其中是考虑了全部的sequence:

并且可以同时计算b2,b3,b4,同理可得:

self-attention做的和双向RNN的事情是一样的,只不过self-attention是可以平行计算的!整体流程如下图:

那!self-attention和全连接有什么区别?
全连接:可以看做特征映射,其权重表示的是特征的重要度
self-attention:并不是一种映射,其权重表示的是序列每个实体的重要度

2.2 Self-Attention是如何并行计算的?(矩阵运算)

self-attention中所有的运算都可以利用矩阵来进行运算,因此我们就可以使用GPU来进行加速,极大的加快了我们的运算速度。(利用矩阵乘法运算来实现并行化)

用矩阵运算的形式来表现:

self-attention的第一步,矩阵运算就是将a1~a4拼起来作为一个matrix Ⅰ ,用 Ⅰ再乘以Wq 权重矩阵,一次得到matrix Q ,里面的每一列代表一个q。同理,将matrix Ⅰ乘以Wk权重矩阵
Wv权重矩阵,可以得到相应的matrix K 和marix V 。如下图:

self-attention的第二步,拿query q去对每个key k做attention计算:将k1到k4串起来,组成矩阵K,之后转置为KT ;再将q1到q4串起来组成矩阵Q ,具体过程如下图:

self-attention的第三步,将做矩阵运算KT×Q=A,将A按列softmax之后(得到每个词对于当前词的相关性大小),就可得到新的A^,如下图:

self-attention的第四步,把v1到v4串成矩阵V,将矩阵A^ 每一列分别和矩阵V点乘得到矩阵O,从而得到我们的一个输出。如下图所示:

最后,我们将所有矩阵运算整合起来,来回顾一下整个流程:

整个过程就是输入序列I,输出序列O,可以看到从输入到输出是一堆矩阵乘法,所以GPU可以很容易加速!
更简化的分析:

2.3 Multi-Head Self-Attention原理

增加一种叫做“多头”注意力(“multi-headed” attention)的机制(这个想法的来源是CNN能够多通道output从而识别不同的模式),进一步完善了自注意力层,并在两方面提高了注意力层的性能:
(1)扩展了模型专注于不同位置的能力
(2)给出了注意力层的多个“表示子空间”(representation subspaces),多头注意力相当于多个不同的自注意力的集成。通过矩阵运算,原本的q,k,v实际进行了降维。
multi-head attention的两种解释:
multi-head attention给 h 次机会去学习 不一样的投影的方法,使得在投影进去的度量空间里面能够去匹配不同模式需要的一些相似函数,然后把 h 个 heads 拼接起来,最后再做一次投影。(有点类似CNN多通道输出的意思)
多头注意力机制允许模型在不同的表示子空间(representation subspaces里学习到相关的信息,每个head关注的地方不同,各司其职(不同模式)。如下图:

注意:每个头只能和对应的头进行运算。比如:q(i,2) 只能和对应的k(i,2)以及k(j,2)进行运算。多头计算的结果可以矩阵拼接起来,经过矩阵运算,保持和单头的运算结果维度相同。如下图:

总的来说,多头注意力机制在保持参数总量不变的情况下,将同样的query, key和value映射到原来的高维空间(Q,K,V)的不同子空间(Qo,Ko,Vo等)中进行自注意力的计算,最后再合并不同子空间中的注意力信息。

2.4 Position Encoding原理

在注意力机制中,词的顺序信息是不重要的,其思想是:天涯若比邻。

为了解决这个问题,Transformer为每个输入的词嵌入添加了一个向量。这些向量遵循模型学习到的特定模式,这有助于确定每个单词的位置,或序列中不同单词之间的距离。这里的直觉是,将位置向量添加到词嵌入中使得它们在接下来的运算中,能够更好地表达的词与词之间的距离。

具体做法:
在原始paper中,ei是人手设置的,不是学习出来的。ei代表了位置信息,每个位置ei不同。paper中将ei加上ai得到一个新的vector,之后和Self-attention操作一样。如下图所示:

用one-hot编码解释加上ei的这个操作的合理性:
将 xi append一个one-hot向量pi,其运算结果就相当于上述过程(加上ei)。如下图:

2.5 Seq2Seq with Attention

首先一般的seq2seq model 包含两个RNN,分别是encoder和decoder,之后将RNN用self-attention替换,其他的操作与之前是一样的。如下图:

三、Transformer架构

基本框架(Encoder-Decoder):

更加具体一步的过程:

Encoder编码器:
在 Encoder 中,Input 经过 embedding 后,要做 positional encodings
Encoder由N层相同的层组成,每一层包括2个sub-layers:
(1)第一部分是 multi-head self-attention,然后是做Add &Norm
(2)第二部分是 position-wise feed-forward network,是一个全连接层,接着也是做Add &Norm
注意:Add &Norm操作是残差连接(输入和输出加起来)与Layer Normalization。(LayerNorm和BatchNorm的区别?)

注:
1.每个 sub-layer 的输出做残差连接 和 LayerNorm:
公式:LayerNorm( x + Sublayer(x) ) (Sublayer(x) 指 self-attention 或者 MLP);
残差连接需要输入输出维度一致,不一致需做投影。简单起见,固定每层输出维度dmodel = 512。
残差(防止梯度消失)图解:

2.LayerNorm和BatchNorm的区别:
BatchNorm:对feature做norm;LayerNorm:对样本做norm。

为什么LayerNorm用的多?时序数据中样本长度不固定:
BatchNorm:切出来的有效部分是阴影部分,均值和方差抖动大,测试时遇到一个特别长的全新样本 (最上方蓝色阴影块),训练时未见过,(全局均值和方差)训练时计算的均值和方差可能不好用。

LayNorm分析:LayerNorm 每个样本自己算均值和方差,不需要存全局的均值和方差。(稳定!)

Q:不同的 feature 之间做 normalization 有意义吗?LayerNorm 和 BatchNorm 的例子理解:n 本书!
BatchNorm:n本书,每本书的第一页拿出来,根据 n 本书的第一页的字数均值 做 Norm
LayerNorm:针对某一本书,这本书的每一页拿出来,根据此书每页的字数均值,自己做 Norm。

Decoder解码器:
操作与encoder 类似,decoder 也是由N个相同的层组成,但每一个层包括以下3个sub-layers:
(1)第一个部分是 masked multi-head attention(表示attention时会注意到已经产生的sequence)
(2)第二部分是 multi-head attention (表示attend 到之前encoder的输出)
(3)第三部分是一个 position-wise feed-forward network
注意:
1.上面三个部分的每一个部分,都有一个Add &Norm(残差连接,后接一个 Layer Normalization)。
2.decoder 和 encoder 不同的地方在 masked multi-head attention。为什么要mask?
(1)decoder 是 auto-regressive 自回归。当前时刻的输入集 是 之前一些时刻的输出。做预测时,decoder 不能看到 之后时刻的输出。
(2)attention mechanism 每一次能看完完整的输入,要避免这个情况的发生。
(3)在 decoder 训练的时候,在预测第 t 个时刻的输出的时候,decoder不应该看到 t 时刻以后的那些输入。它的做法是通过一个带掩码 masked 的注意力机制。保证训练和预测时 行为一致。
mask具体做法(和padding有结合的地方):

在机器翻译任务中,编码器(Encoder)对输入句子进行编码,将输入句子通过非线性变换转化为中间语义表示。解码器(Decoder)的任务是根据中间语义表示和之前已经生成的历史信息来预测未来时刻要生成的单词。最终,解码的特征向量经过一层激活函数为Softmax的全连接层之后得到表示每个单词概率的输出向量。

四、Attention Visualization

如左下图attention的weight越大,线条越粗,attention的weight越小,线条越细,图上两两word之间都会有attention。
如下右图上部分可以发现it和animal的attention很大,因为这个it是指animal。下部分当把tired改成wide后,it表示street,这时候it和street的attention变成最大的了**(说明attention真的能学到上下文语义表示)**。

**多头注意力机制的可视化:**不同的头捕捉到了不同的句法。在multi-head attention中,每一组Q、K、V,它们的作用都不一样,不同组Q、K、V的attention的可视化结果也不同。(如上图红色那组Q、K、V,表示attention下一个(或下几个)word,绿色那组Q、K、V,表示attention一个时间段的word。)

五、Transformer应用

基本上原来可以做seq2seq的,都可以换成transformer!

(1)做summarization(摘要):训练一个summarizer,input是一堆文章,output是一篇具有维基百科风格的文章。如果没有transformer,没有self-attention,很难用RNN产生10^3长的sequence,而有了transformer以后就可以实现。

(2)**另外的一个版本Universal transformer:**简单的概念是说,本来transformer每一层都是不一样,现在在深度上做RNN,每一层都是一样的transformer,同一个transformer的block不断的被反复使用。

(3)**图像self-attention GAN:**让每一个pixel都attend到其他的pixel,可以考虑比较全面的信息。

六、总结与展望

本章围绕Self-Attention,其基本思想是计算不同部分的权重后进行加权求和,最后的效果是对attention的不同部分予以不同程度的关注。self-attention的基本计算基本都是矩阵计算,其最大的优点是不包含任何RNN、CNN结构,可以解决序列的长程依赖问题,同时矩阵计算可以因为并行化而非常快速。Transformer的(整体架构)Encoder和Decoder的结构详解,需要注意的是:
(1)Add&Norm环节,使用了残差网络和Layer Normalization;
(2)解码器中第一处注意力机制叫Masked多头注意力,因为在机器翻译中,解码过程是一个顺序操作的过程,当解码第k个特征向量时,我们只能看到第k-1及其之前的解码结果。
(3)解码器中第二处注意力机制计算是Encoder-Decoder Attention,是用编码器的最终输出和解码器自注意力输出作attention。
(4)由于RNN系列的模型,无法并行计算;并且Transformer的特征抽取能力比RNN系列的模型要好。之后是Transformer的实际应用,基本上是可以使用seq2seq的都可以使用Transformer。在文章集摘要上表现得十分强大,以及会在图像Self-attention GAN 结合,会有很好的效果!

参考博客:
1.2020李宏毅机器学习笔记——19. Transformer(全自注意力网络)(作者:HSR CatcousCherishes)
2.Transformer模型结构详解【小白必看】(作者:和你在一起_
3.(B站)Transformer论文逐段精读【论文精读】(作者:BeBraveBeCurious)

李宏毅机器学习笔记——Transformer相关推荐

  1. 2021李宏毅机器学习笔记--21 Anomaly Detection

    2021李宏毅机器学习笔记--21 Anomaly Detection(异常侦测) 摘要 一.问题描述 二.Anomaly异常 三.Anomaly Detection(异常侦测)做法 3.1 Bina ...

  2. 李宏毅svm_【李宏毅机器学习笔记】 18、支持向量机(Support Vector Machine,SVM)...

    [李宏毅机器学习笔记]1.回归问题(Regression) [李宏毅机器学习笔记]2.error产生自哪里? [李宏毅机器学习笔记]3.gradient descent [李宏毅机器学习笔记]4.Cl ...

  3. 2021李宏毅机器学习笔记--12 attack ML models

    2021李宏毅机器学习笔记--12 attack ML models 摘要 一.图像模型的攻击 1.1原理 1.2Constraint 1.3参数训练 1.4一个例子 1.5攻击方法 1.5.1FGS ...

  4. 2021李宏毅机器学习笔记--22 Generative Adversarial Network 01

    @[TOC](2021李宏毅机器学习笔记–22 Generative Adversarial Network 01(GAN,生成式对抗网络)) 摘要 GAN是建立于神经网络的基础上的,其核心思想是&q ...

  5. 【李宏毅机器学习笔记】 23、循环神经网络(Recurrent Neural Network,RNN)

    [李宏毅机器学习笔记]1.回归问题(Regression) [李宏毅机器学习笔记]2.error产生自哪里? [李宏毅机器学习笔记]3.gradient descent [李宏毅机器学习笔记]4.Cl ...

  6. 【李宏毅机器学习笔记】 17、迁移学习(Transfer Learning)

    [李宏毅机器学习笔记]1.回归问题(Regression) [李宏毅机器学习笔记]2.error产生自哪里? [李宏毅机器学习笔记]3.gradient descent [李宏毅机器学习笔记]4.Cl ...

  7. 2018-3-20李宏毅机器学习笔记十----------Logistic Regression

    上节讲到:既然是一个直线型,只需要求解w和b.为何还要那么费劲的使用概率??? 视频:李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilib ...

  8. 2018-3-21李宏毅机器学习笔记十一-----Brief Introduction of Deep Learning?

    我觉的有用的: BP神经网络_百度百科 https://baike.baidu.com/item/BP%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/4581827?fr=a ...

  9. 李宏毅机器学习笔记六——Gradient Descent

    视频来源: 李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av10590361/?p=6 使用GD的注意 ...

  10. 李宏毅机器学习笔记(五)-----Where does the error come from

    视频来源: 李宏毅机器学习(2017)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av10590361/?p=5 functio ...

最新文章

  1. EXPLAIN PLAN获取SQL语句执行计划
  2. 在grub中添加win7(以及从win7来的win10)的启动项
  3. 编程小白 第一本 python_【Python】编程小白的第一本python(基础中的基础)
  4. 【两行命令】R语言读取excel数据
  5. 1.23 Lambda表达式的使用
  6. python正态检验_Python检验数据是否正态分布
  7. 江苏计算机一级怎么自学,江苏计算机一级自学教程推荐:计算机基础及MS Office应用上机指导(2018年版)...
  8. 使用百度UMeditor富文本编辑器,修改自定义图片上传,修改源码
  9. Python基础语法案例(Fibonacci):选择结构、循环结构、异常处理结构、代码优化
  10. 零基础学python看什么书好?
  11. Hive与数据库的异同
  12. Linux下俄罗斯方块程序设计(c++)-转
  13. python3socket非阻塞在linux里无效_利用Python中SocketServer实现客户端与服务器间非阻塞通信方法介绍...
  14. Packet Tracert 5.0 使用教程
  15. 公式编辑器mathtype中插入空格与公式编号右对齐
  16. 计算机表格函数最大值操作,使用MAX最大值函数计算excel表格中学生成绩的最大值...
  17. ZSP12项目的总结
  18. python字典找相同值_python-找出字典dic中重复值
  19. 家中的两台计算机如何实现联网,怎么设置用两台电脑实现局域网共享上网
  20. 【按键精灵】sub子程序、调用子程序

热门文章

  1. 解决在微信下载app需要点击右上角在浏览器中打开下载的问题
  2. 谷歌浏览器如何正确离线网页
  3. What are FeliCa and PaSoRi?
  4. 无线路由器建立usb共享打印服务器,无线路由器USB网络共享管理设置方法
  5. linux修音软件下载,修音软件下载 Auto Tune 8(修音工具) v8.1.2 免费安装版 下载-脚本之家...
  6. 音频文件如何转换成文字?
  7. cisco思科交换机命令参考大全
  8. 下载yaml appium
  9. 哈希函数-SHA1和SHA256算法
  10. 线程安全之单例模式之懒汉模式