深度学习的实用层面 —— 1.4 正则化

如果你怀疑神经网络过度拟合了数据,即存在高方差问题,那么最先想到的方法可能就是正则化,另一个解决高方差的方法就是准备更多的数据,这也是非常可靠的办法,但你可能无法时时准备足够多的训练数据,或者获取更多数据的成本更高,但正则化通常有助于避免过度拟合,或减小网络误差,下面讲一下正则化的作用原理。

这里使用逻辑回归来实现这些设想,求成本函数 J ( w , b ) J(w,b) J(w,b)的最小值,函数参数包含一些训练数据和不同数据中个体预测的损失, w w w b b b是逻辑回归中的两个参数, w w w是一个多维度参数矢量, b b b是一个实数,在逻辑回归函数中加入正则化,只需添加参数 λ \lambda λ,也就是正则化参数,得到关于逻辑回归的正则化表达式如下所示: J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ 2 m ∣ ∣ w ∣ ∣ 2 2 J(w,b)=\frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}||w||_{2}^2 J(w,b)=m1i=1mL(y^(i),y(i))+2mλw22 ∣ ∣ w ∣ ∣ 2 2 = ∑ j = 1 n x w j 2 = w T w ||w||_2^2=\sum_{j=1}^{n_x}w_j^2=w^Tw w22=j=1nxwj2=wTw此方法称为L2正则化,因为这里用了欧几里得法线,所以被称为向量参数W的L2范数。

为什么只正则化参数 w w w,为什么不再加上参数 b b b呢?可以这么做,只是习惯省略不写,因为 w w w通常是一个高维参数矢量,已经可以表达高偏差问题, w w w可能含有很多参数,我们不可能拟合所有参数,而 b b b只是单个数字,所以 w w w几乎涵盖所有参数,而不是 b b b。如果加了参数 b b b,其实也没有什么太大影响,因为b只是众多参数中的一个,所以通常省略不计,但加上这个参数也是没影响的。

L2正则化是最常见的正则化表达式,可能听说过L1正则化,L1正则化加的不是L2范数,而是如下的表达式: J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ 2 m ∣ w ∣ J(w,b)=\frac{1}{m}\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}|w| J(w,b)=m1i=1mL(y^(i),y(i))+2mλw这也称为参数 w w w向量的L1范数,无论分母是 m m m还是 2 m 2m 2m,它都是一个比例常量。如果用的是L1正则化,得到的 w w w最终会是稀疏的,也就是说 w w w向量中有很多0,有人说这样有利于压缩模型,因为集合中参数均为0,存储该模型所占用的内存更少。实际上,虽然L1正则化使模型变得稀疏,却没有降低太多存储内存,所以吴恩达先生认为这并不是L1正则化的目的,至少不是为了压缩模型。人们在训练模型时越来越倾向于使用L2正则化。

我们来看最后一个细节,KaTeX parse error: Undefined control sequence: \ambda at position 1: \̲a̲m̲b̲d̲a̲是正则化参数,我们通常使用验证集或交叉验证来配置这个参数,尝试各种各样的数据,寻找最好的参数。我们要考虑训练集之间的权衡,把参数正常值设置为较小值,这样可以避免过拟合。 λ \lambda λ是另外一个需要调整的超级参数,顺便说一下,为了方便编写代码,在python编程语言中, λ \lambda λ是一个保留字段,编写代码时,我们删掉a,写成lambd,以免与python中的保留字段冲突,我们用lambd来代替lambda正则化参数。这就是在逻辑回归函数中实现L2正则化的过程。

