Градиентный спуск: тэты не сходятся

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

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

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))

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


person Mark Hodges    schedule 19.02.2017    source источник


Ответы (2)


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

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

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

введите описание изображения здесь

person Sandipan Dey    schedule 23.02.2017

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

0.001 * (1 / 7)

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

1e-6

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

person bremen_matt    schedule 19.02.2017
comment
Чтобы избежать числовой нестабильности, может быть лучше также масштабировать данные. Проблема в том, что и X, и Y находятся в сотнях, деление X и Y на 100 не меняет решения, но будет иметь тот же эффект (эффективное изменение скорости обучения), но без потери числовой стабильности (умножение большого числа на малое). число - одна из основных нестабильных операций) - person lejlot; 20.02.2017