Что такое batchSize в функции model.fit () TensorFlow? - PullRequest
1 голос
/ 04 апреля 2020

Определив модель с помощью TensorFlow. js, вы можете запустить model.fit() для ее обучения. Эта функция принимает ряд параметров, включая объект конфигурации. Этот объект имеет свойство batchSize. В документации по model.fit() просто сказано:

Количество выборок на обновление градиента. Если он не указан, по умолчанию он будет равен 32.

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

Есть ли намеки на это?

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Это действительно довольно просто. Предположим, например, что у вас есть тренировочный набор из 50000 образцов и связанных ярлыков. В классической теории вы должны подать в вашу модель все 50 000 входов (размер пакета = 50 000), а затем скорректировать вес сети с помощью обратного распространения. Таким образом, для 50 000 выборок вы получаете только 1 итерацию весов сети (1 эпоха). Есть две проблемы с этим. Одним из них является время, необходимое для обучения сети. Допустим, для получения высокого уровня точности требуется 50 итераций (эпох). В этом случае вы должны кормить свою сеть 50 х 50 000 образцов. Это заняло бы значительное количество времени обработки. Во-вторых, с размером пакета 50 000 все 50 000 выборок находятся в памяти. Например, если вы работаете с изображениями, это заняло бы огромное количество памяти и, вероятно, приведет к ошибке исчерпания ресурса. Теперь давайте возьмем другую стратегию. Разделите ваш тренировочный набор на группы по 1000 образцов, чтобы у вас было 50 групп (партий). Теперь вы подаете в свою сеть первую партию из 1000 образцов, а затем корректируете вес с помощью обратного распространения (Epoch1). Затем сделайте это снова для следующей партии из 1000 образцов и снова выполните обратное распространение (Epoch2). Повторите это для всех 50 партий. В конце у вас есть 50000 образцов сети, и вы откорректировали веса 50 раз. В результате вы тренируетесь намного быстрее, и у вас в памяти остается только 1000 сэмплов, если вы выбираете сэмплы партиями. Здесь есть компромисс. Например, если вы установите размер пакета = 1, обучение займет очень много времени, потому что вы будете выполнять обратное распространение 50000 раз. Так что лучше выбрать умеренный размер партии. Обычно я выбираю его в диапазоне от 30 до 80, что, кажется, хорошо работает даже с большими изображениями, такими как 254 X 254 X 3, если у вас 16 ГБ памяти GPU.

1 голос
/ 04 апреля 2020

Размер партии - это количество обучающих примеров, которые вы используете для выполнения одного шага стохасти c градиентного спуска (SGD).

Что такое SGD? SGD является градиентным спуском (GD), но вместо того, чтобы использовать все ваши тренировочные данные для вычисления градиента вашей функции потерь относительно параметров сети, вы используете только подмножество обучающего набора данных. Отсюда и прилагательное «стохасти c», потому что, используя только подмножество обучающих данных, вы будете приближаться к стохастически (т.е. вы будете вводить шум) градиента, который будет вычисляться с использованием всех ваши тренировочные данные, которые будут считаться «фактическим» градиентом функции потерь по отношению к параметрам.

Почему я должен изменить это число? Я понял, что если я увеличу его, обучение будет быстрее, а если я уменьшу, оно станет медленнее. Но что именно я здесь меняю? Зачем мне это менять? На что мне нужно обращать внимание?

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

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

Типичными значениями размера пакета являются 32, 64 и 128. Почему? Люди просто используют эти цифры, потому что эмпирически они кажутся хорошими компромиссами (с точки зрения конвергенции, времени обучения и т. Д. c.) Между крошечными размерами партий и огромными размерами партий.

...