Transformer
简介
网上Transformer的教程非常多,不同博主对Transformer关注的细节不一样。在写这篇文章之前,我看过李宏毅、李沐;b站up主deep_thoughts、蓝斯诺特、范仁义-AI编程;csdn博主Forforth、Queen_sy;知乎博主Jack CC、JFF比JF更强壮等等。
我出这个教程的目的是想:
(1) 加深自己对Transformer的印象;
(2) 把Transformer以更直观的形式展现给初学的读者,包括我自己画的图片和维度变化,帮助读者扫盲和更清晰更直观地理解Transformer;
(3) 拜托大佬提出意见和指正有问题的地方,来让我更正现有认知。
这篇笔记里,几乎都是图片,图里的内容都是我根据一些教程和代码总结而来的,除了论文原图和李宏毅老师视频的图片,其他都是我自己写和画的,画的我心累啊啊啊啊啊啊啊!
暂时还没有代码,以后慢慢附上,同时也会根据大家意见不断完善笔记。
看教程之前建议先看过有关的Transformer的教学视频,比如李宏毅的等等!
1. Transformer整体结构
这张图大家应该刷过很多次了,可能乍一看有点看不懂。。。
Transformer又分为Encoder和Decoder两部分:
然后让我们换一种形式表示上面的图:
其中:
你是不是有点清晰了?还是依旧看得一头雾水?没事!
我们先把Encoder和Decoder放一放,到后面再讲。
我们先把细节部分讲一讲
接着看~
2. Self-Attention
2.1 Scaled Dot-Product Attention
如果你看过李宏毅的视频或网上的教学,你可能会见过这张图
然后就会看到矩阵运算…
如果你不知道为什么上图其实就是矩阵运算,可以看一下我画的图:
上图我们展示了(1)Q K.T和(2)A’ V的运算,其中A’ = softmax(Q K.T / sqrt(d_k))
那么softmax(Q K.T / sqrt(d_k)) V就是self-attention的公式了。
我们来详细看看self-attention的公式及其维度细节。
其实你会发现,self-attention的运算是在Q, K, V的最后两个维度进行的,最后输出结果的最后两个维度是len_q, d_v
在multi-head attention中,调用self-attention之后,再加上.trans.concat) W_0就可以了
2.2 Multi-Head Attention
【对应部分】:
论文中multi-head attention的图里,是每个head分别做self-attention,再concat在一起。
但是在代码中每个head使用的是一个self-attention,用一条公式表达就是这样子:
具体维度变化参考Self-Attention部分的图中的“MHA”红框,最后得出维度是[batch_size, len_q, d_model]
可以看到,malti-head attention中需要学习的参数只有4个:W_Q, W_K, W_V, W_0,和len_q, len_k, len_v无关!
实现流程是这样子的:
3. FeedForward
【对应部分】
论文中的公式,其实就是这个意思。不多讲,看看ReLU的定义
4. Mask
Transformer里的mask有3个,分别在每一个attention中,即:(1) Encoder的Multi-Head Attention的mask;(2) Decoder的Masked Multi-Head Attention的mask;(3) Decoder的Multi-Head Attention的mask。
【对应部分里使用】
在mask中我们发现,而<P> * k_j不会被mask,而q_i * <P>会被mask掉
下面注意看维度!
4.1 (1) Encoder的Multi-Head Attention的mask 和 (3) Decoder的Multi-Head Attention的mask
这里我看见有2种写法
4.1.1 第一种写法
4.1.2 第二种写法
4.2 (2) Decoder的Masked Multi-Head Attention的mask
第1个mask和上面的第一种写法一样,第2个mask是上三角矩阵,
然后两个mask取并集!
5. Encoder和Decoder
5.1 Encoder和Decoder中的运作和维度
让我们重新上图
然让们看看Encoder和Decoder中的运作和维度
再接一张图
5.2 Encoder和Decoder中3个attention里的运作和维度
然后看看Encoder和Decoder中3个attention里的运作和维度
再接一张图
5.3 Train和Test或Predict的流程图
(该部分还存疑,欢迎大佬们来指正!)
结语
可能这篇文章对于没接触过transformer的人看起来会一头雾水,我本身的目的是想把它当成入门教程和初学扫盲的,但是我感觉这篇文章可能并不适合入门。不过我会慢慢改善的!请大家提意见~