解析Transformer基本结构与实现

目录

目录

基本结构

1.输入部分包含: 

2. 编码器部分:

2.1 掩码张量

学习并实现了生成向后遮掩的掩码张量函数: subsequent_mask

 2.2 注意力机制

2.3 多头注意力机制 

3. 解码器部分:

 4. 输出部分包含:

Transformer总结


首先:

哈佛NLP团队实现的Pytorch版代码链接如下:

harvardnlp/annotated-transformer: An annotated implementation of the Transformer paper. (github.com)

参考写的很好的一个博主的链接:

Transformer源码详解(Pytorch版本) - 知乎 (zhihu.com)

下面开始我的讲解:

  • 三类应用
  1. 机器翻译类应用-Encoder和Decoder共同使用
  2. 只使用Encoder端-文本分类BERT和图片分类VIT
  3. 只使用Decoder端-生成类模型
     

图:第二章:Transformer 模型 · Transformers快速入门

笔记参考b站视频:2.3.1掩码张量-part1_哔哩哔哩_bilibili

基本结构

​    Transformer总体架构可分为4个部分:

  •  输入部分
  • -输出部分
  • -编码器部分
  • -解码器部分

1.输入部分包含: 

  1. 原文本嵌入层(Input embedding)及其位置编码(position encoding)
  2. 目标文本嵌入层及其位置编码器

  

  • 文本嵌入层的作用:

       无论是源文本嵌入还是目标文本嵌入,都是为了将文本中词汇的数字表示(word to index)转变为向量(eg. one-hot,但这里不是)表示,希望在这样的高维空间捕捉词汇间的关系。

  • 位置编码器的作用:

        因为在Transformer的编码器结构中,并没有针对词汇位置信息的处理,因此需要在Embedding层后加入位置编码器,将词汇位置不同可能会产生不同语义的信息加入到词嵌入张量中,以弥补位置信息的缺失。

Transformer位置编码图解 - BimAnt

position embedding的要求

(1)表示token在序列中的绝对位置

(2)序列长度不同时,不同序列中token的相对位置/距离也要保持一致

(3)可以用来表示模型在训练过程中从来没有看到过的句子

于是想要了:用二进制表示

缺点:占内存, 且无法表示浮点数

于是。采用正余弦函数表示。

2. 编码器部分:

  1.     由N个编码器层堆叠而成 每个编码器层由两个子层连接结构组成。每个编码器层不共享参数
  2.     第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接
  3.     第二个子层连接结构包括一个前馈全连接子层(Linear)和规范化层以及一个残差连接

2.1 掩码张量

什么事掩码张量:   

        掩代表遮掩,码就是我们张量中的数值,它的尺寸不定,里面一般只有1和0的元素,代表位置被遮掩或者不被遮掩,至于是0位置被遮掩还是1位置被遮掩可以自定义,因此它的作用就是让另外一个张量中的一些数值被遮掩,也可以说被替换,它的表现形式是一个张量。

掩码张量的作用:

        在transformer中,掩码张量的主要作用在应用attention(将在下一小节讲解)时,有一些生成的attention张量中的值计算有可能已知了未来信息而得到的,未来信息被看到是因为训练时会把整个输出结果都一次性进行Embedding,但是理论上解码器的的输出却不是一次就能产生最终结果的,而是一次次通过上一次结果综合得出的,因此,未来的信息可能被提前利用。所以,我们会进行遮掩。关于解码器的有关知识将在后面的章节中讲解。

学习并实现了生成向后遮掩的掩码张量函数: subsequent_mask

        它的输入是size,代表掩码张量的大小.
        它的输出是一个最后两维形成1方阵的下三角阵.
        最后对生成的掩码张量进行了可视化分析,更深一步理解了它的用途.
 

# np.triu 演示
>>> np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], k=-1) #k=-1表示主对角线(1,5,9)的元素往下移动一个后下放的元素全为0
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 0,  8,  9],
       [ 0,  0, 12]])

>>> np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], k=0) #k=0,表示主对角线元素及其往下的元素都为0
array([[1, 2, 3],
       [0, 5, 6],
       [0, 0, 9],
       [0, 0, 0]])

>>> np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], k=1) #k=1,表示主对角线元素往上移一步后以下的元素都为0
array([[0, 2, 3],
       [0, 0, 6],
       [0, 0, 0],
       [0, 0, 0]])

 2.2 注意力机制

  • 什么是注意力:

        我们观察事物时,之所以能够快速判断―种事物(当然允许判断是错误的),是因为我们大脑能够很快把注意力放在事物最具有辨识度的部分从而作出判断,而并非是从头到尾的观察一遍事物后,才能有判断结果.正是基于这样的理论,就产生了注意力机制。

  • 我们这里使用的注意力的计算规则:
     

  •  Q,K,V的比喻解释:

         假如我们有一个问题:给出一段文本,使用一些关键词对它进行描述!
