大白话解释Transformer

大白话解释Transformer

    • Transformer 与 ‘seq2seq+attention’
    • 首先理解 *self-attention*
    • multi-head & position-encoding 引入
    • Transformer 模型

Transformer 与 ‘seq2seq+attention’

  • 核心是 self-attention,就是将2代的 encoderdecoder 间的 attention,直接变成encoder自己跟自己 attention 产生context-vectordecoder也可基于self-attention,变得更直接

首先理解 self-attention

  • 样本所有单词的embedding是同时训练的。首先,每个embedding,先经过1层转换,各自变成一个向量,记dmodel(这里不再局限于embedding序列,而是将所有embedding放一起看成input层,各自乘以1个2维矩阵,就能输出一个向量。embedding是向量,必须乘矩阵才能得到向量)。同样的方法,将每个单词的向量dmodel,输出成3个向量qi、kj、vi(每个就得分别乘3个矩阵)
  • 每个矩阵的大小形状,就看你输出的向量要多大了(自定义啦)
  • 接着,就是神奇的self-attention了。同attention方法,只是在计算score对和求softmax指数概率分布时,拿 qi 当成encoder的输出 hi,拿 kj 当成decoder的状态sj,那就包括当前词在内全部计算后,得到当前词同所有词的1组权重αi,j 。后就是计算context-vector了,这里又不同了,是拿vi当成encoder的输出 hi,后就加权平均求和,得到结果(也就是attention时encoder的输出hi,在这里被细化成qi和vi了)。由于不是LSTM,每个单词都可以并行的执行这些计算,同时得到每个词的context-vector。
    (这里的context-vector,真的就是hi每个单词都有1个了,一下子全算出来,所以才说parallel)
  • self-attention 中的score计算,采用上面提到的 dot 方法,也就是 Scaled Dot-Product Attention
    • 很简单,score(qi, kj) = (qi * kj) / ✔d,其中,根号d是指 qi 的维度开方(点积双方维度必相同)
  • 下面是我从台大李宏毅老师那抠的图

大白话解释Transformer_第1张图片


大白话解释Transformer_第2张图片


大白话解释Transformer_第3张图片


上述就是self-attention的整个流程原理,将这样的完整结构,作为一层layer

  • 用矩阵形式来形容上述过程
    大白话解释Transformer_第4张图片
    将样本所有单词的embedding转化后得到的向量,作为1个2维张量I。再转化得到三个2维矩阵Q、K、V(注意是每一列,对应1个单词qi、ki、vi)
    大白话解释Transformer_第5张图片
    同样,计算score和求指数概率分布,也写成矩阵(转置K^T,必须先经过score计算)
    大白话解释Transformer_第6张图片
    最后,将权重A^与单词输出V做矩阵乘,就得到output(同样,每一列才是对应一个单词的context-vector)

multi-head & position-encoding 引入

  • multi-head 没什么,就是前面每个单词只转成qi、kj、vi,但是,有的人觉得多转几个更好,因此就将每个单词转成 (qi,1,qi,2)+ (kj,1,kj,2)+(vi,1,vi,2)。计算方式上,若将1,2理解为分支,就是必须对应分支做计算score和求指数概率,以及最后的加权求和,最终每个单词concat汇总对应分支,得到context-vector。(若是concat后维度太大,那就在来个全连接,降维)
    • 注:实际项目中,每个头都是并行计算的,因此会将每个头创建为1个独立维度(这里不展开)
  • 取多少个分支,就是取多少个head,理论上,是为了加深1个词同其他词的关联,多个head,就可以有多个角度。理解就是,score计算,实际是相似度计算,该单词与哪个词相似度最高,最终反应在求context-vector的权重上。如果多整几个head,就多计算几次score,理论上,就可以从多个角度来判断相似性(相似度高的词会不同),最终表现的,就是该词与多个词有关联。
    • 可以将multi-head类比CNN中的filter,每个head专门提取某一角度上的关联单词,这样就可以提高模型的容量和能力。

大白话解释Transformer_第7张图片


大白话解释Transformer_第8张图片
这个图就更详细了,从立体的层面上看,每个头就是1个filter,最终将所有输出层叠加,用个输出为1的全连接层即可。


  • position-encoding*,就更没什么了。在LSTM中,挨个词的练,那词间就有前后顺序,但是在 self-attention,样本所有单词embedding并行操作,那就没有前后之分,而文本是有上下文关系的,因此得设法整个顺序标记。
  • 想了半天,就是在每个embedding第一次变换成向量后,直接给它加个标记向量。直接加而不用concat,经过数学推导,是有道理的。但无语的是这个标记向量得自己求,不能练。
    大白话解释Transformer_第9张图片
    假设embedding在转换前,就concat一个顺序标记向量。那将转换时乘以的矩阵W拆成两部分,分别求再相加,就发现完全同上面直接加。所以是有道理的。

大白话解释Transformer_第10张图片

这是具体每个单词ei的算法,向量每个元素分偶数/奇数,分别利用sin/cos进行计算。公式中的pos是该单词在其样本中的位置,dmodel就是单词序列长度。注意,10000的指数,奇偶是相同的,不同只是cos/sin/pos,例子有点问题。

Transformer 模型

  • transformer 是在2代 ‘seq2seq + attention’ 的基础上,将encoder和decoder,统统换成 self-attention layer
    • 区别在于,encoder已经自己能完成attention的工作,因此,decoder就只是再更细致的操作。具体是:放入一个起始符号,如,然后在encoder计算出各个context-vector后,基于这些context-vector、起始符号和起始翻译单词,继续 self-attention,最终得到翻译结果。
    • decoder的self-attention有2个,Masked Attention 可理解为decoder自己的attention,两个作用:1是将各样本中padding的0字符标记;2是设置前面单词得不到后面单词的信息。Multi-head Attention 就是将encoder的context-vector和 Mask Attention 输出的context-vector再做一次 self-attention,得到预测翻译,可理解为encoder和decodr交互的attention。
  • transformer 的优势:若将attention注意力模型理解为数据无损处理的一种手段,那 transformer 在 就是在 encoderdecoder两部分都实现数据的无损,而 seq2seq+attention 仅仅在交互时达到无损。

大白话解释Transformer_第11张图片


大白话解释Transformer_第12张图片

这就是完整的transformer结构,比理解的还要复杂些

  • 首先,encoder的思路就基本相同,只是Add & Norm 是指在self-attention输出后,将结果同输入相加,并进行一次 ‘按行标准化’ layer-normalization,才能作为真正的输出。(传统批归一化,bacth-normalization,是指将所有样本的同一维特征进行标准化;而 layer-normalization,是按每个样本行,即样本所有特征进行标准化,多用于RNN)这种操作实际是基于残差网络ResNet,将输入加到输出,就是在不断训练中,告诉模型,它只需把重点放在提取新的信息,旧的信息会保留一份;这种做法能够保证信息不会随着训练深入而丢失,即使模型再也提取不出新信息,原信息也有保留。(也由于一直保留源信息,所以可以训练上千次,不会轻易过拟合)
  • Feed-Forward即全连接层
  • 这里无论 是encoder还是decoder,都是有好几轮的(是指在1次训练中)。但是,注意到encoder引到decoder的箭头不止1个,这实际是说,除了decoder自己的mask-attention,其他和encoder交互的multi-attention块,每个都要接收encoder输入来的context-vector,图上那个Mulit-attention,其实代表多个。记住,encoder只需训练1次。

你可能感兴趣的:(NLP,自然语言处理,深度学习,神经网络,机器学习)