Transformer|深度学习(李宏毅)(八)

一、RNN与CNN处理Seq2seq问题的局限性

  1. RNN的局限性

处理Seq2seq问题时一般会首先想到RNN,但是RNN的问题在于无论使用单向还是双向RNN都无法并行运算,输出一个值必须等待其依赖的其他部分计算完成。

RNN

  1. CNN的局限性

为了解决并行计算的问题,可以尝试使用CNN来处理。如下图,使用CNN时其同一个卷积层的卷积核的运算是可以并行执行的,但是浅层的卷积核只能获取部分数据作为输入,只有深层的卷积层的卷积核才有可能会覆盖到比较广的范围的数据,因此CNN的局限性在于无法使用一层来输出考虑了所有数据的输出值。

CNN

二、Self-attention

Transformer是一种使用了Self-attention的Seq2seq模型。Self-attention是一种可以取代RNN的网络结构,比起RNN其可以实现并行运算。

  1. Self-attention的结构

①如下图,首先要将输入序列的向量经过一个Embedding层(即乘以权重 W W W)获得 a i a^{i} ai,然后 a i a^{i} ai分别乘以三个权重 W q 、 W k 和 W v W^{q}、W^{k}和W^{v} WqWkWv来获得 q i 、 k i 和 v i q^{i}、k^{i}和v^{i} qikivi

获得q、k、v

q i 、 k i 和 v i q^{i}、k^{i}和v^{i} qikivi分别代表query、key和value,在后面会用到:

q{i}、k{i}和v^{i}

②接下来需要拿每个query对每个key做attention,这里使用的是Scaled Dot-Product Attention,其公式为:

a i , j = q i ⋅ k j / d a_{i,j}=q^{i}\cdot k^{j}/\sqrt{d} ai,j=qikj/d

也就是计算query与key的点积,另外点积需要除以 d \sqrt{d} d d d d q 和 k q和k qk的维度,主要是为了起到缩放的作用,避免梯度爆炸哦。至于更详细的为什么Dot-Product Attention需要被Scaled,可以参考该文章:为什么 dot-product attention 需要被 scaled?

该过程如下图所示,下图展示了 q 1 q^{1} q1与key做Attention的过程,获得了 a 1 , i a_{1,i} a1,i

Attention

③然后将得到的结果 a 1 , i a_{1,i} a1,i通过 s o f t m a x softmax softmax函数获得 a ^ 1 , i \hat{a}_{1,i} a^1,i:

softmax

④然后将 a ^ 1 , i \hat{a}_{1,i} a^1,i与对应的 v i v^{i} vi相乘在加起来就获得了第一个输出值 b 1 b^{1} b1。需要注意这里的 b 1 b^{1} b1是考虑了所有的输入 x i x^{i} xi所产生的,其具备与RNN类似的效果。该过程如下图所示:

获得输出

同理 b 2 b^{2} b2等也通过同样的过程计算出来:

获得输出

  1. Self-attention如何并行运算

①将 a i a^{i} ai横向排列到一起组成矩阵 I I I,然后分别用 W q 、 W k 和 W v W^{q}、W^{k}和W^{v} WqWkWv乘以 I I I来获得矩阵 Q 、 K 和 V Q、K和V QKV,该过程如下图所示:

Q、K和V

该步骤的形式化过程如下:

I = ( a 1 a 2 ⋯ a N ) Q = W q I = W q ( a 1 a 2 ⋯ a N ) = ( q 1 q 2 ⋯ q N ) K = W k I = W k ( a 1 a 2 ⋯ a N ) = ( k 1 k 2 ⋯ k N ) V = W v I = W v ( a 1 a 2 ⋯ a N ) = ( v 1 v 2 ⋯ v N ) I=\begin{pmatrix} a^{1} & a^{2} & \cdots & a^{N} \end{pmatrix}\\ Q=W^{q}I=W^{q}\begin{pmatrix} a^{1} & a^{2} & \cdots & a^{N} \end{pmatrix}=\begin{pmatrix} q^{1} & q^{2} & \cdots & q^{N} \end{pmatrix}\\ K=W^{k}I=W^{k}\begin{pmatrix} a^{1} & a^{2} & \cdots & a^{N} \end{pmatrix}=\begin{pmatrix} k^{1} & k^{2} & \cdots & k^{N} \end{pmatrix}\\ V=W^{v}I=W^{v}\begin{pmatrix} a^{1} & a^{2} & \cdots & a^{N} \end{pmatrix}=\begin{pmatrix} v^{1} & v^{2} & \cdots & v^{N} \end{pmatrix} I=(a1a2aN)Q=WqI=Wq(a1a2aN)=(q1q2qN)K=WkI=Wk(a1a2aN)=(k1k2kN)V=WvI=Wv(a1a2aN)=(v1v2vN)

