为什么火炬使用小批量进行训练?

Why torch does train using mini-batches?

我目前正在尝试了解如何通过 pytorch 训练模型。与此同时,我看到了一个非常有趣的特性:传递给训练数据 --- 是一个小批量。例如

有官方pytorch的代码片段web-site

...

data_dir = 'data/hymenoptera_data'
image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),
                                          data_transforms[x])
                  for x in ['train', 'val']}
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,
                                             shuffle=True, num_workers=4)
              for x in ['train', 'val']}

...
...

for inputs, labels in dataloaders[phase]:
    inputs = inputs.to(device)
    labels = labels.to(device)

    optimizer.zero_grad()

    with torch.set_grad_enabled(phase == 'train'):
        outputs = model(inputs)
        _, preds = torch.max(outputs, 1)
        loss = criterion(outputs, labels)

...

根据此代码,传递给模型的输入是一个小批量。

我已经绑定了一些关于这个的信息,但是没有成功。

但我真的很好奇,它是某种提升(并行 运行 等)还是必需的东西。所以,你介意帮我弄清楚并告诉我,为什么有一个小批量传递给训练函数?

N.B。不会拒绝link给论文[笑脸:)].

这样想象;假设您想了解狗和猫之间的区别,而您以前从未见过它们。 批次是我们一次向您展示 10 张狗和猫的图像。你可以相当快地在说 4x10 图像(4 批次)后了解猫和狗的一些差异,但是如果到目前为止你看到的所有狗都是大狗,你当然会有偏见,因此你可能会将所有小型犬归类为猫。在足够多的批次之后,您将学习并忘却不同的功能,因为您不会一次看到所有这些功能,但重要的是,您开始快速学习一些东西。

另一方面,假设我们向您展示了 100 张图像而不是 10 张。您将需要更长的时间来查看所有图像并将它们相互比较,但您会了解“一个”中的差异可以这么说。

无论哪种方式;当你处理完这些图像(作为批次或整个数据集)后,我可以给你看一张图像,你可以告诉我它是狗还是猫,即使你已经从多张图像中学习了。