Как компенсировать, если я не могу сделать большой размер пакета в нейронной сети - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь запустить код распознавания действий из GitHub.В оригинальном коде использовалась партия размером 128 с 4 GPUS.У меня только два gpus, поэтому я не могу сопоставить их число с размером бакты.Есть ли в любом случае я могу компенсировать эту разницу в партии.Я где-то видел, что iter_size может компенсировать это по формуле effective_batchsize= batch_size*iter_size*n_gpu.что такое iter_size в этой формуле?Я использую Pythorch, а не Caffe.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Важной концепцией является не столько размер партии;это количество эпох, которые вы тренируете.Можете ли вы удвоить размер пакета, предоставив тот же размер пакета кластера?Если так, то это непосредственно компенсирует проблему.Если нет, удвойте количество итераций, чтобы подготовиться к тому же количеству эпох.Модель быстро преодолеет последствия смещения ранней партии.

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

0 голосов
/ 26 сентября 2018

В 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()

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

...