(2021李宏毅)机器学习-Transformer

在这里插入图片描述


Transformer模型


Transformer模型是一个基于多头自注意力序列到序列模型 (seq2seq model),整个网络结构可以分为 编码器 (Encoder)和 解码器 (Decoder)两部分。

在这里插入图片描述

这个seq2seq模型输出序列的长度是不确定的。输入一个sequence后,先由Encoder负责处理,再把处理好的结果输入到Decoder中,由Decoder决定最后输出什么样的sequence。Transformer的完整结构如下图所示:

在这里插入图片描述

下面就来解析Transformer的结构


Encoder


在seq2seq模型中的Encoder要做的事情就是 输入一排向量,输出另一排向量 。能实现输入一排向量,输出一排向量功能的模型有Self-attention、CNN和RNN等模型,而 Transformer中用到的则是Multi-Head attention模型

在这里插入图片描述

如上图所示,Transformer中有N个block,每个block中包含了Multi-Head Attention和Fully Connected的Feed Forward Network,它要做的工作如下图所示:

在这里插入图片描述

  • 先做一个self-attention,输入一排向量,经过self-attention考虑整个sequence的信息后,输出另外一排向量。
  • 接下来将输出的这一排向量输入到fully connected的前馈网络中,得到处理后的向量。

上述两个步骤,仅仅是描述了block中完成的大体工作。 Transformer中,在self-attention和fully collected上还额外加了residual connection和layer normalization ,也就是上图中的Add & Norm模块。


Residual Connection & Layer normalization


在这里插入图片描述

在self-attention中,输入一排向量,输出的一排向量是考虑了所有input之后的结果。 在Transformer中,这个输出的向量 a a a还要直接加上它对应的输入向量 b b b,然后经过Layer Normalization后,才是这个self-attention最终的输出

在这里插入图片描述

在fully connected中也增加了同样的residual网络结构,FC网络的输出先直接加上它对应的输入,然后经过layer normalization之后才是FC网络最终的输出。

在这里插入图片描述

layer-Norm

层归一化(Layer Normalization)是对一个中间层的所有神经元进行归一化。

对于一个深度神经网络, 令第 l l l 层神经元的净输入为 z ( l ) z^{(l)} z(l) ,其均值和方差为:

μ ( l ) = 1 M l ∑ i = 1 M l z i ( l ) σ ( l ) 2 = 1 M l ∑ i = 1 M l ( z i ( l ) − μ ( l ) ) 2 \begin{aligned} \mu^{(l)} &=\frac{1}{M_{l}} \sum_{i=1}^{M l} z_{i}^{(l)} \\ \sigma^{(l)^{2}} &=\frac{1}{M_{l}} \sum_{i=1}^{M_{l}}\left(z_{i}^{(l)}-\mu^{(l)}\right)^{2} \end{aligned} μ(l)σ(l)2=Ml1i=1Mlzi(l)=Ml1i=1Ml(zi(l)μ(l))2

其中 M l M_{l} Ml 为第 l l l 层神经元的数量。
层归一化定位为:

z ^ ( l ) = z ( l ) − μ ( l ) σ ( l ) 2 + ϵ ⊙ γ + β ≜ L N γ , β ( z ( l ) ) \begin{aligned} \hat{z}^{(l)} &=\frac{z^{(l)}-\mu^{(l)}}{\sqrt{\sigma^{(l)^{2}+\epsilon}}} \odot \gamma+\beta \\ & \triangleq L N_{\gamma, \beta}\left(z^{(l)}\right) \end{aligned} z^(l)=σ(l)2+ϵ z(l)μ(l)γ+βLNγ,β(z(l))

其中 γ \gamma γ β \beta β 分别代表缩放和平移的参数向量, 和 z ( l ) z^{(l)} z(l) 维数相同。

层归一化是单个训练数据对某一层所有神经元之间的归一化.

在这里插入图片描述

