1.了解不同优化器

2.书写优化器代码
3.Momentum
4.二维优化,随机梯度下降法进行优化实现
5.Ada自适应梯度调节法
6.RMSProp
7.Adam
8.PyTorch种优化器选择

梯度下降法:

1.标准梯度下降法:GD
每个样本都下降一次,参考当前位置的最陡方向迈进容易得到局部最优,且训练速度慢

2.批量下降法:BGD
不再是一次输入样本调整一次,而是一批量数据后进行调整,模型参数的调整更新与全部输入样本的代价函数的和有关,即下山前掌握附近地势,选择最优方向。

3.随机梯度下降法SGD
在一批数据里随机选取一个样本。如盲人下山,并与用走一次计算一次梯度,总能到山底。但引入的噪声可能使得权值更新放下错误。,没法单独克服局部最优解。

动量优化法
标准动量优化momentum
当前权值的改变会受到上一次权值改变得影响。类似小球下滚得时候带上惯性,加快滚动速度。

NAG牛顿加速梯度

NAG牛顿加速梯度 施加当前速度后 ,往标准动量中添加一个校正因子。momentun小球盲目跟从梯度,但nag小球指走到坡底时速度慢下来,知道下一位置大致在哪,来更新当前位置参数。

Ada自适应梯度调节法: Adagrad:该算法的特点是自动调整学习率,适用于稀疏数据。梯度下降法在每一步对每一个参数使用相同的学习率,这种一刀切的做法不能有效的利用每一个数据集自身的特点。 Adadelta(Adagrad的改进算法):Adagrad的一个问题在于随着训练的进行,学习率快速单调衰减。Adadelta则使用梯度平方的移动平均来取代全部历史平方和。

RMSProp:RMSprop也是一种学习率调整的算法。Adagrad会累加之前所有的梯度平方,而RMSprop仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。

Adam:如果把Adadelta里面梯度的平方和看成是梯度的二阶矩,那么梯度本身的求和就是一阶矩。Adam算法在Adadelta的二次矩基础之上又引入了一阶矩。而一阶矩,其实就类似于动量法里面的动量。

 import torch
import torch.utils.data as Data
import torch.nn.functional as F
import matplotlib.pyplot as plt LR = 0.01
BATCH_SIZE = 32
EPOCH = 12 x = torch.unsqueeze(torch.linspace(-1,1,1000),dim=1)
y = x.pow(2) + 0.1*torch.normal(torch.zeros(*x.size())) plt.scatter(x.numpy(),y.numpy())
plt.show() torch_dataset = Data.TensorDataset(x,y)
loader = Data.DataLoader(dataset=torch_dataset,batch_size=BATCH_SIZE,shuffle=True,num_workers=2) torch_dataset = Data.TensorDataset(x,y)
loader = Data.DataLoader(
dataset=torch_dataset,
batch_size=BATCH_SIZE,
shuffle=True,
num_workers=2,
) class Net(torch.nn.Module):
def __init__(self):
super(Net,self).__init__() self.hidden = torch.nn.Linear(1,20)
self.predict = torch.nn.Linear(20,1) def forward(self,x):
x = F.relu(self.hidden(x))
x = self.predict(x)
return x net_SGD = Net()
net_Momentum = Net()
net_RMSprop = Net()
net_Adam = Net()
nets = [net_SGD, net_Momentum, net_RMSprop, net_Adam] # different optimizers
opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR)
opt_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8)
opt_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9)
opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99))
optimizers = [opt_SGD, opt_Momentum, opt_RMSprop, opt_Adam] loss_func = torch.nn.MSELoss()
losses_his = [[], [], [], []] # record loss # training
for epoch in range(EPOCH):
print('Epoch: ', epoch)
for step, (b_x, b_y) in enumerate(loader): # for each training step
for net, opt, l_his in zip(nets, optimizers, losses_his):
output = net(b_x) # get output for every net
loss = loss_func(output, b_y) # compute loss for every net
opt.zero_grad() # clear gradients for next train
loss.backward() # backpropagation, compute gradients
opt.step() # apply gradients
l_his.append(loss.data.numpy()) # loss recoder labels = ['SGD', 'Momentum', 'RMSprop', 'Adam']
for i, l_his in enumerate(losses_his):
plt.plot(l_his, label=labels[i])
plt.legend(loc='best')
plt.xlabel('Steps')
plt.ylabel('Loss')
plt.ylim((0, 0.2))
plt.show()

参考:https://blog.csdn.net/qingxuanmingye/article/details/90514018

