【问题标题】:Why does Gradient descent never reaches the optimal value?为什么梯度下降永远不会达到最优值?
【发布时间】:2020-02-29 00:25:37
【问题描述】:

我已经实现了一个线性梯度下降示例并理解了它背后的公式,但为什么它永远不会达到最佳值并通过更新后面的小数点来不断提高准确性。这个问题的定义或术语是什么?

这是由于梯度下降的公式还是概率和统计计算从未让它达到 100% 并输出 99.99%?

这是 Node.js 上线性梯度下降的代码

const computeCost = require('./computeCost');

console.time('gradientDescent');

const gradientDescent = (X, y, thetat, alpha, iterations, levels) => {
  const m = y.length;
  var theta = thetat;
  var jHistory = [Infinity];
  var thetaHistory = [];
  var limit = 0;
  var cc = 0;
  for (var i = 1; i < iterations; i++) {
    var theta0 = theta[0];
    var theta1 = theta[1];
    const hThetaY = X.map((val,i) => {
      const hTheta = theta[0] + theta[1]*val;
      return hTheta-y[i];
    });
    const sum0 = hThetaY.reduce((a, b) => a + b);
    theta0 = theta0 - (alpha/m) * sum0;
    var sum1 = 0;
    hThetaY.forEach((val,i) => {
      sum1 += val*X[i];
    });
    theta1 = theta1 - (alpha/m) * sum1;
    cc++;
    var J = computeCost(X, y, [theta0, theta1]);
    jHistory.push(J);
    theta = [theta0, theta1];
    thetaHistory.push(...theta);
    if (J === 0 || Math.abs(J - jHistory[i-1]) < Number(`1e-${levels}`)) {
      console.log('CC:', cc);
      console.log('-------------------',{iterations: i});
      jHistory.shift();
      return {theta, jHistory, thetaHistory};
    }
  }
  console.log('CC:', cc);
  jHistory.shift();
  return {jHistory, theta, thetaHistory};
};
console.timeEnd('gradientDescent');
module.exports = gradientDescent;

根据数据:

var X = [1, 2, 3, 4, 5], y = [1, 3, 5, 7, 9];

任何人都能理解的线是2x-1

例如: Theta0 的值不断更新为:
0.26833333333333337,
1.794529145018259,
1.8698473883049052,
1.9175566659682246,
1.9476819685001623

实际值应该达到 2,但它永远不会。

示意图如下: Theta0 History Graph

【问题讨论】:

  • 您能否发布您的代码以更好地了解您所做的事情。还有你的梯度下降增加了吗?
  • @thilakshiK 更新了问题,请看你能不能回答。
  • 如果您尝试将 theta0theta1 值设置为 2x - 1 中的确切值,那么您最终会将成本值设为零。 J = 0 并不意味着您的成本函数工作正常。这意味着您的训练数据完全适合您的模型,但这并不意味着您的测试集也将完全适合。我希望你知道模型过度拟合。您可以增加迭代次数以使值接近 2。
  • @thilakshiK - 这就是我想要做的 J = 0,这反过来又以 100% 的准确度预测未来的样本,而不是 1.99x - 0.99 的值,当给定更高的值输入 10000 时预测,误差会很大。这是我的问题,为什么它没有达到最佳值 2。经过一百万次迭代后,它仍然没有达到这个值,所以这个问题的定义或术语是什么,我只是问这个问题。

标签: node.js machine-learning linear-gradients gradient-descent supervised-learning


【解决方案1】:

梯度下降是一种通用的优化算法,它基于迭代。我们在每个步骤中都更接近成本函数最小值(如果梯度下降算法有效)。你可以把它想象成从山上走下来。每一次迭代都像是离山脚又近了一步。

我们为什么要下山?因为它很陡,所以从数学上讲,给定点的成本函数的导数很大。随着您接近最小值(在每次迭代中),给定点的导数(山坡的陡度)变得越来越小。因此,我们在每次迭代中放慢速度。学习率也控制步长的大小。请注意,如果我们迈得太大,我们可能会走到山的另一边。

由于学习率和成本函数的导数(以及局部最小值)无法让我们达到全局最小值(假设我们给无限时间我们可以达到它)。

如果你使用一维数据(简单线性回归场景),那么查看普通最小二乘法:simple linear regression

Ordinary Least Square formula

我编写了一些代码,它达到了给定数据的确切 theta 值 (2, -1)。试试看!

const ordinaryLeastSquare = (X, y) =>{
  let x_sum = 0;
  let y_sum = 0;
  for (let i = 0; i < X.length; i++) {
    x_sum += X[i];
    y_sum += y[i];
  }

  let x_mean = x_sum / X.length;
  let y_mean = y_sum / y.length;
  let multiplier = 0;
  let divider = 0;
  for (let i = 0; i < X.length; i++) {
    multiplier += (X[i] - x_mean)*(y[i] - y_mean);
    divider += (X[i] - x_mean) * (X[i] - x_mean);
  }

  let theta1 = multiplier / divider;
  let theta0 = y_mean - theta1 * x_mean;
  
  console.log('theta1: ' + theta1)
  console.log('theta0: ' + theta0)
}

var X = [1, 2, 3, 4, 5], y = [1, 3, 5, 7, 9];
ordinaryLeastSquare(X, y);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 2019-06-21
    • 2019-04-08
    • 2018-08-18
    • 2021-01-25
    • 1970-01-01
    • 2015-08-27
    • 2014-04-30
    相关资源
    最近更新 更多