假设上图中,神经网络只有一个隐藏层 ( Z = [ z 1 , z 2 , z 3 , z 4 ] ) , \left(Z=\left[z_{1}, z_{2}, z_{3}, z_{4}\right]\right) , (Z=[z1,z2,z3,z4]) 在训练过程中, 当前批次只有两个训练样本 ( X 1 = [ x 1 1 , x 2 1 , x 3 1 , x 4 1 ] , X 2 = [ x 2 1 , x 2 2 , x 3 2 , x 4 2 ] ) \left.X_{1}=\left[x_{1}^{1}, x_{2}^{1}, x_{3}^{1}, x_{4}^{1}\right], X_{2}=\left[x_{2}^{1}, x_{2}^{2}, x_{3}^{2}, x_{4}^{2}\right]\right) X1=[x11,x21,x31,x41],X2=[x21,x22,x32,x42])
LN采用如下公式, 进行归一化:

z ^ ( l ) = z ( l ) − μ σ 2 + ϵ ⊙ γ + β \hat{z}^{(l)}=\frac{z^{(l)}-\mu}{\sqrt{\sigma^{2}+\epsilon}} \odot \gamma+\beta z^(l)=σ2+ϵ z(l)μγ+β

LN的一次归一化过程:

  • 使用 X 1 X_{1} X1 计算得到隐藏层所有神经元的净输入 Z 1 = [ z 1 1 , z 2 1 , z 3 1 , z 4 1 ] Z^{1}=\left[z_{1}^{1}, z_{2}^{1}, z_{3}^{1}, z_{4}^{1}\right] Z1=[z11,z21,z31,z41]
  • 计算 Z 1 Z^{1} Z1 中所有元素对应的 μ \mu μ σ 2 \sigma^{2} σ2,代入公式进行归一化

LN使用同样的训练数据对同一个隐藏层的所有神经元进行归一化

逐层归一化可以有效地提高训练效率,其原因有以下几个方面:

  1. 更好的尺度不变性 :在深度神经网络中,一个神经层的输入是之前神经层的输出, 给定一个神经层 l l l,它之前的神经层 ( 1 , ⋯   , l − 1 ) (1, \cdots, l-1) (1,,l1)的参数变化会导致其输入的分布发生较大的变化 。当使用随机梯度下降来训练网络时,每次参数更新都会导致该神经层的输入分布发生改变。从机器学习角度来看,如果一个神经层的输入分布发生了改变,那么其参数需要重新学习,这种现象叫做 内部协变量偏移(Internal Covariate Shift) 。为了缓解这一问题,我们可以对神经层的输入做归一化,使其分布保持稳定。把每个神经层的输入分布都归一化为标准正态分布,可以使得每个神经层对其输入具有更好的尺度不变性。不论低层的参数怎么变化,高层的输入保持相对稳定。另外,尺度不变性可以使得我们更加高效的进行参数初始化以及超参选择。
  2. 更平滑的优化地形 :逐层归一化一方面可以使得大部分神经层的输入处于不饱和区域,从而让梯度变大,避免梯度消失问题;另一方面还可以使得神经网络的 优化地形 (Optimization Landscape)更加平滑,以及使梯度变得更加稳定,从而允许使用更大的学习率,并提高收敛率。

Encoder总结


在这里插入图片描述

  • 在将输入向量进行self-attention之前,先加上Positional Encoding,也就是输入向量中的位置信息。
  • Multi-Head Attention:进行Multi-Head的self-attention处理得到输出向量。
  • Add & Norm (residual & layer normalization): 也就是将self-attention的输出加上它对应的输入然后对其进行Layer Normalization。
  • Feed Forward:将上一层的输出输入到fully connected Network中,将得到的输出向量和对应的输入向量同样经过residual & layer normalization操作后得到该block的最终输出。
  • 将这个block重复n次。

Decoder


Decoder分为 Auto regressive (AT)和 Non-Auto regressive (NAT)两种。其中AT应用范围更为广泛一些。

Auto regressive(AT)


在这里插入图片描述

