写在前面:
Hi!还是我!这次的文章源于学习中偶然查到的小点,写出来与大家分享。文章较为简短,书写的内容均是我查阅相关资料后的自我理解(来源均已标出),受限于学业水平,这其中或有些许错误,或有解释不清的地方,还望指出;如有更好的想法,也欢迎你在评论区交流,一同进步。
下面,文章正式开始!
PreNorm 的深度有“水分”,这一点可以从二者的公式中得出
P
r
e
N
o
r
m
:
x
t
+
1
=
x
t
+
F
t
(
N
r
o
m
(
x
t
)
)
P
o
s
t
N
r
o
m
:
x
t
+
1
=
N
r
o
m
(
x
t
+
F
t
(
x
t
)
)
Pre Norm: x_{t+1}=x_{t}+F_{t}(Nrom(x_{t}))\\ Post Nrom: x_{t+1}=Nrom(x_{t}+F_{t}(x_{t}))
PreNorm:xt+1=xt+Ft(Nrom(xt))PostNrom:xt+1=Nrom(xt+Ft(xt))
对 PreNorm 进行迭代:
x
t
+
1
=
x
t
+
F
t
(
N
o
r
m
(
x
t
)
)
=
x
t
−
1
+
F
t
−
1
(
N
o
r
m
(
x
t
−
1
)
)
+
F
t
(
N
o
r
m
(
x
t
)
)
=
⋯
=
x
0
+
F
0
(
N
o
r
m
(
x
0
)
)
+
⋯
+
F
t
−
1
(
N
o
r
m
(
x
t
−
1
)
)
+
F
t
(
N
o
r
m
(
x
t
)
)
\begin{align*} x_{t+1} &= x_{t}+F_{t}(Norm(x_{t}))\\ &= x_{t-1}+F_{t-1}(Norm(x_{t-1}))+Ft(Norm(x_{t}))\\ &= ⋯\\ &= x_{0}+F_{0}(Norm(x_{0}))+⋯+F_{t-1}(Norm(x_{t-1}))+F_{t}(Norm(x_{t})) \end{align*}
xt+1=xt+Ft(Norm(xt))=xt−1+Ft−1(Norm(xt−1))+Ft(Norm(xt))=⋯=x0+F0(Norm(x0))+⋯+Ft−1(Norm(xt−1))+Ft(Norm(xt))
可以看到当 t 较大时,Xt+1 与 Xt 层间的差别较小,使得 Ft+1(Norm(xt+1)) 与 Ft+1(Norm(xt)) 很接近。
因此一个t层的模型与t+1层和,近似等效于一个更宽的t层模型,所以 PreNorm 倾向于退化为一个“浅而宽”的模型,即在 PreNorm 中多层叠加的结果更多是增加宽度而不是深度,而在深度学习网络中深度更加重要,这使得PreNorm 模型的效果变差。
PostNorm 是更突出残差分支的,因此Post Norm中的层数更加“足秤”,一旦训练好之后效果更优(当然 PostNorm 也在承受着层数过多时“梯度消失”所带来的“难收敛、不宜调参”的问题)。
《On Layer Normalization in the Transformer Architecture》的实验曾显示 PreNorm 要好于 PostNorm ,这是否与现有的结论矛盾?其实不然,这篇文章比较的是在完全相同的训练设置下 PreNorm 的效果是否要优于 PostNorm,但是 PostNorm 要达到自己的最优效果,不能用跟 PreNorm 一样的训练配置(比如 PreNorm 可以不加 Warmup 但 Post Norm 通常要加),于是这个实验只能显示出 PreNorm 更容易训练,所以并不矛盾。
资料来源:
Transformer梳理(一):Post-Norm VS Pre-Norm - 知乎
为什么Pre Norm的效果不如Post Norm? - 科学空间|Scientific Spaces