十一、OPTIMIZER 不同优化器方法及解决梯度下降抖动的问题

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既考虑到了上次的方向也动态调整了学习率
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值