【王树森】Transformer模型(1/2): 剥离RNN,保留Attention(个人向笔记)
Transformer简介
- Transformer 是一个Seq2Seq模型
- Tramsformer 不是RNN
- Transfomer 只有attention和全连接层
- 机器翻译在大型数据集上完爆最好的RNN
Review Attention for RNN
这节课讲的attention相对比于前两节课多了一个
v
i
v_i
vi,之前是用权重直接乘
h
h
h,而在这里是乘以
v
v
v。最后得到向量
c
c
c
Attention without RNN
- Attention一开始设计是用在RNN上的,那么我们应该如何把attention从RNN中剥离出来呢?
- 本节课将使用一个attention和一个self-attenion层搭建一个Transformer
1. 设计一个attention层用于Seq2Seq模型
- Seq2Seq模型有一个encoder和一个decoder
- encoder接受 m m m 个词向量的输入
- decoder接受 t t t 个词向量的输入,来生成下一个单词
- 对于encoder的输入向量,我们用两个个矩阵
W
K
W_K
WK 和
W
V
W_V
WV 将其变换为上面的
k
k
k 向量和
v
v
v 向量:
- 对于decoder的输入向量,我们用一个矩阵
W
Q
W_Q
WQ 将其变换为上面的
q
q
q 向量
-
K
K
K 为
m
m
m 个
k
k
k 向量叠在一起的矩阵,用
q
q
q 和
K
K
K 算出相关性,其中
α
\alpha
α 是
m
m
m 维的向量,元素及总和为1,代表着
m
m
m 个
k
k
k 向量和
q
q
q 的相关性
- 利用得到的相关性和
v
v
v 计算 context vector
c
c
c,其中这一系列运算可以简化为
V
α
V\alpha
Vα
- 对所有的
q
q
q 用类似的方法计算出所有 context vector
c
c
c,这样attenion层的输出就是一个
C
C
C 矩阵
- 对于一个
c
i
c_i
ci 来说,它依赖于decoder的当前输入
x
i
′
x'_i
xi′,还有所有encoder的输入
x
1
,
x
2
.
.
.
,
x
m
x_1,x_2...,x_m
x1,x2...,xm
- 以英译德为例:利用decoder的
x
2
′
x'_2
x2′ 和 所有encoder的输入
x
1
,
x
2
.
.
.
,
x
m
x_1,x_2...,x_m
x1,x2...,xm,我们可以生成
c
2
c_2
c2,然后把
c
2
c_2
c2 丢进一个softmax里面产生概率来预测下一个德语单词。
c
2
c_2
c2 是知道整句英语的,所以可以很好的避免遗忘问题
- 总结Attenion层:接受encoder的输入
X
=
[
x
1
,
x
2
,
.
.
.
,
x
m
]
X=[x_1,x_2,...,x_m]
X=[x1,x2,...,xm] 和decoder的输入
X
′
=
[
x
1
′
,
x
2
′
,
.
.
.
,
x
t
′
]
X'=[x'_1,x'_2,...,x'_t]
X′=[x1′,x2′,...,xt′],输出一个context vector矩阵
C
=
[
c
1
,
c
2
,
.
.
.
,
c
t
]
C=[c_1,c_2,...,c_t]
C=[c1,c2,...,ct],其中参数有三个矩阵:
W
K
,
W
Q
,
W
V
W_K,W_Q,W_V
WK,WQ,WV,它们需要从数据中学习
2. 搭建一个Self-Attention层取代RNN
- self-attention层和attention层完全类似,只是输入不同:其中任意一个词向量的改变都会影响到别的词向量
- 在self-attention里:每一个输入的向量都要被变换为
q
,
k
,
v
q,k,v
q,k,v
- 而权重计算也是类似的:对于
α
1
\alpha_1
α1 来说,它依赖于
q
1
q_1
q1,和其他所有的
k
k
k
- 对于
c
1
c_1
c1 计算来说,既依赖于上面它计算出的权重
α
\alpha
α 也依赖于所有的
v
v
v:
Summary
- attention最初被用于改善RNN的Seq2Seq模型
- 后来发现attention不仅仅局限于Seq2Seq模型,而是可以被用在所有的RNN上
- 之后发现可以直接从RNN中剥离出attention作为一个模型使用