Я собираюсь обучить большую сеть LSTM с 2-3 миллионами статей и борюсь с ошибками памяти (я использую AWS EC2 g2x2large).
Я обнаружил, что одним из решений является снижение batch_size
. Однако я не уверен, относится ли этот параметр только к проблемам эффективности памяти или повлияет ли он на мои результаты. На самом деле, я также заметил, что batch_size
в примерах используется, как правило, степень двойки, чего я тоже не понимаю.
Я не против, если моя сеть займет больше времени на обучение, но я хотел бы знать, не снизит batch_size
ли это качество моих прогнозов.
Спасибо.
deep-learning
keras
hipoglucido
источник
источник
Ответы:
Через полтора года я возвращаюсь к своему ответу, потому что мой предыдущий ответ был неверным.
Размер партии значительно влияет на обучение. Когда вы помещаете пакет в свою сеть, происходит то, что вы усредняете градиенты. Концепция заключается в том, что если размер вашей партии достаточно велик, это обеспечит достаточно стабильную оценку того, каким будет градиент полного набора данных. Взяв образцы из вашего набора данных, вы оцените градиент при значительном снижении вычислительных затрат. Чем ниже вы идете, тем менее точной будет ваша оценка, однако в некоторых случаях эти шумовые градиенты могут фактически помочь избежать локальных минимумов. Когда оно слишком низкое, вес вашей сети может просто перепрыгнуть, если ваши данные шумят, и они могут быть неспособны к обучению или они сходятся очень медленно, что отрицательно влияет на общее время вычислений.
Другое преимущество пакетной обработки - для вычислений на GPU. GPU очень хороши для распараллеливания вычислений, которые происходят в нейронных сетях, если часть вычислений одинакова (например, многократное умножение матриц для одной и той же весовой матрицы вашей сети). Это означает, что размер пакета из 16 займет менее чем вдвое больше, чем размер пакета из 8.
В случае, если вам нужны пакеты большего размера, но они не будут соответствовать вашему графическому процессору, вы можете подать небольшую партию, сохранить оценки градиента и одну или несколько партий, а затем выполнить обновление веса. Таким образом, вы получите более стабильный градиент, потому что вы увеличили размер виртуального пакета.
НЕПРАВИЛЬНО, СТАРЫЙ ОТВЕТ: [[[Нет, размер batch_size в среднем влияет только на скорость вашего обучения, а не на качество обучения. Batch_sizes также не обязательно должны иметь степень 2, хотя я понимаю, что некоторые пакеты допускают только степени 2. Вы должны попытаться получить максимальный размер batch_size, который по-прежнему умещается в памяти вашего графического процессора, чтобы получить максимально возможную скорость .]]]]
источник
Я чувствую, что принятый ответ, возможно, неверен Есть варианты в алгоритмах градиентного спуска .
Ванильный градиентный спуск : здесь градиент рассчитывается по всем точкам данных за один снимок и берется среднее значение. Следовательно, у нас есть более плавная версия градиента, который требует больше времени для изучения.
Стохастический градиентный спуск : здесь одна точка данных за раз, следовательно, градиент является агрессивным (градиенты с шумом), следовательно, будет много колебаний (мы используем параметры импульса - например, Нестеров, чтобы контролировать это). Так что есть вероятность, что ваши колебания могут заставить алгоритм не достигнуть локального минимума. (Расходятся).
Мини-пакетный градиентный спуск : который принимает перки обоих предыдущих, усредняет градиенты небольшой партии. Следовательно, не слишком агрессивен, как SGD, и позволяет онлайн-обучение, которое никогда не допускал Vanilla GD.
Чем меньше Mini-Batch, тем лучше будет производительность вашей модели (не всегда), и, конечно, это связано с тем, что ваши эпохи слишком быстро учатся. Если вы тренируетесь на большом наборе данных, вам нужна более быстрая конвергенция с хорошей производительностью, поэтому мы выбираем Batch-GD.
У SGD был фиксированный параметр обучения, поэтому мы запускаем другие адаптивные оптимизаторы, такие как Adam, AdaDelta, RMS Prop и т. Д., Которые изменяют параметры обучения на основе истории градиентов.
источник
Как ни странно, я обнаружил, что для больших размеров партий с керами требуется больше эпох, чтобы сходиться.
Например, результат этого сценария, основанный на интеграционном тесте keras, равен
Связанный
BatchNormalization
, что повлияло на результаты.Edit: в большинстве случаев, увеличение
batch_size
желательно ускорить вычисления, но есть и другие более простые способы сделать это, как использование типов данных меньшей занимаемой площади с помощьюdtype
аргумента, будь то в keras или tensorflow , например ,float32
вместоfloat64
источник