数值稳定性
神经网络的梯度
假设一个有d层的神经网络,对于任意的t层和最终输出y,有:
h
t
=
f
t
(
h
t
−
1
)
,
y
=
l
∘
f
d
∘
⋯
∘
f
1
(
x
)
h^t = f_t(h^{t-1}),y=l\circ f_d\circ \dots \circ f_1(x)
ht=ft(ht−1),y=l∘fd∘⋯∘f1(x)
计算算是
l
l
l关于参数
W
t
W_t
Wt的梯度:
∂
l
∂
W
t
=
∂
l
∂
h
d
∂
h
d
∂
h
d
−
1
⋯
∂
h
t
+
1
∂
h
t
∂
h
t
∂
W
t
\frac{\partial l}{\partial W^t}=\frac{\partial l}{\partial h^d}\frac{\partial h^d}{\partial h^{d-1}}\cdots \frac{\partial h^{t+1}}{\partial h^t}\frac{\partial h^t}{\partial W^t}
∂Wt∂l=∂hd∂l∂hd−1∂hd⋯∂ht∂ht+1∂Wt∂ht
中间有
d
−
t
d-t
d−t次矩阵乘法,做了太多次乘法,就会导致数据稳定性的一些问题:
- 梯度爆炸: 1. 5 100 = 4 × 1 0 17 1.5^{100} =4 \times 10^{17} 1.5100=4×1017
- 梯度消失: 0. 8 100 = 2 × 1 0 − 10 0.8^{100}=2\times 10^{-10} 0.8100=2×10−10
例子:MLP
为了简单省略了偏移,对于第t层:
梯度爆炸
使用Relu作为激活函数:
则矩阵中的元素要么是1要么是0,最终 Π i = t d − 1 ∂ h i + 1 ∂ h i \Pi ^{d-1}_{i=t}\frac{\partial h^{i+1}}{\partial h^i} Πi=td−1∂hi∂hi+1的值的一些元素会来自 Π i = t d − 1 ( W i ) T \Pi^{d-1}_{i=t}(W^i)^T Πi=td−1(Wi)T,如果 d − t d-t d−t很大,那么值将会很大。
梯度爆炸的问题
-
值超出值域(infinity)
16位浮点数尤为严重(数值区间6e-5 - 6e-4)
-
对学习率敏感
如果学习率太大 → \rightarrow → 大参数值 → \rightarrow → 更大的梯度
如果学习率太小 → \rightarrow → 训练无进展
我们可能需要在训练过程不断调整学习率
梯度消失
使用sigmoid作为激活函数
s
i
g
m
o
i
d
(
x
)
=
1
1
+
e
x
p
(
−
x
)
σ
′
=
σ
(
x
)
(
1
−
σ
(
x
)
)
sigmoid(x)=\frac{1}{1+exp(-x)}\ \ \sigma'=\sigma(x)(1-\sigma(x))
sigmoid(x)=1+exp(−x)1 σ′=σ(x)(1−σ(x))
!
当输入值很大,sigmoid的梯度很小,则
Π
i
=
t
d
−
1
∂
h
i
+
1
∂
h
i
=
Π
i
=
t
d
−
1
d
i
a
g
(
σ
′
(
W
i
h
i
−
1
)
)
(
W
i
)
T
\Pi ^{d-1}_{i=t}\frac{\partial h^{i+1}}{\partial h^i}=\Pi^{d-1}_{i=t} diag(\sigma '(W^i h^{i-1}))(W^i)^T
Πi=td−1∂hi∂hi+1=Πi=td−1diag(σ′(Wihi−1))(Wi)T
的元素值是d-t个小数值得乘积,最终梯度会很小很小。
梯度消失得问题
-
梯度值变成0
16位浮点数尤为严重
-
训练没有进展,学习率无用了
-
对于底层影响很大,仅顶部层训练得比较好,无法让神经网络更深,限制了神经网络的大小
当数值过大或者过小时会导致数值问题,常发生在深度模型中,因为其会对n个数累乘
训练更稳定
稳定,即让梯度值在合理的范围内,比如[1e-6,1e3]
方法:
- 将乘法变为加法:ResNet,LSTM
- 归一化:梯度归一化,梯度裁剪
- 合理的权重初始和激活函数
合理的初始值和激活函数
让每层的方差是一个常数
将每层的输出和梯度都看作随机变量,让它们的均值和方差都保持一致。
a和b都是常数。
权重初始化
我们希望在合理值区间里随机初始参数,因为训练开始的时候更容易有数值不稳定,远离最优解的地方,其损失函数表面可能很复杂,最优解附近表面会比较平。
使用 N ( 0 , 0.01 ) N(0,0.01) N(0,0.01)来初始可能对小网络没问题,但不能保证深度神经网络。
例子:MLP
假设
-
w i , j t w^t_{i,j} wi,jt(第t层的第i行第j列)是i.i.d,那么 E [ w i , j t ] = 0 , V a r [ w i , j t ] = γ t E[w^t_{i,j}] = 0,Var[w^t_{i,j}]=\gamma_t E[wi,jt]=0,Var[wi,jt]=γt
独立同分布(Independent Identically Distribution)在概率统计理论中,指随机过程中,任何时刻的取值都为随机变量,如果这些随机变量服从同一分布,并且互相独立,那么这些随机变量是独立同分布。
-
h t t − 1 h^{t-1}_t htt−1独立于 w i , j t w_{i,j}^t wi,jt
假设没有激活函数
h
t
=
W
t
h
t
−
1
,
W
t
∈
R
n
t
×
n
t
−
1
h^t= W^th^{t-1},W^t\in \R^{n_t\times n_{t-1}}
ht=Wtht−1,Wt∈Rnt×nt−1
E
[
h
i
t
]
=
E
[
∑
j
w
i
,
j
t
h
j
t
−
1
]
=
∑
j
E
[
w
i
,
j
t
]
E
[
h
j
t
−
1
]
=
0
E[h^t_i]=E[\sum_jw^t_{i,j} h^{t-1}_j]=\sum_j E[w^t_{i,j}]E[h^{t-1}_j]=0
E[hit]=E[j∑wi,jthjt−1]=j∑E[wi,jt]E[hjt−1]=0
独立的变量,则有
E
[
x
y
]
=
E
[
x
]
E
[
y
]
E[xy]=E[x]E[y]
E[xy]=E[x]E[y]
正向方差
其中 E [ h i t ] 2 = 0 E[h^t_i]^2 =0 E[hit]2=0,第二行将平方展开就能得到
接着由于是独立同分布, E [ x + y ] = E [ x ] + E [ y ] E[x+y]=E[x]+E[y] E[x+y]=E[x]+E[y],而 E [ x y ] = E [ x ] E [ y ] E[xy]=E[x]E[y] E[xy]=E[x]E[y],又知 E [ w i , j t ] = 0 E[w^t_{i,j}]=0 E[wi,jt]=0,则后面那项期望为0
V a r [ w i , j t ] = γ t Var[w^t_{i,j}]=\gamma_t Var[wi,jt]=γt,有 n t − 1 n_{t-1} nt−1个求和。
那么如果我们希望输入的方差和输出的方差一样,那么 n t − 1 γ t = 1 n_{t-1}\gamma_t =1 nt−1γt=1
反向是类似的,需要满足 n t γ t = 1 n_t\gamma_t =1 ntγt=1
Xavier初始
比较难满足 n t − 1 γ t = 1 , n t γ t = 1 n_{t-1}\gamma_t =1,n_t\gamma_t =1 nt−1γt=1,ntγt=1,除非输入的维度等于输出的维度,否则不可能同时满足。
但我们可以折中的取,即 γ t ( n t − 1 + n t ) 2 = 1 , γ t = 2 n t − 1 + n t \frac{\gamma_t (n_{t-1}+n_t)}2 =1 ,\gamma_t =\frac 2{n_{t-1}+n_t} 2γt(nt−1+nt)=1,γt=nt−1+nt2,则:
- 正态分布 N ( 0 , 2 / ( n t − 1 + n t ) ) N(0,\sqrt{2/(n_{t-1}+n_t)}) N(0,2/(nt−1+nt))
- 均匀分布
U
(
−
6
/
(
n
t
−
1
+
n
t
)
,
6
/
(
n
t
−
1
+
n
t
)
)
U(-\sqrt{6/(n_{t-1}+n_t)},\sqrt{6/(n_{t-1}+n_t)})
U(−6/(nt−1+nt),6/(nt−1+nt))
- 分布 U [ − a , a ] U[-a,a] U[−a,a]的和方差是 a 2 3 \frac{a^2}3 3a2
假设线性的激活函数
即 σ ( x ) = x \sigma (x)= x σ(x)=x,反向也是类似的。
这意味着,激活函数必须是 f ( x ) = x f(x)=x f(x)=x
调整后的sigmoid展开后是近似x的了