В pytorch, когда вы выполняете шаг назад (вызывая loss.backward()
или аналогичный), градиенты накапливаются на месте.Это означает, что если вы вызываете loss.backward()
несколько раз, ранее вычисленные градиенты не заменяются, а вместо этого новые градиенты добавляются к предыдущим.Вот почему при использовании pytorch обычно необходимо явно обнулять градиенты между мини-пакетами (вызывая optimiser.zero_grad()
или аналогичный).
Если размер вашего пакета ограничен, вы можете имитировать больший размер партии, если разбить большую партию на более мелкие части и вызвать optimiser.step()
, чтобы обновить параметры модели только после обработки всех частей.
Например, предположим, что вы можете сделать толькопартии размером 64, но вы хотите смоделировать размер партии 128. Если исходный цикл обучения выглядит так:
optimiser.zero_grad()
loss = model(batch_data) # batch_data is a batch of size 128
loss.backward()
optimiser.step()
, то вы можете изменить это на:
optimiser.zero_grad()
smaller_batches = batch_data[:64], batch_data[64:128]
for batch in smaller_batches:
loss = model(batch) / 2
loss.backward()
optimiser.step()
иОбновления параметров модели будут одинаковыми в каждом случае (за исключением, может быть, некоторой небольшой числовой ошибки).Обратите внимание, что вы должны изменить масштаб потери, чтобы сделать обновление таким же.