2

Я пытаюсь выяснить градиентный спуск с Octave. С каждой итерацией мои теты становятся экспоненциально большими. Я не уверен, в чем проблема, поскольку я копирую другую функцию напрямую.Градиентный спуск: thetas не сходятся

Вот мои матрицы:

X = 1 98 
    1 94 
    1 93 
    1 88 
    1 84 
    1 82 
    1 79 

y = 97 
    94 
    94 
    78 
    85 
    85 
    76 

theta = 1 
     1 

Я использую эту формулу:

theta = theta - 0.001 * (1/7) * (X' * (X * theta - y)) 

Я понял, что оптимальный thetas использует нормальное уравнение, но только после нескольких итераций моего тета находятся в нескольких тысячах. Любая идея, что не так?

ответ

1

Вы, кажется, используете градиентный спуск для линейной регрессии, где ваш уровень обучения слишком высок, как упоминалось в предыдущих ответах, это сообщение просто для того, чтобы добавить визуализацию и точно объяснить, что происходит в вашем случае.

Как показано на рисунке ниже, скорость обучения достаточно высока, чтобы сходиться к глобальному минимуму на выпуклой поверхности затрат, а значения тэта колеблются и пропускают минимальную точку, поскольку этапы слишком велики (как показано в RHS рисунок). Если вы снизите скорость обучения (как в LHS), скорость конвергенции будет ниже, но в конечном итоге вы достигнете глобального минимума.

Вам нужно найти альфа (скорость обучения), которая является правильной, так что скорость конвергенции не слишком медленная или слишком высокая (это будет зависеть от данных, а масштабирование функций поможет).

enter image description here

1

Если значения взрываются, ваш шаг должен быть слишком большим. По сути, вы перебрасываете каждый раз. Если ваш шаг слишком велик, вы увидите последовательность оценок, таких как [100, -100,1000, -1000, ...] ... оценки будут колебаться между последовательно большими положительными и отрицательными числами. Самое простое исправление, чтобы изменить размер шага от постоянного

0,001 * (1/7)

к чему-то вроде

1е-6

или, возможно, даже меньше.

+1

Чтобы избежать числовую нестабильность может быть на самом деле лучше масштабировать данные тоже. Проблема заключается в том, что X и Y находятся в 100, деление на X и Y на 100 не изменяет решение, но будет иметь тот же эффект (эффективно изменяя скорость обучения), но без потери численной устойчивости (умножение большого числа на небольшой число является одной из основных нестабильных операций) – lejlot