Transformer笔记

  • 前言
  • 一、Transformer是什么?
    • 1-1、 Transformer的结构:
    • 1-2、 自注意力机制
    • 1-3、使用位置编码表示序列的顺序
    • 1-4、Add&Normalize
    • 1-5、全连接层Feed Forward
    • 1-6、Decoder整体结构
    • 1-7、输出
    • 1-8、transformer的优缺点:
  • 总结

前言

Transformer改进了RNN训练比较慢的缺点,利用self-attention机制实现了快速的并行运算。并且最早,Transformer是用于翻译任务的。


一、Transformer是什么?

1-1、 Transformer的结构:

Nx = 6,Encoder block由6个encoder堆叠而成,图中的一个框代表的是一个encoder的内部结构,一个Encoder是由Multi-Head Attention和全连接神经网络Feed Forward Network构成。

简略结构(每一个编码器都对应上图的一个encoder结构):

Transformer的编码组件是由6个编码器叠加在一起组成的,解码器同样如此。
所有的编码器在结构上是相同的,但是它们之间并没有共享参数。
编码器的简略结构如下:

从编码器输入的句子首先会经过一个自注意力层,这一层帮助编码器在对每个单词编码的时候时刻关注句子的其它单词。
解码器中的解码注意力层的作用是关注输入句子的相关部分,类似于seq2seq的注意力。
原结构中使用到的是多头注意力机制(Multi-Head Attention),我们先从基础——自注意力机制开始讲起:

1-2、 自注意力机制

自注意力的作用:随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。在处理过程中,自注意力机制会将对所有相关单词的理解融入到我们正在处理的单词中。自注意力的结构如下所示:

自注意力的计算:从每个编码器的输入向量(每个单词的词向量,可以是任意形式的词向量,比如说word2vec,GloVe,one-hot编码)

中生成三个向量,即查询向量、键向量和一个值向量。(这三个向量是通过词嵌入与三个权重矩阵相乘后创建出来的)新向量在维度上往往比词嵌入向量更低。(512->64)
比如说X1与WQ权重矩阵相乘得到q1,就是这个单词相关的查询向量。

将以上所得到的查询向量、键向量、值向量组合起来就可以得到三个向量矩阵Query、Keys、Values。

查询向量、键向量和值向量

计算自注意力的第二步是计算得分,假设我们在为这个例子中的第一个词“Thinking”计算自注意力向量,我们需要拿输入句子中的每个单词对“Thinking”打分。这些分数是通过所有输入句子的单词的键向量与“Thinking”的查询向量相点积来计算的。

第三步和第四步是将分数除以8(8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值,这样做是为了防止内积过大。),然后通过softmax传递结果。随着模型处理输入序列的每个单词,自注意力会关注整个输入序列的所有单词,帮助模型对本单词更好地进行编码。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。

这个softmax分数决定了每个单词对编码当下位置(“Thinking”)的贡献。显然,已经在这个位置上的单词将获得最高的softmax分数,
第五步是将每个值向量乘以softmax分数(这是为了准备之后将它们求和)。这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001这样的小数)。
第六步是对加权值向量求和,然后即得到自注意力层在该位置的输出(在我们的例子中是对于第一个单词)。

整体的计算图如图所示:

最终得到了自注意力,并将得到的向量传递给前馈神经网络。以上二到六步合为一个公式计算自注意力层的输出。

自注意力层的完善——“多头”注意力机制:

对应整体结构图中的Multi——Head Attention
1、扩展了模型专注于不同位置的能力。
2、有多个查询/键/值权重矩阵集合,(Transformer使用八个注意力头)并且每一个都是随机初始化的。和上边一样,用矩阵X乘以WQ、WK、WV来产生查询、键、值矩阵。
3、self-attention只是使用了一组WQ、WK、WV来进行变换得到查询、键、值矩阵,而Multi-Head Attention使用多组WQ,WK,WV得到多组查询、键、值矩阵,然后每组分别计算得到一个Z矩阵。

前馈层只需要一个矩阵,则把得到的8个矩阵拼接在一起,然后用一个附加的权重矩阵WO与它们相乘。

总结整个流程:

编码it一词时,不同注意力的头集中在哪里:(图中只列举出了两个注意力)

即it是animal和tired的代表。

1-3、使用位置编码表示序列的顺序

即整体结构图中的positional encoding。
为了理解单词顺序,Transformer为每个输入的词嵌入添加了一个向量,这样能够更好的表达词与词之间的关系。词嵌入与位置编码相加,而不是拼接,他们的效率差不多,但是拼接的话维度会变大,所以不考虑。(这里位置向量如何得到,以哪种计算方法得到,以及词嵌入与位置编码如何结合是可以尝试实验的点,可以看以下链接思考这个问题)。如何理解Transformer论文中的positional encoding,和三角函数有什么关系?.

