Почему градиентный спуск никогда не достигает оптимального значения? - PullRequest
0 голосов
/ 03 ноября 2019

Я реализовал пример линейного градиентного спуска и понял формулу, лежащую в основе этого, но почему он никогда не достигает оптимального значения и продолжает увеличивать точность, обновляя последние десятичные точки. Какое определение или термин используется для этой проблемы?

Это связано с формулой градиентного спуска или вероятностным и статистическим расчетом, который никогда не позволяет достичь 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...