目录

1.局部最小值(local minima)与鞍点(saddle point)

2.批次(Batch)与动量(momentum)

3.自动调整学习率(learning rate)

4.loss损失函数也可能有影响 

5. 批次标准化(Batch Normalization)


1.局部最小值(local minima)与鞍点(saddle point)

        当loss无法下降时,可能梯度已经接近0了,这时,局部最小值(local minima)与鞍点(saddle point)都有可能,统称为critical point。 

每次训练完神经网络 神经网络训练效果不好_深度学习

         此时,需要判断属于哪种情况,计算Hessian即可:

每次训练完神经网络 神经网络训练效果不好_cnn_02

每次训练完神经网络 神经网络训练效果不好_机器学习_03

  

 2.批次(Batch)与动量(momentum)

每次训练完神经网络 神经网络训练效果不好_cnn_04

每次训练完神经网络 神经网络训练效果不好_每次训练完神经网络_05

        在物理学的角度上,小球走到local minimal,当动量比较大的时候,会越过这个小坡。

每次训练完神经网络 神经网络训练效果不好_cnn_06

        正常的梯度下降,每计算一次梯度,往它的反方向计算一次更新一次参数。

每次训练完神经网络 神经网络训练效果不好_深度学习_07

        加上动量的梯度下降,可以理解为更新的方向为Gradient的负反方向加上前一次移动的方向。

每次训练完神经网络 神经网络训练效果不好_cnn_08

        另一种解读是,所谓的momentum,update的方向不是只考虑现在Gradient,而是考虑过去所有Gradient的总和。

每次训练完神经网络 神经网络训练效果不好_神经网络_09

每次训练完神经网络 神经网络训练效果不好_每次训练完神经网络_10

 3.自动调整学习率(learning rate)

        前面在loss不下降的时候,我们说可能是critical point,但是也有可能是下面这种情况:

每次训练完神经网络 神经网络训练效果不好_深度学习_11

        learning rate应该为每一个参数特制化:

每次训练完神经网络 神经网络训练效果不好_深度学习_12

(1)最常见的一种修改学习率的方法是均方根,这种方法被用在Adagrad里面。

(2)可以自己调整现在的gradient的重要性—RMSProp。

(3)Adam: RMSProp + Momentum。

(4)Learning Rate Scheduling,使学习率 η随时间变化。

4.loss损失函数也可能有影响 

每次训练完神经网络 神经网络训练效果不好_每次训练完神经网络_13

        在分类中,通常会加上softmax:

每次训练完神经网络 神经网络训练效果不好_每次训练完神经网络_14

        如果是分类成两类,则更常用sigmoid,但其实这两者的方法结果是一样的。下面是损失函数:

每次训练完神经网络 神经网络训练效果不好_机器学习_15

        事实上,交叉熵在分类中是最常用的。在PyTorch中,CrossEntropyLoss这个函数已经包含了softmax,这两者是绑定在一起的。从图中可以看出,当 loss 很大时,MSE很平坦,不能梯度下降到 loss 小的地方,卡住了;但是交叉熵可以一路梯度下降下去。

每次训练完神经网络 神经网络训练效果不好_每次训练完神经网络_16

 5. 批次标准化(Batch Normalization)

        希望对于不同的参数,对 loss 的影响范围都比较均匀,像下面的右图:

每次训练完神经网络 神经网络训练效果不好_每次训练完神经网络_17

        方法是特征归一化(Feature Normalization):

每次训练完神经网络 神经网络训练效果不好_每次训练完神经网络_18

        归一化之后,每个维度的特征的平均值为0,方差为1。一般来说,特征归一化使梯度下降收敛更快。后一步的输出同样也需要归一化,这些归一化都是针对于一个Batch的。一些比较有名的Normalization:

每次训练完神经网络 神经网络训练效果不好_神经网络_19