如何给某一层添加L2正则化

如何给某一层添加L2正则化,第1张

tf.nn.l2_loss()和tf.contrib.layers.l2_regularizer(),使用示例如下:

import tensorflow as tf

weights = tf.constant([[1,2,3], [4,5,6]], dtype=tf.float32)

sess = tf.InteractiveSession()

# 计算的是所有元素的平方和再除以2

print(tf.nn.l2_loss(weights).eval()())

# 等价于

print(tf.contrib.layers.l2_regularizer(1.)(weights).eval())

# output: 45.5

接下来将介绍两种方法将l2正则化项添加到损失函数后:

一、遍历trainable variables添加L2正则化项:

1.遍历可训练参数,将每个参数传入tf.nn.l2_loss()进行计算并相加起来;

2.乘以weight_decay并与base_loss相加。

weight_decay = 0.001

base_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits))

l2_loss = weight_decay * tf.add_n([tf.nn.l2_loss(tf.cast(v, tf.float32)) for v in tf.trainable_variables()])

loss = base_loss + l2_loss

注意:该过程对每个trainable variable都进行了l2正则化,包括权值w和偏置b。有种说法是如果对偏执b进行l2正则化将会导致欠拟合,一般只需要对权值w进行正则化,所以来看第二种方法。

二、在构造网络层时传入l2正则化函数:

如下所示,在构造网络层时,将'kernel_initializer'参数设为l2正则化函数,则tensorflow会将该权重变量(卷积核)的l2正则化项加入到集合 tf.GraphKeys.REGULARIZATOIN_LOSSES里。

x = tf.layers.conv2d(x, 512, (3, 3),

padding='same',

activation=tf.nn.relu,

kernel_initializer=tf.truncated_normal_initializer(stddev=0.01),

kernel_regularizer=tf.contrib.layers.l2_regularizer(0.001)

在计算loss时使用tf.get_collection()来获取tf.GraphKeys.REGULARIZATOIN_LOSSES集合,然后相加即可:

base_loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits))

l2_loss = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)

loss = tf.add_n([base_loss] + l2_loss, name="loss")

欢迎补充指正。

对于一个回归模型(比如多项式回归)而言,假如我们用MSE作为其损失函数,为了避免其参数过多导致模型过拟合,我们可以加入正则化项。

当我们加一个平方项:

其中\theta是该模型各项的系数。

这样的正则化就是L2正则化,就是加了一个平方项。

如果不加平方项,而是绝对值:

这样的方法被称作L1正则化,也就是Lasso回归的方式。因为Lasso趋向于使得一部分\theta为0,所以Lasso可以做 特征选择

此外还有一种L0正则,也就是引入一项,使得的个数尽可能的小。但是这是一个离散最优化问题,可能需要穷举,这是一个NP难的问题。所以我们实际上是用L1正则来取代这种方法。

最后还有d性网络(Elastic Net),其实就是将L1与L2正则项结合起来。

正则化(Regularization)是机器学习中一种常用的技术,其主要目的是控制模型复杂度,减小过拟合。最基本的正则化方法是在原目标(代价)函数 中添加惩罚项,对复杂度高的模型进行“惩罚”。其数学表达形式为:

其中, 为训练样本以及标签, 为目标函数, 为权重系数向量, 为惩罚项, 为惩罚因子。不同的 对权重 的最优解有不同的偏好,因而会产生不同的正则化效果。最常用的是 范数和 范数,相应称之为 正则和 正则。

深入理解L1、L2正则化 从带约束条件的优化求解和最大后验概率两种思路对L1、L2正则化给出了分析。本文从只说下带约束条件的优化求解(因为目前我只能理解这种思路。。。)

我们知道,模型的复杂度可用VC维来衡量。通常情况下,模型VC维与系数 的个数成线性关系:即 数量越多,VC维越大,模型越复杂。因此,为了限制模型的复杂度,很自然的思路是减少系数 的个数,即让 向量中一些元素为0或者说限制 中非零元素的个数。为此,我们可在原优化问题中加入一个约束条件:

范数表示向量中非零元素的个数。但由于该问题是一个NP问题,不易求解,为此我们需要稍微“放松”一下约束条件。为了达到近似效果,我们不严格要求某些权重 为0,而是要求权重 应接近于0,即尽量小。从而可用 范数和 范数来近似 ,即:

利用拉格朗日算子法,我们可将上述带约束条件的最优化问题转换为不带约束项的优化问题,构造拉格朗日函数:

综上所述, 正则和 正则是通过将某些 为0或者接近于0,降低模型复杂度,防止过拟合。

当 为1维的时候, 和 的函数图像如下:

和 , 会向0的方向优化;区别在于, 中 将不会再变化,而 是接近于0但不会等于0(个人想法)。

《深度学习》第七章(7.1--7.2)有公式推导,有时间可以再好好看看,初看没看懂。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11825877.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存