一、逻辑斯特回归的正则化
在损失函数后面加上L2正则化项:
其中正则化项:
不对b使用正则化是因为w已经是高维参数矢量,几乎涵盖了所有的参数,而b只是一个标量,可以忽略。当然也可以对b进行正则化,不会产生什么影响。
也可以使用L1正则化:
L1正则化使w是稀疏的,即w中有很多0。目前更倾向于使用L2正则化。
二、神经网络的正则化
Feobenius范数:
加入L2正则化后的参数更新:
三、为什么正则化能防止过拟合
训练神经网络的目的是最小化损失函数并更新参数。如果正则化参数λ很大,为了最小化损失函数,那么权重矩阵w将接近于0。对于w接近于0带来的影响,可以从以下两个例子来说明。
- 对于一个多层神经网络,w接近于0意味着隐藏单元的权重接近于0,相当于大大减小了这些隐藏单元的影响。这样神经网络被简化成小规模的网络,但深度不变。这样会欠拟合状态趋向于欠拟合状态。但λ会存在一个中间值,使其达到合理拟合的状态。
- 假设使用双曲激活函数tanh(z),如果z集中于0附近,那么tanh(z)会接近于线性;如果z很大或很小,则tanh(z)变得非线性。那么,w接近于0时,z=wa+b变得很小,集中于0附近,那么每一层几乎都是线性的,这个网络就变成了非常深的线性网络,不会过度拟合数据集的非线性决策边界。
总之,λ增大时,整个网络会变的更加简单,越简单的模型越不会发生过拟合。
四、Dropout
dropout会遍历网络的每一层,以一定的概率消除某一节点,得到一个规模较小的网络。常用的dropout方法是inverted dropout(反向随机激活)。下面以某一神经网络的第三层举例说明。
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
a3 = np.multply(a3, d3)
a3 /= keep_prob
第一行,d3是随机矩阵,布尔型。keep_prob是保留某个隐藏单元的概率。
第二行,将a3与d3相乘,以消除某些节点。
第三行,将a3除以keep_prob,使a3的期望值不变。
五、正则化输入
当输入特征不在同一范围时,如x1在[0,1],x2在[0,10000],需要对输入特征进行归一化,步骤包括零均值化和归一化方差。
零均值化:
归一化方差:
如下图1所示,输入特征可能不在同一范围,零均值化后输入特征变为图2所示分布,归一化方差后输入特征变成图3所示,x1和x2的方差都为1。
如果不进行输入正则化,那么代价函数J的形状可能如下图所示。J的形状十分狭长,此时需要设置较小的学习率,反复尝试才能达到最优点。
进行输入正则化后,J的形状如下所示。J变得均匀,设置一个较大的学习率就可以较快地达到最优点。
六、其他正则化方法
1、数据增强
当不好收集其他数据来扩展训练集时,可以利用现有的训练集进行数据增强。例如在图像分类中,可以对图像进行翻转、裁剪等操作来扩展数据集。
2、early stopping
在训练网络时,我们能看到训练误差在不断地下降,但在验证集上误差可能是先下降再上升。当验证集误差上升时,网络就出现了过拟合,此时提早停止训练可以防止过拟合。一般机器学习包括两个重要内容,一是选择优化算法来优化代价函数J,二是防止过拟合。在一个时间只做以上其中一个事情,而不影响另一个事情,这称为正交化。early stopping的缺点是无法独立地处理这两个事情,你若提早停止训练网络,就无法继续优化代价函数J。