Tensorflow 权重衰减的使用

在 tf.get_variable 这个函数中有一个命名参数为 regularizer,顾名思义,这个参数可用于正则化。在 Tensorflow 官网中,regularizer 的描述如下:

get_variable(
    name,
    shape=None,
    dtype=None,
    initializer=None,
    regularizer=None,
    trainable=True,
    collections=None,
    caching_device=None,
    partitioner=None,
    validate_shape=True,
    use_resource=None,
    custom_getter=None
)

regularizer: A (Tensor -> Tensor or None) function; the result of applying it on a newly created variable will be added to the collection tf.GraphKeys.REGULARIZATION_LOSSES and can be used for regularization.

在使用的时候,我们可以自定义一个函数,只要这个函数的输入参数和返回值都是 tensor,这个函数就能作为 regularizer 这个命名参数传入 get_variable 函数。例如我们可以定义如下的损失函数:

def regularizer(tensor):
    with tf.name_scope(scope, default_name='l2_regularizer', values=[tensor]):
        l2_weight = tf.convert_to_tensor(weight_decay, \
                                         dtype=tensor.dtype.base_dtype, \
                                         name='weight_decay')
        return tf.multiply(l2_weight, tf.nn.l2_loss(tensor), name='value')

我还没找到说明 tensor 这个参数的文档,猜测这个 tensor 传过来的变量就是 get_variable 这个函数的返回值,当我们用 get_variable 获取权重时,这个 tensor 就是权重,所以 regularizer 这个函数返回的就是一个 L2 正则项。

目前为止,我们仅仅是知道了这个参数的含义,但并不知道 Tensorflow 底层会怎样去使用这个参数。需要注意,Tensorflow 没有自动把这个正则项自动加到优化当中去,这意味着在构建 loss 阶段我们必须把正则项加入进去。

由官方文档可以知道,我们可以通过 tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) 获取正则项,这个函数得到的是由若干个类型为 tensor 的元素构成的 list。具体来说,如果我们为网络中的 n 个权重变量都加上 regularizer 这个参数,那么在我们应该得到 n 个对应的正则项,从而通过函数 tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) 能获取一个 n 个元素构成的 list,这里每一个元素分别对应不同的权重的正则项。

ufldl 的 Backpropagation Algorithm 可以知道在优化问题中,损失函数即为均方差以及所有权重的正则项之和,所以在构建 loss 时,我们只要把均方差与上述 tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) 的所有元素之和相加即可得到最终的 loss。

regularization_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
loss = tf.add_n(regularization_losses) + loss
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值