选择超参数

有两种选择超参数的方法:

手动选择。手动选择超参数需要了解超参数做了些什么,以及机器学习模型如何才能取得良好的泛化
自动选择。自动选择超参数算法不需要你了解超参数做了什么以及机器学习模型如何才能取得零号的泛化,但是它往往需要更高的计算成本.
手动设置超参数:

我们必须了解超参数、训练误差、泛化误差、计算资源(内存和运行时间) 之间的关系。这要求我们切实了解一个学习算法有效容量的基本概念

手动搜索超参数的任务是:在给定运行时间和内存预算范围的条件下,最小化泛化误差
我们不讨论超参数对于运行时间和内存的影响,因为它们高度依赖于平台
手动搜索超参数的主要目标是:调整模型的有效容量以匹配任务的复杂性
模型的有效容量受限于三个因素:
模型的表示容量。更多的网络层、每层更多的隐单元的模型具有更大的容量(能表达更复杂的函数)
学习算法成功最小化训练模型代价函数的能力
训练过程正则化模型的程度
模型的表示容量并不是越高越好。如果无法找到合适的代价函数来最小化训练代价、或者正则化项排除了某些合适的函数,那么即使模型的表达能力再强,也无法学习出合适的函数。
如果以超参数为自变量,泛化误差为因变量。那么会在的曲线通常会表现为 U 形。在某个极端情况下,超参数对应着低容量(并不是超参数越小,模型容量越低;也可能是相反的情况)。此时泛化误差由于训练误差较大而很高。这就是欠拟合。在另一个极端情况下,超参数对应着高容量,此时泛化误差也很大。这就是过拟合。过拟合中,泛化误差较大的原因是:虽然此时训练误差较小,但是训练误差和测试误差之间的差距较大。最优的模型容量位于曲线中间的某个位置。
对于某些超参数,当超参数值太大时,会发生过拟合。如中间层隐单元的数量,数量越大,模型容量越高,也更容易发生过拟合。
对于某些超参数,当超参数值太小时,也会发生过拟合。如 正则化L2的权重系数,系数为0,表示没有正则化,此时很容易过拟合
并不是每个超参数都对应着完整的 U 形曲线
很多超参数是离散的,如中间层隐单元的数量,或者 maxout单元中线性片段的数目
有些超参数甚至是二值的。如是否决定对输入特征进行标准化这个布尔值的超参数
有些超参数可能有最小值或者最大值
学习率可能是最重要的超参数
如果你只有时间来调整一个超参数,那么就调整学习率
相比其他超参数,学习率以一种更复杂的方式控制模型的有效容量:
当学习率大小适当时,模型的有效容量最高
当学习率过大时,梯度下降可能会不经意地增加而非减少训练误差。在理想的二次情况下,如果学习率是最佳值的两倍时,会发生这种情况。当学习率太小时,训练不仅会很慢,还有可能永久停留在一个很高的训练误差。对于这种情况我们知之甚少(但是我们可以知道这种情况不会发生在一个凸损失函数中)学习率关于训练误差具有 U 形曲线。泛化误差也是类似的 U 形曲线,但是正则化作用在学习率过大或者过小处比较复杂。
调整学习率以外的其他参数时,需要同时监测训练误差和测试误差,从而判断模型是否过拟合或者欠拟合,然后适当调整其容量
如果训练集错误率大于目标错误率(这个根据任务背景人工指定),那么只能增加模型容量以改进模型。但是这增加了模型的计算代价
如果测试集错误率大于目标错误率,则有两个方法:
如果训练误差较小(这说明模型容量较大),则表明测试误差取决于训练误差与测试误差之间的差距。要减少这个差距,我们可以改变正则化超参数,以减少有效的模型容量
如果训练误差较大(者说明模型容量较小),那么也只能增加模型容量以改进模型
常最佳性能来自于正则化很好的大规模模型,如使用Dropout的神经网络
选择超参数_第1张图片
自动超参数优化算法
理想的学习算法应该是只需要输入一个数据集,然后就可以输出学习的函数而不需要人工干预调整超参数

一些流行的算法如逻辑回归、支持向量机,其流行的部分原因是:这类算法只需要调整一到两个超参数,而且性能也不错
某些情况下,神经网络只需要调整少量的超参数就能达到不错的性能;但是大多数情况下需要调整更多的超参数
原则上可以开发出封装了学习算法的超参数优化算法,并自动选择其超参数

