PyTorch 中的 SGD 优化器实际上是梯度下降算法吗?

mat*_*eek 6 python gradient-descent pytorch

我正在尝试比较神经网络的 SGD 和 GD 算法的收敛速度。在 PyTorch 中,我们经常使用 SGD 优化器,如下所示。

train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
Run Code Online (Sandbox Code Playgroud)
for epoch in range(epochs):
    running_loss = 0

    for input_batch, labels_batch in train_dataloader:

        input = input_batch

        y_hat = model(input)
        y = labels_batch
        L = loss(y_hat, y)
        
        optimizer.zero_grad()
        L.backward()
        
        optimizer.step()
        
        running_loss += L.item()
Run Code Online (Sandbox Code Playgroud)

我对优化器的理解是,SGD 优化器实际上执行小批量梯度下降算法,因为我们一次向优化器提供一批数据。因此,如果我们将batch_size参数设置为所有数据的大小,代码实际上会对神经网络进行梯度下降。

我的理解正确吗?

jod*_*dag 4

你的理解是正确的。SGD 只是根据反向传播计算的梯度来更新权重。因此,它执行的梯度下降的风格是由数据加载器决定的。

  • 梯度下降(又名批量梯度下降):批量大小等于整个训练数据集的大小。
  • 随机梯度下降:批量大小等于 1 和shuffle=True
  • 小批量梯度下降:任何其他批量大小和shuffle=True。迄今为止在实际应用中最常见。