参数初始化
一般来说,正态分布的采样结果更多样化一些,但它理论上是无界的,如果采样到绝对值过大的结果可能不利于优化;相反均匀分布是有界的,但采样结果通常更单一。于是就出现了结合两者优点的“截尾正态分布”。截尾正态分布既指定均值 μ \mu μ和方差 σ 2 \sigma^2 σ2,也需要指定区间 [ a , b ] [a,b] [a,b],它从 N ( μ , σ 2 ) \mathcal{N}(\mu,\sigma^2) N(μ,σ2)中采样,如果采样结果在 [ a , b ] [a,b] [a,b]中,那么保留该结果,否则重复采样直到采样结果落到 [ a , b ] [a,b] [a,b]中
关于标准化
普通的Batch Normalization
y
i
,
j
,
k
=
x
i
,
j
,
k
−
μ
i
,
j
σ
i
,
j
2
+
ϵ
×
γ
k
+
β
k
,
μ
i
,
j
=
1
d
∑
k
=
1
d
x
i
,
j
,
k
,
σ
i
,
j
2
=
1
d
∑
k
=
1
d
(
x
i
,
j
,
k
−
μ
i
,
j
)
2
y_{i, j, k}=\frac{x_{i, j, k}-\mu_{i, j}}{\sqrt{\sigma_{i, j}^{2}+\epsilon}} \times \gamma_{k}+\beta_{k}, \quad \mu_{i, j}=\frac{1}{d} \sum_{k=1}^{d} x_{i, j, k}, \quad \sigma_{i, j}^{2}=\frac{1}{d} \sum_{k=1}^{d}\left(x_{i, j, k}-\mu_{i, j}\right)^{2}
yi,j,k=σi,j2+ϵxi,j,k−μi,j×γk+βk,μi,j=d1k=1∑dxi,j,k,σi,j2=d1k=1∑d(xi,j,k−μi,j)2
但在有些情况下,center化反而效果不好,所以也有新的Normalization的提出,例如RMS Norm
y
i
,
j
,
k
=
x
i
,
j
,
k
σ
i
,
j
2
+
ϵ
×
γ
k
,
σ
i
,
j
2
=
1
d
∑
k
=
1
d
x
i
,
j
,
k
2
y_{i, j, k}=\frac{x_{i, j, k}}{\sqrt{\sigma_{i, j}^{2}+\epsilon}} \times \gamma_{k}, \quad \sigma_{i, j}^{2}=\frac{1}{d} \sum_{k=1}^{d} x_{i, j, k}^{2}
yi,j,k=σi,j2+ϵxi,j,k×γk,σi,j2=d1k=1∑dxi,j,k2
在T5中,使用的就是这种Norm。center操作,类似于全连接层的bias项,储存到的是关于数据的一种先验分布信息,而把这种先验分布信息直接储存在模型中,反而可能会导致模型的迁移能力下降。
为什么Attention中除以 d \sqrt d d这么重要?
对于两个 d d d维向量 q , k q,k q,k,假设它们都采样自“均值为0、方差为1”的分布,那么它们的内积的二阶矩是 d d d,由于均值也是0,那么方差也是 d d d。Attention是内积后softmax,主要设计的运算是 e q ⋅ k e^{q·k} eq⋅k,我们可以大致认为内积之后、softmax之前的数值在 − 3 d −3d −3d到 3 d 3d 3d这个范围内,由于 d d d通常都至少是64,所以 e d e^d ed非常大而 e − d e^{-d} e−d非常小,因此经过softmax之后,Attention的分布非常接近一个one hot分布了,这带来严重的梯度消失问题,导致训练效果差。
相应地,解决方法就有两个,一是在内积之后除以 d \sqrt d d,使 q ⋅ k q·k q⋅k的方差变为1,对应 e 1 e^1 e1, e − 1 e^{-1} e−1都不至于过大过小,这样softmax之后也不至于变成one hot而梯度消失了,这也是常规的Transformer如BERT里边的Self Attention的做法;另外就是不除以 d \sqrt d d,但是初始化 q ⋅ k q·k q⋅k的全连接层的时候,其初始化方差要多除以一个 d d d,这同样能使得使 q ⋅ k q·k q⋅k的初始方差变为1,T5采用了这样的做法。
module.q.weight.data.normal_(mean=0.0, std=factor * ((d_model * key_value_proj_dim) ** -0.5))
module.k.weight.data.normal_(mean=0.0, std=factor * (d_model ** -0.5))
module.v.weight.data.normal_(mean=0.0, std=factor * (d_model ** -0.5))
TM中的残差模块
如果
x
x
x的方差为
σ
1
2
\sigma^2_1
σ12而
F
(
x
)
F(x)
F(x)的方差为
σ
2
2
\sigma^2_2
σ22,并且假设两者相互独立,那么
x
+
F
(
x
)
x+F(x)
x+F(x)的方差为
σ
1
2
+
σ
2
2
\sigma^2_1+\sigma^2_2
σ12+σ22。也就是说,残差会进一步放大方差,所以我们也要想相应的策略缩小其方差。所以TM中接了Norm
x
t
+
1
=
Norm
(
x
t
+
F
t
(
x
t
)
)
x_{t+1}=\operatorname{Norm}\left(x_{t}+F_{t}\left(x_{t}\right)\right)
xt+1=Norm(xt+Ft(xt))
这个也称为Post Norm,假设初始状态下
x
,
F
(
x
)
x,F(x)
x,F(x)的方差均为1,那么
x
+
F
(
x
)
x+F(x)
x+F(x)的方差就是2,而Normalization操作负责将方差重新降为1,这就说明初始阶段Post Norm相当于
x
t
+
1
=
x
t
+
F
t
(
x
t
)
2
x_{t+1}=\frac{x_{t}+F_{t}\left(x_{t}\right)}{\sqrt{2}}
xt+1=2xt+Ft(xt)
当网络很深时就有
x
l
=
x
l
−
1
2
+
F
l
−
1
(
x
l
−
1
)
2
=
x
l
−
2
2
+
F
l
−
2
(
x
l
−
2
)
2
+
F
l
−
1
(
x
l
−
1
)
2
=
⋯
=
x
0
2
l
/
2
+
F
0
(
x
0
)
2
l
/
2
+
F
1
(
x
1
)
2
(
l
−
1
)
/
2
+
F
2
(
x
2
)
2
(
l
−
2
)
/
2
+
⋯
+
F
l
−
1
(
x
l
−
1
)
2
1
/
2
\begin{aligned} x_{l} &=\frac{x_{l-1}}{\sqrt{2}}+\frac{F_{l-1}\left(x_{l-1}\right)}{\sqrt{2}} \\ &=\frac{x_{l-2}}{2}+\frac{F_{l-2}\left(x_{l-2}\right)}{2}+\frac{F_{l-1}\left(x_{l-1}\right)}{\sqrt{2}} \\ &=\cdots \\ &=\frac{x_{0}}{2^{l / 2}}+\frac{F_{0}\left(x_{0}\right)}{2^{l / 2}}+\frac{F_{1}\left(x_{1}\right)}{2^{(l-1) / 2}}+\frac{F_{2}\left(x_{2}\right)}{2^{(l-2) / 2}}+\cdots+\frac{F_{l-1}\left(x_{l-1}\right)}{2^{1 / 2}} \end{aligned}
xl=2xl−1+2Fl−1(xl−1)=2xl−2+2Fl−2(xl−2)+2Fl−1(xl−1)=⋯=2l/2x0+2l/2F0(x0)+2(l−1)/2F1(x1)+2(l−2)/2F2(x2)+⋯+21/2Fl−1(xl−1)
本来残差的意思是给前面的层搞一条“绿色通道”,让梯度可以更直接地回传,但是在Post Norm中,这条“绿色通道”被严重削弱了,越靠近前面的通道反而权重越小,残差“名存实亡”。
一个针对性的改进称为Pre Norm,它的思想是“要用的时候才去标准化”,其形式为
x
t
+
1
=
x
t
+
F
t
(
Norm
(
x
t
)
)
x_{t+1}=x_{t}+F_{t}\left(\operatorname{Norm}\left(x_{t}\right)\right)
xt+1=xt+Ft(Norm(xt))
类似地,迭代展开之后我们可以认为初始阶段有
x
l
=
x
0
+
F
0
(
x
0
)
+
F
1
(
x
1
/
2
)
+
F
2
(
x
2
/
3
)
+
⋯
+
F
l
−
1
(
x
l
−
1
/
l
)
x_{l}=x_{0}+F_{0}\left(x_{0}\right)+F_{1}\left(x_{1} / \sqrt{2}\right)+F_{2}\left(x_{2} / \sqrt{3}\right)+\cdots+F_{l-1}\left(x_{l-1} / \sqrt{l}\right)
xl=x0+F0(x0)+F1(x1/2)+F2(x2/3)+⋯+Fl−1(xl−1/l)
这样一来,起码每一条残差通道都是平权的,残差的作用会比Post Norm更加明显,所以它也更好优化。当然,这样最后的
x
l
x_l
xl方差将会很大,所以在接预测层之前
x
l
x_l
xl也还要加个Normalization。
除此之外,还有更优的方案,成为SkipInit、ReZero,引入一个初始化为0的标量参数
α
t
\alpha_t
αt,然后再逐渐更新
α
t
\alpha_t
αt
x
t
+
1
=
x
t
+
α
t
F
t
(
x
t
)
x_{t+1}=x_{t}+\alpha_{t} F_{t}\left(x_{t}\right)
xt+1=xt+αtFt(xt)
线搜索和信赖域
线搜索方法的策略是,先确定优化变量的更新方向
p
K
p_K
pK ,然后在该方向上确定一个最佳的步长
α
\alpha
α,使得目标函数沿着该方向前进
α
\alpha
α距离后下降得最多,相当于求解下式
信赖域方法的策略则有所不同,先用另一个简单的模型
m
k
m_k
mk近似目标函数,然后确定一个信赖域半径
Δ
k
\Delta_k
Δk,在该半径限制的范围内寻找一个使得模型下降最多的更新量
p
p
p,相当于求解下式
也就是说,线搜索方法是先确定方向,再确定步长,而信赖域方法是先确定最大步长,再确定方向和实际步长。
Lipschitz
Lipschitz条件,即利普希茨连续条件(Lipschitz continuity)。其定义为:对于函数f(x),若其任意定义域中的 x 1 , x 2 x1,x2 x1,x2,都存在 L > 0 L>0 L>0,使得 ∣ f ( x 1 ) − f ( x 2 ) ∣ ≤ L ∣ x 1 − x 2 ∣ |f(x1)-f(x2)|≤L|x1-x2| ∣f(x1)−f(x2)∣≤L∣x1−x2∣。 大白话就是:存在一个实数 L L L,使得对于函数 f ( x ) f(x) f(x)上的每对点,连接它们的线的斜率的绝对值不大于这个实数 L L L。最小的 L L L称为该函数的Lipschitz常数。
对比学习的本质
对比学习系统应该具备两个属性:Alignment和Uniformity(参考上图)。所谓“Alignment”,指的是相似的例子,也就是正例,映射到单位超球面后,应该有接近的特征,也即是说,在超球面上距离比较近;所谓“Uniformity”,指的是系统应该倾向在特征里保留尽可能多的信息,这等价于使得映射到单位超球面的特征,尽可能均匀地分布在球面上,分布得越均匀,意味着保留的信息越充分。乍一看不好理解“分布均匀和保留信息”两者之间的关联,其实道理很简单:分布均匀意味着两两有差异,也意味着各自保有独有信息,这代表信息保留充分。
总体而言,温度参数 τ 起到如下作用:温度参数会将模型更新的重点,聚焦到有难度的负例,并对它们做相应的惩罚,难度越大,也即是与 距离越近,则分配到的惩罚越多。所谓惩罚,就是在模型优化过程中,将这些负例从 身边推开,是一种斥力。也就是说,距离 越近的负例,温度超参会赋予更多的排斥力,将它从 推远。而如果温度超参数 τ 设置得越小,则InfoNCE分配惩罚项的范围越窄,更聚焦在距离 比较近的较小范围内的负例里。同时,这些被覆盖到的负例,因为数量减少了,所以,每个负例,会承担更大的斥力(参考上图左边子图)。极端情况下,假设温度系数趋近于0,那么InfoNCE基本退化为Triplet,也就是说,有效负例只会聚焦在距离 最近的一到两个最难的实例。从上述分析,可以看出:温度超参越小,则更倾向把超球面上的局部密集结构推开打散,使得超球面上的数据整体分布更均匀(参考上图右边子图)。
深度学习的本质
深度学习的本质就是做两件事情:Representation Learning(表示学习)和 Inductive Bias Learning(归纳偏好学习)