【问题标题】:Linear Regression with gradient descent: two questions梯度下降的线性回归:两个问题
【发布时间】:2020-10-05 00:07:53
【问题描述】:

我正在尝试理解带有梯度下降的线性回归,但我在下面的 loss_gradients 函数中不理解这部分。

import numpy as np

def forward_linear_regression(X, y, weights):

    # dot product weights * inputs
    N = np.dot(X, weights['W'])

    # add bias
    P = N + weights['B']

    # compute loss with MSE
    loss = np.mean(np.power(y - P, 2))

    forward_info = {}
    forward_info['X'] = X
    forward_info['N'] = N
    forward_info['P'] = P
    forward_info['y'] = y

    return loss, forward_info

这是我的理解陷入困境的地方,我已经注释掉了我的问题:

def loss_gradients(forward_info, weights):

    # to update weights, we need: dLdW = dLdP * dPdN * dNdW
    dLdP = -2 * (forward_info['y'] - forward_info['P'])
    dPdN = np.ones_like(forward_info['N'])
    dNdW = np.transpose(forward_info['X'], (1, 0))

    dLdW = np.dot(dNdW, dLdP * dPdN)
    # why do we mix matrix multiplication and dot product like this?
    # Why not dLdP * dPdN * dNdW instead?

    # to update biases, we need: dLdB = dLdP * dPdB
    dPdB = np.ones_like(forward_info[weights['B']])
    dLdB = np.sum(dLdP * dPdB, axis=0)
    # why do we sum those values along axis 0?
    # why not just dLdP * dPdB ?

【问题讨论】:

  • 你从哪里得到 loss_gradient 函数?好像不是你自己写的。是教科书上的吗?
  • 是的,它来自 S. Weidman 的《从零开始的深度学习》一书中
  • 请在您的帖子中包含此类信息 - 这也是正确归属的问题

标签: python machine-learning scikit-learn linear-regression gradient-descent


【解决方案1】:

在我看来,这段代码需要“一批”数据。我的意思是,当您执行forward_infoloss_gradients 时,您实际上是在传递一堆 (X, y) 对。假设你传递了 B 个这样的对。您所有转发信息的第一个维度将具有大小 B。

现在,您的两个问题的答案是相同的:本质上,这些行计算梯度(使用您预测的公式)每个 B 项,然后总结所有梯度,所以你得到一个梯度更新。我鼓励您自己弄清楚点积背后的逻辑,因为这是 ML 中非常常见的模式,但一开始要掌握窍门有点棘手。

【讨论】:

  • 哦!我现在理解总结偏差梯度背后的逻辑。你能帮忙弄清楚权重更新的点积背后的逻辑吗?这东西很难。现在我想知道为什么我们不只对权重梯度执行 np.sum(dLdP * dPdN * dNdW) ,遵循与偏置梯度相同的逻辑。
  • 编辑:实际上不会 np.sum(dLdP * dPdN * dNdW) 工作?
  • 另一个问题:为什么要批量训练数据?而不是一次只有一个样本?它在某种程度上有助于收敛吗?我目前的理解是,它与一次做一个样本完全相同。
  • 关于为什么要训练批次,有几个原因。一,和你建议的一样,是提高训练的稳定性。您计算的梯度实际上是预期梯度的估计量,因此基于一个样本的梯度可能非常嘈杂。使用批处理的另一个原因是它实际上更高效,尤其是当您使用 python 和 numpy 时:首先,numpy 是用 C 编写的(或其他一些快速编译的语言,我不记得了),所以一般来说一口气传给 numpy,效果更好。
  • 关于点积:检查您提出的方程中张量的形状。我认为您的示例中的形状不太匹配。
猜你喜欢
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 2019-10-09
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 2016-10-22
相关资源
最近更新 更多