Градиентному спуску всегда нужны данные. Как мы должны передавать данные градиентному спуску? Существует три распространенных способа ввода данных для градиентного спуска (GD): пакетный, стохастический и мини-пакетный.

Есть ли лучший? Почему специалисты по машинному обучению склоняются к Mini-Batch GD? Мы поэкспериментируем со всеми тремя и выясним преимущества и недостатки каждого для себя.

ВВЕДЕНИЕ

Пакетный градиентный спуск — это когда мы передаем ВЕСЬ набор данных для расчета градиентов. Как только градиенты будут рассчитаны, GD сделает шаг к минимуму.

Стохастический градиентный спуск — это когда мы подаем только ОДНУ точку данных для расчета градиента. GD будет использовать этот градиент, чтобы сделать шаг. Затем он выберет другую точку данных и будет повторять процесс, пока не пройдет все данные.

Мини-пакетный градиентный спуск — это когда мы подаем МАЛЕНЬКУЮ ПАРТИЮ данных для расчета градиента. Этот метод разбивает данные на пакеты и передает один пакет за раз в GD, пока он не проверит все данные.

ДАННЫЕ

Мы будем работать над простой задачей регрессии, используя синтезированные данные. Характеристики данных выбираются случайным образом. Цели будут представлять собой линейную комбинацию этих функций с некоторым шумом (случайно выбранным из нормального распределения). Наборы для обучения и проверки будут содержать 128000 точек данных.

# Setting the seed
np.random.seed(0)

# Creating observations
X_train = np.random.rand(number_of_observations,number_of_features)
X_valid = np.random.rand(number_of_observations,number_of_features)

# Instantiating the parameters W and b
W = np.round(np.random.rand(number_of_features,1)*10, 0)
b = np.round(np.random.rand(1,1),0)

# Creating some noise
noise = np.random.randn(number_of_observations,1)

# Creating y by doing XW + b and some noise
y_train = np.dot(X_train, W) + b + noise
y_valid = np.dot(X_valid, W) + b + noise

# Printing coefficients
print(f"True W: {W[0][0]} \nTrue b: {b[0][0]}")

Визуально существует линейная зависимость с X и y с некоторым шумом. (Мы используем линейную модель для генерации данных XD).

ЭКСПЕРИМЕНТ

Теперь для эксперимента мы обучаем три простые модели линейной регрессии (реализованные в Tensorflow). Каждая модель имеет одинаковую архитектуру. Единственная разница заключается в том, как мы подаем данные в алгоритм GD. Для Batch GD мы передаем все данные. Для Stochastic GD мы подаем данные по одной точке за раз. Для Mini-Batch мы вводим 64 точки данных за раз. Модели обучаются на 100 эпох с ранней остановкой. Результаты моделей после обучения показаны ниже:

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

Основываясь на потерях для типа партии (слева), стохастический GD сошелся за самое короткое количество эпох (7, если быть точным). Тогда это был Mini-Batch GD в 32 эпохи. Последний — пакетный GD. Он не смог закончить сходимость за 100 эпох.

Однако, если мы посмотрим на время, прошедшее до обучения (справа), Stochastic потребовалось больше всего времени для завершения обучения. Несмотря на то, что для сходимости потребовалось наименьшее количество эпох, это все же заняло больше всего времени. И это имеет смысл. Мы загружаем только одну точку данных за раз для расчета градиентов, обновления параметров, выбора другой точки данных и повторения процесса. Мы сможем быстро сойтись (за меньшее количество эпох), но вычисление одного градиента за раз требует больших вычислительных ресурсов. Пакетный GD занимает самое короткое время для расчета градиентов (из-за векторизации), но для сходимости потребуется много эпох. Для сходимости необходимо несколько раз просмотреть данные. Mini-Batch сходится почти так же быстро, как Stochastic GD, и вычисляет почти так же быстро, как Batch GD.

ЗАКЛЮЧЕНИЕ

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

Код, используемый для этого блога (GitHub)

Особая благодарность Бенедикту Эмоекабу за помощь в этом блоге!