极市导读
但是虽然 Transformer 模型的参数从数百万增加至数十亿甚至数万亿,大规模模型也在一系列任务上都取得了 SOTA 的性能,但是视觉 Transformer 模型的深度却受到了训练不稳定的限制,使得 Transformer 模型不容易像CNN 那样做Deep。本文所提出的 DeepNet 模型成功地将 Transformer 的深度扩展到了1000层解决了该问题。>>加入极市CV技术交流群,走在计算机视觉的最前沿
43 解决 Transformer 训练难题,1000层 Transformer 也能稳定训练
(来自微软亚洲研究院)
43.1 DEEPNET 原理分析
Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer。Transformer 模型使用了 Self-Attention 机制,不采用 RNN 的顺序结构,使得模型可以并行化训练,而且能够拥有全局信息。
视觉 Transformer 模型在计算机视觉领域取得了巨大的成功,甚至大有取代 CNN 之势。但是虽然 Transformer 模型的参数从数百万增加至数十亿甚至数万亿,大规模模型也在一系列任务上都取得了 SOTA 的性能,并在小样本和零样本学习设置下展现出了令人瞩目的能力,但是视觉 Transformer 模型的深度 (depth) 却受到了训练不稳定的限制,使得 Transformer 模型不容易像 CNN 那样做 Deep。
本文就是为了解决这个问题,所提出的 DeepNet 模型成功地将 Transformer 的深度扩展到了1000层。
论文名称:DeepNet: Scaling Transformers to 1,000 Layers
论文地址:
https://arxiv.org/pdf/2203.00555.pdf
在 Toan Q. Nguyen and Julian Salazar 的这篇文章里面:
Transformers without tears: Improving the normalization of self-attention
Toan Q. Nguyen and Julian Salazar 发现把每个 Block 里面的 Layer Normalization 层从 Self-Attention 层的后面 (Post-LN) 换到 Self-Attention 层之前 (Pre-LN),能够提升 Transformer 训练的稳定性。但是后人的研究又发现 Pre-LN 层的梯度存在这样的现象,即:浅层的梯度高于深层,这个现象会使 Pre-LN 的性能不如 Post-LN。之后,又有几个工作试图将 Transformer 模型做得更深,如下:
从初始化角度:Improving deep transformer with depth-scaled initialization and merged attention (EMNLP-IJCNLP 2019)
从初始化角度:Improving transformer optimization through better initialization (ICML 2020)
从结构的角度:Learning deep transformer models for machine translation (ACL 2019)
从结构的角度:Understanding the difficulty of training transformers (EMNLP 2020)
从结构的角度:Rezero is all you need: Fast convergence at large depth
从结构的角度:Normformer: Improved transformer pretraining with extra normalization
这些工作能够把 Transformer 训练到数百层的深度,但是训练到1000层,是前所未有的。
本文作者的目标是提升 Transformer 模型的训练稳定性,并将模型深度进行数量级的扩展。
43.1.1 Motivation
论文里面并没有很清楚地说明把 Transformer 做深的动机是什么,一开始读这篇论文时我首先想到的是为什么一定要把 Transformer 模型做得这么深 (除去发论文的目的)。
后来结合 MSRA 的一系列工作 (Swin, Swin V2),和这个知乎的回答:如何评价微软亚洲研究院的Swin Transformer V2:在4个数据集上达到SOTA?:https://www.zhihu.com/question/500004483/answer/2236028403。个人觉得目前大模型是诸如 MSRA 这类大厂的研究趋势,从 Swin V2 强行扩展就能够看得出,SwinV2 这个工作本身,不是开创性的,也未必会对整个领域产生深远的影响,但这个工作本身对 Swin 是重要的,因为在大规模无监督数据加大模型的故事里,一个新结构,必须要证明自己能有效的训练大模型。
那么在这个无监督+大模型的故事背景下,简单地通过增加 Block 的 channel 来把 Swin Transformer 从 Base 扩展到 G 是可以的,但如果想再大,就要从 Depth 的角度来扩展了。
Swin V2 搞懂 Vision Transformer 原理和代码,看这篇技术综述就够了(二十) 已经研究了几种解决训练中的不稳定性问题的方法,如:
但是还是那句话,这些方法只是辅助 Transformer 在 channel 维度增加的训练方法,对于 Depth 维度的增加,需要探索新的稳定训练的方式,这也是本文的价值所在。
为此,作者们研究了不稳定优化的原因,并且发现爆炸式模型更新 (exploding model update) 是造成不稳定的罪魁祸首。基于这些观察,研究者在残差连接处引入了一个新的归一化函数 —— DEEPNORM,它从理论上保证了把模型更新过程限制为常数。这一方法简单但高效,只需要改变几行代码即可。最终,该方法提升了 Transformer 模型的稳定性,并实现了将模型深度扩展到了1000多层。
结果显示,本文的方法能够将 Post-LN 性能的优势和 Pre-LN 训练稳定的优势结合起来,且对于目前多个大型 Transformer 模型也是适用的。
43.1.2 太长不看版
如果没时间仔细阅读,只需要看本小节这一点点就行。
DeepNorm 伪代码:
def deepnorm(x):
return LayerNorm(x∗α + f(x))
def deepnorm_init(w):
if w is ['ffn', 'v_proj', 'out_proj']:
nn.init.xavier_normal_(w, gain=β)
elif w is ['q_proj', 'k_proj']:
nn.init.xavier_normal_(w, gain=1)
1 使用 DeepNorm 时,拿它来替换 Post-LN。
2 DeepNorm 其实就是 LN,只是在执行层归一化之前 up-scale 了残差连接。x∗α + f(x) 里面的 f(x) 代表 Self-Attention 等等的 Token-mixer,x 代表 Token-mixer 的输出,α 是常数。
3 torch.nn.init.xavier_normal_(tensor, gain=1) 是 xavier 高斯初始化,参数由0均值,标准差为 gain × sqrt(2 / (fan_in + fan_out)) 的正态分布产生,其中 fan_in 和 fan_out 是分别权值张量的输入和输出元素数目。这种初始化同样是为了保证输入输出的方差不变。
4 DeepNorm 还在初始化期间 down-scale 了参数。值得注意的是,对于 ffn,v_proj,out_proj 和 q_proj,k_proj 的初始化,是不一样的。5 不同架构的 α 和 β 值不一样,如下图所示。
43.1.3 深度 Transformer 模型训练的不稳定问题
根据前人的研究,更好的初始化方法可以让 Transformer 的训练更稳定。因此,研究者分析了有无适当初始化的 Post-LN 的训练过程。通过更好的初始化,在执行 Xavier 初始化后对第 层的权重进行 downscale,下降的比例是: 。比如,第 层的 FFN 的权重初始化为:
式中, 是输入和输出维度的均值。
研究者将此模型命名为 Post-LN-init。注意到 这个值是随着层数的增加而越来越小的,也就意味着对于浅层而言,权重进行 downscale 的比例较大,对于深层而言,权重进行 downscale 的比例较小。此外,Post-LN-init 与 Post-LN 具有相同的架构,从而消除了架构的影响。
作者接下来在 IWSLT-14 De-En 机器翻译数据集上面训练了 18L-18L Post-LN 和 18L-18L Post-LN-init。如下图1所示是它们的梯度和 validation loss 的曲线。如图1(c) 所示,Post-LN-init 的 validation loss 是收敛的,但是 Post-LN 却没有。如图1(a) 所示,Post-LN-init 在最后几层中具有更大的梯度范数,尽管其权重已按比例 缩小。这说明梯度爆炸不是导致 Transformer 训练不稳定的原因。如图1(b) 所示,作者可视化最后一个解码器层的梯度范数,模型深度从 6L-6L 到 24L-24L,发现 Post-LN-init 的梯度范数大于 Post-LN 的梯度范数,但是初始化时 Post-LN-init 的范数是更小的。
接下来作者通过一系列实验,从实验的角度验证 Post-LN 的不稳定性来自一系列的问题。
首先可视化在训练的早期阶段,模型更新的范数 ,如下图2(a)所示:
式中, 和 代表第 次更新的输入和模型参数。Post-LN 在训练一开始就有爆炸式的更新,然后很快就几乎没有更新了。这表明该模型已陷入虚假的局部最优。warm-up,或者更好的初始化都有助于缓解这个问题,使模型能够更加顺利地更新。图2(b)和(c)分别是从 FFN 层和 Attention 层到 LN 层的输入,作者发现当更新爆炸时,LN 的输入会变大。对于这种现象,之前已有理论分析:
On layer normalization in the transformer architecture (ICML 2020)
通过 LN 的梯度大小与其输入的大小成反比:
当不使用 warm-up 以及合适的初始化的情况下,图2(b)和(c) 表明 明显大于 ,这也就解释了 Post-LN 训练中出现的梯度消失问题,如图2(d)所示。
本节的结论是:
大的 Transformer 模型训练的不稳定的原因是训练的起始阶段模型参数更新非常快,它使模型陷入一个坏的局部最优,这反过来增加了每个 LN 的输入。随着训练的继续进行,通过 LN 的梯度变得越来越小,从而导致严重的梯度消失。消失的梯度使得难以脱离局部最优,并且进一步破坏了优化的稳定性。所以最关键的问题是不要让起始阶段模型参数更新得太快。相反,Post-LN-init 的更新相对较少,LN 的输入是稳定的。这减轻了梯度消失的问题,使优化更加稳定。
43.1.4 DeepNet 的架构
作者提出了一种非常深的 Transformer 模型,设计的初衷就是不要让起始阶段模型参数更新得太快。
作者首先估计了 DeepNet 模型更新的预期幅度,然后作者提供理论分析来证明它的更新可以被一个常数所限制。
DeepNet 的架构基于 Transformer,把 Post-LN 替换成 DeepNorm。DeepNorm 的表达式可以写成:
式中, 是常数, 是第 层 Transformer 的输出 (Attention 层或者 FFN)。DeepNet 还将残差内部的权重 扩展了 倍。
43.1.5 DeepNet 模型更新预期大小的估计
在下面这一小节里面,作者提供了对 DeepNet 模型更新预期大小 (Expected Magnitude) 的估计。不是一般性,研究一个 head 为1的 Attention 层。
Attention 模块的表达式可以写成:
式中, 依次代表了 query,key 和 value。 代表相应的映射矩阵。
接下来作者通过3个定理展示了 Attention 模块的一些性质:
[引理 4.1] 给定 ,其中 。对所有的 都有 ,则满足下式:
其中, 代表左右两侧的幅值是一样的 (Equal bound of magnitude)。
证明: 把 softmax 展开:
这样,上式就变成了:
因为 ,所以有 。所以上式就变成了:
就等价于5式。得证。
引理 4.1说明,attention 层的输出幅度其实只取决于 Value 和输出的映射矩阵,即:
作者这里只考虑 hidden dimension 的情况,所以此时 就变成了标量 ,则意味着 。
同样的道理有: ,这里 分别代表 FFN 网络的参数。
定义模型某一层的输出的变化量为 ,基于以上分析,对于一个 层的 DeepNet 而言,对于 范围的估计有如下定理:
[定理 4.2] 给定一个 层的 DeepNet: ,其中 和 分别代表第 层的 Self-attention 和 FFN 的参数,且每层都使用 DeepNorm 去替换 LN,即: ,则 满足:
**证明:**作者的目的是研究模型更新的幅度,作出以下假设以简化推导:
考虑到引理4.1,如果 是参数为 的 FFN 网络,则 。如果 是参数为 的 Self-attention 网络,则 。如果对各个投影矩阵使用 Xavier 初始化,则输出可以保持输入方差,这相当于 。根据假设2,有:
根据上式, 和 的范围界限是:
最后一层的输出的变化量 满足:
对上式使用泰勒展开,有:
上式表明了 与 的关系,因此有:
公众号后台回复“数据集”获取30+深度学习数据集下载~
# 极市平台签约作者#
科技猛兽
知乎:科技猛兽
清华大学自动化系19级硕士
研究领域:AI边缘计算 (Efficient AI with Tiny Resource):专注模型压缩,搜索,量化,加速,加法网络,以及它们与其他任务的结合,更好地服务于端侧设备。
作品精选