数值稳定性
神经网络的梯度
- 这里的t是第t层,这里
h
t
h^t
ht是第t层的输出,y表示表示第1层到第d层的加上一个损失函数的一个目标函数。
- 如果这里要计算损失
l
\mathcal{l}
l关于第t层的参数
W
t
W_t
Wt?的梯度,就是用链式法则,一直往下求,求到第t层,这里我们的h是一个向量,向量关于向量的导数是一个矩阵,所以这里就可以看作d-t次的矩阵的乘法,这样的一个矩阵的乘法带来了两个问题,一个是梯度爆炸,一个是梯度消失
数值稳定性的常见两个问题
- 例子
- 假如如下MLP(多层感知机)(这里为了简单省略了便宜偏移b)
-
f
t
(
h
t
?
1
)
=
σ
(
W
t
h
t
?
1
)
f_t(h^{t-1})=\sigma (W^t h^{t-1})
ft?(ht?1)=σ(Wtht?1),这里的
σ
\sigma
σ是激活函数
-
?
h
t
?
h
t
?
1
=
d
i
a
g
(
σ
′
(
W
′
h
t
?
1
)
)
(
W
t
)
T
\frac{\partial h^t}{\partial h^{t-1}}=diag(\sigma^{'}(W^{'}h^{t-1}))(W^t)^T
?ht?1?ht?=diag(σ′(W′ht?1))(Wt)T,这里
σ
′
\sigma ^{'}
σ′是
σ
\sigma
σ的导数函数
-
∏
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
\prod_{i=t}^{d-1}\frac{\partial h^{i+1}}{\partial h^i}=\prod_{i=t}^{d-1}diag(\sigma^{'}(W^ih^{i-1}))(W^i)^T
∏i=td?1??hi?hi+1?=∏i=td?1?diag(σ′(Wihi?1))(Wi)T
梯度爆炸
- 使用ReLU作为激活函数
- 梯度爆炸的问题
- 值超出值域(infinity)
- 对于学习率敏感
- 如果学习率太大 -> 大参数值 -> 更大的梯度
- 如果学习率太小 -> 训练无进展
- 我们可能需要再训练的过程中不断调整学习率
梯度消失
- 使用sigmoid作为激活函数,可以看图,当我们输入值很大,梯度就很小,接近于0
- 梯度消失的问题
总结
- 当数值过大或者过小时会导致数值问题
- 常发生在深度模型中,因为其会对n个数累乘
让训练更加稳定
- 目标:让梯度值在一个合理的范围内
- 将乘法变加法
- 归一化
- 合理的权重初始和激活函数
让每层的方差是一个常数
- 将每层的输出和梯度都看做随机变量
- 让它们的均值和方差都保持一致
权重初始化
假设线性的激活函数
检查常用的激活函数
总结
- 合理的权重初始值和激活函数的选取可以提升数值稳定性
|