Transformer学习
Transformer学习
此帖用于整理回顾自己学transformer的一些问题和知识
极好的博客和资料:
Transformer 模型详解-CSDN博客:原理讲的很清楚
举个例子讲下transformer的输入输出细节及其他 - 知乎 (zhihu.com):讲的是输入输出的细节
Transformer论文逐段精读【论文精读】B站:李沐dalao懂的都懂
一些问题
- 是不是编码器和解码器中堆叠层的数量一样?
- 从源码和论文的图上看是这样的,都是N=6
- 全局注意力是怎么来的,一次embedding是一个句子还是一篇文章
- 还没解决
一些注意点
-
多头自注意力块(Multi-Head Attention)的输入qkv都是相同的。但是在实际运算时,qkv都要先通过一个全连接层 给每个单头自注意力块生成qkv,过了全连接层之后,每个单头自注意力块中的qkv就不一样了。
-
与CNN的一个对比:一个CNN块假设是看3*3的像素,它是没有办法看全貌信息的,但是transformer可以一次性把整个序列的内容都看到。 但是CNN有一个好处就是它可以是多通道输出的,可以认为一个输出通道对应了一种输出模式、一种特定的特征。Transformer为了有这个效果引入了多头注意力机制。当然还一个原因是单头注意力确实没有什么可以学的参数
-
layerNorm是对某个样本全部特征做norm,BatchNorm是对某个特征做norm
-
mask分两个,一个是解码器中的Sequence Mask,这是为了让训练时过程与使用时一致。另一个是Padding Mask,因为训练时不会每个句子长度都一样,因此需要将较短的句子的长度补到最长句子的长度,而凑长度而补的这些信息自然是不应该参与最后的自注意力计算的,因此要使用mask忽视掉它们。值得注意的Mask是在 \(Q*K^T\)算完之后进行。
-
思考:为什么采用论文中的公式为位置编码?
我的理解:在公式的定义下,时间步p和时间步p+k的位置编码的内积,即 是与p无关,只与k有关的定值。也就是说,任意两个相距k个时间步的位置编码向量的内积都是相同的,这就相当于蕴含了两个时间步之间相对位置关系的信息。此外,每个时间步的位置编码又是唯一的,这两个很好的性质使得上面的公式作为位置编码是有理论保障的。
注意力机制
Attention机制含义是:加权和。重要的赋予较高的权重,不重要的权重低,根据权重对Value进行加权和就是Attention。
有很多种attention机制,本文中作者所选用的是:scaled Dot-Product Attention(缩放的点积自注意力机制,说是scaled是因为除了一个\(\sqrt{d_k}\))。点乘自注意力机制算是最简单的自注意力计算了,这个实现起来比较简单作者选用了这一个。
通过对于某一个q
,要计算这个q
和其他所有的k
之间的关系,得到每个k
与这个q
之间的关系紧密程度,也就是得到一个权重,这个权重决定了计算这个q
的最终结果时每个v
的权重。
源代码参考
比较好的源码实现:The Annotated Transformer (harvard.edu)(这个是哈佛一个团队实现的,逻辑很清晰)
非常好的源码讲解:Transformer代码完全解读! - 知乎(对应的也是上面的源码)