【问题标题】:mini-batch gradient descent implementation in tensorflow张量流中的小批量梯度下降实现
【发布时间】:2017-03-15 00:45:29
【问题描述】:

在阅读深度学习模型的 tensorflow 实现时,我试图理解训练过程中包含的以下代码段。

self.net.gradients_node = tf.gradients(loss, self.variables)
for epoch in range(epochs):
            total_loss = 0
            for step in range((epoch*training_iters), ((epoch+1)*training_iters)):
                batch_x, batch_y = data_provider(self.batch_size)

                # Run optimization op (backprop)
                _, loss, lr, gradients = sess.run((self.optimizer, self.net.cost, self.learning_rate_node, self.net.gradients_node), 
                                                  feed_dict={self.net.x: batch_x,
                                                             self.net.y: util.crop_to_shape(batch_y, pred_shape),
                                                             self.net.keep_prob: dropout})

                if avg_gradients is None:
                    avg_gradients = [np.zeros_like(gradient) for gradient in gradients]
                for i in range(len(gradients)):
                    avg_gradients[i] = (avg_gradients[i] * (1.0 - (1.0 / (step+1)))) + (gradients[i] / (step+1))

                norm_gradients = [np.linalg.norm(gradient) for gradient in avg_gradients]
                self.norm_gradients_node.assign(norm_gradients).eval()



                total_loss += loss

我认为它与小批量梯度下降有关,但我不明白它是如何工作的,或者我将它与如下所示的算法联系起来有些困难

【问题讨论】:

    标签: python tensorflow deep-learning gradient-descent


    【解决方案1】:

    这与小批量 SGD 无关。

    它计算所有时间步长的平均梯度。在第一个时间步之后avg_gradients 将包含刚刚计算的梯度,在第二步之后它将是两个步骤的两个梯度的元素平均值,在n 步骤之后它将是所有n 的元素平均值到目前为止计算的梯度。然后对这些平均梯度进行归一化(以便它们的范数为 1)。如果没有呈现它们的上下文,很难说出为什么需要这些平均梯度。

    【讨论】:

    • 嗨 lshamael,感谢您的回复。我在原始帖子中包含了整个训练迭代部分。让我感到困惑的另一件事是关于 avg_gradients,它最初被定义为零。然后在 avg_gradients[i] = (avg_gradients[i] * (1.0 - (1.0 / (step+1)))) + (gradients[i] / (step+1)) 中,由于 avg_gradients[i] =0,看起来就像左边的第一项正好等于 0。和 avg_gradients[i] = gradients[i]/(step+1),对吗?我只是无法弄清楚这个梯度操作的目的是什么。
    • 是的,它是正确的在第一步,此时step+1 = 1,所以avg_gradients[i] = grandients[i]。在每个连续的步骤中,条件avg_gradients is None 不成立,因此不再为零。
    • 我明白了,谢谢。但是,如果不是批量 SGD,那么这个实现的底层算法(或逻辑)是什么。我刚刚更新了原帖。
    • 实际的小批量 SGD 发生在 batch_x, batch_y = data_provider(self.batch_size)(这给你一个小批量数据)和 sess.run((self.optimizer(这执行实际的 SGD,或者更有可能是它的一些高级版本,例如作为 Adam 或 RMSProp,取决于 optimizer 是什么)。目前还不清楚他们为什么需要这些平均梯度,他们不会在任何地方使用它们
    猜你喜欢
    • 2019-08-28
    • 2016-11-04
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2014-10-10
    • 2022-06-21
    相关资源
    最近更新 更多