为了方便统一正确答案,这道题可能预先已经给大家写出了一些关键词作为提示。其中这些给出的提示就可以看作是key,而整个的文本信息就相当于是query,value的含义则更抽象,可以比作你看到这段文本信息后,脑子里浮现的答案信息,,这里我们又假设大家最开始都不是很聪明,第一次看到这段文本后脑子里基本上浮现的信息就只有提示这些信息,因此key与value基本是相同的,但是随着我们对这个问题的深入理解,通过我们的思考脑子里想起来的东西原来越多,并且能够开始对我们query也就是这段文本,提取关键信息进行表示.这就是注意力作用的过程,通过这个过1我们最终脑子里的value发生了变化,
        根据提示key生成了query的关键词表示方法,也就是另外一种特征表示方法.
刚刚我们说到key和value一般情况下默认是相同,与query是不同的,这种是我们一般的注意力输入形式,但有一种特殊情况,就是我们query与key和value相同,这种情况我们称为自注意力机制,就如同我们的刚刚的例子。使用一般注意力机制,是使用不同于给定文本的关键词表示它.而自注意力机制,需要用给定文本自身来表达自己,也就是说你需要从给定文本中抽取关键词来表述它,相当于对文本自身的一次特征提取。

简单的:

  • Q:我们要查询的信息,eg, 高领男士毛衣(查询和别人的关系)
  • K:正在被查询的信息,eg,高龄,男士,毛衣(身份证)
  • v:被查询的内容(特征表示)

或者理解:

  • Q是一段准备被概括的文本;
  • K是给出的提示;
  • V是大脑中的对提示K的延伸.。

当Q=K=V时,称作自注意力机制。(给你一篇文章提主旨,你说需要给个参考,结果“没参考”,即给你的参考是和原文一模一样的文章)
 

  •  什么是注意力机制:

        注意力机制是注意力计算规则能够应用的深度学习网络的载体,除了注意力计算规则外,还包括一些必要的全连接层以及相关张量处理,使其与应用网络融为一体。使用自注意力计算规则的注意力机制称为自注意力机制。

  • 注意力机制在网络中实现的图形表示:

  • 注意力计算规则的函数: attention
  1. 它的输入就是Q,K,V以及mask和dropout, mask用于掩码, dropout用于随机置0。
  2. 它的输出有两个,query的注意力表示(词嵌入的维度)以及注意力张量

 

mask-fill演示:

 

2.3 多头注意力机制 

  • 什么是多头注意力机制:

        从多头注意力的结构图中,貌似这个所谓的多个头就是指多组线性变换层,其实并不是,我只有使用了一组线性变化层,即三个变换张量对Q,K,V分别进行线性变换,这些变换不会改变原有张量的尺寸,因此每个变换矩阵都是方阵,得到输出结果后,多头的作用才开始显现,每个头开始从词义层面分割输出的张量,也就是每个头都想获得一组Q,K,v进行注意力机制的计算,但是句子中的每个词的表示只获得一部分,也就是只分割了最后一维的词嵌入向量.这就是所谓的多头,将每个头的获得的输入送到注意力机制中,就形成多头注意力机制。

为什么要用多头:

a. "多头"与CNN中conv kernel类似,类似地,有多少个kernel,就有多少个feature map.

b. 不同的注意力结果得到的特征向量不同,表达也不相同

  • 多头注意力机制结构图:

  •  多头注意力机制的作用:

        这种结构设计能让每个注意力机制去优化每个词汇的不同特征部分,从而均衡同一种注意力机制可能产生的偏差,让词义拥有来自更多元的表达,实验表明可以从而提升模型效果。

3. 解码器部分:

  1. 由N个解码器层堆叠而成 每个解码器层由三个子层连接结构组成
  2. 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接
  3. 第二个子层连接结构包括一个多头注意力子层和规范化层以及一个残差连接(编码-解码多注意力子层)
  4. 第三个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接

encode和decode中残差连接的作用:因为transformer中的输出是position embedding和word embedding相加,随着word embed和position embed的相加,网络会逐渐遗忘position的信息,而着重表达了word embedding的信息。所以需要残差连接来记住position embedding。

 4. 输出部分包含:

  1. 线性层(得到output size)
  2. softmax处理器(找到最大概率)

 

  • 就是重新组合各大输入向量,得到更完美的特征。

参考:Vision Transformer 超详细解读 (原理分析+代码解读) (一) - 知乎 (zhihu.com)

 输入序列x1,x2,x3,x4,对x1~x4提取特征。探究x1,x2,x3,x4之间的关系,利用3个辅助向量Q,K,V。

每一个token对应3个向量Q,K,V;

Q:查一查自己与别人的关系

K:自己是被查对象,身份证的key

V:特征表达(x1用v1表达,后面与x1则没关系了,用v1代替)

通过这个操作得到一个权重项,再把特征进行重新组合。

Transformer总结

  • Transformer与RNN不同,可以比较好地进行并行训练。
  • Transformer本身是不能利用单词的顺序信息的,因此需要再输入中添加位置Embeeding,否则Transformer就是一个词袋模型了。
  • Transformer的重点是self-Attention结构,其中用到的Q,K,V矩阵通过输出进行线性变换得到
  • Transformer中Multi-Head Attention中有多个Self-Attention,可以捕获单词之间多种维度上的相关系数attention分数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值