Transformer学习

Transformer学习

此帖用于整理回顾自己学transformer的一些问题和知识

极好的博客和资料:

Transformer 模型详解-CSDN博客:原理讲的很清楚

举个例子讲下transformer的输入输出细节及其他 - 知乎 (zhihu.com):讲的是输入输出的细节

Transformer论文逐段精读【论文精读】B站:李沐dalao懂的都懂

transformer的细节到底是怎么样的? - 知乎 (zhihu.com):很详细

一些问题

  • 是不是编码器和解码器中堆叠层的数量一样?
    • 从源码和论文的图上看是这样的,都是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代码完全解读! - 知乎(对应的也是上面的源码)

posted @ 2023-05-03 20:38  tantor  阅读(47)  评论(0编辑  收藏  举报