Transformer主要思想是Self-attention,详细介绍了Self-attention过程,简单介绍Transformer框架
pdf 视频
Sequence
用RNN很难并行训练/推理,计算
b
4
b^4
b4时必须先计算
b
1
,
b
2
,
b
3
b^1,b^2,b^3
b1,b2,b3。
考虑用CNN,虽然可以做到并行训练/推理,但是需要叠很多层,才能包含长序列。
而使用Self-Attention,可以取得RNN,并且是可以并行计算。
Self-Attention
使用Self-Attention Layer,
b
i
b^i
bi包含了所有输入信息,同时
b
1
,
b
2
,
b
3
,
b
4
b^1, b^2, b^3, b^4
b1,b2,b3,b4可以同时计算。
Attention is all you need.😏
先对输入的word做Embedding,如何做embedding可以回顾(笔记:ML-LHY-14: Unsupervised Learning - Word Embedding),这样就把输入word(
x
i
x^i
xi)转成一样长的vector(
a
i
a^i
ai)。对
a
i
a^i
ai乘上不同的matrix:
-
乘 W q W^q Wq,得到q:query,去匹配其他key(包括自己的) q i = W q a i q^{i}=W^{q} a^{i} qi=Wqai
-
乘 W k W^k Wk,得到k:key,被其他query匹配(包括自己的) k i = W k a i k^{i}=W^{k} a^{i} ki=Wkai
-
乘 W v W^v Wv,得到v:value,vector( a i a^i ai)所包含的信息 v i = W v a i v^{i}=W^{v} a^{i} vi=Wvai
以上 q , k , v q,k,v q,k,v都是长度一样的向量
attention过程就和以往一样,先match,然后softmax,最后weigh sum
match:
每个输入word(
x
i
x^i
xi)对应在
x
j
x^j
xj上的初始attention值
α
\alpha
α的输出为:
α
j
,
i
=
q
j
⋅
k
i
/
d
\alpha_{j, i}=q^{j} \cdot k^{i} / \sqrt{d}
αj,i=qj⋅ki/d
除以
d
\sqrt{d}
d,是为了防止维度过高内积值太大。
进行softmax:
α
^
j
,
i
=
exp
(
α
j
,
i
)
/
∑
m
=
1
L
exp
(
α
j
,
m
)
\hat{\alpha}_{j, i}=\exp \left(\alpha_{j, i}\right) / \sum_{m=1}^L \exp \left(\alpha_{j, m}\right)
α^j,i=exp(αj,i)/m=1∑Lexp(αj,m)
最后进行weight sum:
输入
x
j
x^j
xj对应的输出:
b
j
=
∑
i
=
1
L
α
^
j
,
i
v
i
b^{j}=\sum_{i=1}^L \hat{\alpha}_{j, i} v^{i}
bj=i=1∑Lα^j,ivi
综合的式子:
b
j
=
∑
i
=
1
L
(
exp
(
α
j
,
i
)
/
∑
m
=
1
L
exp
(
α
j
,
m
)
)
v
i
=
∑
i
=
1
L
[
exp
(
q
j
⋅
k
i
/
d
)
/
∑
m
=
1
L
exp
(
q
j
⋅
k
m
/
d
)
]
v
i
\begin{aligned} b^{j}&=\sum_{i=1}^L (\exp \left(\alpha_{j, i}\right) / \sum_{m=1}^L \exp \left(\alpha_{j, m}\right)) v^{i}\\ &=\sum_{i=1}^L \left[\exp \left(q^{j} \cdot k^{i} / \sqrt{d}\right) / \sum_{m=1}^L \exp \left(q^{j} \cdot k^{m} / \sqrt{d}\right)\right] v^{i} \end{aligned}
bj=i=1∑L(exp(αj,i)/m=1∑Lexp(αj,m))vi=i=1∑L[exp(qj⋅ki/d)/m=1∑Lexp(qj⋅km/d)]vi
矩阵形式:
首先对embedding输出的
a
i
a^i
ai并列,可以得到矩阵
I
I
I
I
=
[
a
1
a
2
.
.
.
]
I=\left[ a^1 a^2 ...\right]
I=[a1a2...]
各种乘不同矩阵得到输出矩阵
Q
,
K
,
V
Q,K,V
Q,K,V:
Q
=
[
q
1
q
2
.
.
.
q
i
]
=
W
q
I
=
W
q
[
a
1
a
2
.
.
.
q
i
]
Q = \left[ q^1 q^2 ... q^i\right] = W^q I = W^q \left[ a^1 a^2 ...q^i\right]\\
Q=[q1q2...qi]=WqI=Wq[a1a2...qi]
K = [ k 1 k 2 . . . k i ] = W k I = W k [ k 1 k 2 . . . k i ] K = \left[ k^1 k^2 ...k^i\right] = W^k I = W^k \left[ k^1 k^2 ...k^i \right]\\ K=[k1k2...ki]=WkI=Wk[k1k2...ki]
V = [ v 1 v 2 . . . v i ] = W v I = W v [ v 1 v 2 . . . v i ] V = \left[ v^1 v^2 ... v^i \right] = W^v I = W^v \left[ v^1 v^2 ... v^i \right]\\ V=[v1v2...vi]=WvI=Wv[v1v2...vi]
q i = W q a i q^{i}=W^{q} a^{i} qi=Wqai
k i = W k a i k^{i}=W^{k} a^{i} ki=Wkai
v i = W v a i v^{i}=W^{v} a^{i} vi=Wvai
match:
每个输入word(
x
i
x^i
xi)对应在
x
j
x^j
xj上的初始attention值
α
\alpha
α的输出为:
[
α
1
,
1
α
2
,
1
.
.
.
α
j
,
1
α
1
,
2
α
2
,
2
.
.
.
α
j
,
2
.
.
.
.
.
.
.
.
.
.
.
.
α
1
,
i
α
2
,
i
.
.
.
α
j
,
i
]
=
[
k
1
k
2
.
.
.
k
i
]
[
q
1
q
2
.
.
.
q
j
]
A
=
K
T
Q
\begin{bmatrix} \alpha_{1,1} & \alpha_{2,1} & ... & \alpha_{j,1}\\ \alpha_{1,2} & \alpha_{2,2} & ... & \alpha_{j,2}\\ ... & ... & ... & ...\\ \alpha_{1,i} & \alpha_{2,i} & ... & \alpha_{j,i} \end{bmatrix} = \begin{bmatrix} k_{1} \\ k_{2} \\ ...\\ k_{i} \end{bmatrix}\left[ q^1q^2...q^j \right]\\ A=K^TQ
⎣⎢⎢⎡α1,1α1,2...α1,iα2,1α2,2...α2,i............αj,1αj,2...αj,i⎦⎥⎥⎤=⎣⎢⎢⎡k1k2...ki⎦⎥⎥⎤[q1q2...qj]A=KTQ
α j , i = q j ⋅ k i / d \alpha_{j, i}=q^{j} \cdot k^{i} / \sqrt{d} αj,i=qj⋅ki/d
进行softmax:
[ α ^ 1 , 1 α ^ 2 , 1 . . . α ^ j , 1 α ^ 1 , 2 α ^ 2 , 2 . . . α ^ j , 2 . . . . . . . . . . . . α ^ 1 , i α ^ 2 , i . . . α ^ j , i ] ⇐ [ α 1 , 1 α 2 , 1 . . . α j , 1 α 1 , 2 α 2 , 2 . . . α j , 2 . . . . . . . . . . . . α ^ 1 , i α 2 , i . . . α j , i ] A ^ ⇐ A \begin{bmatrix} \hat{\alpha}_{1,1} & \hat{\alpha}_{2,1} & ... & \hat{\alpha}_{j,1} \\ \hat{\alpha}_{1,2} & \hat{\alpha}_{2,2} & ... & \hat{\alpha}_{j,2} \\ ... &... & ... &... \\ \hat{\alpha}_{1,i} & \hat{\alpha}_{2,i} & ... & \hat{\alpha}_{j,i} \end{bmatrix} \Leftarrow \begin{bmatrix} \alpha_{1,1} & \alpha_{2,1} & ... & \alpha_{j,1}\\ \alpha_{1,2} & \alpha_{2,2} & ... & \alpha_{j,2}\\ ... & ... & ... & ...\\ \hat{\alpha}_{1,i}& \alpha_{2,i} & ... & \alpha_{j,i} \end{bmatrix} \\ \hat{A} \Leftarrow A ⎣⎢⎢⎡α^1,1α^1,2...α^1,iα^2,1α^2,2...α^2,i............α^j,1α^j,2...α^j,i⎦⎥⎥⎤⇐⎣⎢⎢⎡α1,1α1,2...α^1,iα2,1α2,2...α2,i............αj,1αj,2...αj,i⎦⎥⎥⎤A^⇐A
α ^ j , i = exp ( α j , i ) / ∑ m = 1 L exp ( α j , m ) \hat{\alpha}_{j, i}=\exp \left(\alpha_{j, i}\right) / \sum_{m=1}^L \exp \left(\alpha_{j, m}\right) α^j,i=exp(αj,i)/m=1∑Lexp(αj,m)
最后进行weight sum:
[
b
1
b
2
.
.
.
b
j
]
=
[
v
1
v
2
.
.
.
v
i
]
[
α
^
1
,
1
α
^
2
,
1
.
.
.
α
^
j
,
1
α
^
1
,
2
α
^
2
,
2
.
.
.
α
^
j
,
2
.
.
.
.
.
.
.
.
.
.
.
.
α
^
1
,
i
α
^
2
,
i
.
.
.
α
^
j
,
i
]
O
=
V
A
^
[b^1 b^2 ... b^j] =[v^1 v^2 ... v^i] \begin{bmatrix} \hat{\alpha}_{1,1} & \hat{\alpha}_{2,1} & ... & \hat{\alpha}_{j,1} \\ \hat{\alpha}_{1,2} & \hat{\alpha}_{2,2} & ... & \hat{\alpha}_{j,2} \\ ... &... & ... &... \\ \hat{\alpha}_{1,i} & \hat{\alpha}_{2,i} & ... & \hat{\alpha}_{j,i} \end{bmatrix} \\ O=V\hat{A}
[b1b2...bj]=[v1v2...vi]⎣⎢⎢⎡α^1,1α^1,2...α^1,iα^2,1α^2,2...α^2,i............α^j,1α^j,2...α^j,i⎦⎥⎥⎤O=VA^
b j = ∑ i = 1 L α ^ j , i v i b^{j}=\sum_{i=1}^L \hat{\alpha}_{j, i} v^{i} bj=i=1∑Lα^j,ivi
最后综合就是:
一堆矩阵乘法,用 GPU 可以加速
Multi-head Self-attention
可以进行分裂,不同的head产生的attention在不一样的地方。
Positional Encoding
可以发现在self-attention中不存在位置信息,而对于sequence来说,位置信息很重要。
e
i
e^i
ei求法:
先对位置进行编码(one-hot):
p
i
=
[
.
.
.
0
1
0
.
.
.
]
T
p^{i}=[...\quad0\quad1\quad0\quad... ]^T
pi=[...010...]T
和
x
i
x^i
xi拼接,然后乘W,W可以分解为
W
I
W^{I}
WI和
W
P
W^{P}
WP,而
e
i
=
W
P
p
i
e^i = W^{P} p^{i}
ei=WPpi
Seq2seq with Attention
可视化过程:
https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html
Transformer
Batch normalization:在指定batch内,对同一维的数据做normalization,希望均值和方差为0
Layer normalization:不需要指定batch,对不同维数据做normalization,希望均值和方差为0
Masked Multi-Head Attention:这边attend是在decoder的输出上,所以只能对已生成的sequence做attention
Universal Transformer
https://ai.googleblog.com/2018/08/moving-beyond-translation-with.html
基于attention,但是在深度轴上是一个RNN
以上参考李宏毅老师视频和ppt,仅作为学习笔记交流使用