Transformer 李宏毅深度学习
tags: Deep Learning
, Transformer
, , seq2seq
, Attention
笔记内容参考于:https://youtu.be/ugWDIIOHtPA
原文link(我最初的笔记,图较多,建议阅读,要fq ^.^): https://hackmd.io/@abliu/BkXmzDBmr
RNN:
- 是最经典的处理Sequence的模型,单向RNN或双向RNN等等。
- RNN的问题:难以平行处理=>就有人提出用CNN取代RNN
CNN取代RNN:
- CNN filters:每一个三角形代表一个filter输入为seq的一小段,输出一个数值(做内积得到),不同的filter对应seq中不同的部分。
- 每一个CNN只能考虑有限的内容,RNN能考虑一整个句子
- 考虑很长的句子:叠很多层CNN,上层的filter就可以考虑较多资讯,因为上层的filter会把下层的filter的输出当作输入
- 问题:必须叠很多层才有办法做到考虑较长的句子,因此出现了self-attention机制
Self-Attention Layer
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vINtPja7-1576743293341)(https://i.imgur.com/ma6cYQP.png)]
目的
- 想取代RNN原本想做的事情,输入输出同RNN,可以输入sequence输出sequence
- 跟双向RNN有同样能力,可以先偷看过整个sequence,但特别的是 b 1 , b 2 , b 3 , b 4 b^1,b^2,b^3,b^4 b1,b2,b3,b4是同时处理的,不需要一个算完才能算下一个
- 可以完全取代RNN
以前用RNN发表过的paper已经全部被使用self-attention机制洗一轮了…[name=Li]
Attention机制(参考自[4])
核心思想:
- 用三元组 < Q , K , V > <Q,K,V> <Q,K,V>代表注意力机制,表示Query和Key的相似性,再根据相似性赋予Value的取值
公式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HGSCtOci-1576743293345)(https://i.imgur.com/uFNNTPY.png)]
Self-attention 思路(本文)
- input: x 1 , . . . , x 4 x_1,..., x_4 x1,...,x4,是一个sequence
- 每一个输入先通过一个embedding,乘上一个权重矩阵变成 a 1 , . . . , a 4 a_1,...,a_4 a1,...,a4,把 a 1 , . . . , a 4 a_1,...,a_4 a1,...,a4丢进Self-attention layer
- 每一个输入都乘上不同的vector: q , k , v q,k,v q,k,v
-
q
q
q:query(为了去匹配其他人)
- q i = W q a i q_i=W_qa_i qi=Wqai
-
k
k
k:key(为了被匹配)
- k i = W k a i k_i=W_ka_i ki=Wkai
-
v
v
v:value 被抽取出来的资讯
- v i = W v a i v_i=W_va_i vi=Wvai
- 权重 W q W k W v W_q W_k W_v WqWkWv是训练出来的,一开始随机初始化
方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tphroiks-1576743293348)(https://i.imgur.com/8zYZ7ti.png)]
- 拿每个query q去对每个key k做attention(吃两个向量, 输出一个分数),其实就是计算q.k的相似度Similarity。
- Scaled Dot-Product : S ( q 1 , k 1 ) S(q_1,k_1) S(q1,k1)得到 α 1 , 1 \alpha_{1,1} α1,1, S ( q 1 , k 2 ) S(q_1,k_2) S(q1,k2)得到 α 1 , 2 \alpha_{1,2} α1,2…
- α 1 , i = q 1 ・ k i / d \alpha_{1,i}=q_1・k_i /\sqrt{d} α1,i=q1・ki/d
- d代表q和k的dimension,只是论文中作者使用的小技巧
- 再做Softmax normalization(归一化)
- 把得到的 α ^ \hat{\alpha} α^与 v v v相乘得到 b b b,相当于做weighted sum
- 上图中得到的 b 1 b_1 b1就是所求sequence的第一个vector(word或character)
- 每个output vector都用了整个sequence的资讯
===
Self-attention 平行化处理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9sVKC8dP-1576743293359)(https://i.imgur.com/uCc1ru1.png)]
q
i
=
W
q
a
i
q_i=W_qa_i
qi=Wqai
k
i
=
W
k
a
i
k_i=W_ka_i
ki=Wkai
v
i
=
W
v
a
i
v_i=W_va_i
vi=Wvai
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RRyMevxe-1576743293366)(https://i.imgur.com/tNyNAhC.png)]
- 把 a 1 , . . . , a 4 a_1,...,a_4 a1,...,a4当作一个矩阵 I I I,与权重矩阵 W q W_q Wq相乘得到 q 1 , . . . , q 4 q_1,...,q_4 q1,...,q4,当作一个矩阵 Q Q Q。相同的矩阵 K , V K,V K,V也是同样方式,由 q , k q,k q,k和 a a a相乘得来的
-
α
1
,
1
=
k
1
T
.
q
1
\alpha_{1,1}=k_1^T.q_1
α1,1=k1T.q1
α 1 , 2 = k 2 T . q 1 \alpha_{1,2}=k_2^T.q_1 α1,2=k2T.q1
…
所以把 k 1 , . . . k 4 k_1,...k_4 k1,...k4叠一起变成矩阵 K K K,同乘以 q 1 q_1 q1
也把 q 1 , . . . q 4 q_1,...q_4 q1,...q4叠一起变成矩阵 Q Q Q,得到 α \alpha α集合成的矩阵 A A A,就是Attention,做Softmax后变成 A ^ \hat{A} A^ - 每一个time step中,两两vector之间都有attention
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFdCDYaA-1576743293368)(https://i.imgur.com/wx4mdTE.png)]
- 计算V、A hat的weighted sum,就得到b,b集合成的矩阵就是输出的矩阵 O O O
Self-attention Layer做的事情
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n42FwiKx-1576743293371)(https://i.imgur.com/56JpMo7.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ozo7C8LW-1576743293375)(https://i.imgur.com/uZLy5zJ.png)]
转换成矩阵乘法,就可以使用GPU来加速运算了
Multi-head Self-attention
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U5Wg0nBF-1576743293380)(https://i.imgur.com/4c9iFPJ.png)]
以2 heads为例
- 2个head就是把 q , k , v q,k,v q,k,v分裂成两个 q , k , v q,k,v q,k,v,而 q i , 1 q_{i,1} qi,1只会跟 k i , 1 k_{i,1} ki,1相乘得到 α i , 1 \alpha_{i,1} αi,1,最后计算出 b i , 1 b_{i,1} bi,1
- 最后把 b i , 1 , b i , 2 b_{i,1},b_{i,2} bi,1,bi,2concat起来,乘上一个transform,做降维得到最终的 b i b_i bi
每个head所关注的资讯不同,有的只关心local资讯(邻居的资讯),有个只关心global(较长时间)资讯等等。
Positional Encoding
天涯若比邻
在注意力机制中,输入句子的词的顺序如何是没差的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2gxGGYhP-1576743293382)(https://i.imgur.com/LTmJC97.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BGXif3dA-1576743293388)(https://i.imgur.com/7BQOS1a.png)]
- 没有位置资讯=>所以有一个唯一的位置向量 e i e_i ei,不是学出来的而是人设置的。
- 其他方法:使用one-hot encoding表示的 p i p_i pi为 x i x_i xi表示其位置
Seq2seq with Attention
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gn7nlXDd-1576743293392)(https://i.imgur.com/vMWuegd.png)]
原始seq2seq2 model由两个RNN分别组成了Encoder、Decoder,可以应用于机器翻译。
上图中原本Encoder里面是双向RNN,Decoder里面是一个单向RNN,下图把两个都用Self-attention layer取代,可以到达一样的目的而且可以平行运算。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XAip1lvE-1576743293395)(https://i.imgur.com/UPAlIwM.png)]
细看Transformer Model
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xkjPeBbq-1576743293399)(https://i.imgur.com/X0IgIjE.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5rawATMJ-1576743293406)(https://i.imgur.com/Vt3iFUR.png)]
Encoder的部分
- Input通过Input Embedding,考虑位置资讯,加上人为设置的Positional Encoding,进入会重复N次的block
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8SEssStW-1576743293408)(https://i.imgur.com/Qou2NfM.png)]
- Multi-head:进到Encoder里面,他是Multi-head Attention的,也就是q,k,v有多个,在里面做qkv个别乘以a的运算,算出 α \alpha α 最后得到 b b b
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OfXlPBc9-1576743293414)(https://i.imgur.com/AEWD7zx.png)]
- Add & Norm([3]残差连接residual connection):把Multi-head attention的input a a a和output b b b加起来得到 b ′ b' b′,再做[1]Layer Normalization
- 计算完后丢到前向传播,再经过一个Add & Norm
Decoder的部分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qxJY60OQ-1576743293416)(https://i.imgur.com/Jy5uxlE.p ng)]
- Decoder input为前一个time step的output,通过output embedding,考虑位置资讯,加上人为设置的positional encoding,进入会重复n次的block
- Masked Multi-head Attention:做Attention,Masked表示只会attend到已经产生出来的sequenc e,再经过Add & Norm Layer
- 再经过Multi-head Attention Layer,attend到之前Encoder的输出,然后再进到Add & Norm Layer
- 计算完丢到Feed Forward前向传播,再做Linear和Softmax,产生最终输出
Attention Visualization
single-head
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fq0NgFEU-1576743293421)(https://i.imgur.com/Agvn0v5.png)]
文字俩俩之间的关系,线条越粗代表关联越深
Multi-head
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tiNjHnUT-1576743293424)(https://i.imgur.com/43k2M4X.png)]
用不同组的q.k配对出来的结果有所不同,代表不同组的q.k拥有不同资讯(下面local or 上面global)
应用
Summarizer By Google
input为一堆文档,output为一篇文章(summarize)
Universal Transformer
横向(时间上)是Transformer,纵向是RNN
Self-attention GAN
用在影像生成上
参考资料
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Ycg2UFn-1576743293428)(https://i.imgur.com/n2nKumo.png)]
[1]. Layer Norm https://arxiv.org/abs/1607.06450 不需要考虑batch,希望各个不同维度的资料平均=0,变异数=1,一般来说Layer Norm会搭配RNN使用
[2] Batch Norm https://www.youtube.com/watch?v=BZh1ltr5Rkg 对同一batch中不同data做normalization,希望平均数=0,变异数=1
[3] Residual Connection 残差连接:将输出表示成输入和输入的非线性变换的线性叠加