关于训练
参数和超参数
回顾有监督学习:
给定训练数据来自同一分布
找到
能在测试集(来自同一分布)上表现良好
需要通过损失函数(loss function):
来衡量模型的数据处理能力。即衡量是否在测试集上表现良好。这就需要找到一个,最小化loss值:
训练完成后得到的loss值并不一定尽如人意:
- 有可能在训练集上表现良好,但在测试集上表现较差。
- 甚至在训练集上表现也较差。
对于第一种情况,可能是模型过拟合了,需要调整参数,或者进行正则化;第二种情况则可能是欠拟合,此时可能不仅需要调参,甚至需要重新设计网络。
如果出现欠拟合的问题,可能遇到的问题是large bias,即偏差较大。可能是参数没有训练好,也有可能是模型本身不够强。此时的解决方案为:
- 在输入中增加更多的特征(比如区分男女性,可以不仅仅靠身高的高矮来判断,还可以同时考虑头发长度、穿衣打扮等)
- 使用更复杂的、表达能力更强的模型
如果出现过拟合的问题,可能遇到的问题是large variance,即方差较大。此时泛化能力弱,模型可能学出了训练集上的噪声。此时的解决方案:
- 增加训练集的数据量。(这个方法虽然很有效,但并不总是实用。比如有些病灶图像,由于疾病罕见,能获得的图像本就很少,因此难以通过收集增加数据量,此时可以考虑图像增强,人为增加数据量。)
- 正则化,但可能增加bias的误差。
当模型简单的时候,bias会比较大,而variance较小;反之模型复杂的时候,bias会比较小,而variance较大。
参数和超参数
(Model Design + Hyperparameters) -> Model Parameters
模型设计包括:层数、**函数、优化等
超参数包括:学习率、Dropout等
参数包括:权重、偏置等
实际训练过程中:选择超参数;训练模型;评估性能;改进超参数,构成了一个循环,直到模型能满足要求,循环结束。
设置数据
将所有的数据都作为训练集来训练模型,这种做法是欠妥的,因为这样得到的模型势必会出现过拟合的问题。如果将一部分数据作为测试集,剩下的数据作为训练集,这种做法依然会出现模型过拟合的问题。
更好的做法是,将数据分成训练集、评估(validation)集和测试集三部分。平估集用来确定超参数。常用的划分比例为或者。
对于上述方法,如果数据集本身较小,那么的数据也不够用于模型训练,此时考虑第四种方法,即交叉检验(Cross-Validation):将训练数据集分成若干个folds,每次选取一个fold作为评估集,来选取超参数,剩下的作为训练集。如下图所示:
最后,将得到的结果平均起来就是最终的模型。这种方法尤其适合小数据集。
梯度下降法
当我们为一个具体的问题设计了一个模型以及评估策略后,所有的机器学习问题都可以形式化为一个最优化问题。优化问题中只有少部分问题可以得到解析解(如通过最小二乘法得到一个真实的解),很大一部分问题只能通过迭代的方式求解,其中最常用的就是梯度下降法和牛顿法。神经网络优化算法,大体都是使用了梯度下降法的框架。
梯度的概念建立在偏导数与方向导数之上。方向导数反映了函数沿某一个方向上的变化率,而梯度就是函数变化最快的那个方向。
以二维平面为例,假设有一函数,如果它的导数,那么单调递增,即减小的值就能减小的值,反之亦然。所以,将向导数相反的方向移动,就能减小。这就是梯度下降。
在机器学习中,我们的目标是优化参数,也就是找到使得loss function取值最小的那些参数值。要找到这样的值可以通过迭代的方式实现。
以一个参数为例,要求。首先要随机给定一个初始值,一般取在之间。然后计算,随后就能得到 ,其中是学习率。因为参数移动的方向是梯度的反方向,所以前面的式子中用的是减号。
如果有两个参数,问题就变成了求得。解决方法和之前相同,只不过原先求的是导数,现在求的是偏导数。首先要随机给定一个初始值,一般取在之间。然后计算,随后就能得到 。用表示梯度向量。直到为参数,停止计算。
由于上述过程计算过于复杂,为简化计算,采用随机梯度下降(Stochastic Gradient Descent)。
随机梯度下降:随机选取一个样本,计算这个样本的loss值,来更新当前的参数。这样使得更新速度变快,但是更新可能存在随机化,即不够稳定。
而梯度下降要计算完所有的样本之后才计算一个loss值,再更新参数,速度太慢了。
Mini-batch SGD
将训练样本划分成若干个batches,每一个batches都称为一个Mini-batch。一个Mini-batch里会有若干个训练样本。每个batch内计算一遍所有样本的loss值,计算完后进行一次更新;所有的Mini-batches对权重更新完后,再进行一次迭代,直到收敛。
这里的超参数包括Mini-batch size,如何减小学习率,迭代何时停止。
假设一共有个样本,每个Mini-batch里有个样本,那就一共有个Mini-batch。当参数更新完次后,这就成为一个epoch。一次epoch要将每一个样本都用完,一个epoch之后会紧接着运行下一个epoch。
当Mini-batch size=1时,就变成随机梯度下降了。
Mini-batch SGD的速度不会比随机梯度下降慢太多,同时更稳定;且batch增加了随机性,使得模型更容易跳出局部最优。
调参的过程中,会遇到的问题,比如局部最优、鞍点、平台等。为了解决这一问题,参考物理问题,在梯度下降中加入冲量(Momentum)。
此时,在原先的基础上加上,即。
此时计算如下:
假设起点是,冲量是,计算处的梯度,以及移动后的冲量。于是运动到处。然后计算计算处的梯度,以及移动后的冲量。一直到为参数,停止计算。
观察发现:
冲量实际上是梯度变换的加权和。
冲量的优化:
其中是学习率。计算如下:
也是一个超参数,一般设置为。
模型性能
欠拟合问题
上文提到过如果模型无法很好地在训练集上运作,可能要重新设计网络,但这种做法费时费力,一般会先采取别的措施:
- 选取新的**函数
- 调整学习率
- Batch Normalization
选取新的**函数
模型性能差,可能是因为在训练过程中梯度消失了,即**函数过早饱和。因此,这种情况下可以选取别的**函数。
调整学习率
由于,可见学习率也会影响到参数,是一个非常重要的超参数。
从上图可以明显看到,选取合适的学习率的重要性,若选取的太小,学习过程会变得很慢,若是太大,则有可能学不到目标值。
实验过程中,一般看不到上图,实际可见的类似下图,对下图进行分析:
从图中可以看到loss值总体一直在下降,但是下降缓慢,说明学习率的选取没有问题,但是过于小了,且loss值上下振荡很厉害,可见batch size的选取过小。
不同的学习率对于模型的影响如下:
有一种学习率的选取方法是每隔几个epoch之后减少一次学习率。训练刚开始,由于参数距离目标值尚远,可以使用较大的学习率,但是几轮epoch之后,参数值接近目标值了,此时就需要减小学习率了。一种减小方式是:。
普通的梯度下降:,其中
Adagrad:,其中与参数相关。。最终,。
Adagrad解决了不同参数下设定不同学习率的问题。
RMSProp:,,一般取或。
(可以应对更加复杂的学习率的变化问题,比如梯度大时,将学习率设置的较小,梯度小时,将学习率设置的较大。)
权重更新公式:
计算如下:
Adam:RMSProp+Momentum
Batch Normalization
Feature Scaling(数据预处理):让不同的数据的分布尽量相同。
数据归一化:对于每个数据样本,都包含个数据维度,计算每一个维度的数据的平均值和标准差。那么,对于样本的第维的数据进行操作,使得数据服从均值为,方差为的正态分布。
经过归一化后的数据再进行梯度下降,此时收敛会快很多。
Batch Normalization
每个batch都会有输出,求出它们的平均值和标准差,得到。再通过将数据经评议和所发还原到原来的scaling。和是根据计算得到,而和是通过学习得到的。这样可以减小层与层之间的影响。通常会运用在**函数前。
在测试阶段,是没有和的,理想的做法是使用的和是训练时得到的值,但实际操作中使用的是测试中求得的和的值的平均值。
优点在于:
- 减少训练时间,解决了梯度消失/爆炸等问题。
- 对初始值的依赖较少。(不太会受局部最优解影响)
- 降低对于正则化的需求。
过拟合问题
Early Stopping
及时停止训练,避免过拟合,可以在训练过程中,借助验证集来测试,如果验证集的loss值在某个点不降反升了,此时应该停止训练。
Regularization(正则化)
在原先的loss函数上增加一项正则项,即
L2正则化:,此时一般不考虑bias。
那么对应的梯度为:KaTeX parse error: Undefined control sequence: \part at position 8: \dfrac{\̲p̲a̲r̲t̲ ̲L'}{\part w}=\d…
权重的更新变成了::KaTeX parse error: Undefined control sequence: \part at position 34: …w^t-\eta\dfrac{\̲p̲a̲r̲t̲ ̲L'}{\part w}=w^…
这一项随着的增大,会无限接近。
同理,采用L1正则化:,损失函数变为
那么对应的梯度为:KaTeX parse error: Undefined control sequence: \part at position 8: \dfrac{\̲p̲a̲r̲t̲ ̲L'}{\part w}=\d…
权重的更新变成了::KaTeX parse error: Undefined control sequence: \part at position 34: …w^t-\eta\dfrac{\̲p̲a̲r̲t̲ ̲L'}{\part w}=w^…
这一项随着的增大,也会无限接近。
Dropout
训练过程中,每次更新参数的时候,每个神经元有的概率会被丢弃。因此,每修正一次参数,都会得到一个新的神经网络。
测试时,则无需再dropout。如果如果训练时dropout rate的值设为,那么测试时所有的权重都要乘以。
dropout用到了集成学习的思想,“三个臭皮匠赛过诸葛亮”。集成学习应用的就是这种想法。单个模型可能很弱,但是将这些很弱的模型结合起来求平均,最终的神经网络表现会更佳。虽然dropout的训练过程中,每个minibatch对应的网络都不相同,但都是完整网络的一个子网络。
如何选择合适的超参数
超参数是模型训练之前人为给定的一些参数,如dropout rate、学习率、batch size等。超参数定义了关于模型更高层次的概念,如模型复杂性、学习能力等。一般超参数都是根据经验来设定,因此只能通过不断地尝试,来确定某个场景下,超参数的给定值。
目前,有四种主要的策略来选取合适的超参数:
- Babysitting:完全手动调整,耗时
- Grid Search:列出每个超参数的可能取值,排列组合后测每个组合的正确率,选择正确率较高的一组数值。这种做法会面临组合爆炸的问题,即便采用并行计算,计算效率仍然很低。因此主要适用于超参数个数小于等于的场景。
- Random Search:能以更少的迭代次数找到更优的解,但是不能保证找到最优的超参数的值。
- Automatic Hyperparameter Tuning(贝叶斯优化)
过不断地尝试,来确定某个场景下,超参数的给定值。
目前,有四种主要的策略来选取合适的超参数:
- Babysitting:完全手动调整,耗时
- Grid Search:列出每个超参数的可能取值,排列组合后测每个组合的正确率,选择正确率较高的一组数值。这种做法会面临组合爆炸的问题,即便采用并行计算,计算效率仍然很低。因此主要适用于超参数个数小于等于的场景。
- Random Search:能以更少的迭代次数找到更优的解,但是不能保证找到最优的超参数的值。
- Automatic Hyperparameter Tuning(贝叶斯优化)
除了第一种是人工调参,后三种都是机器调参。