Пакетный градиентный спуск против стохастического градиентного спуска

101

Предположим, у нас есть некоторый обучающий набор (x(i),y(i)) для i=1,,m . Также предположим, что мы запускаем некоторый тип контролируемого алгоритма обучения на тренировочном наборе. Гипотезы представлены в виде hθ(x(i))=θ0+θ1x(i)1++θnx(i)n, Нам нужно найти параметры θ которые минимизируют «расстояние» между y(i) и hθ(x(i)) . Пусть

J(θ)=12i=1m(y(i)hθ(x(i))2

Тогда мы хотим найти θ которое минимизирует J(θ) . При градиентном спуске мы инициализируем каждый параметр и выполняем следующее обновление:

θj:=θjαθjJ(θ)

В чем ключевое различие между периодическим градиентным спуском и стохастическим градиентным спуском?

Оба используют вышеуказанное правило обновления. Но один лучше другого?

user20616
источник

Ответы:

121

Применимость пакетного или стохастического градиентного спуска действительно зависит от ожидаемого многообразия ошибок.

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

Стохастический градиентный спуск (SGD) вычисляет градиент, используя одну выборку. В большинстве приложений SGD фактически используется мини-пакет из нескольких образцов, по причинам, которые будут объяснены чуть позже. SGD работает хорошо (я полагаю, не очень хорошо, но лучше, чем пакетный градиентный спуск) для коллекторов ошибок, которые имеют много локальных максимумов / минимумов. В этом случае несколько более шумный градиент, рассчитанный с использованием уменьшенного числа выборок, стремится вывести модель из локальных минимумов в область, которая, как мы надеемся, является более оптимальной. Отдельные сэмплы очень шумные, в то время как мини-партии имеют тенденцию выделять немного шума. Таким образом, количество рывков уменьшается при использовании мини-пакетов. Хороший баланс достигается, когда размер мини-пакета достаточно мал, чтобы избежать некоторых плохих локальных минимумов, но достаточно велик, чтобы он не Избегайте глобальных минимумов или более эффективных локальных минимумов. (Между прочим, это предполагает, что лучшие минимумы имеют большую и более глубокую зону притяжения, и поэтому в них легче попасть.)

Одним из преимуществ SGD является то, что он в вычислительном отношении намного быстрее. Большие наборы данных часто не могут храниться в оперативной памяти, что делает векторизацию гораздо менее эффективной. Скорее, каждый образец или партия образцов должны быть загружены, обработаны, сохранены результаты и так далее. Мини-пакет SGD, с другой стороны, обычно намеренно делается достаточно маленьким, чтобы его можно было вычислить в вычислительном отношении.

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

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

Jason_L_Bens
источник
13
На практике никто не использует Пакетный градиентный спуск. Это просто слишком вычислительно дорого для небольшого выигрыша. (Выигрыш в том, что вы фактически снижаете «истинный» градиент.) Если у вас есть функция сильно невыпуклых потерь, вам просто нужно шагнуть в основном в правильном направлении, и вы в конечном итоге сойдетесь на локальный минимум. Таким образом, минибатч SGD.
Сабалаба
@Jason_L_Bens, у вас есть какие-либо ссылки (документы или онлайн-тексты), где я могу прочитать больше об этих алгоритмах?
user110320
1
@ user110320 Не слишком важно, нет, хотя они очень распространенные алгоритмы, и поэтому по этой теме должно быть доступно множество ресурсов с небольшим поиском. Если вы ищете общий подход, я бы порекомендовал прочесть некоторые из «Изучения глубокой архитектуры Йошуа Бенжио для ИИ». Это то, с чего я начал.
Jason_L_Bens
6

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

  1. Почему минибатч работает .

pdatap^data

g=Epdata(J(θ)θ)
SE(g^(n))SE(g^(m))=mn
m
Ep^data(g^(m))=Ep^data(J(θ)θ)
m
  1. Почему minibatch может работать лучше .

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

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

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

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

Вы можете найти книгу «Глубокое обучение» Яна Гудфеллоу и др., В которой есть довольно хорошие дискуссии на эту тему, если вы внимательно ее прочитаете.

Сяо-Фенг Ли
источник
Для выпуклых задач оптимизации то, что вы сказали, хорошо. Но чтобы использовать градиентные методы для невыпуклых функций, вы упустили очень важную причину, по которой SGD лучше, чем пакетный GD. Смотрите мой ответ datascience.stackexchange.com/questions/16807/…
horaceT
@horaceT Спасибо за ваш комментарий. Поскольку упомянутый вами вопрос был описан Jason_L_Bens выше с подробностями, я не стал повторять, но с должным уважением ссылался на его ответ в последнем третьем абзаце. Для задачи оптимизации градиентного спуска невыпуклый отражается локальными минимумами, включая седловую точку (см. Последний третий абзац); и ради описания мой ответ описывает SGD как мини-пакет, но с размером пакета 1 (см. третий абзац).
Сяо-Фенг Ли
3

2101=512

Свен Алиндер
источник