如果我不能在神经网络中进行大批量处理,如何补偿

Moh*_*out 0 artificial-intelligence neural-network deep-learning pytorch

我正在尝试运行来自 GitHub 的动作识别代码。原始代码使用 4 个 GPU 的批处理大小 128。我只有两个 GPU,所以我无法匹配它们的 bacth 大小。无论如何,我可以批量补偿这种差异吗?我在某处看到 iter_size 可能会根据公式进行补偿effective_batchsize= batch_size*iter_size*n_gpu。这个公式中的 iter_size 是多少?我使用 PYthorch 而不是 Caffe。

myr*_*cat 7

在 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()
Run Code Online (Sandbox Code Playgroud)

那么你可以将其更改为:

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()
Run Code Online (Sandbox Code Playgroud)

并且模型参数的更新在每种情况下都是相同的(除了一些小的数值误差之外)。请注意,您必须重新调整损失以使更新相同。