上次读了前沿论文,发现确实水平远远不足,因此更加努力的看视频和学数学,希望后续能有所改善!
本文主要总结关于神经网络训练不起来该怎么处理的问题进行论述,大家可以选择性观看!
目录
偶遇Critical Point
有些时候,当我们构建的模型随着训练集的输入,它的Loss将会越来越小。但有时候,当它收敛结束后,我们可能对它的结果依旧不满意,或者甚至它在最初根本就没有训练起来。那么,在以前就会有人说可能是遇到了Critical Point。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210410110239720
它一般分为两大类,一类是Local Minimum(局部最小值),另一类是Saddle Point(马鞍点)
Saddle Point
鞍点,词如其名,就是在某一方向或者某些方向上是最小的点,但在另一些方向上却仍可以继续优化。当我们遇到马鞍点,我们或许不需要特别惊慌,因为我们还有方向可以继续优化。
Local Minimum
局部最小值,不同于前者,其周围一般都是陡峭的悬崖,看上去我们已经找不到路可以走了。最初,它被认为是无法逃离的地方。
如何鉴别Critical Point
那么,我们可能会想知道,当我们遇到Critical Point时如何判别自己究竟是遇到了无法逃离的局部最小值还是有路可走的鞍点。
我们可以首先使用Taylor Series Approximation来估计θ附近的Loss:
L
(
θ
)
≈
L
(
θ
′
)
+
(
θ
+
θ
′
)
T
g
+
1
2
(
θ
+
θ
′
)
T
H
(
θ
+
θ
′
)
L\left(\theta\right)\approx L\left(\theta'\right)+\left(\theta+\theta'\right)^Tg+\frac{1}{2}\left(\theta+\theta'\right)^TH\left(\theta+\theta'\right)
L(θ)≈L(θ′)+(θ+θ′)Tg+21(θ+θ′)TH(θ+θ′)
其中Gradient g是一个向量:
g
=
∇
L
(
θ
′
)
g
i
=
∂
L
(
θ
′
)
∂
θ
i
g=\nabla L\left(\theta'\right)\ \ \ \ g_i=\frac{\partial L\left(\theta'\right)}{\partial\theta_i}
g=∇L(θ′) gi=∂θi∂L(θ′)
它代表着,你用现有的Function中每个参数对Loss求偏导的结果。
而Hessian H是一个矩阵:
H
i
j
=
∂
2
∂
θ
i
∂
θ
j
L
(
θ
′
)
H_{ij}=\frac{\partial^2}{\partial\theta_i\partial\theta_j}L\left(\theta'\right)
Hij=∂θi∂θj∂2L(θ′)
它的第i行第j个元素是对Loss求第i个参数和第j个参数的二阶偏导。
那么这个公式有什么用呢?当我们遇到Critical Point时Gradient = 0上式就可以写作
L
(
θ
)
≈
L
(
θ
′
)
+
1
2
(
θ
+
θ
′
)
T
H
(
θ
+
θ
′
)
L\left(\theta\right)\approx L\left(\theta'\right)+\frac{1}{2}\left(\theta+\theta'\right)^TH\left(\theta+\theta'\right)
L(θ)≈L(θ′)+21(θ+θ′)TH(θ+θ′)
我们假设
v
=
(
θ
−
θ
′
)
v=\left(\theta-\theta'\right)
v=(θ−θ′)
当对于所有的θ:
v
T
H
v
>
0
v^THv>0
vTHv>0
则L(θ)>L(θ’),该点为Local Minimum
同理,当:
v
T
H
v
<
0
v^THv<0
vTHv<0
则L(θ)<L(θ’),该点为Local Maximum
而当其有时候大于0有时小于0时,它为Saddle Point
也可以用Hessian的特征值判断
当H的Eigen Value全为Positive时则为Local Minimum
当H的Eigen Value全为Negative时则为Local Maximum
当H的Eigen Value有时为Positive,有时为Negative时则为Saddle Point
我们假设存在一种简单的神经网络,和一组简单有标注数据集:
它的函数集:
y
=
w
1
w
2
x
y=w_1w_2x
y=w1w2x
它的Error Surface:
可知,当w1=w2=0时,为马鞍点,当w1*w2=1时为local minima
我们选取其中w1=w2=0的一点
发现它g为零向量,H特征值一正一负,它为saddle point,沿着它特征值矩阵方向还能继续减少Loss。
幸运的是,当θ维度够大的时候,它一般总会有路可以走,也就是说遇到Local Minima的机会很少。
批处理与动量
Batch批处理
神经网络有很多违背直觉的东西,batch就是其中之一。我们需要确定一个批次大小,每训练过Batch个再更新一次参数向量。
结果是一般来说,更大的Batch(例如Full Batch)更节省时间,而更小的Batch(例如单个)在测试集上表现更好。
一般的解释是,小批次的噪音有助于训练,而GPU的并行训练节省了大Batch的时间。
动量
为了防止一遇到平坦地界就被卡住,我们设置了动量来助推它走过平坦或者狭窄坑道。如图
自动更新学习率
η在过去对我们来说,是一个常量,但当多个变量之间变化曲线有差距甚至差异极大时,它经常会导致许多问题。我们就考虑当当前梯度较大时使其学习率较小,当梯度较小时学习率增大。
η
1
=
η
0
σ
\eta^1=\frac{\eta^0}{\sigma}
η1=ση0
η
1
=
η
σ
i
t
g
i
t
σ
i
t
=
α
(
σ
i
t
−
1
)
2
+
(
1
−
α
)
(
g
i
t
)
2
\eta^1=\frac{\eta}{\sigma_i^t}g_i^t\ \ \ \sigma_i^t=\sqrt{\alpha\left(\sigma_i^{t-1}\right)^2+\left(1-\alpha\right)\left(g_i^t\right)^2}
η1=σitηgit σit=α(σit−1)2+(1−α)(git)2
我们可以通过α来控制我们对于当前位置梯度的在乎程度。
Batch Normalization(批正则化)
在上文,我们发现,当参数梯度相差非常多的时候,普通的优化器已经无法应对了。因此我们也改进了我们的优化器为RMSProp,但现在我们改变我们的想法,是否可以通过改变数据的分布而使其梯度整体上趋于一致呢?
但仅仅改变某一个数据会导致其失去整体特征变为噪音,因此我们选择Batch Normalization,对一批数据的某一行数据整体正则化。如图
让其拥有共同的平均值0以及方差1,特征更紧致。
现在也出现了许多可以让网络自调整其均值与方差值,让其分布更具备多样性。
总结
本文总结了笔者最近观看的网课,后续将开始涉及卷积神经网络,继续加油!