1 正则化(Regularization)
深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据。在逻辑回归函数中加入正则化,只需添加参数 λ,λ是正则化参数,我们通常使用验证集或交叉验证集来配置这个参数,尝试各种各样的数据,寻找最好的参数,我们要考虑训练集之间的权衡,把参数设置为较小值,这样可以避免过拟合,所以 λ 是另外一个需要调整的超级参数。
λ/2m乘以w范数的平方,w欧几里德范数的平方等于wj(j 值从 1 到nx)平方的和,也可表示为wTw,也就是向量参数w的欧几里德范数(2 范数)的平方,此方法称为L2正则化。因为这里用了欧几里德法线,被称为向量参数w的L2范数.为什么只正则化参数w?为什么不再加上参数 b呢?因为w通常是一个高维参数矢量,已经可以表达高偏差问题,w可能包含有很多参数,b只是众多参数中的一个,所以我通常省略不计,如果你想加上这个参数,完全没问题。L2正则化是最常见的正则化类型,还有L1正则化,如果用的是L1正则化,w最终会是稀疏的,也就是说w向量中有很多 0,有人说这样有利于压缩模型,因为集合中参数均为 0,存储模型所占用的内存更少,实际上,虽然L1正则化使模型变得稀疏,却没有降低太多存储内存,人们在训练网络时,越来越倾向于使用L2正则化,在 Python 编程语言中,λ是一个保留字段,编写代码时,我们删掉a,写成lambd,以免与 Python 中的保留字段冲突,这就是在逻辑回归函数中实现L2正则化的过程。
神经网络含有一个成本函数,该函数包含w[1],b[1]到w[l],b[l]所有参数,字母L是神经网络所含的层数,因此成本函数等于m个训练样本损失函数的总和乘以 1/m,正则项为,我们称||w[l]||2为范数平方,这个矩阵范数||w[l]||2(即平方范数),被定义为矩阵中所有元素的平方求和,求和公式的具体参数,第一个求和符号其值i从 1 到n[l−1],第二个其j值从 1 到n[l],因为w是一个n[l] × n[l−1]的多维矩阵,n[l]表示l层单元的数量,n[l−1]表示第l−1层隐藏单元的数量,该矩阵范数被称作“弗罗贝尼乌斯范数”,用下标F标注.
1.1 为什么正则化有利于预防过拟合呢?( Why regularization reduces overfitting?)
这个庞大的深度拟合神经网络,我知道这张图不够大,深度也不够,可以想象这是一个过拟合的神经网络,我们的代价函数J,含有参数w,b,我们添加正则项,它可以避免数据权值矩阵过大,这就是弗罗贝尼乌斯范数,直观上理解就是如果正则化λ设置得足够大,权重矩阵w被设置为接近于 0 的值,直观理解就是把多隐藏单元的权重设为 0,于是基本上消除了这些隐藏单元的许多影响,实际上是该神经网络的所有隐藏单元依然存在,但是它们的影响变得更小了,是L2正则化,它是我在训练深度学习模型时最常用的一种方法,在深度学习中,还有一种方法也用到了正则化,就是 dropout 正则化.
1.2 dropout 正则化(Dropout Regularization)
除了L2正则化,还有一个非常实用的正则化方法——“Dropout(随机失活)”,假设你在训练上图这样的神经网络,它存在过拟合,这就是 dropout 所要处理的,我们复制这个神经网络,dropout 会遍历网络的每一层,并设置消除神经网络中节点的概率.
假设每个节点得以保留和消除的概率都是 0.5,设置完节点概率,我们会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络,然后用 backprop 方法进行训练。
如何实施 dropout 呢?方法有几种,目前实施 dropout 最常用的方法就是 Inverted dropout(反向随机失活),首先要定义向量d,d[3]表示一个三层的 dropout 向量:d3=np.random.rand(a3.shape[0],a3.shape[1]),d[3]中的对应值为 1 的概率都是 0.8,对应为 0 的概率是 0.2然后看它是否小于某数,我们称之为 keep-prob,keep-prob 是一个具体数字,它表示保留某个隐藏单元的概率,假设 keep-prob 等于 0.8,它意味着消除任意一个隐藏单元的概率是 0.2,它的作用就是生成随机矩阵,a3 =np.multiply(a3,d3),这里是元素相乘,a[3]是第二层的激活函数,乘法运算最终把d[3]中相应元素输出,即让d[3]中 0 元素与a[3]中相对元素归零,最后,我们向外扩展a[3],用它除以 keep-prob 参数,即a3/=keep-prob,这就是所谓的 dropout 方法。下面我解释一下为什么要这么做,为方便起见,我们假设第三隐藏层上有 50 个神经元,在一维上a[3]是 50,我们通过因子分解将它拆分成50 × m维的,保留和删除它们的概率分别为 80%和 20%,这意味着最后被删除或归零的单元平均有 10(50×20%=10)个,现在我们看下z[4],z[4] = w[4]a[3] + b[4],我们的预期是,a[3]减少20%,也就是说a[3]中有 20%的元素被归零,为了不影响z[4]的期望值,我们需要用w[4]a[3]/0.8,它将会修正或弥补我们所需的20%,a[3]的期望值不会变。
1.3理解 dropout(Understanding Dropout)
Dropout 可以随机删除网络中的神经单元,因为该单元的输入可能随时被清除,因此该单元通过这种方式传播下去,并为神经元的输入增加一点权重,通过传播所有权重,dropout将产生收缩权重的平方范数的效果,和之前讲的L2正则化类似,实施 dropout 的结果实它会压缩权重,并完成一些预防过拟合的外层正则化;,并完成一些预防过拟合的外层正则化;L2对不同权重的衰减是不同的,它取决于激活函数倍增的大小。
应用 dropout 的层只含有一个超级参数,就是 keep-prob,不同层的 keep-prob 可以变化,keep-prob 的值是 1,意味着保留所有单元,并且不在这一层使用 dropout,对于有可能出现过拟合,且含有诸多参数的层,我们可以把 keep-prob 设置成比较小的值,以便应用更强大的 dropout。dropout 一大缺点就是代价函数J不再被明确定义,或者说在某种程度上很难计算。
1.4 其他正则化方法(Other regularization methods)
除了L2正则化和随机失活(dropout)正则化,还有几种方法可以减少神经网络中的过拟合。
第一种方法是数据扩增。对于图片,我们可以通过随意翻转和裁剪图片,我们可以增大数据集,额外生成假训练数据;对于光学字符识别,我们还可以通过添加数字,随意旋转或扭曲数字来扩增数据。数据扩增的缺点是,如果你想通过扩增训练数据来解决过拟合,但扩增数据代价高,而且有时候我们无法扩增数据。
第二种方法是early stopping,代表提早停止训练神经网络,因为在训练过程中,训练误差,代价函数J差通常会先呈下降趋势,然后在某个节点处开始上升,early stopping 的作用是,神经网络已经在这个迭代过程中表现得很好了,我们在此停止训练吧,得到验证集误差。说 early stopping 的主要缺点就是你不能独立地处理这两个问题:(1)因为提早停止梯度下降,也就是停止了优化代价函数J,因为现在你不再尝试降低代价函数J,所以代价函数J的值可能不够小;(2)希望不出现过拟合
选择一个算法来优化代价函数J,我们有很多种工具来解决这个问题,如梯度下降, Momentum,RMSprop 和 Adam 等等,但是优化代价函数J之后,我们也不想发生过拟合,也有一些工具可以解决该问题,比如正则化,扩增数据等等.