Проводится ли обучение нейронных сетей один за другим? [Дубликат]

9

Я пытаюсь изучить нейронные сети, просматривая эту серию видео и внедряя простую нейронную сеть на Python.

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

Мой вопрос: следует ли мне изменять весовые коэффициенты на каждом отдельном образце, прежде чем переходить к следующему образцу, или я должен сначала рассчитать требуемые изменения для всей партии из 1000 образцов, и только затем начать применять их к сети?

Рам Рахум
источник

Ответы:

9

Должен ли я изменять веса / смещения на каждом отдельном образце, прежде чем перейти к следующему образцу

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

или я должен сначала рассчитать требуемые изменения для всей партии из 1000 образцов, и только потом начать применять их к сети?

Вы можете сделать это, это называется пакетным градиентным спуском или, в некоторых случаях (особенно в старых ресурсах), просто считается нормальным подходом и называется градиентным спуском.

Каждый подход имеет свои преимущества и недостатки. В основном:

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

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

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

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

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

  • Перестановка набора данных в начале каждой эпохи.

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

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

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

Нил Слэйтер
источник
«Распространенным решением является обработка пакета наибольшего размера, который ускорение GPU позволяет выполнять параллельно». Как вы это определяете? Я не видел ни одного ресурса, где его можно было бы прокомментировать, когда размер пакета достаточен для пикового распараллеливания
DuttaA
1
@DuttaA, например, stackoverflow.com/questions/46654424/… и pugetsystems.com/labs/hpc/…
Нил Слэйтер
Подобный вопрос был задан ранее на этом сайте. Я даже думаю, что это дубликат (хотя и с другой, немного другой точки зрения). См .: ai.stackexchange.com/q/11667/2444 .
nbro
«Распространенным решением является обработка пакета наибольшего размера, который ускорение графического процессора позволяет выполнять параллельно». - У тебя это задом наперед! Первая эвристика заключается в обработке наименьшего размера мини-партии, что приводит к приемлемой производительности. Однако во многих моделях вы достигаете пределов памяти, прежде чем насыщаете аппаратную эффективность, поэтому в конечном итоге вы используете самую большую модель, которая умещается в ОЗУ. Как правило, однако, меньшие размеры партий находят лучшие минимумы, так как они демонстрируют большую стохастичность. Предостережение заключается в том, что нормы партии нарушаются при очень малых размерах партии.
Александр Дубинский
@AleksandrDubinsky RAM - это аппаратное обеспечение.
DuttaA
0

В идеале вам нужно обновить веса, пройдя все выборки в наборе данных. Это называется « Пакетный градиентный спуск» . Но, как нет. примеров обучения увеличивается, вычисления становятся огромными, и обучение будет очень медленным. С появлением глубокого обучения размер обучения исчисляется миллионами, а вычисления на всех примерах обучения очень непрактичны и очень медленны.

Здесь два метода оптимизации стали заметными.

  1. Мини-пакет градиентного спуска
  2. Стохастический градиентный спуск (SGD)

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

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

Подходя к преимуществам и недостаткам трех методов, которые мы обсуждали.

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

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

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

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

  • Участок градиентного спуска падает плавно и медленно, стабилизируется и достигает глобального минимума.

  • График стохастического градиентного спуска будет иметь колебания, будет быстро падать, но колеблется вокруг глобального минимума.

Это некоторые блоги, в которых есть подробное объяснение преимуществ, недостатков каждого метода, а также графики изменения функции стоимости для всех трех методов с итерациями.

https://adventuresinmachinelearning.com/stochastic-gradient-descent/

https://machinelearningmastery.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/

Картик Подугу
источник