【问题标题】:Vectorizing a gradient descent algorithm向量化梯度下降算法
【发布时间】:2014-01-11 06:05:54
【问题描述】:

我在 matlab 中编码梯度下降。 对于两个功能,我得到了更新步骤:

temp0 = theta(1,1) - (alpha/m)*sum((X*theta-y).*X(:,1));
temp1 = theta(2,1) - (alpha/m)*sum((X*theta-y).*X(:,2));
theta(1,1) = temp0;
theta(2,1) = temp1;

但是,我想将此代码矢量化并能够将其应用于任意数量的功能。 对于矢量化部分,shows 我想做的是矩阵乘法

theta = theta - (alpha/m) * (X' * (X*theta-y));

这很好看,但是当我尝试时,我意识到它不适用于梯度下降,因为参数不会同时更新。

那么,我怎样才能对这段代码进行矢量化,并确保参数和更新同时进行呢?

【问题讨论】:

标签: java python matlab machine-learning linear-algebra


【解决方案1】:

对于矢量化版本,请尝试以下操作(明确同时更新的两个步骤):

 gradient = (alpha/m) * X' * (X*theta -y)
 theta = theta - gradient

【讨论】:

  • 你能解释一下这个吗..方程梯度 = (alpha/m) * X' * (X*theta -y) .. 或者只是引导我到一本书或一个解释它的网址。 . 谢谢你
  • 在矩阵(θ)更新之前将梯度预计算为两个步骤,以确保更新是同时进行的。因为第二步将是原子的。
  • 这个应该是公认的答案,因为它更有效地利用了矢量化
【解决方案2】:

您的矢量化是正确的。我也尝试了你的两个代码,它让我得到了相同的 theta。请记住,不要在第二个实现中使用更新的 theta。

这也有效,但不如您的第二个实现简单:

Error = X * theta - y;
for i = 1:2
    S(i) = sum(Error.*X(:,i));
end

theta = theta - alpha * (1/m) * S'

【讨论】:

  • 我不明白:基本上,当 theta 有两个参数时,我尝试了第一个版本(带 temp)和第二个版本(“完全矢量化”)。我试图用这两个参数解决相同的问题代码并为每个版本执行 1500 次迭代。最后,我没有得到相同的结果,我可以看到第一个版本至少收敛得更快)(我在 coursera ml 的第一次作业中尝试了这两个版本类,显然结果不同)。
  • 我只尝试了一个 2*1 向量作为 theta,一步之后,你的两个工具都得到了相同的新 theta。我不确定您的代码的其他部分是否会影响结果。您可以跟踪每一步以观察 theta 的变化。顺便说一句,两个初始化 theta 是否相同?它们是设置为零还是随机数?
  • theta 在两种实现中显然不会以相同的方式改变。我不确定第二个版本是否只是收敛得更慢,或者它是否没有执行正确的更新步骤。
  • 如果你完全训练样本而不是按顺序训练,收敛也应该是相同的。
【解决方案3】:

为了同时更新它们,您需要将 theta(1..n) 的值保留在临时向量中,并在操作后更新原始 theta 向量中的值。

这是我用于此目的的代码:

临时更新

tempChange = zeros(length(theta), 1);

tempChage = theta - (alpha/m) * (X' * (X*theta-y));

实际更新

theta = tempChage;

【讨论】:

    【解决方案4】:
    theta = theta - (alpha/m) * (X') * ((X*theta)-y)
    

    【讨论】:

      【解决方案5】:

      我对这个话题很陌生,我的看法仍然是: 如果您事先计算X*theta,那么在进行矢量化操作以调整theta 时,不需要处于临时状态。 换一种说法: 如果您在更新 theta 向量时计算 X*theta,则 theta(1) 在 theta(2) 之前更新,因此会更改 X*theta。 但是如果我们将X*theta 计算为 y_pred 然后在 theta 上进行矢量化运算,就可以了。

      所以我的建议是(不使用 temp):

      y_pred = X*theta %theta is [1;1] and X is mX2 matrix
      theta = theta - (alpha/m) * (X' * (y_pred-y));
      

      如果我错了,请纠正我。

      【讨论】:

        【解决方案6】:

        这是梯度下降的矢量化形式,它适用于我的倍频程。
        请记住,X 是一个矩阵,第一列中有一个(因为theta_0 *1thetha_0)。对于 X 中的每一列,您在 X 中都有一个特征(n)。每一行都是一个训练集(m)。所以 X 是一个 m X (n+1 ) 矩阵。 y 列向量可以是房价。 最好有一个成本函数来检查您是否找到最小值。
        为 alpha 选择一个值,可能是 a = 0.001,并尝试在每次运行代码时更改它。 num_iters 是您希望它运行的时间。

        function theta = gradientDescent(X, y, theta, alpha, num_iters)
        
        m = length(y); % number of training examples
        
        
         for iter = 1:num_iters
        
          theta = theta - (alpha/m) * (X') * ((X*theta)-y)
        
        
         end
        
        end
        

        在此处查看完整说明:https://www.coursera.org/learn/machine-learning/resources/QQx8l

        【讨论】:

          【解决方案7】:

          python 向量化梯度下降实现中,具有 MSE 损失的线性回归可能如下所示:

          import numpy as np
          def grad_step(X, y, θ, α):
              m = X.shape[0]
              return θ - (α / m) * 2 * X.T @ (X @ θ - y)
          
          def compute_loss(X, y, θ):
              return np.mean((X @ θ - y).T @ (X @ θ - y))
          
          # run gradient descent
          θ = np.zeros(X.shape[1]).reshape(-1,1)
          for _ in range(100):
              θ = grad_step(X, y, θ, α = 0.01)
          

          由于使用矩阵微分规则,我们可以计算成本函数的梯度如下:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-03-23
            • 2014-01-11
            • 1970-01-01
            • 2016-06-13
            • 2017-06-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多