深度学习-梯度优化方法

目录

一.什么是梯度下降的优化方法?

      

 二.优化方法

 1.指数加权平均

 2.动量算法Momentum

 3.adaGrad

 4.RMSprop

 5.Adam


一.什么是梯度下降的优化方法?

       1.碰到平缓区域,梯度值较小,参数优化变慢

        2.碰到'鞍点',梯度为0,参数无法优化

        3.碰到局部最小值,参数不是最优

      

  对于这些问题,出现了一些对梯度下降算法的优化方法,例如:Momentum,AdaGrad,RMSprop,Adam

 二.优化方法

        1.指数加权平均

        指数移动加权平均则是参考各数值,并且各数值的权重都不同,距离越远的数字对平均数计算的贡献值就越小,距离越近则对平均数的计算贡献就越大

        比如:明天天气怎么样,和昨天气温有很大关系,而和一个月前的气温关系就小一些.

计算公式:

St表示指数加权平均值

Yt表示t时刻的值

β调节权重系数,该值越大平均数越平缓

未加入优化方法的代码演示:

import torch
import matplotlib.pyplot as plt
ELEMENT_NUMBER = 30
# 1. 实际平均温度
def test01():
# 固定随机数种子
torch.manual_seed(0)
# 产生30天的随机温度
temperature = torch.randn(size=[ELEMENT_NUMBER,]) * 10
print(temperature)
# 绘制平均温度
days = torch.arange(1, ELEMENT_NUMBER + 1, 1)
plt.plot(days, temperature, color='r')
plt.scatter(days, temperature)
plt.show()

 加入后的代码演示:

# 2. 指数加权平均温度
def test02(beta=0.9):
torch.manual_seed(0) # 固定随机数种子
temperature = torch.randn(size=[ELEMENT_NUMBER,]) * 10 # 产生30天的随机温度
exp_weight_avg = []
for idx, temp in enumerate(temperature, 1): # 从下标1开始
# 第一个元素的的 EWA 值等于自身
if idx == 1:
exp_weight_avg.append(temp)
continue
# 第二个元素的 EWA 值等于上一个 EWA 乘以 β + 当前气温乘以 (1-β)
new_temp = exp_weight_avg[idx - 2] * beta + (1 - beta) * temp
exp_weight_avg.append(new_temp)
days = torch.arange(1, ELEMENT_NUMBER + 1, 1)
plt.plot(days, exp_weight_avg, color='r')
plt.scatter(days, temperature)
plt.show()

对比:

指数加权平均绘制出的气氛变化曲线更加平缓,
β 的值越大,则绘制出的折线越加平缓,波动越小。
2.动量算法Momentum

        

当处于鞍点位置时,由于当前的梯度为0,参数无法更新,但是Momentum动量梯度下降算法已经在先前积累了一些梯度值,很有可能跨过鞍点

mini-batch 普通的梯度下降算法,每次选取少数的样本梯度确定进方向,可能出现震荡,使得训练时间变长,Momentum使得移动加权平均,平滑了梯度的变化,使得前进的方向更加平缓,有利于加快训练的过程.

代码演示:

def test01():
# 1 %&'()*+
w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)
y = ((w ** 2) / 2.0).sum()
# 2 ,-'.'/01SGD 23*+beta=0.9
optimizer = torch.optim.SGD([w], lr=0.01, momentum=0.9)
# 3 41567 89:;<=>*+?@67
optimizer.zero_grad()
y.backward()
optimizer.step()
print('415: :;w.grad: %f, 67AB():%f' % (w.grad.numpy(), w.detach().numpy()))
# 4 42567 89:;<=>*+?@67
# CD67AB*+EF!"#$
y = ((w ** 2) / 2.0).sum()
optimizer.zero_grad()
y.backward()
optimizer.step()
print('425: :;w.grad: %f, 67AB():%f' % (w.grad.numpy(), w.detach().numpy()))

 3.adaGrad

        Adagrad 通过对不同的参数分量使用不同的学习率,AdaGrad的学习率总体会逐渐减小

        其计算步骤如下:

        1.初始化学习率 α、初始化参数 θ、小常数 σ = 1e-6

        2.初始化梯度累计变量 s = 0

        3.从训练集中采样m个样本的小批量,计算梯度g

        4.累积平方梯度 s = s + g g表示各个分量相乘

        学习率a的计算公式如下:

                

        参数更新公式如下:

                         

        重复2-4步骤,即可完成网络训练

        AdaGrad 缺点是可能会使得学习率过早,过量的降低,导致模型训练后期学习概率太小,很难找到最优解. 

        代码演示:

        

def test02():
# 1 %&'()*+
w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)
y = ((w ** 2) / 2.0).sum()
# 2 ,-'.'/01adagrad.'/0
optimizer = torch.optim.Adagrad ([w], lr=0.01)
# 3 41567 89:;<=>*+?@67
optimizer.zero_grad()
y.backward()
optimizer.step()
print('415: :;w.grad: %f, 67AB():%f' % (w.grad.numpy(), w.detach().numpy()))
# 4 42567 89:;<=>*+?@67
# CD67AB*+EF!"#$
y = ((w ** 2) / 2.0).sum()
optimizer.zero_grad()
y.backward()
optimizer.step()
print('425: :;w.grad: %f, 67AB():%f' % (w.grad.numpy(), w.detach().numpy()))

 4.RMSprop

        RMSprop优化算法是对AdaGrad的优化.最主要的不同是,其使用指数移动加权平均梯度,替换历史梯度,的平方和.

计算过程:

        

代码演示:

def test03():
# 1 %&'()*+
w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)
y = ((w ** 2) / 2.0).sum()
# 2 ,-'.'/01RMSprop90<GHalpha>IJbeta
optimizer = torch.optim.RMSprop([w], lr=0.01,alpha=0.9)
# 3 41567 89:;<=>*+?@67
optimizer.zero_grad()
y.backward()
optimizer.step()
print('415: :;w.grad: %f, 67AB():%f' % (w.grad.numpy(), w.detach().numpy()))
# 4 42567 89:;<=>*+?@67
# CD67AB*+EF!"#$
y = ((w ** 2) / 2.0).sum()
optimizer.zero_grad()
y.backward()
optimizer.step()
print('425: :;w.grad: %f, 67AB():%f' % (w.grad.numpy(), w.detach().numpy()))

 5.Adam

        Momentum使用指数加权平均计算当前的梯度值

        AdaGrad,RMSProp 使用自适应的学习率

        Adam优化算法将Mmentum和RMSprop算法结合在一起

        1.修正梯度:使用梯度的指数加权平均

        2.修正学习率:使用梯度平方的指数加权平均

     代码实现:

        

def test04():
# 1 %&'()*+
w = torch.tensor([1.0], requires_grad=True)
y = ((w ** 2) / 2.0).sum()
# 2 ,-'.'/01Adam90<GHbetasK2+L(BM+
optimizer = torch.optim.Adam([w], lr=0.01,betas=[0.9,0.99])
# 3 41567 89:;<=>*+?@67
optimizer.zero_grad()
y.backward()
optimizer.step()
print('415: :;w.grad: %f, 67AB():%f' % (w.grad.numpy(), w.detach().numpy()))
# 4 42567 89:;<=>*+?@67
# CD67AB*+EF!"#$
y = ((w ** 2) / 2.0).sum()
optimizer.zero_grad()
y.backward()
optimizer.step()
print('425: :;w.grad: %f, 67AB():%f' % (w.grad.numpy(), w.detach().numpy()))

  • 39
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值