神经网络优化篇:详解正则化(Regularization)

正则化

深度学习可能存在过拟合问题------高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有助于避免过拟合或减少的网络误差。

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

用逻辑回归来实现这些设想,求成本函数\(J\)的最小值,它是定义的成本函数,参数包含一些训练数据和不同数据中个体预测的损失,\(w\)和\(b\)是逻辑回归的两个参数,\(w\)是一个多维度参数矢量,\(b\)是一个实数。在逻辑回归函数中加入正则化,只需添加参数λ,也就是正则化参数。

\(\frac{\lambda}{2m}\)乘以\(w\)范数的平方,其中\(\left\| w \right\|2^2\)是\(w\)的欧几里德范数的平方,等于\(w{j}\)(\(j\) 值从1到\(n_{x}\))平方的和,也可表示为\(w^{T}w\),也就是向量参数\(w\) 的欧几里德范数(2范数)的平方,此方法称为\(L2\)正则化,因为这里用了欧几里德范数,被称为向量参数\(w\)的\(L2\)范数。

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

\(L2\)正则化是最常见的正则化类型,们可能听说过\(L1\)正则化,\(L1\)正则化,加的不是\(L2\)范数,而是正则项\(\frac{\lambda}{m}\)乘以\(\sum_{j= 1}^{n_{x}}{|w|}\),\(\sum_{j =1}^{n_{x}}{|w|}\)也被称为参数\(w\)向量的\(L1\)范数,无论分母是\(m\)还是\(2m\),它都是一个比例常量。

如果用的是\(L1\)正则化,\(w\)最终会是稀疏的,也就是说\(w\)向量中有很多0,有人说这样有利于压缩模型,因为集合中参数均为0,存储模型所占用的内存更少。实际上,虽然\(L1\)正则化使模型变得稀疏,却没有降低太多存储内存,所以认为这并不是\(L1\)正则化的目的,至少不是为了压缩模型,人们在训练网络时,越来越倾向于使用\(L2\)正则化。

来看最后一个细节,\(\lambda\)是正则化参数,通常使用验证集或交叉验证集来配置这个参数,尝试各种各样的数据,寻找最好的参数,要考虑训练集之间的权衡,把参数设置为较小值,这样可以避免过拟合,所以λ是另外一个需要调整的超级参数,顺便说一下,为了方便写代码,在Python 编程语言中,\(\lambda\)是一个保留字段,编写代码时,删掉\(a\),写成\(lambd\),以免与Python 中的保留字段冲突,这就是在逻辑回归函数中实现\(L2\)正则化的过程,如何在神经网络中实现\(L2\)正则化呢?

神经网络含有一个成本函数,该函数包含\(W^{[1]}\),\(b^{[1]}\)到\(W^{[l]}\),\(b^{[l]}\)所有参数,字母\(L\)是神经网络所含的层数,因此成本函数等于\(m\)个训练样本损失函数的总和乘以\(\frac{1}{m}\),正则项为\(\frac{\lambda }{2m}{{\sum\nolimits_{1}^{L}{| {{W}^{[l]}}|}}^{2}}\),称\({||W^{\left[l\right]}||}^{2}\)为范数平方,这个矩阵范数\({||W^{\left[l\right]}||}^{2}\)(即平方范数),被定义为矩阵中所有元素的平方求和,

看下求和公式的具体参数,第一个求和符号其值\(i\)从1到\(n^{[l - 1]}\),第二个其\(J\)值从1到\(n^{[l]}\),因为\(W\)是一个\(n^{[l]}\times n^{[l-1]}\)的多维矩阵,\(n^{[l]}\)表示\(l\) 层单元的数量,\(n^{[l-1]}\)表示第\(l-1\)层隐藏单元的数量。

该矩阵范数被称作"弗罗贝尼乌斯范数",用下标\(F\)标注",鉴于线性代数中一些神秘晦涩的原因,不称之为"矩阵\(L2\)范数",而称它为"弗罗贝尼乌斯范数",矩阵\(L2\)范数听起来更自然,但鉴于一些大家无须知道的特殊原因,按照惯例,称之为"弗罗贝尼乌斯范数",它表示一个矩阵中所有元素的平方和。

该如何使用该范数实现梯度下降呢?

backprop 计算出\(dW\)的值,backprop 会给出\(J\)对\(W\)的偏导数,实际上是$ W^{[l]},把W^\(替换为\)W^{[l]}\(减去学习率乘以\)dW$。

这就是之前额外增加的正则化项,既然已经增加了这个正则项,现在要做的就是给\(dW\)加上这一项\(\frac {\lambda}{m}W^{[l]}\),然后计算这个更新项,使用新定义的\(dW^{[l]}\),它的定义含有相关参数代价函数导数和,以及最后添加的额外正则项,这也是\(L2\)正则化有时被称为"权重衰减"的原因。

用$ dW^{[l]}的定义替换此处的dW^\(,可以看到,\)W^{[l]}的定义被更新为W^\(减去学习率\)\alpha$ 乘以backprop 再加上\(\frac{\lambda}{m}W^{[l]}\)。

该正则项说明,不论\(W^{[l]}\)是什么,都试图让它变得更小,实际上,相当于给矩阵W乘以\((1 - \alpha\frac{\lambda}{m})\)倍的权重,矩阵\(W\)减去\(\alpha\frac{\lambda}{m}\)倍的它,也就是用这个系数\((1-\alpha\frac{\lambda}{m})\)乘以矩阵\(W\),该系数小于1,因此\(L2\)范数正则化也被称为"权重衰减",因为它就像一般的梯度下降,\(W\)被更新为少了\(\alpha\)乘以backprop 输出的最初梯度值,同时\(W\)也乘以了这个系数,这个系数小于1,因此\(L2\)正则化也被称为"权重衰减"。

不打算这么叫它,之所以叫它"权重衰减"是因为这两项相等,权重指标乘以了一个小于1的系数。

以上就是在神经网络中应用\(L2\)正则化的过程。