Я часто читаю, что в случае моделей глубокого обучения обычная практика - применять мини-партии (как правило, маленькие, 32/64) в течение нескольких тренировочных эпох. Я не могу понять причину этого.
Если я не ошибаюсь, размер пакета - это количество обучающих экземпляров, которые модель увидит во время итерации обучения; и эпоха - это полный поворот, когда каждый из обучающих примеров был замечен моделью. Если это так, я не вижу преимущества итерации по почти незначительному подмножеству обучающих экземпляров в несколько раз по сравнению с применением «максимальной партии» путем выставления всех доступных обучающих экземпляров в каждом повороте модели (при условии, конечно, достаточно память). В чем преимущество этого подхода?
machine-learning
deep-learning
Хендрик
источник
источник
Ответы:
Основное преимущество использования мини-пакета по сравнению с полным набором данных восходит к фундаментальной идее стохастического градиентного спуска 1 .
В пакетном градиентном спуске вы вычисляете градиент по всему набору данных, усредняя потенциально огромный объем информации. Для этого требуется много памяти. Но реальный гандикап - это траектория периодического градиента, в результате чего вы окажетесь в плохом месте (седловая точка).
В чистом SGD, с другой стороны, вы обновляете свои параметры, добавляя (знак минус) градиент, рассчитанный для одного экземпляра набора данных. Поскольку он основан на одной случайной точке данных, он очень шумный и может отклоняться в направлении, далеко от градиента партии. Тем не менее, шумность - это именно то, что вам нужно при невыпуклой оптимизации, поскольку она помогает вам избежать седловых точек или локальных минимумов (теорема 6 в [2]). Недостаток в том, что он ужасно неэффективен, и вам нужно многократно перебирать весь набор данных, чтобы найти хорошее решение.
Методология мини-пакета - это компромисс, который вводит достаточно шума для каждого обновления градиента, в то же время достигая относительной быстрой сходимости.
1 Ботту Л. (2010). Масштабное машинное обучение со стохастическим градиентным спуском. В Слушаниях COMPSTAT'2010 (стр. 177-186). Физика-Верлаг HD.
[2] Ge, R., Huang, F., Jin, C. & Yuan, Y. (2015, июнь). Escape From Saddle Points-Online Стохастический градиент для тензорного разложения. В COLT (стр. 797-842).
РЕДАКТИРОВАТЬ :
Я только что увидел этот комментарий на фейсбуке Яна ЛеКуна, который дает свежий взгляд на этот вопрос (извините, не знаю, как связаться с fb.)
Он процитировал этот документ, который был только что опубликован на arXiv несколько дней назад (апрель 2018), который стоит прочитать,
Доминик Мастерс, Карло Луши, Пересмотр тренинга для малых групп по глубоким нейронным сетям , arXiv: 1804.07612v1
Из аннотации
источник
Память на самом деле не является причиной для этого, потому что вы можете просто накапливать свои градиенты, когда вы перебираете набор данных, и применять их в конце, но все же в SGD вы применяете их на каждом шаге.
Причины, по которым SGD используется так широко:
1) Эффективность. Как правило, особенно в начале обучения, градиенты параметров для разных подмножеств данных будут иметь тенденцию указывать в одном и том же направлении. Таким образом, градиенты, оцениваемые на 1/100 данных, будут указывать примерно в том же общем направлении, что и для полного набора данных, но требуют только 1/100 вычисления. Поскольку для конвергенции в глубоко нелинейной глубокой сети обычно требуются тысячи или миллионы итераций, независимо от того, насколько хороши ваши градиенты, имеет смысл делать много обновлений, основанных на дешевых оценках градиента, а не несколько обновлений, основанных на хороших.
2) Оптимизация: Шумные обновления могут позволить вам отскочить от плохой локальной оптимы (хотя у меня нет источника, который показывает, что это имеет значение на практике).
3) Обобщение. Кажется (см. Чжан и др.: Теория глубокого обучения III: Свойства обобщения SGD ), что SGD действительно помогает обобщению, находя «плоские» минимумы в обучающем наборе, которые, скорее всего, также являются минимумами в тестовом наборе. Интуитивно понятно, что мы можем рассматривать SGD как своего рода пакетирование - вычисляя наши параметры на основе множества мини-пакетов данных, мы усиливаем правила, которые обобщают все мини-пакеты, и отменяем правила, которые этого не делают, тем самым делая нас менее склонными к подгонке к Обучающий набор.
источник
Правильно (хотя я бы назвал это «шагом обновления веса»)
Правильный
Ну, в значительной степени это. У вас обычно не хватает памяти. Допустим, речь идет о классификации изображений. ImageNet является чрезвычайно популярным набором данных. Долгое время VGG-16D был одним из самых популярных моделей. Требуется вычислить 15 245 800 поплавков (на картах объектов) для одного изображения 224x224. Это означает около 61 МБ на изображение. Это лишь приблизительная нижняя граница того, сколько памяти вам нужно во время тренировки для каждого изображения. ImageNet содержит несколько тысяч (я думаю, около 1,2 миллиона?) Изображений. Хотя у вас может быть так много основной памяти, у вас, конечно, не так много памяти GPU. Я видел, как GPU ускоряет процесс до 21x. Так что вы определенно хотите использовать графический процессор.
Также: время для одной мини-партии намного меньше. Итак, вопрос: вы бы предпочли сделать n шагов обновления с мини-пакетами в час на GPU или m шагов обновления с пакетами без GPU, где n >> m.
источник
Помимо других ответов, я думаю, что стоит отметить, что есть две величины, которые различны, но часто связаны:
Как уже отмечали другие, градиент по отношению к мини-пакету является приближением к истинному градиенту. Чем больше мини-пакет, тем лучше приближение.
Компромисс здесь - это просто производительность (память / циклы).
Эти количества обычно одинаковы, то есть размер мини-партии, но в принципе они могут быть разделены.
источник