文章目录

  1. 1. L2 正则化
  2. 2. L1 正则化
  3. 3. TensorFlow 的支持
  4. 4. 参考资料

过拟合表现在训练数据上的误差非常小,而在测试数据上误差反而增大。这种现象的产生,一般是模型过于复杂,过分拟合数据的噪声。正则化则是对模型参数添加先验,使得模型复杂度较小,对于噪声输入扰动相对较小。

L2 正则化

L2 正则化,会在代价函数后面再加上一个正则化项。

其中,C0代表原始的代价函数,后面加上 L2 正则化项。事实上,L2 正则化将所有参数 W 的平方的和,乘以 λ/2n。。λ 就是正则项系数,而系数 1/2,主要是为了求导的结果方便,后面那一项求导会产生一个 2,与 1/2 相乘刚好凑整。

L2 正则化项的效果是减小权值 W。事实上,更小的权值 W,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好。

L1 正则化

L1 正则化,会在代价函数后面再加上一个正则化项。

其中,L1 正则化在原始的代价函数后面加上一个 L1 正则化项,即所有权值 W 的绝对值的和,乘以 λ/n。

L1 正则化项的效果是让权值 W 往 0 靠,使网络中的权值尽可能为 0,也就相当于减小了网络复杂度,防止过拟合。事实上,L1 正则化能产生稀疏性,导致 W 中许多项变成零。

TensorFlow 的支持

TensorFlow 提供了正则化支持。

tf.contrib.layers.l1_regularizer(scale, scope=None)
tf.contrib.layers.l2_regularizer(scale, scope=None)

其中,有两个重要的参数。

  • scale: 正则项的系数。
  • scope: 可选的scope name。

现在,来看一个案例。这个案例中,我们使用了tf.contrib.layers.l2_regularizer(scale, scope=None)函数。其中, lambd 参数表示来正则化项的权重,W 为需要计算正则化损失的参数。

loss = tf.reduce_mean(tf.square(y-y_) + tf.contrib.layers.l2_regularizer(lambd)(W))

最后,以下代码给出了使用这两个函数的案例。

import tensorflow as tf
import numpy as np

W = tf.constant([[1.0, -2.0], [-3.0, 4.0]])
with tf.Session() as sess:
    # (1+2+3+4)*0.5 ⇒ 5
    print(sess.run(tf.contrib.layers.l1_regularizer(.5)(W)))
    # (1+4+9+16)*0.5*0.5 ⇒ 7.5
    print(sess.run(tf.contrib.layers.l2_regularizer(.5)(W)))
    # l1_regularizer + l2_regularizer
    print(sess.run(tf.contrib.layers.l1_l2_regularizer(.5, .5)(W)))

此外,L1 正则化方法和 L2 正则化方法可以同时使用。

参考资料

(完)

微信公众号

文章目录

  1. 1. L2 正则化
  2. 2. L1 正则化
  3. 3. TensorFlow 的支持
  4. 4. 参考资料