之前关注过 pre-norm 和 post-norm 的区别,这篇文章中的 deepnorm 进一步发扬了这一点。
pre-norm 其中第二项的方差由于有 norm 是不随层数变化的,于是 x 的方差会在主干上随层数积累。到了深层以后,单层对主干的影响可以视为小量,而不同层的 f 统计上是相似的,于是有 。这样训练出来的深层 ResNet or Transformer,深层部分实际上更像扩展了模型宽度,所以相对好训练,但某种意义上并不是真正的 deep.
post-norm 则保证了主干方差恒定,每层对 x 都可能有较大影响,代价则是模型结构中没有从头到尾的恒等路径,梯度难以控制。通常认为会更难收敛,但训练出来的效果更好。
本文中的 deep-norm 通过控制参数起到了一个折中的效果。
(update: 上述 pre-norm 和 post-norm 的区别是我 2020 年 10 月在某篇论文中看到的,不过现在我也找不到是哪篇了。希望热心群众帮忙找找。)
很有价值的工作!
论文里面并没有很清楚地说明把 Transformer 做深的动机是什么,一开始读这篇论文时我首先想到的是为什么一定要把 Transformer 模型做得这么深 (除去发论文的目的)。
后来结合 MSRA 的一系列工作 (Swin, Swin V2),和这个知乎的回答:如何评价微软亚洲研究院的Swin Transformer V2:在4个数据集上达到SOTA?。个人觉得目前大模型是诸如 MSRA 这类大厂的研究趋势,从 Swin V2 强行扩展就能够看得出,SwinV2 这个工作本身,不是开创性的,也未必会对整个领域产生深远的影响,但这个工作本身对 Swin 是重要的,因为在大规模无监督数据加大模型的故事里,一个新结构,必须要证明自己能有效的训练大模型。
那么在这个无监督+大模型的故事背景下,简单地通过增加 Block 的 channel 来把 Swin Transformer 从 Base 扩展到 G 是可以的,但如果想再大,就要从 Depth 的角度来扩展了。
Swin V2 科技猛兽:Vision Transformer 超详细解读 (原理分析+代码解读) (二十) 已经研究了几种解决训练中的不稳定性问题的方法,如:
但是这些方法确实是辅助 Transformer 在 channel 维度增加的训练方法,对于 Depth 维度的增加,需要探索新的稳定训练的方式,我觉得这也是本文的价值。
原作者也给出了看法:
为此,作者们研究了不稳定优化的原因,并且发现爆炸式模型更新是造成不稳定的罪魁祸首。基于这些观察,研究者在残差连接处引入了一个新的归一化函数 —— DEEPNORM,它从理论上保证了把模型更新过程限制为常数。这一方法简单但高效,只需要改变几行代码即可。最终,该方法提升了 Transformer 模型的稳定性,并实现了将模型深度扩展到了1000多层。
结果显示,本文的方法能够将 Post-LN 性能的优势和 Pre-LN 训练稳定的优势结合起来,且对于目前多个大型 Transformer 模型也是适用的。
参考: