本人是学视觉对抗学习的,读论文的时候有论文用到了transformer,所以特地学习一下。博客里没有涉及代码,都是基础理论。个人感觉自己写的应该比较易懂吧,适合小白看。有错误欢迎评论里指出,谢谢。

目录

1. 文中图片、部分文字内容及思路来源

2. 基本知识

2.1 注意力机制是什么

2.2 位置编码

2.3 其他

3. transformer的总体架构

4. encoder

4.1 输入部分

4.2 注意力机制

4.3 多头注意力

4.4 残差链接

4.5 Batch Normalization 和 Layer Normalization

4.6 前馈神经网络 Feed Forward

4.7 encoder的输出如何作为decoder的输入

5. decoder

5.1 首先第一层,带masked的多头注意力

5.2 然后是第二层,decoder里的多头注意力机制

5.3 前馈神经网络 Feed Forward


1. 文中图片、部分文字内容及思路来源

Transformer从零详细解读(可能是你见过最通俗易懂的讲解)_哔哩哔哩_bilibili

10.1. 注意力提示 — 动手学深度学习 2.0.0-beta0 documentation

LN和BN对比 - 光彩照人 - 博客园

Transformer详解(看不懂你来骂我)_数学家是我理想的博客-CSDN博客

Transformer 中的 Positional Encoding

2. 基本知识

2.1 注意力机制是什么

transformer就是建立在注意力机制之上的,在学transformer之前首先要理清什么是注意力机制。以及其他文章或者论文在介绍注意力机制的时候,常用的图片都是什么意思。

从文字的角度理解注意力机制:

人的注意力大概分为两种:一种是下意识的关注度;另一种是带有目的性的关注度。

比如,你舍友让你去他的果盘里拿一个苹果。他的果盘里有一层苹果,但是果盘中心位置摆了一个西瓜。这时,虽然你脑中的目标物品是“苹果”,但是由于你的大脑受到这个西瓜的大小,花纹,颜色,在果盘中处于显眼位置等特征的影响,下意识的注意力(比如你的眼睛下意识的去看)就会被移到“西瓜”上去;然后你想到了舍友要的是苹果(目的性),这时你的注意力才会转移到那一堆苹果上去。

把上面这个例子对应到下边图中就是:

:一系列物品(果盘里的一堆苹果和一个西瓜)

:这一系列物品对人下意识的吸引力(比如在上述果盘中,由于西瓜自身的各种特征,它对人下意识的吸引力肯定比苹果要高)

查询:你想要的物品(苹果)

注意力汇聚:一个网络层,该层的输出结果是一个所有元素的和等于1的权重向量。该层的作用是把想要的物品(目的物品)所对应的权重值变高。这样使用该‘权重向量’乘‘值’后,即使目的物品“下意识的吸引力(即‘值’)”不够高,但是由于它对应的权重高,其他物品对应的权重小,最终选择到目标物品的可能性也会变大。

果盘的例子不够形象的话,这个短视频应该就可以了(国外男主播挑战男性本能)

从公式的角度简单的看注意力机制的具体例子:

为了描述的简单一些,我们假设Query、Key、Value都是一个数字,不是向量。

用婴儿做Query(Q),图像的四个部分做为Key(K)。首先用Query分别点乘4个Key(点乘是计算两个向量相似度的一种方式,相似度越高,点乘得到的结果越大。判断两个向量相似度的方式有点乘、构建一个新的MLP、计算cos相似度等)得到一个四维向量。比如是[7,1,1,1] ,然后经过一次softmax层得到[0.7,0.1,0.1,0.1],作为注意力权重(注意力权重指的是各个key(即各个物品)与query(即目的物品)的相似程度,即人的目的性关注度)。注意力权重里的这4个数字,越大的数字,说明Query对相应的Key的下意识的关注度越高。然后再用注意力权重[0.7,0.1,0.1,0.1]和4个V(Valuei)相乘(即[v1*0.7,v2*0.1,v3*0.1,v4*0.1]),再相加(即加权和),得到最终的Attention value= v1*0.7+v2*0.1+v3*0.1+v4*0.1(一个数值)

在transformer结构里,Query、Key、Value不可能仅用一个数字代表,通常是使用多维向量表示。所以得到的Attention value是一个向量(而不是像上一段的Attention value一样,是一个数值)。具体向量形式的下面会介绍。

2.2 位置编码