超参数优化算法往往有自己的超参数(如每个超参数的取值范围),这将问题变得更复杂
我们可以人工选择参数优化算法这一级的超参数,因为这一级的超参数通常更容易选择
当只有三个或者更少的超参数时,常见的超参数搜索方法是:网格搜索

对于每个超参数,选择一个较小的有限值集合去搜索
然后这些超参数笛卡尔乘积得到多组超参数
网格搜索使用每一组超参数训练模型,挑选验证集误差最小的超参数作为最好的超参数
如何确定搜索集合的范围?

如果超参数是数值,则搜索集合的最小、最大元素可以基于先前相似实验的经验保守地挑选出来
如果超参数是离散的,则直接使用离散值
通常网格搜索会在对数尺度下挑选合适的值

通常重复进行网格搜索时,效果会更好。假设在集合 {-1,0,1}上网格搜索超参数

如果找到的最佳值是 1,那么说明我们低估了 的取值范围。此时重新在 {1,2,3} 上搜索
如果找到的最佳值是 0,那么我们可以细化搜索范围以改进估计。此时重新在 {-0.1,0,0.1} 上搜索
网格搜索的一个明显问题时:计算代价随着超参数数量呈指数级增长。
如果有 m个超参数,每个最多取 n个值,那么所需的试验数将是n的m次方 。虽然我们可以并行试验,但是指数级增长的计算代价仍然不可行。
随机搜索比网格搜索更快的找到良好超参数的原因是:没有浪费的实验

在网格搜索中,两次实验之间只会改变一个超参数 (假设为 )的值,而其他超参数的值保持不变。如果这个超参数 的值对于验证集误差没有明显区别,那么网格搜索相当于进行了两个重复的实验

在随机搜索中,两次实验之间,所有的超参数值都不会相等(因为每个超参数的值都是从它们的分布函数中随机采样而来)。因此不大可能会出现两个重复的实验

如果 超参数与泛化误差无关,那么不同的 值:

在网格搜索中,不同 值、相同的其他超参数值,会导致大量的重复实验
在随机搜索中,其他超参数值每次也都不同,因此不大可能出现两个重复的实验(除非所有的超参数都与泛化误差无关)

拟合极小的数据集:

当训练集上有很大的误差时,我们需要确定问题是欠拟合,还是软件错误。尝试对一个小数据子集进行训练,然后确保能达到 0 的损失值。

通常即使是极小模型也能保证很好的拟合一个足够小的数据集。如只有一个样本的分类数据,它可以通过正确设置输出层的偏置来拟合
如果分类器不能正确标定一个单样本组成的训练集、自编码器无法成功再现一个单独的样本、生成模型无法一致的生成一个单独的样本,那么很有可能是由于软件错误
这种测试可以推广到少量样本的小数据集上,不一定是只有一个样本的数据集
进行这个训练时,最好让正则化强度为0,不然它会阻止得到0的损失
如果不能通过这个检验,那么训练过程有问题。此时进行整个数据集的训练是没有意义的;如果能通过这个检验,那么也不保证训练过程没问题
在训练神经网络时,应该跟踪多个重要数值

这些数值输出的图表是观察训练进程的一个窗口,是直观理解不同超参数设置效果的工具

通常 轴都是以周期 epoch 为单位,它衡量了训练中每个样本数据都被观察过次数的期望

一个周期表示每个样本数据都被观察过了一次
不要使用迭代次数。因为迭代次数与数据的 batch size 有关。而 batch size 可以任意设置
第一个要跟踪的数值就是损失函数
从左图中可见:

过低的学习率(蓝色曲线)导致算法的损失函数下降近似线性的
稍高一些的学习率(红色曲线) 会导致算法的损失函数看起来呈几何指数下降
更高一些的学习率(绿色曲线)会让损失函数下降的更快,但是它使得损失函数停留在一个较高的水平位
异常高的学习率(黄色曲线)会让损失函数上升
从右图可见:

