Реализация градиентного спуска - PullRequest
4 голосов
/ 06 февраля 2012

Я реализовал как пакетный, так и стохастический градиентный спуск.Я испытываю некоторые проблемы, хотя.Это стохастическое правило:

1 to m {  
 theta(j):=theta(j)-step*derivative (for all j)  
} 

Проблема, с которой я столкнулся, заключается в том, что, хотя функция стоимости становится все меньше и меньше, тестирование говорит, что это не хорошо.Если я немного изменю шаг и изменит количество итераций, функция стоимости будет немного больше по значению, но результаты в порядке.Это чрезмерный «симптом»?Как мне узнать, какой из них правильный?:)

Как я уже сказал, хотя функция стоимости более минимизирована, тестирование говорит, что это не хорошо.

Ответы [ 2 ]

17 голосов
/ 07 февраля 2012

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

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

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

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

  • Добавьте шум.Это снижает точность найденных вами параметров, что может «размывать» локальные минимумы.Поиск может затем выпрыгнуть из локальных минимумов, которые являются небольшими по сравнению с шумом, но все еще остаются в более глубоких минимумах.Хорошо известным подходом для добавления шума является имитация отжига .

  • Добавить импульс.Наряду с использованием текущего градиента для определения шага также продолжайте в том же направлении, что и предыдущий шаг.Если вы возьмете часть предыдущего шага в качестве члена импульса, есть тенденция продолжать движение, что может привести к тому, что поиск превысит локальный минимум.При использовании дроби шаги затухают экспоненциально, поэтому плохие шаги не являются большой проблемой.Это всегда было популярной модификацией градиентного спуска при обучении нейронных сетей, где градиентный спуск известен как обратное распространение.

  • Используйте гибридный поиск.Сначала используйте глобальный поиск (например, генетические алгоритмы, различные методы Монте-Карло), чтобы найти хорошие начальные точки, затем примените градиентный спуск, чтобы воспользоваться информацией о градиенте в функции.

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

0 голосов
/ 06 февраля 2012

Есть много вещей, которые могут происходить:

  • ваш step может быть плохим выбором
  • Ваша производная может быть выключена
  • Ваше "ожидаемое значение" может быть ошибочным
  • ваш градиентный спуск может просто медленно сходиться

Я бы попытался увеличить длину прогона, и график запускается с различными значениями шага. Чем меньше шаг, тем больше шансов избежать слишком больших шагов.

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