1. 偏差与方差:
(1)欠拟合:假设这就是数据集,如果给这个数据集拟合一条直线,可能得到一个逻辑回归拟合,但它并不能很好地拟合该数据,这是高偏差(high bias)的情况,我们称为“欠拟合” (underfitting)。
(2)过拟合:相反的如果我们拟合一个非常复杂的分类器,比如深度神经网络或含有隐藏单元的神经网络,可能就非常适用于这个数据集,但是这看起来也不是一种很好的拟合方式,分类器方差较高(high variance),数据过度拟合(overfitting)。
(3)适度拟合:在两者之间,可能还有一些像图中这样的,复杂程度适中,数据拟合适度的分类器,这个数据拟合看起来更加合理,我们称之为“适度拟合”(just right)是介于过度拟合和欠拟合中间的一类。
(4)注意点:高偏差和高方差是两种不同的情况,后续要尝试的方法也可能完全不同,通常会用训练验证集来诊断算法是否存在偏差或方差问题,然后根据结果选择尝试部分方法;但在当前的深度学习和大数据时代,只要持续训练一个更大的网络,只要准备了更多数据,那么也并非只有这两种情况,我们假定是这样,那么,只要正则适度,通常构建一个更大的网络便可以,在不影响方差的同时减少偏差,而采用更多数据通常可以在不过多影响偏差的同时减少方差。
2. L2正则化
(1)深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有助于避免过拟合或减少你的网络误差。
(2)L2正则化:相当于给矩阵W乘以小于1的系数,因此𝐿2范数正则化也被称为“权重衰减”; L2正则化表示一个矩阵中所有元素的平方和,选用𝐿1正则化会使模型变得稀疏,因为得到的是比例常量,也就是说w向量中有很多0。
(3)正则化参数𝜆:通常使用验证集或交叉验证集来配置这个参数,尝试各种各样的数据,寻找最好的参数,要考虑训练集之间的权衡,把参数设置为较小值,这样可以避免过拟合,所以 λ 是另外一个需要调整的超级参数。
(4)减少过拟合的原因:如果正则化𝜆设置得足够大,权重矩阵𝑊被设置为接近于 0 的值,直观理解就是把多隐藏单元的权重设为 0,于是基本上消除了这些隐藏单元的许多影响。如果是这种情况,这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单元,可是深度却很大,它会使这个网络从过度拟合的状态更接近高偏差状态。直觉上认为大量隐藏单元被完全消除了,其实不然,实际上是该神经网络的所有隐藏单元依然存在,但是它们的影响变得更小了。 如果正则化参数变得很大,参数𝑊很小,𝑧也会相对变小,此时忽略𝑏的影响,𝑧会相对变小,实际上,𝑧的取值范围很小,这个激活函数会相对呈线性,整个神经网络会计算离线性函数近的值,这个线性函数非常简单,并不是一个极复杂的高度非线性函数,不会发生过拟合。
3. Dropout正则化(随机失活)
(1)dropout 会遍历网络的每一层,并设置消除神经网络中节点的概率。假设网络中的每一层,每个节点都以抛硬币的方式设置概率,每个节点得以保留和消除的概率都是 0.5,设置完节点概率,我们会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络,然后用 backprop 方法进行训练。
(2)在测试阶段不使用 dropout,因为在测试阶段进行预测时,我们不期望输出结果是随机的,如果测试阶段应用 dropout 函数,预测会受到干扰。
(3)减少过拟合的原因: 不依赖于任何一个特征,因为该单元的输入可能随时被清除,因此该单元通过这种方式传播下去,并为单元的输入增加一点权重,通过传播所有权重,dropout 将产生收缩权重的平方范数的效果,和之前讲的𝐿2正则化类似;实施 dropout 的结果使它会压缩权重,并完成一些预防过拟合的外层正则化;𝐿2对不同权重的衰减是不同的,它取决于激活函数倍增的大小。总结一下,dropout 的功能类似于𝐿2正则化,与𝐿2正则化不同的是应用方式不同会带来一点点小变化,甚至更适用于不同的输入范围。
(4)适用性:计算视觉中的输入量非常大,输入太多像素,以至于没有足够的数据,所以dropout 在计算机视觉中应用得比较频繁,但要牢记一点,dropout 是一种正则化方法,它有助于预防过拟合,因此除非算法过拟合,不然是不会使用 dropout 的,所以它在其它领域应用得比较少,主要存在于计算机视觉领域,因为通常没有足够的数据,所以一直存在过拟合。
(5)缺点:代价函数𝐽不再被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。定义明确的代价函数𝐽每次迭代后都会下降,因为所优化的代价函数 J 实际上并没有明确定义,或者说在某种程度上很难计算,所以我们失去了调试工具来绘制这样的图片。
4. 其它正则化方法
(1)数据扩增:如果扩增数据代价高,而且有时候无法扩增数据,但我们可以通过添加这类图片来增加训练集,例如随意翻转图片和裁剪图片。
(2)early stopping:是在中间点停止迭代过程,我们得到一个𝑤值中等大小的范数,与𝐿2正则化相似,选择参数𝑤范数较小的神经网络。主要缺点就是你不能独立地处理问题,因为提早停止梯度下降,也就是停止了优化代价函数𝐽,因为现在你不再尝试降低代价函数𝐽,所以代价函数𝐽的值可能不够小,同时你又希望不出现过拟合,你没有采取不同的方式来解决这两个问题,而是用一种方法同时解决两个问题,这样做的结果是我要考虑的东西变得更复杂。如果不用 early stopping,另一种方法就是𝐿2正则化,训练神经网络的时间就可能很长。我发现,这导致超级参数搜索空间更容易分解,也更容易搜索,但是缺点在于,你必须尝
试很多正则化参数𝜆的值,这也导致搜索大量𝜆值的计算代价太高。Early stopping 的优点是,只运行一次梯度下降,你可以找出𝑤的较小值,中间值和较大值,而无需尝试𝐿2正则化超级参数𝜆的很多值。
5. 归一化输入:
这是一个非常细长狭窄的代价函数,但如果特征值在不同范围,假如𝑥1取值范围从 1 到 1000,特征𝑥2的取值范围从 0 到 1,结果是参数𝑤1和𝑤2值的范围或比率将会非常不同,这些数据轴应该是𝑤1和𝑤2,但直观理解,我标记为𝑤和𝑏,代价函数就有点像狭长的碗一样,如果你能画出该函数的部分轮廓,它会是这样一个狭长的函数。
然而如果你归一化特征,代价函数平均起来看更对称,如果你在上图这样的代价函数上运行梯度下降法,你必须使用一个非常小的学习率。梯度下降法可能需要多次迭代过程,直到最后找到最小值。但如果函数是一个更圆的球形轮廓,那么不论从哪个位置开始,梯度下降法都能够更直接地找到最小值,你可以在梯度下降法中使用较大步长,而不需要反复执行。
6. 优化算法:
(1)Mini-batch梯度下降:适用于训练集较大的情况,可以提高数据处理的速度。把训练集分割为小一点的子集训练,这些子集被取名为 mini-batch,假设每一个子集中只有 1000 个样本,那么把其中的𝑥(1)到𝑥(1000)取出来,将其称为第一个子训练集,也叫做 mini-batch,然后你再取出接下来的 1000 个样本,从𝑥(1001)到𝑥(2000),然后再取1000 个样本,以此类推。
(2)指数加权平均数:
(3)动量梯度下降法:运行速度几乎总是快于标准的梯度下降算法,基本的想法就是计算梯度的指数加权平均数,并利用该梯度更新权重。能够最小化碗状函数,微分项提供了一个加速度,动量梯度项相当于速度。
(4)RMSprop:
可以控制在w和b的方向迭代的速度,达到期待的速度。
(5)Adam优化算法:Adam 优化算法基本上就是将动量梯度下降算法和 RMSprop 结合在一起,是一种及其常用的学习算法,被证明能有效适用于不同的神经网络,适用于广泛的结构。
7. 学习率衰减:
(1)加快学习算法的一个办法就是随时间慢慢减少学习率,就是学习率衰减。当采用的学习率是固定值时,下降朝向最小值,但是不会精确地收敛,所以算法最后在最小值附近大幅度摆动,并不会真正收敛。但要慢慢减少学习率𝑎的话,在初期的时候,𝑎学习率还较大,你的学习还是相对较快,但随着𝑎变小,你的步伐也会变慢变小,所以最后在最小值附近的一小块区域里摆动,而不是在训练过程中,大幅度在最小值附近摆动。所以慢慢减少𝑎的本质在于,在学习初期,你能承受较大的步伐,但当开始收敛的时候,小一些的学习率能让你步伐小一些。
(2)有指数下降和离散下降
(3)众多超参数需要调试,要为超参数选择合适的范围
8. Softmax分类器:不局限于二分类,输出层添加一个矩阵,再进行归一化,概率最大的则是哪一类。
9. TensorFlow:深度学习编程框架,只需要基本实现前向传播,内置反向传播和梯度计算 (pythorn)