由此也就完成了以下过程:

获得q、k、v

②接下来需要对 q i q^{i} qi k i k^{i} ki做attention,在每一个 q i q^{i} qi对每一个 k i k^{i} ki进行点积运算时可以将 k i T k^{iT} kiT纵向叠加成一个矩阵即 K T K^{T} KT,该过程如下图所示(下图中省略了 d \sqrt{d} d ):

attention

同样地每一个 q i q^{i} qi也可以横向排列到一起来与 K T K^{T} KT做点击运算,得到矩阵 A A A,该过程如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nLsF7MCT-1595144833218)(https://upload-images.jianshu.io/upload_images/22097296-373f2d0cb0f2e72b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/600)]

该步骤的形式化过程如下:

A = 1 d K T Q = 1 d ( k 1 T k 2 T ⋮ k N T ) ( q 1 q 2 ⋯ q N ) A=\frac{1}{\sqrt{d}}K^{T}Q=\frac{1}{\sqrt{d}}\begin{pmatrix} k^{1T}\\ k^{2T}\\ \vdots \\ k^{NT} \end{pmatrix}\begin{pmatrix} q^{1} & q^{2} & \cdots & q^{N} \end{pmatrix} A=d 1KTQ=d 1k1Tk2TkNT(q1q2qN)

③将矩阵 A A A每一列通过 s o f t m a x softmax softmax函数获得 A ^ \hat{A} A^,该过程如下图所示:

softmax

④然后将 v i v^{i} vi横向排列到一起再与矩阵 A ^ \hat{A} A^相乘来获得最终的输出矩阵 O O O,该过程如下图所示:

获取O

该步骤的形式化过程如下:

O = V A ^ = ( v 1 v 2 ⋯ v N ) ( a ^ 1 , 1 a ^ 2 , 1 ⋯ a ^ N , 1 a ^ 1 , 2 a ^ 2 , 2 ⋯ a ^ N , 2 ⋮ ⋮ ⋱ ⋮ a ^ 1 , N a ^ 2 , N ⋯ a ^ N , N ) O=V\hat{A}=\begin{pmatrix} v^{1} & v^{2} & \cdots & v^{N} \end{pmatrix}\begin{pmatrix} \hat{a}_{1,1} & \hat{a}_{2,1} & \cdots & \hat{a}_{N,1}\\ \hat{a}_{1,2} & \hat{a}_{2,2} & \cdots & \hat{a}_{N,2}\\ \vdots & \vdots & \ddots & \vdots \\ \hat{a}_{1,N} & \hat{a}_{2,N} & \cdots & \hat{a}_{N,N} \end{pmatrix} O=VA^=(v1v2vN)a^1,1a^1,2a^1,Na^2,1a^2,2a^2,Na^N,1a^N,2a^N,N


并行运算的整个过程如下图所示:

整体过程

具体的细节可以用下图来表示:

整体过程

总而言之是一些矩阵运算,可以使用GPU来进行加速。


  1. Multi-head Self-attention

q i 、 k i 、 v i q^{i}、k^{i}、v^{i} qikivi还可以继续乘以各自的权重获得 q i , j 、 k i , j 、 v i , j q^{i,j}、k^{i,j}、v^{i,j} qi,jki,jvi,j,比如 q i , 1 = W q , 1 q i , q i , 2 = W q , 2 q i , ⋯ , q i , m = W q , m q i q^{i,1}=W^{q,1}q^{i},q^{i,2}=W^{q,2}q^{i},\cdots ,q^{i,m}=W^{q,m}q^{i} qi,1=Wq,1qiqi,2=Wq,2qiqi,m=Wq,mqi,该过程如下图所示(以2个head为例):

2 head

然后分别将对应的 q i , m q^{i,m} qi,m与对应的 k i , m k^{i,m} ki,m做attention,然后经过与上一部分介绍的相同的步骤来获得 b i , m b^{i,m} bi,m,最后将所有的 b i , m b^{i,m} bi,m纵向拼接到一起再与权重 W O W^{O} WO相乘来获得最终的输出 O O O。该过程如下所示:

步骤

步骤

步骤

  1. Self-attention如何考虑位置信息

显然上述Self-attention的输出是不考虑 a i a^{i} ai的顺序的,可以通过将 a i a^{i} ai与一个向量 e i e^{i} ei加起来的方式来将 a i a^{i} ai序列的顺序考虑进来,要注意这里的 e i e^{i} ei是预先设定好的,并不会在参数更新过程中被学习。该过程如下所示:

考虑位置

这里的 e i e^{i} ei的来源可以理解为:先将 x i x^{i} xi与一个代表向量 x i x^{i} xi在序列中位置的独热编码 p i p^{i} pi纵向拼接起来然后乘以权重 W W W获得 a i a^{i} ai,其中 W W W可以分为两部分 ( W I W P ) \begin{pmatrix} W^{I} & W^{P} \end{pmatrix} (WIWP),其中 W P W^{P} WP不是学习得来的,是预先设定的。该过程的形式化描述如下:

W ( x i p i ) = ( W I W P ) ( x i p i ) = W I x i ⏟ a i + W P p i ⏟ e i W\begin{pmatrix} x^{i}\\ p^{i} \end{pmatrix}=\begin{pmatrix} W^{I} & W^{P} \end{pmatrix}\begin{pmatrix} x^{i}\\ p^{i} \end{pmatrix}=\underset{a^{i}}{\underbrace{W^{I}x^{i}}}+\underset{e^{i}}{\underbrace{W^{P}p^{i}}} W(xipi)=(WIWP)(xipi)=ai WIxi+ei WPpi

以下是该过程的直观的描述:

考虑位置

如何获得设定的 W P W^{P} WP有特定的方法,这里只展示一下将 W P W^{P} WP可视化的结果:

权重

三、Transformer

  1. Self-attention在Seq2seq问题中的应用

Self-attention层可以直接替换RNN层来处理Seq2seq问题,比如可以将RNN的AutoEncoder中的Encoder和Decoder全部替换成Self-attention层,使用下图中的网络结构同样可以做一些RNN能做的工作。比如翻译等:

AutoEncoder

  1. Transformer

下图以机器翻译为例展示了Transformer的结构:

Transformer

可以看到Transformer共有Encoder和Decoder两部分组成。

在Encoder部分:
①Input Embedding:指的是词嵌入层,获得词的编码向量;
②Positional Encoding:指的是上文提到的 e i e^{i} ei,用来确定输入向量的位置;
③Multi-Head Attention:这一层指的是如下结构:

Multi-Head Attention

④Add&Norm:该部分处理顺序如下:

Add&Norm

这部分会把输入 a a a加到Multi-Head Attention层的输出 b b b上(一个残差连接 residual connection)然后对相加的结果做Layer normalization,Layer normalization与Batch normalization有所不同,Batch normalization是在一个Batch的每一个维度上做标准化使其 μ = 0 , σ = 1 \mu =0,\sigma =1 μ=0,σ=1,而Layer normalization是对每一笔数据做标准化:

normalization

⑤Feed Forward:前馈神经网络;
⑥总共有N个这样的结构(Nx)。

在Decoder部分:
①Input:以Decoder的前一个时间步(time step)的输出作为Decoder的输入;
②Masked Multi-Head Attention: masking 的作用就是防止在训练的时候使用未来的输出的单词,确保对位置i的预测仅依赖于已知的位置i之前的输出,而不会依赖于位置i之后的输出。 比如训练时, 第一个单词是不能参考第二个单词的生成结果的。 Masking就会把这个信息变成0, 用来保证预测位置 i 的信息只能基于比 i 小的输出;
③Multi-Head Attention:encoder-decoder attention layer ,这一层会attend到之前Encoder部分的输出;

四、Attention可视化

Self-attention的过程中序列中的任意两个词都会做attention,这里可以将对应的权重做可视化:

可视化

在下面这张图中有个有趣的现象,可以看到经过训练后,句子“The animal didn’t cross the street because it was too tired.”中“it”到“animal”的权重很大,而句子“The animal didn’t cross the street because it was too wide.”中“it”到“street”的权重很大。

可视化

下图展示了Multi-Head Attention的不同head的可视化结果,上面的部分可以看出这个head主要关注比较长序列(global)的信息,而下面的head比较关注距自己相近的序列(local)的信息,说明使用多个head时不同的head通过学习会关注不同的信息。

Multi-Head Attention可视化

五、Transformer应用

  1. 多文档摘要

使用Transformer可以做多文档摘要,如下图所示,通过训练一个Summarizer来输入一个文档的集合然后输出这些文档的摘要:

Summarizer

Transformer很好地解决了输入序列长度较大的情况,而向RNN中输入长序列结果通常不会好:

长序列输入

  1. Universal Transformer

将Transfromer在深度上随时间循环使用,即重复使用相同的网络结构:

Universal Transformer

  1. Self-Attention GAN

简单了解一下:

Self-Attention GAN

#参考资料

ref:深度学习中的“注意力机制”
ref:神经机器翻译 之 谷歌 transformer 模型

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值