Deep Learning Specialization课程笔记——正则化和最优化
Machine Learning Application
本周学习如何在实际运用中使神经网络高效工作。
训练神经网络,你必须做很多决定:神经网络多少层?每层多少隐藏单元?学习速率多少?用什么**函数?而这些超参数并不常常一次性猜中,所以需要idea->code->experiment的不断循环。
关于测试集大小问题:当数据量巨大时,测试集所占比例可以变小(如30%->10%)
另一个准则是:尽可能确保开发集(Dev sets,交叉验证集)和测试集数据分布相同。这样能更好的加快算法进步速度。
之后讲了“偏差-方差困境(偏差-方差均衡)”,这个之前比较熟悉,不赘述。
若train set error和dev set error都大,是欠拟合,高偏差;
若train set error小,dev set error大,是过拟合,高方差。
下图的紫色线条显示了一种既高偏差,又高方差的情况:
High bias解决办法:bigger network,train longer,change NN architecture;
High variance解决办法:more data,regularization,change NN architecture。
Regularization
正则化是解决过拟合的一个可靠办法。
那么我们来看正则化是如何生效的?
以逻辑回归为例:J为最小化代价函数,lamda为正则化参数,该函数是每一个训练样本的预测损失之和。公式为:
那么为什么只对w进行正则化,而不对b这样呢?
答:也可以这样,但实际问题中w往往是高维参数矢量,而b是单数字,实际上不会起太大作用。
那么在神经网络中呢?这时||w||^2不再叫做第二范数,而被称为“Frobenius norm”,它表示矩阵中元素的平方和。
那么是如何进行梯度下降的呢?
我们知道,在添加正则项之前,使用的方法是在后向传播中求dw=dJ/dw,之后对w进行更新。
那么在添加了正则项之后,相当于求导时加上了lamda/m*w^[l]项,如下图所示:
由于dw的值会变大,所以w的值会变得更小,可以起到权重衰减的作用。
那么为什么正则化可以防止过拟合?
一个直观的理解是:当把正则项设的很大时,权重矩阵w会被设置的接近0,相当于把很多隐藏单元的权重设置的接近0,而导致这些隐藏单元的影响被消除了,使得神经网络得到了简化。
或者说,如果w很小,会使得z=w*a+b很小,在g(z)=tanh(z)中为线性函数,整个网络接近线性网络,不能计算很复杂的非线性函数,因此就不大容易发生过拟合。
接下来介绍dropout regularization(随机失活正则化),它是除了L2正则化以外,另一种非常强大的正则化技术。
它指的是:我们网络中的每一层,对每一个节点做一次公平投币,使得这个节点有50%的几率被保留,50%的几率被丢弃。
这里展示随机失活中最常用的一种:inverted dropout(反向随机失活)
其中keep.prob表示给定隐藏单元将被保留的概率值,d3是对a3中的值随机选取其中的keep.prob置true,其余(1-keep.prob)置false,第二步对a3进行更新,第三步是为了提供(1-keep.prob)的校正值,从而不改变a3的期望值:
要注意的是在测试阶段不使用随机算法,因为这时并不想让输出也是随机的,只会为预测增加噪声。
在dropout中,可以为每一层设置不同的留存率,也可以为输入设置留存率,舍弃掉一些输入项,但实际操作中,通常取输入项留存率为1。
除了L2和dropout以外,还可以使用其他的方法减少过拟合,包括:
增加训练数据:比如把图片水平翻转,随机裁剪,扭曲变换(在不改变图片信息本质,如猫的图片 的前提下),这些额外的伪训练样本增加的信息量不如随机样本,但这是一个廉价的方式(只需要一些计算代价)。
early stopping:在神经网络表现最好的那次迭代附近停止。
原因是刚开始迭代时w接近0(随机初始化),之后w开始变大,这时要求在一个不大不小的w处终止。
Early stopping的一个很大的缺点:对于一个算法,我们希望能够优化成本函数J,然后避免过拟合。这是两项完全不同的任务,early stopping没有办法分开解决这两个问题。
Optimization
训练神经网络时,有一种加速训练的方法是对输入进行归一化(normalization),这包含两个步骤:1.均值归0;2.方差归一化。
为什么要归一化呢?不然代价函数可能会出现左边的情况,梯度下降只能使用小的学习率:
对于权重指数w,若其值皆大于1,那么在一个非常深的网络,**函数就会爆炸;若小于1,**函数则会指数级的减少。
初始化单个神经元,其中左边是ReLu的形式:
梯度检验(Grad check):