Batch Gradient Descent:全量处理,俗称批量梯度下降
Mini-Batch Gradient Descent:处理部分数据 俗称mini-batch梯度下降
Stochastic Gradient Descent:每次只取一个数据训练,俗称随机梯度下降
import numpy as np
import torch
x = np.random.random(size=(100, 8))
linear = torch.nn.Linear(in_features=8, out_features=1)
sigmoid = torch.nn.Sigmoid()
linear2 = torch.nn.Linear(in_features=1, out_features=1)
model = torch.nn.Sequential(linear, sigmoid, linear2).double()
train_x = torch.from_numpy(x)
print(model(train_x).shape)
y_true = torch.from_numpy(np.random.uniform(0, 5, size=(100, 1)))
print(y_true.shape)
loss_fn = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-5)
# Batch Gradient Descent:全量处理
# for e in range(100):
# y_hat = model(train_x)
# loss = loss_fn(y_hat, y_true)
# loss.backward()
#
# print(loss)
# optimizer.step()
# Mini-Batch Gradient Descent:处理部分数据
# for e in range(100):
# for b in range(100 // 20):
# batch_index = np.random.choice(range(len(train_x)), size=20)
# y_hat = model(train_x[batch_index])
# loss = loss_fn(y_hat, y_true[batch_index])
# loss.backward()
#
# print(loss)
# optimizer.step()
# Stochastic Gradient Descent:每次只取一个数据训练
for e in range(100):
for b in range(100 // 1):
batch_index = np.random.choice(range(len(train_x)), size=1)
y_hat = model(train_x[batch_index])
loss = loss_fn(y_hat, y_true[batch_index])
loss.backward()
print(loss)
optimizer.step()
蓝色代表:Batch Gradient Descent,因为是取一个数据训练,所以梯度下降不稳定
绿色代表:Mini-Batch Gradient Descent,介于两者之间
紫色代表:Batch Gradient Descent,因为是取全量数据训练,所以梯度下降稳定,每次取全量内存消耗过多,运行就会可能很慢
梯度下降抖动的问题解决方法
1、Gradient with momentum 使用动量法解决梯度下降抖动的问题:
在此时的梯度方向上,考虑上上一次的梯度方向,进行向量相加,算作本次的梯度方向
2、RMS-prop (Root mean square prop)
上面的方法中的学习率参数γ是认为给的固定值,此时我们把这个参数自动的动态调整,如下方式,从公式中可以看出,这样当上一次loss比较大时,这次就会变小一些
3、Adam Optimizer
Combined with Momentum and RMSProp
上面的方法中只考虑到了梯度下降的学习率大小根据上一次来优化,没有考虑方向,ADMA既考虑到了上次的方向也动态调整了学习率