Влияет ли batch_size в Keras на качество результатов?

38

Я собираюсь обучить большую сеть LSTM с 2-3 миллионами статей и борюсь с ошибками памяти (я использую AWS EC2 g2x2large).

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

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

Спасибо.

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

Ответы:

43

Через полтора года я возвращаюсь к своему ответу, потому что мой предыдущий ответ был неверным.

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

Другое преимущество пакетной обработки - для вычислений на GPU. GPU очень хороши для распараллеливания вычислений, которые происходят в нейронных сетях, если часть вычислений одинакова (например, многократное умножение матриц для одной и той же весовой матрицы вашей сети). Это означает, что размер пакета из 16 займет менее чем вдвое больше, чем размер пакета из 8.

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

НЕПРАВИЛЬНО, СТАРЫЙ ОТВЕТ: [[[Нет, размер batch_size в среднем влияет только на скорость вашего обучения, а не на качество обучения. Batch_sizes также не обязательно должны иметь степень 2, хотя я понимаю, что некоторые пакеты допускают только степени 2. Вы должны попытаться получить максимальный размер batch_size, который по-прежнему умещается в памяти вашего графического процессора, чтобы получить максимально возможную скорость .]]]]

Ян ван дер Вегт
источник
Я не могу позволить себе 32, но я могу позволить себе 16. Однако я заметил, что это слишком медленно. Как вы думаете, я должен попробовать некоторые значения между 16-32 или придерживаться 16?
hipoglucido
Я бы попробовал и время некоторые ценности. Каждая эпоха должна быть примерно в одно и то же время, чтобы это не заняло много времени. Сначала попробуйте 17, чтобы увидеть, работает ли он быстрее или медленнее, потому что меня это интересует, учитывая, что эта степень 2 зависит от GPU и / или серверной части Keras. Но я думаю, что лучше всего заполнить его до краев
Ян ван дер Вегт
9
Вы уверены, что размер пакета не влияет на качество обучения? Я помню, как читал некоторые блоги / газеты (?), Где говорилось, что меньшие партии дают более шумные градиенты, чем большие, но шум может быть полезен для выхода из локальных минимас. Не уверен, если / как это относится к LSTM, хотя.
Stmax
Не совсем уверен, у меня не было достаточно опыта, но это то, что я прочитал. Я вижу, что градиенты менее стабильны, поэтому я могу быть выключен.
Ян ван дер Вегт
2
Спустя полтора года и гораздо больше знающих сейчас, и я согласен. Я собираюсь изменить свой ответ
Ян ван дер Вегт
11

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

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

  2. Стохастический градиентный спуск : здесь одна точка данных за раз, следовательно, градиент является агрессивным (градиенты с шумом), следовательно, будет много колебаний (мы используем параметры импульса - например, Нестеров, чтобы контролировать это). Так что есть вероятность, что ваши колебания могут заставить алгоритм не достигнуть локального минимума. (Расходятся).

  3. Мини-пакетный градиентный спуск : который принимает перки обоих предыдущих, усредняет градиенты небольшой партии. Следовательно, не слишком агрессивен, как SGD, и позволяет онлайн-обучение, которое никогда не допускал Vanilla GD.

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

У SGD был фиксированный параметр обучения, поэтому мы запускаем другие адаптивные оптимизаторы, такие как Adam, AdaDelta, RMS Prop и т. Д., Которые изменяют параметры обучения на основе истории градиентов.

Джил Юнг Юк
источник
3) обычно называют минибат
Алекс
@ Алекс: добавлено изменение.
Джил Юнг Джук
1
Я согласен, что нет никакого правила относительно параметра размера партии. Но это утверждение - «Чем меньше Mini-Batch, тем лучше будет производительность вашей модели» - противоречит общему правилу. Как правило, вы хотите максимально увеличить размер партии
MonsieurBeilto
4

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

Например, результат этого сценария, основанный на интеграционном тесте keras, равен

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

Связанный

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

Edit: в большинстве случаев, увеличение batch_sizeжелательно ускорить вычисления, но есть и другие более простые способы сделать это, как использование типов данных меньшей занимаемой площади с помощью dtypeаргумента, будь то в keras или tensorflow , например , float32вместоfloat64

Шади
источник
С большими партиями (и, следовательно, меньше за эпоху) у вас будет меньше градиентных обновлений за эпоху. «эпоха» - это просто жаргон ML для «одного прохода ваших данных во время тренировки». Если вы пытаетесь ускорить тренировку, измерьте время на стене и игнорируйте эпохи.
Эндрю Вагнер