李宏毅机器学习(六) 神经网络训练技巧(1)
神经网络训练技巧
训练不好的原因

上图中出现了两种训练情况。
- Loss下降的很明显,但是最终没有降到一个很低的值。
- Loss从训练开始就没什么变化。
原因:梯度接近于0,模型陷入了临界点,参数更新很少甚至不更新,所以loss变化很小。
saddle point & local minima
- 是什么导致了梯度接近于0,同时loss还很高呢?

两种情况:local minima or saddle point
- local minima:局部最低点,模型的参数进入了局部最低点的位置,此时梯度为0,没有可以逃离的点,但此处并非全局最低点。
- saddle point:鞍点,处于鞍点位置,四周的梯度也都为0,这里不是全局最低点,但可以从侧面逃离鞍点。
如何区分?
假设 \(\theta\) 的一个临近点 为\(\theta^{'}\),模型在 \(\theta\) 处的Loss可定义为:

\(g\):梯度向量
\(H\):海森矩阵
当模型参数梯度处于临界点(critical point)时,梯度 \(g\) 为0,所以 \(L(\theta)\) 等于:

红框中的部分可以帮我们辨别当前模型参数处于局部最小/大点,还是处于鞍点(saddle point)。
-
用 \(v\) 代替 $ (\theta - \theta^{'})$ ,公式可表示为:
\[L(\theta) \approx L(\theta^{'}) + \frac{1}{2}v^T H v \]对于所有\(v\),有三种情况:
- 所有 \(v\) 都使得 \(v^T H v > 0\),则\(L(\theta) > L(\theta')\),这个临界点是 局部最小值点(local minima)。
- 所有 \(v\) 都使得 \(v^T H v < 0\),则\(L(\theta) < L(\theta')\),这个临界点是 局部最大值点(local maxima)。
- 若有的 \(v^T H v < 0\),有点 \(v^T H v > 0\),这个临界点是 鞍点(saddle point)。
问题:要使用上面的规则,要代入每一个\(v\)进行检验,计算亮太大,其实利用Hessian matrix : H的性质就可以分辨属于哪种情况。
同样有3中情况:
- 如果 \(H\) 是正定矩阵(特征值都为正),则临界点为 局部最小值点(local minima)
- 如果 \(H\) 是负定矩阵(特征值都为负),则临界点为 局部最大值点(local maxima)
- 如果 \(H\) 不是正定矩阵,也不是负定矩阵(特征值有正有负),则临界点为 鞍点(saddle point)
思考
在二维角度看来是局部最小值,在三维空间看来却是鞍点。那三维空间中的局部最小/大值 在更高的维度看起来会不会也是鞍点呢?

实验
对于一个网络,训练100次,每次训练完后,将对应Hessian矩阵的特征值进行统计,计算Hessian矩阵的正特征值的比例,将这个比例和Loss对应起来,结果如下:

横轴为Hessian 矩阵中正特征值的比例 minimum ratio。
- ratio = 1: Hessian矩阵的所有特征值都是正的,则代表临界点为局部最小值点(local minima)
- ratio = 0:Hessian矩阵的所有特征值都是负的,则代表临界点为局部最大值点(local maxima)
- ration ~ (0, 1):Hessian矩阵的特征值有正有负,则临界点为鞍点(saddle point)
图中可以看出,所有点在(0, 1),所以都是鞍点,这证明最值点很少会遇见。
Batch
Batch介绍
Batch:将训练数据均分为若干个份,一份中包含若干个样本,这样的一份样本就是一个batch,batch size取值为1~N。

例如图中将训练数据分为4个Batch,并用每一个Batch进行训练并更新参数,所以全部数据分为4个batch,1个epoch可以进行4次参数更新,也就是4个step。
- 1个batch:用于单次训练的样本
- 1个epoch:将所有batch都用于训练一次
- 1个step:一次参数更新
在一个epoch后,会对训练数据进行shuffle(打乱数据,类似于洗牌)操作,然后重新划分batch。
Batch取值
假如有20个样本,那么Batch size的大小取值为1~20,Batch取值有两个极端,下面进行理论分析:
- Large Batch Size = N:将20条训练样本组织成1个batch
- 速度:由于要计算所有样本的Loss才能进行1次参数更新,所以训练很慢。
- 性能:由于每次参数更新都看过了所有的样本,所以每次训练做出的决策很稳定。
- Small Batch Size = 1:将20条训练样本分为20个batch
- 速度:进行1次参数更新只需要计算1个样本的Loss,所以训练很快。
- 性能:每次参数更新都只看了1个样本,所以每次训练做出的决策不稳定。

由于GPU有多任务并行运算的能力,所以对包含1000个样本的1个Batch进行运算,花费时间不会比包含1个样本的1个Batch的运算时间多多少(理论上是相等,但由CPU将数据读写到GPU需要花费的时间跟样本数成比例)。
所以,1次参数更新,GPU能够承载的Batch size的训练时间类似,由于GPU硬件的限制,并行任务数超过一定数量花费的时间将大大增加。

一次update和epoch,batch size对时间的影响:
-
one update: GPU能够handle的batch size对应的时间相差不大,超过GPU能handle的数据量,时间翻倍。
-
one epoch: batch_size很小时,1个epoch对应着很多个batch的训练,会有很多次参数更新,所以时间很长。随着batch_size时间的增加,1个epoch中参数更新的次数减少,时间大幅减小。

在使用GPU进行训练后,不同Batch size的Batch单次参数更新过程所花费的时间基本相同。

因为 batch size越大越稳定,不用考虑训练时间的差异后,是不是batch size越大越好?

科学家就batch size对准确率的影响问题进行了研究,在两个图像识别任务上,batch size越大,准确率越低。
- 为什么会这样?

直观解释:
-
full batch:每次参数更新都看完了所有的样本,参数更新更稳定,在遇到local minima和saddle时很容易走不出去(可通过调大学习率等参数改善)。
-
small batch:由于每个样本都进行一次参数更新,参数更新的随机性更大,更有可能突破local minima和saddle。
所以小batch在测试集上更好吗?

研究人员在多个数据集上使用多种网络进行实验,将batch size分为small batch和large batch,通过训练调参优化,将使用不同batch size的两个模型训练到在训练集上有一样的准确率。通过测试,使用small batch训练的模型在测试集上的准确率要高于使用large batch训练的模型。paper

- 个人对于上图的理解
通常,small batch倾向于将模型引入平坦的minima,因为small batch的随机性容易走出sharp的minima。而large batch在遇到sharp的minima后,很难走出来,所以其倾向于将模型引入sharp的minima。
如何选择

单个epoch,大的batch size因其参数更新次数少,所以更快,但在训练集和测试集上的效果不佳。所以batch size是一个需要人工调整的超参数。
- 怎样均衡取值?(参考资料)
- Large Batch Optimization for Deep Learning: Training BERT in 76 minutes (https://arxiv.org/abs/1904.00962)
- Extremely Large Minibatch SGD: Training ResNet-50 on ImageNet in 15 Minutes (https://arxiv.org/abs/1711.04325)
- Stochastic Weight Averaging in Parallel: Large-Batch Training That Generalizes Well (https://arxiv.org/abs/2001.02312)
- Large Batch Training of Convolutional Networks (https://arxiv.org/abs/1708.03888)
Accurate, large minibatch sgd: Training imagenet in 1 hour (https://arxiv.org/abs/1706.02677)
Momentum
Momentum(动量):运用物理世界小球下坡遇到平坦和小坑时,利用动量冲出的思想。参数更新不再只取决于当前的梯度,还要考虑之前的梯度。

一般的梯度下降:只考虑当前的梯度。

梯度下降+动量:每一步参数更新方向,结合当前梯度方向和以前的梯度更新方向(动量),如下图所示。




浙公网安备 33010602011771号