损失函数值曲线看起来比较合理,但是 batch size 可能有点小。因为损失值的噪音很大
损失值的震荡程度和 batch size 有关。当 batch size=1 时,震荡会相对较大;而 batch size 为整个数据集大小时,震荡最小。因为每个梯度更新都是单调的优化损失函数
在训练分类器时,第二个要跟踪的就是验证集和训练集的准确率。从该图标可以获知模型过拟合的程度
训练集准确率和验证集准确率之间的空隙指明了模型过拟合的程
蓝色的验证集曲线相对于训练集,验证集的准确率低了很多。这说明模型有很强的过拟合。此时应该增大正则化强度或者收集更多的数据
绿色的验证集曲线和训练集曲线如影随形,说明你的模型容量还不够大,发生了欠拟合。此时应该通过增加参数数量让模型更大一些。
另一个应该跟踪的数值是:权重更新的相对值

假设权重为 w,更新的增量为 w^。 l为学习率。那么权重更新的相对值为
w^/w这里的梯度是一个更新的梯度。如果多个 batch ,则每个 batch 更新一次就计算一次
这个比例 应该在 10e-3左右。如果更低,说明学习率可能太小;如果更高,说明学习率可能太高
一个不正确的初始化可能让学习过程变慢,甚至停止。这个问题可以比较简单的诊断出来
输出网络中所有层的激活数据和梯度分布的柱状图
如果看到任何奇怪的分布,都不是好兆头。如;对于使用 tanh 的神经元,我们应该看到激活数据的值在整个 [-1,1] 区间都有分布。如果看到神经元的输出都是0,或者都在饱和部分,那么就有问题
如果数据是图像像素数据,那么把第一层特征可视化会有帮助
左图的特征充满了噪音,这暗示网络可能出现问题:网络没有收敛 、学习率设置不当、正则化惩罚的权重过低
右图特征不错,平滑、干净、种类繁多。说明训练过程良好

常见数据预处理方式:(红色的线指出各维度的数值范围)

data_process1

均值减法:对数据中每个独立特征减去均值,集合上理解为:在每个维度上,都将数据云的中心迁移到原点

归一化:将所有维度都做归一化:

第一种做法:先对数据做零中心化处理,然后每个维度都除以标准差
第二种做法:每个维度都做归一化,使得每个维度最大和最小值都是 1 和 -1
PCA 降维:取得数据的主成分,可以对数据去除相关性

白化whitening:先对数据进行旋转(旋转的矩阵就是 SVD 分解中的 U矩阵),然后对每个维度除以特征值(为防止分母为0,通常加一个很小的值作为平滑系数)来对数值范围进行归一化

如果数据服从多变量的高斯分布,则白化之后,数据的分布是一个均值为零,且协方差相等的矩阵
该变换的缺点是:可能会放大数据中的噪声。因为它将所有维度都拉伸到相同的维度,这包括了那些大多数是噪声的维度。这个问题可以采用更强的平滑系数来解决
data_process2

实际在神经网络中,并不会采用 PCA 和白化。

任何预处理策略都只能在训练集的数据上进行,然后再应用到验证集或测试集上。

如数据均值:首先分成训练集、验证集、测试集,从训练集中求数据的均值。然后训练集、验证集、测试集中的数据减去这个均值。 而不是减去测试集均值或者验证集均值
激活函数:当前推荐使用 ReLU 激活函数

Batch Normalization:让数据在通过激活函数之前,添加一个 batch normalization
权重一定不能全零初始化。因为这会导致神经元在前向传播中计算出同样的输出,然后在反向传播中计算出同样的梯度,从而进行同样的权重更新。这就产生了大量对称性神经元。

通常采用小随机数初始化,通过这样来打破对称性。至于使用高斯分布还是均匀分布,对结果影响很小。

之所以用小的随机数,是因为:如果网络中存在tanh 或者 sigmoid 激活函数,或者网络的输出层为sigmoid 等单元,则它们的变量值必须很小。

如果使用较大的随机数,则很有可能这些单元会饱和,使得梯度趋近于零。这意味着基于梯度下降的算法推进的很慢,从而学习很慢。

如果网络中不存在sigmoid/tanh 等激活函数,网络的输出层也不是sigmoid 等单元,则可以使用较大的随机数初始化。
通常使用根号1/n校准权重初始化标准差。随着输入数据的增长,随机初始化的神经元的输出数据的分布中的方差也在增大。
通常将偏置初始化为0。这是因为随机小数值权重已经打破了对称性

你可能感兴趣的:(机器学习)