为了让模型理解单词的顺序,我们添加了位置编码向量,这些向量的值遵循特定的模式。

1-4、Add&Normalize

在经过多头注意力机制得到矩阵Z之后,并没有直接传入全连接神经网络,而是经过了一步Add&Normalize。

Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:

其中 X表示 Multi-Head Attention 或者 Feed Forward 的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出 (输出与输入 X 维度是一样的,所以可以相加)。

Add
Add,就是在z的基础上加了一个残差块X,加入残差块的目的是为了防止在深度神经网络的训练过程中发生退化的问题,退化的意思就是深度神经网络通过增加网络的层数,Loss逐渐减小,然后趋于稳定达到饱和,然后再继续增加网络层数,Loss反而增大。

ResNet残差神经网络
为了了解残差块,我们引入ResNet残差神经网络,神经网络退化指的是在达到最优网络层数之后,神经网络还在继续训练导致Loss增大,对于多余的层,我们需要保证多出来的网络进行恒等映射。只有进行了恒等映射之后才能保证这多出来的神经网络不会影响到模型的效果。

上图就是构造的一个残差块,X是输入值,F(X)是经过第一层线性变换后并且激活的输出,在第二层线性变化之后,激活之前,F(X)加入了这一层输入值X,然后再进行激活后输出。

要恒等映射,我们只需要让F(X)=0就可以了。x经过线性变换(随机初始化权重一般偏向于0),输出值明显会偏向于0,而且经过激活函数Relu会将负数变为0,过滤了负数的影响。
这样当网络自己决定哪些网络层为冗余层时,使用ResNet的网络很大程度上解决了学习恒等映射的问题,用学习残差F(x)=0更新该冗余层的参数来代替学习h(x)=x更新冗余层的参数。
Normalize
归一化目的:
1、加快训练速度
2、提高训练的稳定性
使用到的归一化方法是Layer Normalization。

LN是在同一个样本中不同神经元之间进行归一化,而BN是在同一个batch中不同样本之间的同一位置的神经元之间进行归一化。
BN是对于相同的维度进行归一化,但是咱们NLP中输入的都是词向量,一个300维的词向量,单独去分析它的每一维是没有意义地,在每一维上进行归一化也是适合地,因此这里选用的是LN。

1-5、全连接层Feed Forward


全连接层是一个两层的神经网络,先线性变换,然后ReLU非线性,再线性变换。
这两层网络就是为了将输入的Z映射到更加高维的空间中然后通过非线性函数ReLU进行筛选,筛选完后再变回原来的维度。
经过6个encoder后输入到decoder中。

1-6、Decoder整体结构


和Encoder Block一样,Encoder也是由6个decoder堆叠而成的,Nx=6。相比于Encoder,多了一个Masked Multi-Head Attention。

Masked Multi-Head Attention
与Encoder的Multi-Head Attention计算原理一样,只是多加了一个mask码。mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。为什么需要添加这两种mask码呢?

1.padding mask
什么是 padding mask 呢?因为每个批次输入序列长度是不一样的也就是说,我们要对输入序列进行对齐。具体来说,就是给在较短的序列后面填充 0。但是如果输入的序列太长,则是截取左边的内容,把多余的直接舍弃。因为这些填充的位置,其实是没什么意义的,所以我们的attention机制不应该把注意力放在这些位置上,所以我们需要进行一些处理。
具体的做法是,把这些位置的值加上一个非常大的负数(负无穷),这样的话,经过 softmax,这些位置的概率就会接近0!

2.sequence mask
sequence mask 是为了使得 decoder 不能看见未来的信息。对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。这在训练的时候有效,因为训练的时候每次我们是将target数据完整输入进decoder中地,预测时不需要,预测的时候我们只能得到前一时刻预测出的输出。
那么具体怎么做呢?也很简单:产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的。
注意:
1、在Encoder中的Multi-Head Attention也是需要进行mask的,只不过Encoder中只需要padding mask即可,而Decoder中需要padding mask和sequence mask。

2、Encoder中的Multi-Head Attention是基于Self-Attention地,Decoder中的第二个Multi-Head Attention就只是基于Attention,它的输入Quer来自于Masked Multi-Head Attention的输出,Keys和Values来自于Encoder中最后一层的输出。

1-7、输出

Output如图中所示,首先经过一次线性变换(线性变换层是一个简单的全连接神经网络,它可以把解码组件产生的向量投射到一个比它大得多的,被称为对数几率的向量里),然后Softmax得到输出的概率分布(softmax层会把向量变成概率),然后通过词典,输出概率最大的对应的单词作为我们的预测输出。

1-8、transformer的优缺点:

优点:
1、效果好
2、可以并行训练,速度快
3、很好的解决了长距离依赖的问题
缺点:
完全基于self-attention,对于词语位置之间的信息有一定的丢失,虽然加入了positional encoding来解决这个问题,但也还存在着可以优化的地方。

