Bert/Transformer 被忽视的细节

2022-09-06 13:45:21 浏览数 (1)

作者:阎覃 链接:https://zhuanlan.zhihu.com/p/559495068

引言

自从 “Attention is All You Need” 提出 Transformer 以来,该模型在 NLP 的各种任务上取代了 RNN / CNN,成为了 NLP 的一种新架构。该论文最初的目的是在翻译任务上提升质量,后来由于出色的表现,被应用于各种语言模型和下游任务。除了 NLP 之外,在视觉领域甚至也取得了很好的效果。

这篇论文写作比较简洁清晰,不过由于篇幅限制,每句话包含的信息量非常大,很多细节容易被遗漏。此外,还有很多设计细节作者也没有给出证明,更多的是凭借经验和直觉。在这篇论文之后,也有很多工作都在尝试继续分析 Transformer。

本文收集整理了 Transformer 中的一些容易被忽视的细节(面试题),主要关注Encoder部分,供读者参考学习。

目录

Embedding

  1. Position Encoding/Embedding 区别?
  2. 为什么 Transformer 的 Embedding 最后要乘?
  3. 为什么 BERT 的三个 Embedding 可以进行相加?

Attention

  1. 为什么 Transformer 需要进行 Multi-head Attention?
  2. Transformer 为什么 Q 和 K 使用不同的权重矩阵生成?
  3. 为什么在进行 softmax 之前需要除以?

LayerNorm

  1. Transformer 为什么用 LayerNorm 不使用 BatchNorm?

Q: Position Encoding/Embedding 区别

A: Position Embedding 是学习式,Position Encoding 是固定式

Transformer 和 RNN/CNN 不同,没有包含序列信息。为了融合序列信息,需要加入位置编码。论文提到了两种编码方法:学习式(learned)和固定式(fixed)。

学习式

学习式是位置编码的一个最朴素的方案,不特意去设计什么,直接将位置编码当作可训练参数,比如最大长度为 512,编码维度为 768,那么就初始化一个 512×768 的矩阵作为位置向量,让它随着训练过程更新。现在的 BERT、GPT 等模型所用的就是这种位置编码,事实上它还可以追溯得更早,比如 2017 年 Facebook 的《Convolutional Sequence to Sequence Learning》就已经用到了它。

对于这种学习式的绝对位置编码,一般的认为它的缺点是不可扩展,即如果预训练最大长度为 512 的话,那么最多就只能处理长度为 512 的句子,再长就处理不了了。

固定式

固定式的位置编码通过三角函数公式计算得出。

为什么使用周期函数可以表示位置编码?

可以参考二进制:

另一个使用它的理由是,他可以让模型轻松学习到相对位置。

因为 ,  ,这表明   可以被 线性表示。

具体地,记为t

因为 k , t 均为常数,并且 

所以可以得出

即, 可以被 线性表示。

这也是为什么 PE 需要同时使用 sin 和 cos,而不是仅使用一个 sin 或者 cos 函数。

为什么公式中有一个魔法值10000?

当 i = 0 时,周期为 ,当 2i = d_model = 512时,周期为 。

下图表示了不同周期,PE 在不同位置上的变化。

10000 时:

100 时:

20 时:

1 时:

使用 10000 很可能就是确保循环周期足够大,以便编码足够长的文本。

对于深度学习的很多技巧,当你实验做得足够多的时候你就会发现,这类问题的唯一正确答案是:因为实验结果显示这样做效果更好!

实验

最后,作者尝试了两种编码方法(学习式和固定式),取得的效果都差不多。

实验结果如下图:

第E行就是学习式的实验结果,PPL(越低越好)和base相同,BLEU(越高越好)低了0.1。可以看出确实差不多。那为什么bert使用学习式呢?可能是因为bert的训练数据更大,能学到的东西更多,实验表现更好。

参考 苏剑林. 《让研究人员绞尽脑汁的Transformer位置编码》: https://kexue.fm/archives/8130 Transformer Architecture: The Positional Encoding: https://kazemnejad.com/blog/transformer_architecture_positional_encoding/

Q: 为什么 Transformer 的 Embedding 最后要乘

A: 为了使 embedding 和 position encoding 的规模一致

我们先来看一下原论文。原论文只是在最后用一句话提了一下,具体什么原因留给读者思考。

再看一下代码,在 forward 时的确是需要乘一个常数。

具体的原因是,如果使用 Xavier 初始化,Embedding 的方差为,当非常大时,矩阵中的每一个值都会减小。通过乘一个可以将方差恢复到1。具体的数学推导也很简单,后面讲 scaled self-attention 的时候会证明。

因为Position Encoding是通过三角函数算出来的,值域为[-1, 1]。所以当加上 Position Encoding 时,需要放大 embedding 的数值,否则规模不一致相加后会丢失信息。

因为 Bert 使用的是学习式的Embedding,所以 Bert 这里就不需要放大。

Q: 为什么 Bert 的三个 Embedding 可以进行相加?

解释1. 因为三个 embedding 相加等价于三个原始 one-hot 的拼接再经过一个全连接网络。和拼接相比,相加可以节约模型参数。

解释2. 从梯度的角度解释:(f g h)’ = f’ g’ h’

参考:为什么 Bert 的三个 Embedding 可以进行相加? https://www.zhihu.com/question/374835153

子问题:为什么Bert不将三个 Embedding 拼接?

可能的原因:可以但没必要。实验显示拼接并没有相加效果好,拼接后维度增加,需要再经过一个线性变换降低维度,增加了更多的参数,得不偿失。

此外,可以说相加是一种特殊的拼接。

