【问题标题】:How to regularize loss function?如何正则化损失函数?
【发布时间】:2019-03-06 18:15:30
【问题描述】:

我正在学习 tensorflow,但在理解如何规范化成本函数时遇到了一些麻烦。我已经看过了,我发现了很多不同的答案。有人可以告诉我如何规范成本函数吗?

我在 Coursera 上学习了 Andrew Ng 的机器学习课程,当我在论坛上查看时,有一件事似乎有所不同。似乎大多数人正则化每个权重以及正则化最终成本函数,并且在课程中没有提到这一点。哪一个是正确的?

【问题讨论】:

  • 你有一些你正在处理的代码示例吗?
  • @Sharky 我主要是想学习这门语言。我有一个脚本,但它还有其他错误,我主要只是用它来测试新命令。我只想知道如何将 l2 正则化项添加到网络中。
  • 您使用的是 Estimator 还是 keras?
  • @Sharky 我使用的是普通的张量流。我听说过估算器,但从未真正研究过它是什么。

标签: python tensorflow machine-learning


【解决方案1】:

TensorFlowL2(Tikhonov)正则化中,正则化参数lambda_可以这样写:

# Assuming you defined a graph, placeholders and logits layer.
# Using cross entropy loss:
lambda_ = 0.1
xentropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=logits)
ys = tf.reduce_mean(xentropy)
l2_norms = [tf.nn.l2_loss(v) for v in tf.trainable_variables()]
l2_norm = tf.reduce_sum(l2_norms)
cost = ys + lambda_*l2_norm
# from here, define optimizer, train operation and train ... :-)

【讨论】:

  • 但是为什么不在最后将 l2 正则化项添加到成本中,而不是将其添加到每个权重中并对正则化求和?
  • tf.losses.get_regularization_loss() 之间有什么区别?还有,不应该是 tf.reduce_mean() 吗?
  • But why not just add the l2 regularization term to the cost at the end, rather than adding it to each weight and summing the regularizations? - 最后添加到成本中:cost = ys + lambda_*l2_norm
  • Also, shouldn’t it be tf.reduce_mean()? - 不,它应该是 reduce_sum,因为我们正在对参数进行平方和。
  • And what is the difference here between tf.losses.get_regularization_loss()? - 可能是为了实现相同的正则化,方法是将每个变量的每个 l2 范数添加到集合 GraphKeys.REGULARIZATION_LOSSES 中,同时构建一个图。稍后要访问这些变量,您将调用此函数。在我的回答中,我没有将变量添加到集合中,而是使用tf.trainable_variables() 访问它们,然后才计算 l2-norm。
【解决方案2】:

基本上,您只需在所需层内定义正则化函数。

tf.keras.layers.Conv2D(filters,
                       kernel_size,
                       strides=strides,
                       padding=padding,
                       ...
                       kernel_regularizer=tf.keras.regularizers.l2()
                       )

使用 Estimator API 或低级 tensorflow,您可以将所有正则化器与损失值相加。您可以使用tf.losses.get_regularization_loss() 获取它,然后将其添加到 loss 或使用 tf.losses.get_total_loss() Keras 将在内部处理它。

【讨论】:

    猜你喜欢
    • 2020-10-24
    • 1970-01-01
    • 2021-05-14
    • 2022-11-07
    • 2018-03-20
    • 1970-01-01
    • 2023-03-28
    • 2021-05-03
    • 2019-05-27
    相关资源
    最近更新 更多