Task6.PyTorch理解更多神经网络优化方法的更多相关文章

  1. 神经网络优化方法总结:SGD,Momentum,AdaGrad,RMSProp,Adam

    1. SGD Batch Gradient Descent 在每一轮的训练过程中,Batch Gradient Descent算法用整个训练集的数据计算cost fuction的梯度,并用该梯度对模型 ...

  2. 神经网络优化算法:梯度下降法、Momentum、RMSprop和Adam

    最近回顾神经网络的知识,简单做一些整理,归档一下神经网络优化算法的知识.关于神经网络的优化,吴恩达的深度学习课程讲解得非常通俗易懂,有需要的可以去学习一下,本人只是对课程知识点做一个总结.吴恩达的深度 ...

  3. 移动端IM开发者必读(二):史上最全移动弱网络优化方法总结

    1.前言 本文接上篇<移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”>,关于移动网络的主要特性,在上篇中已进行过详细地阐述,本文将针对上篇中提到的特性,结合我们的实践经 ...

  4. zz图像、神经网络优化利器:了解Halide

    动图示例实在太好 图像.神经网络优化利器:了解Halide  Oldpan  2019年4月17日  0条评论  1,327次阅读  3人点赞 前言 Halide是用C++作为宿主语言的一个图像处理相 ...

  5. 【零基础】神经网络优化之Adam

    一.序言 Adam是神经网络优化的另一种方法,有点类似上一篇中的“动量梯度下降”,实际上是先提出了RMSprop(类似动量梯度下降的优化算法),而后结合RMSprop和动量梯度下降整出了Adam,所以 ...

  6. Halide视觉神经网络优化

    Halide视觉神经网络优化 概述 Halide是用C++作为宿主语言的一个图像处理相关的DSL(Domain Specified Language)语言,全称领域专用语言.主要的作用为在软硬层面上( ...

  7. Tensorflow学习:(三)神经网络优化

    一.完善常用概念和细节 1.神经元模型: 之前的神经元结构都采用线上的权重w直接乘以输入数据x,用数学表达式即,但这样的结构不够完善. 完善的结构需要加上偏置,并加上激励函数.用数学公式表示为:.其中 ...

  8. 深度理解Jquery 中 offset() 方法

    参考原文:深度理解Jquery 中 offset() 方法

  9. Java反射理解(五)-- 方法反射的基本操作

    Java反射理解(五)-- 方法反射的基本操作 方法的反射 1. 如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法 2. 方法反射的操作 method.invoke(对象,参数列表) ...

随机推荐

  1. robotframework之用户关键字的用法

    robotframework是一个关键字驱动框架,核心在于关键字的应用 目录 1.如何创建用户关键字 2.调用用户关键字 3.用户关键字的使用场景 1.如何创建关键字 第一种:直接在项目上右键,添加用 ...

  2. 初学单片机:Proteus介绍、Proteus与Keil联调(Windows10环境下)

    Proteus是一个仿真软件,可以在里面设计电路并模拟测试,也可生成PCB的布线等等,反正就是强大的不行.初学单片机,除了开发板,这个仿真器就是一个很好的调式环境.软件安装信息: Proteus 8. ...

  3. 【js】什么是函数节流与函数去抖

    函数节流 意思:节省流量,不会一直访问. | 指定时间内不执行,指定时间后执行. | 一段时间内只执行一次 场景: 比如控制游戏人物攻击,时间内就算按得很快,也只能砍一刀,过后才能砍第二刀. 搜索引擎 ...

  4. 国家授时中心的NTP服务器地址 210.72.145.44

    国家授时中心的NTP服务器地址 210.72.145.44

  5. 基于weui loading插件封装

    <!-- Loading.vue --> <template> <div id="loadingToast" v-if="show" ...

  6. fastjson @JSONField

    此文来源于:https://blog.51cto.com/xiaok007/2164029 1.作用在FIELD(成员变量上) 注意:1.若属性是私有的,必须有set*方法.否则无法反序列化. pac ...

  7. [Git] 024 log 命令的补充

    0. 回顾 [Git] 009 逆转未来 的 "1" 画张导图 其实 --oneline 前有个"关键字参数" "--pretty" --o ...

  8. 一分钟安装mysql

    学数据库的人都知道,MySQL数据库是比较基本的掌握要求,不仅开源而且社区版本是免费使用的.由于工作上或者经常更换系统的原因,有时候会需要安装MySQL数据库.为了不至于每次安装都要查阅资料,现把安装 ...

  9. java8--- Optional的使用

    // https://www.jianshu.com/p/82ed16613072 1.Optional.of(T value),传入非 null(否则会抛出 NullPointerException ...

  10. AutoTikv简介

    AutoTikv是一个用于对TiKV数据库进行自动调优的工具.它的设计灵感来自于SIGMOD 2017的一篇paper:Automatic Database Management System Tun ...