TensorFlow(7)- 防止过拟合之正则化

 1、过拟合问题

在本系列第三篇文章TensorFlow(3)- 防止过拟合之dropout中已经谈到过过拟合问题:所谓过拟合,指的是当一个模型过为复杂之后,它可以很好地“记忆”每一个训练数据中随机噪音的部分而忘记了要去“学习”训练数据中通用的趋势。举一个极端的例子,如果一个模型中的参数比训练数据的总数还多,那么只要训练数据不冲突,这个模型完全可以记住所有训练数据的结果从而使得损失函数为0。可以直观地想象一个包含n 个变量和n 个等式的方程组,当方程不冲突时,这个方程组是可以通过数学的方法来求解的。然而,过度拟合训练数据中的随机噪音虽然可以得到非常小的损失函数,但是对于未知数据可能无法做出可靠的判断。

除了之前介绍过的dropout来解决这个问题之外,另一非常常用的方法就是我们今天的主角-正则化。

至于为什么正则化之所以能够降低过拟合的原因在于,正则化是结构风险最小化的一种策略实现。

给loss function加上正则化项,能使得新得到的优化目标函数h = f+normal,需要在f和normal中做一个权衡(trade-off),如果还像原来只优化f的情况下,那可能得到一组解比较复杂,使得正则项normal比较大,那么h就不是最优的,因此可以看出加正则项能让解更加简单,符合奥卡姆剃刀理论,同时也比较符合在偏差和方差(方差表示模型的复杂度)分析中,通过降低模型复杂度,得到更小的泛化误差,降低过拟合程度。

L1正则化和L2正则化:

L1正则化就是在loss function后边所加正则项为L1范数,加上L1范数容易得到稀疏解(0比较多)。L2正则化就是loss function后边所加正则项为L2范数的平方,加上L2正则相比于L1正则来说,得到的解比较平滑(不是稀疏),但是同样能够保证解中接近于0(但不是等于0,所以相对平滑)的维度比较多,降低模型的复杂度。

详细的解释和原理请参照:https://zhuanlan.zhihu.com/p/35356992


 2、正则化

正则化的思想就是在损失函数中加入刻画模型复杂程度的指标。假设用于刻画模型在训练数据上表现的损失函数为的,那么在优化时不是直接优化的,而是优化。其中R(w)刻画的是模型的复杂程度,而λ表示模型复杂损失在总损失中的比例。注意这里θ表示的是一个神经网络中所有的参数,它包括边上的权重w和偏置项b。一般来说模型复杂度只由权重w决定。常用的刻画模型复杂度的函数R(w)有两种,一种是LI正则化,计算公式是:

                                                 

另一种是L2 正则化,计算公式是:

                                                                 

无论是哪一种正则化方式,基本的思想都是希望通过限制权重的大小,使得模型不能任意拟合训练数据中的随机噪音。但这两种正则化的方法也有很大的区别。首先,Ll 正则化会让参数变得更稀疏,而L2 正则化不会。所谓参数变得更稀疏是指会有更多的参数变为0 ,这样可以达到类似特征选取的功能。之所以L2 正则化不会让参数变得稀疏的原因是当参数很小时,比如0.001 ,这个参数的平方基本上就可以忽略了,于是模型不会进一步将这个参数调整为0 。其次,LI正则化的计算公式不可导,而L2正则化公式可导。因为在优化时需要计算损失函数的偏导数,所以对含有L2 正则化损失函数的优化要更加简洁。优化带LI正则化的损失函数要更加复杂,而且优化方法也有很多种。在实践中,也可以将LI正则化和L2正则化同时使用,如:

                                                


3、简单的例子

前面我们提到过tensorflow可以优化任意形式的损失函数,所以tensorflow自然也可以优化带正则化的损失函数。以下代码给出了一个简单的带L2正则化的损失函数定义:

# 均方误差损失函数 + L2正则化项

import tensorflowas tf

w= tf.Variable(tf.random_normal([2,1], stddev=1, seed=1))

y= tf.matmul(x, w)

loss= tf.reduce_mean(tf.square(y- y))+ tf.contrib.layers.l2_regularizer(lambda)(w)

在以上程序中,loss 为定义的损失函数,它由两个部分组成。第一个部分是均方误差损失函数,它刻画了模型在训练数据上的表现。第二个部分就是正则化,它防止模型过度模拟训练、数据中的随机噪音。lambda 参数表示了正则化项的权重,也就是公式J(θ)+λR (w)中的λ。w 为需要计算正则化损失的参数。TensorFlow提供了tf.contrib.layers.12_regularizer函数,它可以返回一个函数,这个函数可以计算一个给定参数的L2正则化项的值。类似的,tf.contrib.layers.l1_regularizer可以计算LI正则化项的值。

本文只是一个引子,更多的信息就请大家自己探索啦

 参考文献:

1.书籍:Tensorflow:实战Google深度学习框架(第二版)

2. L1正则化与L2正则化

你可能感兴趣的:(TensorFlow(7)- 防止过拟合之正则化)