吴恩达deep learning课程笔记
常用来防止过拟合的正则方法:
L1:
∑i∑j|Wi,j|=∥W∥1
权重矩阵各元素和的绝对值
L2:
∑i∑j∥Wi,j∥2=WTW
权重矩阵各元素平方和
L2是较常用的正则法,因其公式特性尽可能的考虑到了每一个特征。而L1是绝对值合,结果常常是一个稀疏矩阵。
在NN里,常用正则项 “Frobenius norm”
J(w[1],b[1]...w[l],b[l])=1m∑ni=1L(y^(i),y)+λ2m∑ℓℓ=1∥W[ℓ]∥2F
这里的F指frobenius norm,求矩阵里元素的平方加总。
∥W[ℓ]∥2F=∑n[ℓ−1]i=1∑n[ℓ]j=1(W[ℓ]ij)2,(W:(n[ℓ],n[ℓ−1]))
在反向传播里
∂W[ℓ]=(from backup)+λ2mW[ℓ]
(1−λm)W[ℓ] 权重w乘以一个小于1的数的结果是小于w的值,即实现了权重衰减。
关于正则项如何减少过拟合呢?
从整个cost function 公式来看,当
λ
很大的时候,
W[ℓ]≈0
这使得网络中的某些隐藏层节点为0,这样的结果是简化了网络。而在实际使用中,W不可能为0,只是相应的使隐藏层的影响减小,从而降低过拟合的可能。
比如当使用tanh激活函数的时候,如果
λ
增大,那么W减小,当W偏小的时候,Z值也较小。根据函数图可以看出z值在较小的区间里,函数接近线性,因此一定程度上防止过拟合。而取值增大后,函数呈非线性。
在深度特别是图像处理中常用的正则法Dropout
这个方法的大概思路就如名字,失活一些节点,简化训练时的网络。
具体而言,通过设定一个概率值如0.8,每个隐藏层随机激活80%的节点,关闭20%的节点。这样的结果是网络被简化了。
同时随着训练次数增加到一定程度,可以令至少每个样本点都能被随机的训练一个相对简单的网络。最终达到降低因网络过于复杂而带来的过拟合问题。
从单个节点来看,输入点因为随机性而无法确定哪些点存活,这使得节点不能依赖任一个输入特征。因此分配给任一个输入点较多的权重值都是不合理的。取代的做法是平衡并且分配给每个输入多一点权重以补偿失活点的权重。这样的权重在网络间传播,整体的效果是收缩了权重平方模数。类似于L2的功能。
这里介绍了inverted dropout的方法。
假设在网络的第3层由FF得到
a3
, 那么我们设定一个与之匹配的开关板
d3
,另外设置好
keep_prob
用来确定存活节点概率。
d3=np.random.rand(a3.shape[0],a3.shape[1])<keep_prob
得到一个跟a3维度相同的布尔值数组,就是我们的开关板。
a3=np.multiply(a3,d3)
随机到false的对应点被关闭,值为0
到这一步已经实现了dropout,接下来的一步就是了修补失活节点后被减少的预期权重值。
a3=a3/keep_prob
keep_prob的设定是根据网络各层复杂度来的,在有较高维度权重矩阵的层可以设定较小的值比如0.5,来防止overfitting;而在比较不易过拟合的层采用较大的值如0.9,1。 输入层虽然可以采用大于1或小于1的值,但一般而言通用的作法是将keep_prob设定为1.
小结: Dropout 在计算机视觉领域很常用,因为这个领域的输入非常高,而使数据集过小造成过拟合。Dropout相较于L2更能适应不同大小的输入,因此几乎是默认正则化。另一方面由于dropout随机关闭节点而使优化目标cost function无法明确,因此吴神推荐的一个解决方法是在确认代码正确前先关闭dropout(可以通过设置keepprob为1)。在监测代价函数随着迭代单调递减后再打开dropout。