图解Transformer(完整版).
史上最小白之Transformer详解.
一文读懂BERT(原理篇).
Transformer模型详解(图解最完整版).
【从 0 开始学习 Transformer】 上篇:Transformer 搭建与理解.

总结

以上就是我总结(照抄)其它优秀博主的全部transformer内容了。

Transformer笔记相关推荐

  1. 非常详细的transformer笔记,包括XLNet, MT-DNN, ERNIE, ERNIE2, RoBERTa

    华校专老师更新了个人笔记,增加了 Transformer笔记,包含XLNet, MT-DNN, ERNIE, ERNIE2, RoBERTa 等内容,内容十分详细,非常值得学习,特此推荐. 作者华校专 ...

  2. NLP经典论文:Attention、Self-Attention、Multi-Head Attention、Transformer 笔记

    NLP经典论文:Attention.Self-Attention.Multi-Head Attention.Transformer 笔记 论文 介绍 特点 模型结构 整体结构 输入 输出 Attent ...

  3. 丑憨批的Transformer笔记

    rnn-seq2seq-attentio attention attention transformer transformer Self-Attention:当前翻译和已经翻译的前文之间的关系: E ...

  4. The illustrated Transformer 笔记

    The illustrated Transformer Transformer是一种使用Attention机制类提升模型训练的速度的模型.该模型的最大优势在于其并行性良好.Transformer模型在 ...

  5. NLP经典论文:Layer Normalization 笔记

    NLP经典论文:Layer Normalization 笔记 论文 介绍 模型结构 batch normalization 和 layer normalization 的相同点 batch norma ...

  6. 15个小时彻底搞懂NLP自然语言处理(2021最新版附赠课件笔记资料)【LP自然语言处理涉及到深度学习和神经网络的介绍、 Pytorch、 RNN自然语言处理】 笔记

    15个小时彻底搞懂NLP自然语言处理(2021最新版附赠课件笔记资料)[LP自然语言处理涉及到深度学习和神经网络的介绍. Pytorch. RNN自然语言处理] 笔记 教程与代码地址 P1 机器学习与 ...

  7. 电信保温杯笔记——NLP经典论文:BERT

    电信保温杯笔记--NLP经典论文:BERT 论文 介绍 ELMo 对输入的表示 OpenAI GPT 对输入的表示 BERT 对输入的表示 模型结构 整体结构 输入 模型参数量 Input Embed ...

  8. NLP论文笔记合集(持续更新)

    NLP论文笔记合集(持续更新) 经典论文 参考文献 情感分析论文 关键词 综述 参考文献 非综述 参考文献 其他论文 参考文献 经典论文 2003年发表的文章1^11,NLP经典论文:NNLM 笔记 ...

  9. 源码阅读及理论详解《 Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting 》

    Informer论文:https://arxiv.org/pdf/2012.07436.pdf Informer源码:GitHub - zhouhaoyi/Informer2020: The GitH ...

最新文章

  1. Java的新项目学成在线笔记-day13(九)
  2. iOS9https设置info.plist
  3. 单、双链表的循环链表(十五)
  4. 模仿莫烦的PyCharm主题
  5. 聚类的方法、原理以及一般过程
  6. 免费下载3小时学会Excel数据处理视频教程
  7. 混合基金量化投资策略应该怎么制定?
  8. vue3 ts版本深度拷贝功能推荐ts-deepmerge
  9. Spring 最新漏洞修复
  10. uniapp 密码显示隐藏
  11. 7-3 计算平均成绩 (15分)
  12. 汽车功能安全工程师必看!ISO 26262认证基本原理解析
  13. JS数组的创建及正则表达式的对象
  14. warmup lr+CosineAnnealingLR策略
  15. c#上位机开发(三)——简易串口发送数据
  16. aliyun cloud ide
  17. 先行一步,7大技术创新和突破,阿里云把 Serverless 领域的这些难题都给解了
  18. 风口上的低代码:诱人的故事,危险的豪赌
  19. Unity选择外部图片设置头像封面功能
  20. Substance Painter:常用快捷键

热门文章

  1. CentOS8 DHCP服务器配置
  2. EDM营销邮件规范-制作-设计-参考资料
  3. 2、PHP环境搭建(推荐宝塔面板)
  4. linux 查看opengl版本,什么是可以显示OpenGL版本的终端命令?
  5. python中的递归函数(以阶乘和莱布尼茨公式逼近圆周率为例)
  6. java double相减_完美解决java double数相加和相减的方案
  7. html5.js不起作用,js+html onmouseover不管用
  8. k线图技术分析中的一些要领
  9. 实习一个月后的第一篇日记(一)
  10. 程序员如何写出高质量年终总结?