对于RNN来说,它所有的时间步(时间步的概念:RNN中的batch_size 和 time_step的直观理解_神鱼来啦的博客-CSDN博客https://blog.csdn.net/lnaruto1234/article/details/99672601?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-2.pc_relevant_aa&utm_relevant_index=5)采用的是同一套参数,这样就隐含了输入的先后顺序信息。transformer缺少了单词输入的顺序信息,所以需要位置编码来标记各个字之间的时序关系或者位置关系。

计算位置编码用的是上图中的公式。假设“爱”是当前的pos,“爱”这个字用512维的词向量Embedding表示。d_model等于词向量的维度,即512。i代表的是这512个数字的位置号,每个数字都有自己的位置编码。至于为什么公式里要采用正弦余弦的形式,可以参考以下文章(Transformer 中的 Positional Encodinghttps://wmathor.com/index.php/archives/1453/)。

2.3 其他

词向量embedding、残差链接这些内容很基础,不再赘述。

3. transformer的总体架构

在几乎所有关于讲解transformer的文章或者视频里,下面这个图都是必有的:

如果没学过transformer的话,这个经典图看上去会很晦涩。我们小白把这个经典图抽象成下面这个图,然后再知道这些就好:

  • transformer的编码部分由多层编码器encoder组成;解码部分由多层解码器decoder构成。
  • 6个encoder结构相同,参数各自随机初始化,在训练后,6个encoder的参数就不同了。
  • 6个decoder结构相同,参数各自随机初始化,但是与encoder的结构不同,训练后参数也不同了。
  • encoder和decoder不一定是6层,几层都可以,原论文里采用的是6层。

4. encoder

encoder包括三个部分:输入、多头注意力、前馈神经网络。

4.1 输入部分

将输入单词的embedding词向量,与该单词的位置编码对位相加即可。

如上图所示, 比如“爱”这个字的embedding是512维向量;它的位置编码也是512维向量。将两者对位相加做为encoder第一层的输出,也即第二层(即注意力机制)的输入。

4.2 注意力机制

为了好理解,所以在上一部分介绍的注意力机制形式上比较简单。这里开始介绍一般情况下的注意力机制的运算过程,以及多头注意力的概念。

首先放一张经典的图:

在解释transformer的时候,很多文章都会用到这张图。这个图用两个词组成的一个短句子做为输入,实际上两个词对初学者理解整个注意力机制的运算过程显的太少了,我并不觉得这个图表述的很清晰。因为两个词的做例子并不具体,三个词就好多了。

假设input是I love you三个词的时候,这张图的运算过程:

input

I

love

you

词向量

计算位置编码(只有第一层transfomer会加位置编码)

词向量和位置编码对位相加得到embedding

embedding乘随机初始化的W^{Q}矩阵得到Queries

embedding乘随机初始化的W^{K}矩阵得到Keys

embedding乘随机初始化的W^{V}矩阵得到Values

 (v1)

  (v2)

  (v3)

计算词I对应的输出Z1:

Score

q1*k1=112

q1*k2=48

q1*k3=48

Divide by 8

14

6

6

Softmax

0.88

0.06

0.06

Softmax后的值*各个词的Values,记为Vi’

0.88*v1=   (v1’)

0.06*v2= (v2’)

0.06*v2= (v3’)

Z1

Z1=v1’+v2’+v3’(对位相加)

计算词love对应的输出Z2:把q1换成q2即可

Score

q2*k1=48

q2*k2=48

q2*k3=112

Divide by 8

6

6

14

Softmax

0.06

0.88

0.06

Softmax后的值*各个词的Values,记为Vi’

0.06*v1=   (v1’)

0.88*v2= (v2’)

0.06*v2= (v3’)

Z2

Z2=v1’+v2’+v3’(对位相加)

计算词you对应的输出Z3:把q1换成q3即可,这里就不重复画表了。

上面有一步操作是除以根号dk,原因:q*k得到的值可能会很大,softmax在x较大处的梯度是很小的,如下图所示。如果网络层次较深的话,在传播时容易造成梯度消失。除以根号dk让值变小,缓解梯度消失,也让方差变为1。

在实际操作中,采用矩阵相乘,方便并行提速。X有两行的意思就是,把Thinking和Machines的Embedding叠在一起,做为一个矩阵。Z是最终得到的attention值(两行,每行对应一个词),如下图所示。

4.3 多头注意力

transformer里用到的是多头注意力。多头的意思是,有多组不同的W^{Q}W^{K}W^{V}权重矩阵。把同一个句子利用多组不同的Q、K、V权重矩阵相乘,最后把得到的8个Z0~Z7对位相加(或者拼接起来再乘一个权重矩阵W^{0})得到最终的Z,这样可以捕捉到更多的特征信息。

多头注意力的完整示意如下图所示。

多头注意力,与CNN中的多通道十分类似,每个头都可能提取到不同的特征。

4.4 残差链接

把得到的两个词的Attention值摞在一起后,将“加入位置编码后的词向量”与“摞在一起的Attention值” 相加。残差链接减小了梯度消失的影响。加入残差链接,就能保证层次很深的模型不会出现梯度消失的现象。残差块是深度学习必学的基础内容,这里写的很简单,不理解的可以找找相关的博客看看。

4.5 Batch Normalization 和 Layer Normalization

假设每列代表一个样本,每行代表一个特征。BN按照特征进行标准化,将每一个特征都变为标准正态分布。batch_size较小时,BN效果差。因为小批量的均值和方差不能很好的代表整体。

LN是对每一个样本进行标准化,将每一个样本都变为标准正态分布。在NLP任务中,一般选用的都是LN,不用BN。因为句子长短不一,每个样本的特征数很可能不同,造成很多句子无法对齐,所以不适合用BN。

二者提出的目的都是为了加快模型收敛,减少训练时间。BN和LN的具体区别可以见BN和LN的区别https://www.cnblogs.com/gczr/p/12597344.html)。

4.6 前馈神经网络 Feed Forward

假设多头注意力部分有两个头,那么输出的两个注意力头Zi分别通过两个Feed Forward(由两个全连接层构成的网络:Linear(ReLU(Linear(Zi​)))),然后接一个残差链接,即Zi和Feed Forward的输出Add对位相加。最后把相加的结果进行一次LN标准化。

以上介绍的是transformer的encoder的第一层,如果有多层encoder的话,第二层encoder的输入就是第一层encoder的输出(即Z,Z的shape和X的shape是相同的),以此类推。

最后一层encoder的输出是Zn。Zn的shape和第一层输出的Z1相同。

4.7 encoder的输出如何作为decoder的输入

根据transformer的整体架构图可以看出,decoder的第二层是一个多头注意力(Multi-Head Attention)。既然是多头注意力了,那么一定会涉及到Q、K、V三个矩阵。从上图中还可以看出,K、V矩阵是由encoder部分的输出作为decoder的输入的。刚才提到,encoder最后一层的输出是Zn。那么如何把Zn这一个矩阵变成K、V两个矩阵呢?很简单,和注意力机制内部一样,初始化一个新的W^{K}W^{V}权重矩阵,用Zn去乘这两个矩阵就可以了。

总结一下,假如该transformer的编码部分有6层encoder,每层encoder有8个“头”,那么编码部分一共初始化了多少个W^{Q}W^{K}W^{V}权重矩阵?

W^{K}W^{V}都是6×8+1个,W^{Q}有6×8个。

5. decoder

decoder包括三个部分,带掩码的多头注意力、N个普通的多头注意力、前馈网络。

5.1 首先第一层,带masked的多头注意力

如果像encoder的注意力机制那里一样没有mask,那么在训练decoder时,如果要生成预测结果you,就需要用到下面整个句子的所有词。但是在真正预测的时候,并看不到未来的信息(即you和now)。

在预测阶段,预测的第一步生成第一个词I的时候,用起始词<start>做self-attention;预测的第二步生成第二个词love的时候,就做<start>和I两个词的self-attention。预测的每一步在该层都有一个输出Q,Q要送入到中间的Multi-Head Attention层,和encoder部分输出的K,V做attention。

那么在真正实现的时候,用怎样的技巧实现mask这个步骤?

举个例子,我们将"<start> I love you"这个句子输入到Decoder中,经过WordEmbedding和Positional Encoding之后,将得到的矩阵去乘随机初始化的老三样(W^{Q}W^{K}W^{V}),得到Q、K、V。然后做self-attention操作。首先通过公式\frac{Q*K^{T}}{\sqrt{d_{k}}},得到矩阵Z,然后要对Z进行Mask。例如,当输入"I"时,模型目前仅知道包括"I"在内之前所有字的信息,即"<start>"和"I"的信息,不应该让其知道"I"之后词的信息。在mask的时候,首先生成一个下三角全0,上三角全为负无穷(-inf)的矩阵,得到MASK_Z,然后将其与Scaled Scores相加即可。

之后再对结果做softmax,就能将-inf变为0,得到的这个矩阵即为每个字之间的权重。

5.2 然后是第二层,decoder里的多头注意力机制

这里的多头注意力的具体细节和encoder是相同的,唯一的区别就是,encoder的多头注意力里的Q、K、V是初始化多个不同的W^{Q}W^{K}W^{V}矩阵得到的。而decoder的K、V是来自于encoder的输出,Q是上层Masked Self-Attention的输出。

如果解码部分的多头注意力有多层,那么输入到每层多头注意力里的K、V都来自于encoder。除了第一层的Q来自于masked Multi-Head Attention的输出,其余的Q都来自于上层encoder的输出。

5.3 前馈神经网络 Feed Forward

这一部分和encoder是一样的,即一个两层的、带残差链接的、全连接网络,后边再接一个LN层。

transformer的原论文 https://arxiv.org/pdf/1706.03762.pdf

transformer的简要解读(应该都能看懂)相关推荐

  1. em算法 实例 正态分布_人人都能看懂的EM算法推导

    ↑ 点击蓝字 关注极市平台作者丨August@知乎(已授权)来源丨https://zhuanlan.zhihu.com/p/36331115编辑丨极市平台 极市导读 EM算法到底是什么,公式推导怎么去 ...

  2. 人人都能看懂的EM算法推导

    作者丨August@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/36331115 编辑丨极市平台 估计有很多入门机器学习的同学在看到EM算法的时候会有种种疑惑:EM ...

  3. 《小学生都能看懂的快速沃尔什变换从入门到升天教程》(FWT / FMT / FMI)(最最严谨清晰的证明!零基础也能得学会!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 0x00 卷积 0x01 多项式 0x02 卷积的定义 0x03 卷积的基本性质 0x04 位运 ...

  4. 兄弟,用大白话给你讲小白都能看懂的分布式系统容错架构

    点击上方"蓝字", 右上角选择"设为星标" 周一至周五早11点半!精品文章准时送上! 本文来自石杉的架构笔记 目录 (1)TB级数据放在一台机器上:难啊! (2 ...

  5. 春节充电 | 文科生都能看懂的机器学习教程:梯度下降、线性回归、逻辑回归(附动图解释)...

    来源:新智元 本文约4200字,建议阅读10+分钟. 本文浅显易懂的方式讲解机器学习,力求让没有理科背景的读者都能看懂. [ 导读 ]虽然在Coursera.MIT.UC伯克利上有很多机器学习的课程, ...

  6. 文科生都能看懂的机器学习教程:梯度下降、线性回归、逻辑回归

    来源:新智元 本文约4200字,建议阅读10+分钟. 本文浅显易懂的方式讲解机器学习,力求让没有理科背景的读者都能看懂. [ 导读 ]虽然在Coursera.MIT.UC伯克利上有很多机器学习的课程, ...

  7. 人人都能看懂LSTM

    这是在看了台大李宏毅教授的深度学习视频之后的一点总结和感想.看完介绍的第一部分RNN尤其LSTM的介绍之后,整个人醍醐灌顶.本篇博客就是对视频的一些记录加上了一些个人的思考. 0. 从RNN说起 循环 ...

  8. 小学生都能看懂的FFT!!!

    小学生都能看懂的FFT!!! 前言 在创新实践中心偷偷看了一天FFT资料后,我终于看懂了一点.为了给大家提供一份简单易懂的学习资料,同时也方便自己以后复习,我决定动手写这份学习笔记. 食用指南: 本篇 ...

  9. 随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...

    一.什么是随机森林 前面我们已经介绍了决策树的基本原理和使用.但是决策树有一个很大的缺陷:因为决策树会非常细致地划分样本,如果决策树分得太多细致,会导致其在训练集上出现过拟合,而如果决策树粗略地划分样 ...

  10. 语言线性拟合线对称_文科生都能看懂的机器学习教程:梯度下降、线性回归、逻辑回归...

    [新智元导读]虽然在Coursera.MIT.UC伯克利上有很多机器学习的课程,包括吴恩达等专家课程已非常经典,但都是面向有一定理科背景的专业人士.本文试图将机器学习这本深奥的课程,以更加浅显易懂的方 ...

最新文章

  1. ESPNet: 自动驾驶领域轻量级分割模型
  2. 论坛项目(docker模式)
  3. nginx 正则匹配优化(一)
  4. python处理excel表格实例-通过实例学习Python Excel操作
  5. 浅谈ORACLE AWR single instance 一
  6. ionic view 视图
  7. 一文看懂5G射频的“黑科技”
  8. MongoDB入门简介
  9. 实现数组和List之间的相互转换
  10. php 得到服务器的数据$_SERVER
  11. 一层循环时间复杂度_数据结构与算法:算法的时间复杂度
  12. GDT、LDT、IDTR、TR
  13. 14个UI精美功能强大的Android应用设计模板
  14. 扫描到计算机怎么转换为文字,扫描仪扫描出来的图片怎么转换成文字
  15. QtreeWidget添加右键菜单
  16. Microsoft Dynamics CRM 常用JS语法(已转成vs2017语法提示)
  17. TFmini Plus 开关量输出说明
  18. 动手实践看懂深度学习的DP和DDP
  19. 色阶、灰度色彩模式、灰度等级
  20. 向量复习(一):定义、求解、四则运算、点积和叉积

热门文章

  1. PTA L1-093 猜帽子游戏 (15 分)
  2. TPM-TPM-Profile-PTP协议-2
  3. 180701 icon文件查找与转换网站
  4. 【人工智能 AI 2.0】阿里VP贾扬清被曝将离职创业:建大模型基础设施 已火速锁定首轮融资
  5. 第四节:逻辑控制【java】
  6. Maven Nexus详解
  7. Nginx代理无法访问Nexus问题
  8. Intel TBB 介绍
  9. VM Tools 安装
  10. 波长链(TRON)---发币