Tensorflow:权重衰减与 logits 归一化

Posted

技术标签:

【中文标题】Tensorflow:权重衰减与 logits 归一化【英文标题】:Tensorflow: weight decay vs logits normalization 【发布时间】:2017-01-09 19:49:02 【问题描述】:

我正在研究与 cifar10 示例中类似架构的 CNN。我的 CNN 由两个卷积层组成,每个卷积层后面跟着一个最大池化层和三个全连接层。除最后一层外,所有层都使用relu 激活函数。最后一层产生10^5 的logits,因此运行softmax 函数会导致one-hot 编码。我试图以两种不同的方式解决这个问题。

首先,我只是将 logits 重新调整为 [-1, 1],即将它们标准化。这似乎解决了问题,训练进行得很好,CNN 产生了合理的结果。但是我不确定这是否是正确的方法,感觉就像规范化 logits 是一种解决方法,并不能解决最初的问题。

其次,我应用了重量衰减。如果没有 logits 归一化,交叉熵从大值开始,但随着总重量损失的下降而稳步下降。然而,准确性会产生一种奇怪的模式。此外,使用权重衰减训练的网络产生的结果比使用 logits 归一化的网络要差得多。

重量衰减如下:

def weight_decay(var, wd):
    weight_decay = tf.mul(tf.nn.l2_loss(var), wd, name='weight_loss')
    tf.add_to_collection('weight_losses', weight_decay)

准确度

predictions = tf.nn.softmax(logits)
one_hot_pred = tf.argmax(predictions, 1)
correct_pred = tf.equal(one_hot_pred, tf.argmax(y, 1))
accuracy_batch = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

那么应该如何解决大数量级 logits 的问题呢?最佳做法是什么?应用重量衰减产生更差结果的原因可能是什么?

【问题讨论】:

【参考方案1】:

在我看来,tf.nn.l2_loss(var) 没有被规范化,换句话说,可能你的wd 太大了,或者不合适。

【讨论】:

以上是关于Tensorflow:权重衰减与 logits 归一化的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow-正则化与指数衰减率

Hulu机器学习问题与解答系列 | 二十三:神经网络训练中的批量归一化

过拟合解决办法之一:权重衰减

tf.nn.sigmoid_cross_entropy_with_logits 它是不是共享权重?

[tensorflow] tf.nn.sparse_softmax_cross_entropy_with_logits的使用

为啥 TensorFlow 的文档将 softmax 的输入称为“logits”?