以语音辨识为例,假设要处理的这个NLP问题, 每一个Token都用One-Hot的Vector表示 ,并假设START和END两个special token,其中 START表示开始工作,END表示结束工作

  • 在Encoder完成之后,将其输出作为一个输入喂到Decoder中。
  • 同时,输入一个special token:START表示开始工作。
  • Decoder结合这两个输入, 输出一个经过softmax处理后的长度为Vocabulary Size的输出向量,该向量中每一个中文字都对应一个数值,数值最大的中文字为最终输出的中文字 ,下图中,输出的结果是“机”。

在这里插入图片描述

接下来,将“机”对应的向量作为Decoder的输入,做下一步计算。这样Decoder会考虑下边两个输入,得出蓝色的输出向量。

  • START对应的向量
  • “机”对应的向量

蓝色向量中“器”对应的softmax值最高,输出“器”。

在这里插入图片描述

接下来,将“器”对应的向量也作为Decoder的输入,这样Decoder会考虑下边三个输入,得出绿色的输出向量。

  • START对应的向量
  • “机”对应的向量
  • “器”对应的向量

绿色的向量中“学”对应的softmax的值最高,输出“学”。持续这样的过程直到Decoder输出的结果为END对应的向量结束。当然整个过程中Decoder也有考虑Encoder的输出信息,这就是Decoder的计算过程


Decoder具体结构


在这里插入图片描述

如上图所示,通过对比可以看出在 每一个block中Decoder比Encoder多了中间的一个Multi-Head Attention ,同时 第一个自注意力机制使用的是Masked Multi-Head Attention


Masked Multi-Head attention

在这里插入图片描述
在这里插入图片描述

Masked Multi-Head attention的计算顺序其实是和Decoder的串行计算顺序相对应的,以上图中计算 b 2 b^{2} b2 为例:
在计算 b 2 b^{2} b2 的时候,和原来的self-attention考虑所有输入信息 [ a 1 , a 2 , a 3 , a 4 ] \left[a^{1}, a^{2}, a^{3}, a^{4}\right] [a1,a2,a3,a4] 不同, Masked Multi-Head attention只考虑 [ a 1 , a 2 ] \left[a^{1}, a^{2}\right] [a1,a2], 因为此时的 [ a 3 , a 4 ] \left[a^{3}, a^{4}\right] [a3,a4] 还没有计算出来。


Encoder-Decoder数据传输


在这里插入图片描述

Encoder和Decoder之间的数据传输由上图中的Cross Attention负责完成 ,也就是上边说到的Decoder中比Encoder多出来的中间的那一个Multi-Head Attention。现在假设Encoder有 [ a 1 , a 2 , a 3 ] \left[a^{1}, a^{2}, a^{3}\right] [a1,a2,a3] 三个输出。

  • 在cross attention中,首先生成对应的矩阵 [ k 1 , k 2 , k 3 ] \left[k^{1}, k^{2}, k^{3}\right] [k1,k2,k3] 。每当Decoder生成一个结果 q q q ,就将其与 [ k 1 , k 2 , k 3 ] \left[k^{1}, k^{2}, k^{3}\right] [k1,k2,k3] 一起计算Attention Score得到 [ α 1 ′ , α 2 ′ , α 3 ′ ] \left[\alpha_{1}^{'}, \alpha_{2}^{'}, {\alpha_{3}^{'}} \right] [α1,α2,α3]
    在这里插入图片描述

  • 将得到的Attention Score分别与 [ α 1 ′ , α 2 ′ , α 3 ′ ] \left[\alpha_{1}^{'}, \alpha_{2}^{'}, {\alpha_{3}^{'}} \right] [α1,α2,α3]对应的 [ v 1 , v 2 , v 3 ] \left[v^{1}, v^{2}, v^{3}\right] [v1,v2,v3] 计算相加得到输出 v v v, 这个 v v v 后续将输入全连接网絡中进一步的计算。

  • 上述过程持续到Decoder输出END结束。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顾道长生'

您的支持是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值