博主刚刚入门深度学习、机器学习领域
这是博主对Transformer基本模型的简单学习笔记,借鉴了其他人的文章。
如果有理解上的疏忽遗漏,欢迎大家评论指出
简单了解
Transformer是一个基于Attention机制的encoder-decoder模型,丢弃了循环与卷积结构,而采用Self-Attention机制。
与RNN模型不同,Transformer模型把序列中的所有word进行并行处理,同时使用Self-Attention机制对句子中所有word之间的关系直接进行建模,没有考虑各自的位置。
基本结构
采用encoder-decoder架构
Transformer将多个encoder-decoder堆叠在了一起
简化版
encoder
包含self-attention和Feed Forward Neural Network
self-attention让当前节点不仅仅关注当前的word,还能获得上下文的语义
decoder
包含Self-Attention,Encoder-Decoder Attention和Feed Froward Neural Network
Encoder-Decoder Attention 让当前节点获取当前需要重点关注的内容
Transformer首先对输入的数据进行embedding,然后将得到的数据输入到encoder,self-attention对数据进行处理过后传入Feed Froward,Feed Froward进行并行计算,将得到的输出传入到下一个encoder
![简化版](https://i-blog.csdnimg.cn/blog_migrate/b558c5772a7ae9def26d5dd764d12d43.png)
Encoder
![Encoder](https://i-blog.csdnimg.cn/blog_migrate/03bb89ab8c73b65b148e2d20e99e524e.png)
组成
- Multi-Head Attention
- Residual connection
- Normalisation
- Position-wise Feed-Forward Networks
Self-Attention
Self-Attention利用了Attention机制,计算每个word与其他所有word(包括自身)之间的关联,然后根据对齐模型分布得到加权表示作为该word的新表示,同时考虑了上下文信息。
Self-Attention 可以捕获句子中长距离的相互依赖特征,从而缩短远距离依赖
采用了残差网络的short-cut机制(还未理解)
处理过程
首先,Self-Attention用embedding向量与随机初始化的矩阵相乘,生成三个向量Query,Key,Value。
![Self-Attention处理过程1](https://i-blog.csdnimg.cn/blog_migrate/cfebc9902161056b6570a2a808d62ed7.png)
计算Self-Attention的score,该score决定了对每个位置encoder一个word时,对输入句子其余word的关注程度。由Query与Key进行点乘计算得到。
然后进行score归一化,将点乘结果乘以一个缩放因子 1 d k \frac{1}{\sqrt{d_k}} dk1(该缩放因子可以防止结果过大,使得结果经过softmax计算后落入饱和区间)
再进行softmax计算,得到每个word对当前位置的word的相关性大小。
对Value与softmax的值进行加权,得到Self-Attention在当前节点的值
![Self-Attention处理过程2](https://i-blog.csdnimg.cn/blog_migrate/de26164f9287f241f025e0518eafaf7e.png)
也可以采用矩阵方式,直接计算出Query,Key,Value矩阵,来提高计算速度
![矩阵计算方式](https://i-blog.csdnimg.cn/blog_migrate/f685c26480a131146477c4598ee9fd6f.png)
![矩阵计算方式](https://i-blog.csdnimg.cn/blog_migrate/bd00805229db2f4d2a3d6c2814c63c7e.png)
该Attention又被称为Scaled Dot-Product Attention
![Scaled Dot-Product Attention](https://i-blog.csdnimg.cn/blog_migrate/cf5945d2d1f68ac755e9304da5647276.png)
Multi-Headed Attention
初始化多组Q,K,V矩阵,然后对于生成的多个特征矩阵Z进行压缩(列排列)得到一个大矩阵,然后用一个随机初始化矩阵与该矩阵相乘,得到最终矩阵
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
V
Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V
Attention(Q,K,V)=softmax(dkQKT)V
![Multi-Headed Attention流程](https://i-blog.csdnimg.cn/blog_migrate/e6623167d0a91125a80bf138deb51c9f.png)
最终,生成的Z被传入下一个模块,Position-wise Feed-Forward Network
Add & Norm
计算公式
L
a
y
e
r
N
o
r
m
(
X
+
M
u
l
t
i
H
e
a
d
A
t
t
e
n
t
i
o
n
(
X
)
)
L
a
y
e
r
N
o
r
m
(
X
+
F
e
e
d
F
o
r
w
a
r
d
(
X
)
)
LayerNorm(X+MultiHeadAttention(X))\\ LayerNorm(X+FeedForward(X))
LayerNorm(X+MultiHeadAttention(X))LayerNorm(X+FeedForward(X))
X表示Multi-Head Attention 或者 Feed Forward 的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出
Add表示Residual connection,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在 ResNet 中经常用到。
![add](https://i-blog.csdnimg.cn/blog_migrate/745a45a64d24b0591bad3491743fbc3c.png)
Norm表示Layer Normalisation,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
Position-wise Feed-Forward Network
一个前馈全连接网络,一共两层
第一层的激活函数是 ReLU,
第二层是一个线性激活函数, F F N ( Z ) = m a x ( 0 , Z W 1 + b 1 ) W 2 + b 2 FFN(Z)=max(0,ZW_1+b_1)W_2+b_2 FFN(Z)=max(0,ZW1+b1)W2+b2
Positional Encoding
Transformer在encoder和decoder之间引入一个额外向量Position Encoding,该向量可以决定当前word的位置,从而使Transformer可以解释输入序列中word的顺序。
计算方法
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
)
PE(pos,2i)=sin(\frac{pos}{10000^{\frac{2i}{d_model}}})\\ PE(pos,2i+1)=cos(\frac{pos}{10000^{\frac{2i}{d_model}}})
PE(pos,2i)=sin(10000dmodel2ipos)PE(pos,2i+1)=cos(10000dmodel2ipos)
然后将Position Encoding与embedding相加,作为输入传入下一层
![Position Encoding](https://i-blog.csdnimg.cn/blog_migrate/bd67865aa9988bf3188ba7ab83e3f866.png)
Decoder
![Decoder](https://i-blog.csdnimg.cn/blog_migrate/7f276b25bf066a270d5d007714cacfc2.jpeg)
相比于Encoder,在最下层多了一个Masked Multi-Head Attention
Masked
在解码过程中,结果是一个time_step一个time_step生成的,在当前time_step解码输出只能依赖当前时刻之前的输出,所以使用 Mask 将后面的掩盖
两种方法
- Padding Mask
- Sequence Mask
输出
当Decoder层全部执行完毕后,通过在结尾加一个全连接层和softmax层,将输出的向量映射为我们需要的word
![output](https://i-blog.csdnimg.cn/blog_migrate/65c02720abee8a2fba479872f6667fec.png)