如何在神经网络中实现L2正则化呢?神经网络含有一个成本函数,该函数包含从 w [ 1 ] , b [ 1 ] w^{[1],b^{[1]}} w[1],b[1] w [ L ] , b [ L ] w^{[L],b^{[L]}} w[L],b[L]的所有参数,字母L是神经网络所含的层数,在神经网络中加上正则化后的表达式为: J ( w [ 1 ] , b [ 1 ] , . . . , w [ l ] , b [ l ] ) = 1 m ∑ i = 1 m L ( y ^ [ i ] , y [ i ] ) + λ 2 m ∑ l = 1 L ∣ ∣ w [ l ] ∣ ∣ 2 J(w^{[1]},b^{[1]},...,w^{[l]},b^{[l]})=\frac{1}{m}\sum_{i=1}^mL(\hat{y}^{[i]},y^{[i]})+\frac{\lambda}{2m}\sum_{l=1}^L||w^{[l]}||^2 J(w[1],b[1],...,w[l],b[l])=m1i=1mL(y^[i],y[i])+2mλl=1Lw[l]2我们把 ∣ ∣ w [ l ] ∣ ∣ 2 ||w^{[l]}||^2 w[l]2称为平方范数,这个范数矩阵被定义为矩阵中所有元素的平方求和,看下求和公式的具体参数。 ∣ ∣ w [ l ] ∣ ∣ F 2 = ∑ i = 1 n [ l − 1 ] ∑ j = 1 n [ l ] ( w i j [ l ] ) 2 ||w^{[l]}||_F^2=\sum_{i=1}^{n^{[l-1]}}\sum_{j=1}^{n^{[l]}}(w_{ij}^{[l]})^2 w[l]F2=i=1n[l1]j=1n[l](wij[l])2第一个求和符号其 i i i值从1到 n [ l − 1 ] n^{[l-1]} n[l1],第二个求和符号其 j j j值从1到 n [ l ] n^{[l]} n[l],因为 w w w是一个维度为 ( n [ l − 1 ] , n [ l ] ) (n^{[l-1]},n^{[l]}) (n[l1],n[l])的多维矩阵, n [ l − 1 ] n^{[l-1]} n[l1]表示隐藏单元的数量, n [ l ] n^{[l]} n[l]表示l层单元的数量,该矩阵范数被称为“佛罗贝尼乌斯范数”,用下标F标注,鉴于线性代数中一些神秘晦涩的原因,我们不称之为“矩阵L2范数 ∣ ∣ ⋅ ∣ ∣ 2 2 ||\cdot||_2^2 22”,而称它为”佛罗贝尼乌斯范数”。矩阵L2范数听起来更自然,但鉴于一些大家无须知道的特殊原因,按照惯例,我们称之为“佛罗贝尼乌斯范数”,它表示一个矩阵中所有元素的平方和。

如何使用该范数实现梯度下降呢?用bp计算出 d w dw dw的值,bp会给出损失函数 J J J w w w的偏导数,实际上是 d w [ l ] = ∂ J ∂ w [ l ] = ∂ J ∂ w [ l ] + λ m w [ l ] dw^{[l]}=\frac{\partial J}{\partial w^{[l]}}=\frac{\partial J}{\partial w^{[l]}}+\frac{\lambda}{m}w^{[l]} dw[l]=w[l]J=w[l]J+mλw[l]参数的更新公式表示为 w [ l ] = w [ l ] − α d w [ l ] w^{[l]}=w^{[l]}-\alpha dw^{[l]} w[l]=w[l]αdw[l]使用新定义的 d w [ l ] dw^{[l]} dw[l],该定义含有代价函数导数和相关参数,以及最后添加的额外正则项。

这也是L2正则化有时被称为“权重衰减”的原因,我们把加入正则项的损失函数的求导结果放进参数 w w w的更新方程中, w [ l ] w^{[l]} w[l]的更新公式表示为: w [ l ] = w [ l ] − α λ m w [ l ] − α ∂ J ∂ w [ l ] w^{[l]}=w^{[l]}-\frac{\alpha \lambda}{m}w^{[l]}-\alpha \frac{\partial J}{\partial w^{[l]}} w[l]=w[l]mαλw[l]αw[l]J。该正则项说明,不管 w [ l ] w^{[l]} w[l]是什么我们都试图让它变得更小,实际上相当于我们给矩阵 w w w乘以了 ( 1 − α λ m ) (1-\frac{\alpha \lambda}{m}) (1mαλ)倍的权重。矩阵 w w w减去 α λ m \frac{\alpha \lambda}{m} mαλ倍的它,也就是用这个系数乘于矩阵 w w w,该系数小于1,。因此L2范数正则化也被称为“权重衰减”,因为它就像一般的梯度下降。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值