一文读懂transformer

首先先上经典图片,想必学过transformer 的各位对这张图片都不陌生吧。

笔者想从这张图片(图一)入手,讲清楚transformer 的结构

Transformer整体结构

从以下四个方面讲清楚transformer 的结构

  1. Encoder-Decoder(编码器-解码器)
  2. Multi-Head Attention(多头注意力机制)
  3. Point-wise Feed-forward Network(前馈神经网络)
  4. Embedding & positional encoding

Encoder-Decoder(transformer 的主要架构)

Transformer的本质上是一个Encoder-Decoder的结构

同样先上图(图二),这是一个Transformer的Encoder-Decoder结构

原论文中N=6,即编码器由6个编码组成,同样解码器由6个解码组成。也就是说是类似上图这样的结构有六个堆叠而成,同样上图(图三)一目了然。

Encoder 结构是对应于图一的左半部分

Encoder有两个子层

  • multi-head attention层,是利用self-attention学习源句内部的关系
  • feed forward层,类似于FC层其实就是FC层加了一个RELU激活函数,简单的全连接网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活函数,之后产生encoder的输出(key 和 value)传给decoder

这里编码过程是并行计算的,相比于原来的encoder-decoder模型,极大地提高了效率。

Decoder的结构对应于图一的右半部分

Decoder中有三个子层

  • 两个multi-head attention层
  • attention层是利用self-attention学习目标句内部的关系,之后该层输出(query)与encoder传过来的结果一起输入到上面的attention层,这个attention层并不是 self-attention,而是encoder-decoder attention,用来学习源句与目标句之间的关系。
    • 对于这个Attention,query代表decoder上一步的输出,key和value是来自encoder的输出。这里值得一提的是,解码过程是像RNN一样一步步生成的,因为要用上一位置的输出当作这一位置attention的query。
  • q最后再经过一个与编码部分类似的feed forward层,就可以得到decoder的输出了。

Multi-Head Attention(多头注意力机制)

Attention

注意力机制:简单来说是模仿人的注意力,对不同的事件有不同的关注程度,即权重

通过权重大小来模拟人在处理信息的注意力的侧重,有效的提高了模型的性能,并且一定程度上降低了计算量

深度学习中的注意力机制通常可分为三类:软注意(全局注意)、硬注意(局部注意)和自注意

  1. Soft/Global Attention(软注意机制):对每个输入项的分配的权重为0-1之间,也就是某些部分关注的多一点,某些部分关注的少一点,因为对大部分信息都有考虑,但考虑程度不一样,所以相对来说计算量比较大。
  2. Hard/Local Attention(硬注意机制):对每个输入项分配的权重非0即1,和软注意不同,硬注意机制只考虑那部分需要关注,哪部分不关注,也就是直接舍弃掉一些不相关项。优势在于可以减少一定的时间和计算成本,但有可能丢失掉一些本应该注意的信息。
  3. Self/Intra Attention(自注意力机制):对每个输入项分配的权重取决于输入项之间的相互作用,即通过输入项内部的"表决"来决定应该关注哪些输入项。和前两种相比,在处理很长的输入时,具有并行计算的优势。

注意力函数是对一个query向量,让它和一系列的key向量-value向量对进行映射并输出结果的函数,输出是value的加权和,权重是key和query的相似度计算来的;即使key-value对不改变,随着query的改变,输出向量会不一样,但输出的维度是和value一样的。

Multi-Head

简单说了注意力机制,接下来说一下为什么是多头

我们先看一下多头的结构图(图四)

可以看到多头注意力机制就是将原始的输入序列进行多组的自注意力处理过程;然后再将每一组自注意力的结果拼接起来进行一次线性变换得到最终的输出结果。

简单看一下公式:

为什么要使用多头注意力机制?

  1. 自注意力机制的缺陷就是:模型在对当前位置的信息进行编码时,会过度的将注意力集中于自身的位置
  2. 多头注意力机制产生原因:作者提出了通过多头注意力机制来解决这一问题。同时,使用多头注意力机制还能够给予注意力层的输出包含有不同子空间中的编码表示信息,从而增强模型的表达能力。
  3. 多头注意力是多组自注意力构件的组合,自注意力机制能帮助建立包括上下文信息的词特征表达,多头注意力能帮助学习到多种不同类型的上下文影响情况,比如"今天阳光不错,适合出去跑步",在不同情景下,"今天"同"阳光"、"跑步"的相关性是不同,特别是头越多,越有利于捕获更大更多范围的相关性特征,增加模型的表达能力
  4. 多头注意力机制是模拟卷积神经网络多输出通道的一个效果

Scaled dot-product attention

输入序列的每一项都对应三个向量query(dk), key(dk), value(dv),在transformer里,它们是等长的,都是512。通过计算query和所有key的内积来作为两者的相似度,除以sqrt(dk),在经过softmax得到权重,然后作用在对应的value上得到输出.

  • dot-product:内积的几何意义是一个向量在另一个向量上的投影,进而内积越大说明相似度越高。
  • scaled:较长的序列(512)会导致QK的内积的方差很大,相对差距变大,极值做出来softmax会倾向于1, 计算的梯度接近0,导致难以学习,除以sqrt(dk)可以避免这种情况。

Mask

  • Mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果
  • 带掩码的注意力机制:保证了在 t 时刻不能看到 t 时刻以后的输入,从而保证训练和预测时候是一致的

Point-wise Feed-forward Network

Feed-Forward层包括两层全连接层以及一个非线性激活函数ReLu。

实质就是全连接层加了激活函数,实质还是一个全连接层FC

在Feed-Forward层中,先将数据映射到高维空间再映射到低维空间的过程,可以学习到更加抽象的特征,即该Feed-Forward层使得单词的表达能力更强,更加能够表示单词与context中其他单词之间的作用关系。

Embedding & positional encoding

Embedding(词嵌入)

Embedding将token映射成向量,transformer会在embedding结果乘以sqrt(d_model),原因是Embedding的分布往往是N(1, 1/sqrt(d_model)), 同时位置编码positional encoding是三角函数,在token编码和位置编码加和的时候,前者乘以sqrt(d_model)可以使两者处于相同的尺度,是比较好的。

根据嵌入向量得到 q, k , v 三个向量

positional encoding

 Transformer摒弃了之前机器翻译任务中常用的RNN结构,使得并行性更好。RNN的这种结构天生考虑了词语的先后顺序关系。当Transformer模型不使用RNN结构时,它就要想办法通过其它机制把位置信息传输到encoder,否则可能会出现“所有词语都对了,但是无法组成有意义的语句”的情况。为了解决这个问题,论文使用了Positional Encoding对序列中词语出现的位置进行了编码。

其实就是一个激活函数(tanh)

layer normalization

  • 在encoder和decoder模块中每一层后面都有一个normalization。
  • normalization 目的:把输入转化成均值为 0 方差为 1 的数据。

先解释Batch normalization:在每一层的每一批数据上进行归一化。

layer normalization 不是 Batch normalization 那种在批方向计算均值和方差,而是在每一个样本上计算均值和方差。layer normalization 多用于RNN的结构。

batchnorm 竖着切 若样本长度变化比较大,均值和方差抖动大

layernorm 横着切

猜你喜欢

转载自blog.csdn.net/y1120944224/article/details/130405649