目录
机器学习基础
训练_开发_测试集
在训练神经网络时,我们需要作出很多决策,如神经网络的层数、每层的隐藏单元数、学习率和各层采用的激活函数等超参数,我们可以编码实现自己初始的想法,根据实验效果改进这些超参数,不断循环迭代,直到构建出一个性能优良的神经网络。
一般把数据集分成三部分:训练集、验证集(交叉验证集)和测试集。训练集用于训练算法或模型;验证集用于模型选择,选择一个最优的模型(对应一组最优的超参数配置);最后用测试集无偏评估算法的运行状况。
在机器学习的小数据时代,常见的做法是将数据集三七分,即70%作为训练集、30%作为测试集或者六二二分。而在大数据时代,数据集的规模一般比较大(百万级以上),一般会把把98%的数据作为训练集,1%用来验证,剩下1%用来测试。
注意:
- 可以没有测试集,测试集主要提供对最后选定模型的无偏评估。如果不需要无偏评估,那就可以不需要设置测试集;
- 如果有测试集,一定要确保验证集和测试集来自同一分布。
偏差/方差
一般通过训练误差和验证误差这两个指标来判断偏差/方差:当训练误差和最优误差相差比较大时,则出现了高偏差,也称欠拟合;当训练误差和验证误差相差比较大时,则出现了高方差(过拟合)。
高偏差/高方差解决方案:
- 解决高偏差问题:采用更“大”的神经网络(增加隐层数和隐层单元数)、训练更长时间和采用不同的网络结构(不一定有效)等;
- 解决高方差问题:增加更多的数据、正则化和采用不同的网络结构(不一定有效)等。
通过循环迭代,再依次判断高偏差/高方差问题,直到得到一个低偏差和低方差的模型。
注意:
- 解决高偏差和高方差对应的两种解决方案不一样,明确出现的具体问题有利于我们选出最有效的方法;
- 现在的深度学习时代,我们有很多工具可以做到在减少偏差或方差的同时不对另外一方产生过多的不良影响,这是为什么我们不需要考虑偏差/方差权衡的重要原因。
正则化
L2正则化
- 逻辑回归中的正则化
其中是正则化系数,一般只对参数w(权重)进行正则化,因为w通常是一个高维参数矢量,几乎涵盖所有的参数。
- 神经网络中的正则化
与逻辑回归类似,在原代价函数的基础上加上L2正则化项,其中为权重矩阵中每个元素的平方和。
L2正则化也被叫做权重衰减。加入L2正则化项后,在进行梯度下降时,相当于把先乘以,再减去之前不加正则化时反向传播计算的梯度,这样会使权重参数相对变得更小。
- L2正则化可以减少过拟合的原因
当正则化系数增加到足够大时,,此时就近似于只有一个隐藏单元起作用,神经网络的结构就会大大简化,虽然深度还在,但会无限接近于逻辑回归算法,就可能会产生高偏差现象(实际上,这种消除隐藏单元影响的情况是不会出现的,隐藏单元还会在,只不过影响较小了,神经网络结构变得更简单了);而当非常小时,此时相当于不做正则化,神经网络结构非常复杂,就可能产生高方差(过拟合)现象。因此,此时就会存在一个适中的取值,可以简化网络结构,减少过拟合。如果设置一个合适的将会达到一个理想的分类效果。
Dropout正则化
dropout正则化:在一次前向传播中,通过遍历神经网络中的每个节点,并且每个节点都以“掷硬币”的方式设置一定的概率决定保留还是消除,消除的节点会连同它的所有连线(参数)都从原结构中“消失”,最后得到一个节点更少、规模更小的网络结构。在反向传播时也只更新简化后结构中的参数。对于每个样本,我们都采用精简后的神经网络来训练它。
- Inverted Dropout(反向随机失活):dropout正则化最常用的方法
Dl = np.random.rand(Al.shape) < keep_prob
Al *= D1 #对应位置元素相乘
Al /= keep_prob #反向随机失活
Dl是一个与Al同维(第l层的单元数乘以样本数m)的矩阵。Dl的元素随机初始为0-1之间的浮点数,设置一个保留概率keep_prob,如果keep_prob=0.8,Dl中会有20%的元素为0;然后将第l层的激活输出Al与Dl对应位置元素相乘,作用就是设置0元素,这样会使20%的节点消失;最后Al要除以keep_prob,这样可保证Al的期望大体不变,弥补消失节点的损失。
- 理解Dropout
dropout正则化与L2正则化类似,都能简化网络结构。在实施dropout后,有一些输入特征会被随机清除,也就是说它不能完全依靠其中的任何一个特征,所以不会把某一个输入单元的权重设置的很大,相反而是把权重值分散,起到收缩权重的平方范数的结果。
对于一个复杂的神经网络,我们会对每一层设置一个keep_prob值。通常对于输入层keep_prob通常为1或者接近于1,如0.90;如果觉得某一层更容易出现过拟合,比如参数较多,就可以把该层的keep_prob设置的小一些,其他层大一些,但这样在交叉验证时,会需要搜索更多超参数;另一种方案是在某些容易出现过拟合的层上使用dropout,而另一些层不用,这样就只有一个超级参数keep_prob.
dropout在计算机视觉中应用非常频繁,因为计算机视觉中输入量非常大,但是在其他领域用得比较少。
Dropout缺点:由于每次迭代都会随机移除一些节点,所有代价函数J不再有明确的定义,所以不能应用梯度检验或代价函数随迭代次数的变化曲线进行调试。一般,先关闭dropout(keep_prob=1),再进行梯度检验或绘制曲线进行调试,如果梯度检验没有问题或代价函数J随迭代次数单调递减,再打开dropout。
其它正则化方法
- 数据增强
可以通过扩展训练集来解决过拟合问题,但是额外增加训练集有时候成本会很高,也很耗时。所以我们一般会选择通过数据增强的方式来增加训练集,如下图所示,我们可通过随机翻转图片、随意裁剪图片(要保证裁剪完后还是原来的物品)等方式增加训练集。
- Early Stopping
在使用梯度下降法时,通过绘制出训练集误差和验证集误差随迭代次数的变化曲线,我们通常会发现验证集误差先呈现下降趋势,然后在某个节点后上升,Early stopping就是在验证集误差开始变大的节点处提前停止训练。
原理:当我们还未在神经网络上运行太多迭代过程的时候,参数W接近于0,因为随机初始化参数W的值可能都是较小的随机值;在经过多次迭代和训练后,参数W会越来越大。所以Early stopping要做的就是在中间点停止迭代过程,选择一个范数较小的参数W,与L2正则化类似选择参数W范数较小的神经网络来减少过拟合。
缺点:机器学习问题一般包括利用优化算法(梯度下降或高级优化算法)最小化代价函数J和减少模型的过拟合(正则化、数据增强等)两个步骤。我们一般可以独立考虑这两个问题,用一组工具来优化代价函数,此时只考虑参数W、b,使得代价函数越小越好,其他不关注;用另一组工具来减少过拟合,会使问题变得简单。但是用Early stopping我们就不能独立考虑这两个问题,因为提早终止梯度下降,也就停止了优化代价函数J,这就造成代价函数的值不够小,同时又希望不要出现过拟合。所以我们只是用一种方法同时解决两个问题,这样会使要考虑的东西变得复杂。
如果不使用Early stopping,可以采用L2正则化。训练神经网络的时间就可能更长,这会使超参数空间更容易分解和搜索,但我们必须尝试大量的取值,导致搜索大量值的计算代价太高。而Early stopping仅需运行一次梯度下降过程,就可以找出W的较小值中间值和较大值,不用像L2正则化那样尝试许多值。
加快神经网络训练
归一化输入
- 归一化输入的步骤
- 零均值化:对特征向量每一维求均值,每一维减去各自均值;
- 归一化方差:对特征向量每一维求方差,把所有数据都除以。
注意:如果对训练集进行规范化,测试集也要进行同样的规范化操作。对测试集进行规范化时,使用规范化训练集时计算出来的的均值和方差。
- 归一化原因
对于代价函数,如果w和b都是实数,如果不归一化输入,输入特征向量x各个维度的取值范围可能相差很大,此时代价函数的轮廓图会比较狭长,在使用梯度下降法优化代价函数时,需要一个较小的学习率,经过多次迭代才能达到最小值。相反地,如果归一化输入,代价函数图像会比较对称,此时会得到一个更圆的球形轮廓,在使用梯度下降法优化代价函数时,无论从哪个位置开始,都能直接找到最小值,可以在梯度下降法中设置一个较大的步长,而不用像之前那样反复迭代。
神经网络的权重初始化
- 梯度消失和梯度爆炸问题
如下图所示,假如我们正在训练一个很深的神经网络,先不考虑偏置参数b,当初始化权重矩阵比单位矩阵I(对角矩阵)略大时,神经网络的输出将爆炸式增长,而深度学习的神经网络的激活函数输出也将爆炸式增长;当初始化权重矩阵比单位矩阵I(对角矩阵)略小时,神经网络的输出将呈指数级减小,而深度学习的神经网络的激活函数输出也将指数级下降。对于反向传播中的梯度来说,跟前向传播一样也会呈现指数增加或减小,从而导致训练非常困难,尤其是当梯度和L相差指数级,梯度下降法的步长会非常小,梯度下降法需花费很长时间来学习。
- 合理初始化权重参数
对于梯度爆炸/消失问题有一个不完整的解决方案,合理地初始化权重参数矩阵,使其既不远大于单位矩阵I也不远小于单位矩阵I,从而减缓二者的产生。
对于tanh激活函数,权重参数一般首先初始化为的矩阵,矩阵中的值服从标准高斯分布,如下图所示:
对于Relu激活函数,一般初始化权重矩阵后再乘以(为输入单元数量),此时权重参数的方差为 2 / n
在一些论文中,也可以见到初始化权重矩阵后再乘以
梯度检验
梯度的数值逼近
对梯度进行数值逼近,将梯度近似值和实际计算的梯度进行比较,从而检查反向传播计算的梯度是否正确。
对于单边公差,误差为,而对于双边公差,误差为。由此可见,双边公差比单边公差的误差小,而且二者的计算代价几乎一样,所以实际进行梯度检验时使用的是双边公差作为梯度的近似值。
梯度检验工作原理
通过梯度检验,可以帮我们发现backprop实施过程中的bug,从而节省大量时间。
1)首先把神经网络的所有参数拉伸为一个大的向量,所有参数的梯度拉伸为一个大的向量
2)然后用双边公差计算参数的近似梯度,得到一个与同维的向量
3)最后比较和
实施梯度检验的技巧和注意事项
1)不要在训练中使用梯度检验(梯度检验计算参数梯度非常慢),它只用于调试;
2)如果梯度检查失败,要检查每一项并试着找出bug;
3)执行梯度检验时,如果使用了正则化,一定要包括正则项;
4)梯度检验不能和dropout同时使用。dropout会使一些节点随机失活,很难计算代价函数。一般先关闭dropout(keep_prob=1),然后进行梯度检验,无误后再打开dropout;
5)在随机初始化过程中,运行梯度检验(不常用)。