大名鼎鼎的transformer原文,虽然早就读过了,并且看了两遍沐神的带读,但是却没有写博客,今天想起来决定还是要记录一下,毕竟它太重要了,记录一下也能加深印象。
模型
transformer模型总览如下
Encoder
encoder层由六层堆叠而成
每一个encoder里面有两个子层
第一个子层是多头注意力机制
第二个子层是全连接层
都使用残差连接,并且使用LN,输出维度为512
并且在输入之前都加上位置编码:
P
E
(
p
o
s
,
2
i
)
=
s
i
n
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
P
E
(
p
o
s
,
2
i
+
1
)
=
c
o
s
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
\begin{aligned} PE_{(pos,2i)} = sin(pos/10000^{2i/dmodel}) \\ PE_{(pos,2i+1)} = cos(pos/10000^{2i/dmodel}) \end{aligned}
PE(pos,2i)=sin(pos/100002i/dmodel)PE(pos,2i+1)=cos(pos/100002i/dmodel)
连接层是一个Position-wise Feed-Forward Networks,意思是对每个token投影到2048维,再投影回512维:
F
F
N
(
x
)
=
m
a
x
(
0
,
x
W
1
+
b
1
)
W
2
+
b
2
\begin{aligned} FFN(x) = max(0, xW_1 + b_1)W_2 + b_2 \end{aligned}
FFN(x)=max(0,xW1+b1)W2+b2
Decoder
decoder和encoder一样由六层组成,不一样的是,每一层分为3个子层
第一个子层接受上一个子层的输出作为输入,在加上位置编码的同时,加上了mask
第二个子层接受encoder的最后一层输出作为V和K ,第一个子层的输出作为Q
第三个子层是全连接层
都使用残差连接,并且使用LN
input embedding,output embedding,还有softmax层之前的linear层,都使用同一个投影矩阵,并且embedding都会乘以一个
d
m
o
d
e
l
\mathbf{\sqrt{d_{model}}}
dmodel
训练参数:
优化器:Adam
正则化:Dropout
标签平滑:
只要softmax的输出值>=0.1就直接当做正确答案,这会影响模型的困惑度,但是提高了准确性和BLEU分数
实验
评价
到真正自己要写博客才发现,对transformer的理解还有盲点,所以还是得写博客,虽然我不是在写解读,但是记录的过程也勉强算是跟费曼学习法沾边,果然好记性不如烂笔头呀!(更别说我现在记性变差了好多呜呜呜)
Transformer算是开启了MLP,CNN,RNN模型之后的第四范式,可以说是划时代级别的paper,入门的时候一定要把它吃的透透的