【问题标题】:Machine learning: why the cost function does not need to be derivable?机器学习:为什么成本函数不需要是可导出的?
【发布时间】:2018-01-07 18:12:14
【问题描述】:

我正在使用 Tensorflow 创建一个自定义的损失函数,这个关于一般机器学习的问题浮现在我的脑海。

我的理解是优化算法需要一个可导的成本函数来找到/接近最小值,但是我们可以使用不可导的函数,例如绝对函数(当 x=0 时没有导数)。一个更极端的例子,我这​​样定义我的成本函数:

def customLossFun(x,y):
    return tf.sign(x)

我预计在运行代码时会出错,但它确实有效(它没有学到任何东西,但没有崩溃)。

我错过了什么吗?

【问题讨论】:

    标签: tensorflow machine-learning


    【解决方案1】:

    你错过了 sign 函数的梯度是在 Tensorflow 源代码中手动定义的一个事实。

    如你所见here:

    def _SignGrad(op, _):
      """Returns 0."""
      x = op.inputs[0]
      return array_ops.zeros(array_ops.shape(x), dtype=x.dtype)
    

    tf.sign 的梯度被定义为始终为零。当然,这是导数存在的梯度,因此无处不在,但不为零。

    tensorflow 作者决定不检查输入是否为零,并在特定情况下抛出异常

    【讨论】:

      【解决方案2】:

      为了防止 TensorFlow 抛出错误,唯一真正的要求是,对于输入变量的任何值,您的成本函数都会计算为一个数字。从纯粹的“它会运行”的角度来看,它不知道/不关心它试图最小化的函数的形式。

      为了让您的成本函数在 TensorFlow 使用它来训练模型时为您提供有意义的结果,它还需要 1)随着您的模型做得更好而变得更小,并且 2)从低于(即它不能去负无穷大)。它通常不需要平滑(例如 abs(x) 在符号翻转的地方有一个扭结)。 Tensorflow 始终能够使用自动微分计算任何位置的梯度(https://en.wikipedia.org/wiki/Automatic_differentiationhttps://www.tensorflow.org/versions/r0.12/api_docs/python/train/gradient_computation)。

      当然,如果您选择了一个有意义的成本函数,那么这些梯度会更有用,它不是太平。

      【讨论】:

        【解决方案3】:

        理想情况下,成本函数需要在任何地方都平滑才能应用基于梯度的优化方法(SGD、Momentum、Adam 等)。但如果不是这样,一切都不会崩溃,您可能只是在收敛到局部最小值时遇到问题。

        当函数在某个点x 不可微时,如果神经网络收敛到这个x,就有可能得到大的振荡。例如,如果损失函数为tf.abs(x),则可能网络权重大多为正,因此推断x > 0 一直存在,因此网络不会注意到tf.abs。然而,x 更有可能在0 周围反弹,因此梯度是任意正负的。如果学习率没有衰减,则优化不会收敛到局部最小值,而是会围绕它进行约束。

        在您的特定情况下,梯度始终为零,因此根本不会发生任何变化。

        【讨论】:

          【解决方案4】:

          如果它没有学到任何东西,你得到了什么?您的损失函数几乎在任何地方都是可微的,但它几乎在任何地方都是平坦的,因此最小化器无法确定朝向最小值的方向。

          如果您从正值开始,它很可能会停留在正值的随机值上,即使左侧的最小值更好(具有较低的值)。

          Tensorflow 通常可用于进行计算,它提供了一种机制来自动查找给定表达式的导数,并且可以跨不同的计算平台(CPU、GPU)执行此操作,并在需要时分布在多个 GPU 和服务器上。

          但是你在 Tensorflow 中实现的不一定是要最小化的目标函数。你可以使用它,例如抛出随机数并对给定函数执行蒙特卡罗积分。

          【讨论】:

            猜你喜欢
            • 2012-04-26
            • 2011-06-04
            • 2023-03-04
            • 2011-02-06
            • 2017-05-29
            • 2016-07-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多