SDG Optimizer in pytorch (torch.optim.SDG)

44 Views
No Comments

A total of 1455 characters, expected to take 4 minutes to complete reading.

关于 torch.optim

在 pytorch 中,torch.optim 文件中包含了很多优化器,如下图所示。

pytorch 中的 SDG 优化器详解 (torch.optim.SDG)

我们可以很方便的创建这些对象来实现优化算法。

梯度下降算法

梯度下降法 (Gradient Descent) 是一种优化方法,利用梯度对目标函数进行最小化的优化。

一般分为以下三种:

  1. 批量梯度下降 (BGD, Batch Gradient Descent)

批量梯度下降时每次更新参数时,都会使用提供的所有的训练样本。如果数据集很大,那么训练一次性能消耗量非常巨大,并且很慢。同时,会占用大量的显存(或者内存),因此一般不采用这种方法。

其算法公式表达如下:

\theta=\theta-\eta\cdot\frac{dJ(\theta)}{d\theta}

Among them \theta 为要更新的参数, \eta 为学习率,J(\theta) 为目标函数。

  1. 随机梯度下降 (SGD, Stochastic gGradient Descent)

随机梯度下降每次参数更新时,只随机选择一个样本进行计算来更新参数。

其算法公式表达如下:

\theta=\theta-\eta\cdot\frac{dJ(\theta,(x^{i},y^{i}))}{d\theta}

Among them (x^{i},y^{i}) 表示从数据集内抽取的一个数据,并不取所有样本进行更新。

  1. 小批量梯度下降 (Mini-batch BGD, Mini-batch Gradient Descent)

小批量梯度下降每次参数更新时,每次计算一个批次 (mini-batch) 内的所有数据进行更新。

其算法公式表达如下:

\theta=\theta-\eta\cdot\frac{dJ(\theta,(x^{i:i+b},y^{i:i+b}))}{d\theta}

Among them (x^{i:i+b},y^{i:i+b}) 表示从数据集内的一个批次的数据。

PyTorch 中的 SGD

pytorch 中有 torch.optim.SGD 模块,提供梯度下降的算法。 但是请注意!这个模块可以实现随机梯度下降算法,但注意只有 BatchSize=1 的时候,才是随机梯度下降算法!

我们来看这个模块的实现,见 pytorch 官网 。算法逻辑如下:

pytorch 中的 SDG 优化器详解 (torch.optim.SDG)

默认情况下,只提供学习率 lr,这时候 \theta_t\leftarrow\theta_{t-1}-\gamma \cdot \nabla_\theta f_t(\theta_{t-1})。可以看到这并不是一个纯粹的随机梯度下降算法,而是每次计算你提供的所有数据。

以以下的代码为例:

# 模型
model = xxx
criterion = xxx
optimizer = optim.SGD(model.parameters(), lr=0.01)

# 数据集
data = DataLoader(train_data, batch_size=batch_size)

for i in range(xxx):
    for x, y in tqdm(data):
        optimizer.zero_grad()
        y_hat = model(x)
        loss = criterion(y_hat, y)
        loss.backward()
        optimizer.step()

batch_size = 1 的时候,此时 SGD 模块每次计算一个数据,即为随机梯度下降算法。

1 < batch_size < 整个数据集大小 的时候,此时 SGD 模块每次计算一个 mini-batch 的数据,即为小批量梯度下降算法。

batch_size = 整个数据集大小 的时候,此时 SGD 模块每次计算一整个数据集的数据,即为批量梯度下降算法。不推荐这种算法!计算成本太高!

END
 0
Comment(No Comments)
验证码
en_USEnglish
Article Directory