【问题标题】:minimize a loss function using a specific form of the gradient of loss w.r.t its parameters使用特定形式的损失梯度 w.r.t 最小化损失函数
【发布时间】:2017-08-17 19:23:52
【问题描述】:

在机器学习中,给定要最小化的损失函数,我们通常会选择一些机器学习库来更新参数。比如在tensorflow中,我们通常会做如下的事情,先写下损失函数,

self.loss = F(\theta, \eta)
self.optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)          
self.train_op = self.optimizer.minimize(
                self.loss, global_step=tf.contrib.framework.get_global_step())

然后使用_, loss = sess.run([self.train_op, self.loss], feed_dict) 更新参数以最小化损失函数。

在这种情况下,我们不需要关心 F(\theta, \eta) w.r.t \theta 和 \eta 的梯度的确切形式是什么。

我想知道如何使用特定形式的损失梯度 w.r.t 来更新参数并最小化损失。也就是说,给定梯度的形式,如何使用机器学习库写下要更新的东西。

Update1 @lejlot 提供了一个惊人的答案(见下文),它首先通过 Adam 计算了一些 true_gradient,然后将渐变修改为您想要的。但是,对我来说,我想知道是否可以绕过这一点,直接将所需的梯度形式应用于损失。这背后的原因是我不知道计算的true_gradients 的形式,所以我不能添加一些东西。例如,我想要的渐变形式是f(\theta),但是如何从计算出的true_gradients 到f(\theta) 是未知的,因为我们不知道计算出的true_gradients 的形式。

【问题讨论】:

    标签: numpy machine-learning tensorflow


    【解决方案1】:

    首先,值得注意的是,梯度只有一个适当的“形式”,它是由 TF 等库使用自动微分自动计算的。如果你对这个梯度做了任何事情,它就不再是你正在考虑的损失函数的梯度了。跟随它可能仍然会导致收敛(有许多定理表明,如果更新方向“足够相似”它仍然可以工作)但值得理解的是,玩弄梯度通常会产生一些不是任何函数的适当梯度。如果将梯度下降以外的任何东西用作优化器,这一点非常重要 - 例如,在您的代码中,您有 Adam,如果您提供的不是适当的梯度,它可能会完全中断(因为它使用它来进行二阶估计,因此如果你弄乱梯度,它们将是完全错误的,甚至可能导致发散/随机行为。

    但是,如果您只知道梯度(或有充分的数学理由相信您所做的事情不会破坏优化),您可以利用这一事实直接在 TF 中应用它.minimize 在内部调用两个函数:compute_gradients 和 apply_gradients。

    所以(在伪代码中)它将在以下几行中:

    self.optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)          
    true_gradients = self.optimizer.compute_gradients(self.loss)
    
    my_own_gradients = do_some_magical_stuff_with(true_gradients)
    
    self.train_op = self.optimizer.apply_gradients(my_own_gradients)
    

    就是这样!

    【讨论】:

    • 惊人的答案,谢谢!我也想知道是否可以绕过伪代码中的第二行,直接给出一种理想的渐变形式并将其应用于损失。
    • 我想回避第二行的原因是我不知道计算的true_gradients 的形式,所以我不能添加一些东西。例如,我想要的渐变形式是f(\theta),如何从计算得到的true_gradientsf(\theta) 是未知的,因为我们不知道计算得到的true_gradients 的形式。
    • 哦,我突然明白我确实可以回避第二步,只需要忽略第二步。谢谢,@lejlot!
    • 没错,你所要做的就是定义你的“do_some_magical_stuff_with”来忽略它的论点:)
    • 感谢您帮助我解决这个问题。但是当我需要两组不同参数的两个梯度损失时,似乎这种方法不能直接应用于。你能看看这个here。我试了很久才弄明白,还是没有成功。
    猜你喜欢
    • 2019-04-14
    • 2021-11-25
    • 2016-11-29
    • 1970-01-01
    • 2021-02-24
    • 2020-08-25
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多