一、深度学习步骤回顾
二、常规指导
三、训练过程中Loss很大
3.1 原因1:模型过于简单
原因分析
如果你的设计的模型(函数表达式)过于简单,可能会拟合不出复杂的函数,导致预测误差较高
解决方案
解决方法也很简单,就是增加模型的复杂度。如上一节课(【深度学习】李宏毅2021/2022春深度学习课程笔记 - Deep Learning Introduction)所讲的,我们可以将原本简单的线性表达式转化为复杂的非线性表达式,这样就可以拟合出更多复杂的函数,从而为减小误差提供可能。
3.2 原因2:优化得不好
原因分析
以当前模型确实存在一组参数使得Loss较低,但是由于优化算法的效果不好,没办法找到可以使得Loss较低的参数
解决方案
更换效果更好的优化算法
3.3 原因1 or 原因2 ?
这一节会讲述,我们应该怎么判断到底是原因1导致的训练过程Loss过高,还是原因2导致的
尝试不同的模型,对比不同模型下,训练过程的Loss。如下图所示,56层的模型的Loss反而比20层的模型还要大,说明应该是原因2导致的训练过程Loss过高
四、训练过程Loss小。测试过程Loss大
4.1 原因1:过拟合 Overfitting
原因分析
在大部分情况下,训练数据只是数据全集的一小部分,甚至有可能存在部分噪声数据,所以如果模型对训练数据学习得过于深入,有可能学到噪声,导致模型的泛化性变差
解决方案
- 使用更多的训练数据(当然更多,也要是正确的训练数据多才行噢),减少噪声的影响,增加训练数据的全面性,让模型可以更好地拟合真实函数
其他解决方案
- 使用更少参数的模型
- 使用更少的特征数量
- 提早停止 Early Stopping
- 正则化
- Dropout
4.2 原因2:Mismatch
还是看上一节课讲的案例,2/26是星期五,按照以往的规律,星期五一般学习Deep Learning的人数都是比较少的,所以模型也认为2/26日播放量应该比较少,然而事实是,2/26反而是播放量最多的一天。
这是一种反常的现象,称之为 mismatch。即机器遇到了反常的现象,即测试数据体现出的规律和训练资料体现出的规律有很大不同
下面例子,体现了Mismatch的产生原因,训练数据和测试数据体现的规律有很大不同
五、N折交叉验证
为了判断当前模型是否出现过拟合现象,我们需要从原始训练数据中,分出一部分作为验证集,然后选出在验证集上Loss最小的模型作为最终模型
六、When gradient is small …
下面只讨论,当Optimization失败时,怎么把梯度下降做得更好
人们对于Optimization失败时,有如下图所示的猜想,认为模型被优化到了一个使得梯度非常接近0的点,导致优化无法继续。这一类点通常是局部最小值点或者鞍点。
那么,如果卡在局部最小值或者鞍点时,应该怎么办呢?下面会介绍解决这个问题的办法。
6.1 Batch
Batch 指的是每次更新参数时,只用训练数据中的一小批数据进行参数更新
如下图所示,一般来说,较小的 Batch Size 可能会得到更好的结果
6.2 Momentum
在介绍 Momentum 之前,先来回顾一下,传统的梯度下降是怎么更新参数的。如下图所示,每到一个点,就按照梯度的反方向更新参数
接下来看看,加上 Momentum 之后的参数更新是什么样的。如下图所示,所谓 Momentum 就是考虑了上一步移动的方向,相当于给参数的更新加上了惯性,让参数的更新不止是根据梯度,还要根据上一步移动的方向进行更新参数,这样有利于跳出局部最优点和鞍点
七、Adaptive Learning Rate
下图展示了固定学习率的缺点。如果学习率太大,会导致最终模型可能在最优解附近来回震荡,但始终无法收敛至最优点。如果学习率太小,又会导致模型需要迭代很多次,收敛速度很慢
针对上面提到的,采用固定学习率带来的缺点,我们认为,可以给不同的参数设置不同的参数更新权重,且这个权重是随着迭代进行自适应变化的,进而提高模型迭代的效率与质量
下面给出了 Learing rate 的更新方法,参数更新权重是根据历史梯度计算的
以上,还不是关于学习率优化的最终版本。我们还希望,对于同一个参数的学习率,它对于不同时期的历史梯度信息的权重应该是不一样的,于是就有了 RMSProp , 它用 α 来控制当前梯度和历史梯度的权重
综上所述,就有了很强的优化器, Adam !
让我们来看看用了自适应学习率之后的寻优路线,如下图所示。我们可以看到,在接近最优点的时候,在竖直方向上发生了较大幅度的震荡,这是由于自适应学习率是考虑了历史上所有梯度的,而最开始时竖直方向的梯度较大,所以导致其会发生竖直震荡
为了解决上面的震荡问题,我们可以采用 根据迭代次数而自适应变化的学习率,称之为 Learning Rate Scheduling
下面采用了 学习率随迭代次数递减的策略,可以看到,震荡现象就消失了
除了学习率递减策略,还有一个常用策略是 Warm Up 策略 , 学习率先逐渐上升,然后到一个阈值后,再逐渐下降到一个阈值
八、为什么用了交叉验证有时还是会过拟合?
让我们来回顾一下验证集是怎么用的。
如下图所示,我们会把原始训练资料分为训练集和验证集,其中假设验证集占原始训练资料的三分之一,那么就可以进行三折交叉验证,根据将原始训练数据分为三个不同的验证集和训练集,可以训练出三个模型,我们最终会选择这三个模型中,在验证集上Loss最小的作为最终模型。
其实不难联想到,其实根据验证集Loss最低的原则选择模型的策略,是不是就类似于 根据验证集去训练网络呢?答案是肯定的,所以,使用交叉验证的时候,有时也会出现过拟合,这是因为模型在验证集上过拟合了!所以,同理,如果交叉验证的折数越多,代表模型越有可能在验证集上出现过拟合现象,所以在实际训练中,我们一般不会采取较多折的交叉验证,通常为3折、5折、10折。
九、Batch Normalization
当输入数据的量纲差别很大时,就会导致不同维度方向上的梯度相差很大,这样不利于梯度下降的进行。要想解决这个问题,很容易想到的解决方案就是:统一输入数据的量纲。
这个方法也叫做 Feature Normalization 。
如下图所示,我们可以对输入数据进行 Z-Score 标准化后,再传给神经网络进行学习
一般来说,标准化步骤放在激活函数之前,但实际上,在激活函数之前和之后没有太大差别
在实际神经网络训练的时候,我们并不会一次性将所有数据丢给神经网络,而是一个一个Batch地给,因此,在标准化的时候,也是一个一个Batch地进行标准化,称之为 Batch Normalization
还有很多其他标准化地方法如下
转载:https://blog.csdn.net/weixin_51545953/article/details/128267952