参考:bert的三个embedding向量为什么不concat? 知乎 https://www.zhihu.com/question/512549547

Q: 为什么 Transformer 需要进行 Multi-head Attention?

A: 实验证明多头是必要的,8/16个头都可以取得更好的效果,但是超过16个反而效果不好。每个头关注的信息不同,但是头之间的差异随着层数增加而减少。并且不是所有头都有用,有工作尝试剪枝,可以得到更好的表现。

论文中提到模型分为多个头,形成多个子空间,每个头关注不同方面的信息

后续也有一些研究使用了一些可视化的方法分析每层的每个头。

图中显示了,虽然同一层中,有很多头呈现出相同的模式,但是还是存在差异性。

https://arxiv.org/pdf/1906.05714.pdf

图中表示,头之间的差距随着所在层数变大而减少。换句话说,头之间的方差随着所在层数的增大而减小。

https://arxiv.org/pdf/1906.04341.pdf

不同的颜色代表不同的层,同一颜色的分布代表了同一层的头差距。我们可以先看看第一层,也就是深蓝色。在左边出现了一个点,右边和下边都有点出现,分布是比较稀疏的。再看看第六层浅蓝色的点,相对来说分布比较密集了。再看看第十二层,深红色,基本全部集中在下方,分布非常密集。

还有的研究表明有些头其实不是必须的,去掉一些头效果依然有不错的效果(而且效果下降可能是因为参数量下降),这是因为在头足够的情况下,这些头已经能够有关注位置信息、关注语法信息的能力了,再多一些头,无非是一种 enhance 或 noise 而已。

参考:https://www.zhihu.com/question/341222779/answer/814111138

Q: Transformer 为什么 Q 和 K 使用不同的权重矩阵生成?

Q 和 K 使用了不同的 W_q, W_k 来计算,可以理解为是在不同空间上的投影。正因为有了这种不同空间的投影,增加了表达能力,这样计算得到的 attention score 矩阵的泛化能力更高。

如果使用相同的W,attention score 会退化为一个近似对角矩阵。因为在 softmax 之前,对角线上的元素都是通过自身点乘自身得到的,是许多正数的和,所以会非常大,而其他元素有正有负,没有这么大。经过 softmax 之后,对角线上的元素会接近1。

这里做了一个实验,看了一下矩阵自己乘以自己的转置之后是什么样的。可以看到对角线上的元素非常大。

Q: 为什么在进行 softmax 之前需要除以

A: 防止梯度消失

论文中的解释是:向量的点积结果会很大,将 softmax 函数 push 到梯度很小的区域,scaled 会缓解这种现象。

为什么除以,不是其他的数?

针对为什么维度会影响点积的大小,在论文的脚注中其实给出了一点解释:

假设向量 和 的各个分量 , 是互相独立的随机变量,均值是 0,方差是 1,那么 的均值是 0 方差是 。

证明均值为 0:

证明方差为 dk:

这里用到了方差的一个性质

缩放后的方差会回到 1:

这里用到了方差的另外一个性质:

怎么理解将 softmax 函数 push 到梯度很小区域?

softmax 函数倾向于学习为 0 / 1。当输入非常小或者非常大时,输出已经接近 0 / 1,梯度将会非常小。

也可以从另一个角度理解,sigmoid 是 softmax 的一种特例。当输入很大的情况,函数进入饱和区,梯度非常小。

这里直接给出结论,当 时, 对 的梯度为:

展开:

根据前面的讨论,当输入 的元素均较大时,softmax 会把大部分概率分布分配给最大的元素,假设我们的输入数量级很大,那么就将产生一个接近 one-hot 的向量

此时上面的矩阵变为如下形式:

也就是所有的梯度都接近0

softmax 导数数学推导过程:https://eli.thegreenplace.net/2016/the-softmax-function-and-its-derivative/

思考1:softmax 交叉熵会让输入过大/过小的梯度消失吗?

不会。因为交叉熵有一个log。log_softmax的梯度和刚才算出来的不同,就算输入的某一个x过大也不会梯度消失。

思考2:softmax MSE会有什么问题?为什么我们在分类的时候不使用MSE作为损失函数?

刚才的解释就可以说明这个问题。因为MSE中没有log,所以softmax MSE会造成梯度消失。

Q: Transformer 为什么用 LayerNorm 不使用 BatchNorm?

为什么要归一化?

使数据的分布稳定,降低数据的方差。将数据化成均值为0方差为1,防止落入激活函数饱和区,训练过程平稳

为什么不用BatchNorm?

不同归一化方法操作的维度不同,对于输入[N, C, H, W]维度的图片:

  • BatchNorm 在 C 维度上,计算 (N, H, W) 的统计量,拉平各个 C 里面的差异。
  • LayerNorm 在 N 维度上,计算 (C, H, W) 的统计量,拉平各个 N 里面的差异。

注意,这个图只是在CV中的例子,在NLP中,LayerNorm的操作对象是:

  • 对于输入 [N, L, E] 维度的文本(Batch size, seq len, embedding size)
  • 计算 (E) 的统计量,而不是(L, E)

从数据的角度解释:CV 通常用 BatchNorm,NLP 通常用 LayerNorm。图像数据一个 Channel 内的关联性比较大,不同 Channel 的信息需要保持差异性。文本数据一个 Batch 内的不同样本关联性不大。

从Pad的角度解释:不同句子的长度不同,在句子的末尾归一化会受到 pad 的影响,使得统计量不置信。

从模型角度解释:Self Attention 中,内积的大小的上界和 q,k 的 L2Norm 有关。LayerNorm 对 L2Norm 限制更加直接。


0 人点赞