前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【调参实战】那些优化方法的性能究竟如何,各自的参数应该如何选择?

【调参实战】那些优化方法的性能究竟如何,各自的参数应该如何选择?

作者头像
用户1508658
发布2020-04-22 10:40:46
4710
发布2020-04-22 10:40:46
举报
文章被收录于专栏:有三AI有三AI

本次主要讲述图像分类项目中的优化方法的调参实践

作者&编辑 | 言有三

本文资源与结果展示

背景要求:会使用Python和任一深度学习开源框架

1 项目背景与准备工作

本次项目开发需要以下环境:

(1) Linux系统,使用windows系统也可以完成,但是使用Linux效率更高。

(2) 最好拥有一块显存不低于6G的GPU显卡,如果没有使用CPU进行训练速度较慢。

(3) 安装好的Caffe开源框架。

2 优化方法原理与实践

下面我们对各类优化算法的基本原理进行讲解,并进行实践。由于本文目标不是为了从零开始讲清楚优化算法,所以有些细节会略过。

2.1 标准梯度下降算法

梯度下降算法,即通过梯度的反方向来进行优化,批量梯度下降(Batch gradient descent)用公式表述如下:

写成伪代码如下:

代码语言:javascript
复制
for i in range(nb_epochs):
     params_grad = evaluate_gradient(loss_function, data, params)
    params = params - learning_rate * params_grad

上面的梯度下降算法公式用到了数据集所有的数据,这在解决实际问题时通常是不可能,比如ImageNet1000有100G以上的图像,内存装不下,速度也很慢。

我们需要在线能够实时计算,比如一次取一个样本,于是就有了随机梯度下降(Stochastic gradient descent),简称SGD,公式如下:

写成伪代码如下:

代码语言:javascript
复制
for i in range(nb_epochs):
     np.random.shuffle(data)
     for example in data:
          params_grad = evaluate_gradient(loss_function example , params)
          params = params - learning_rate * params_grad

SGD方法缺点很明显,梯度震荡,所以就有了后来大家常用的小批量梯度下降算法(Mini-batch gradient descent),公式如下:

伪代码如下:

代码语言:javascript
复制
for i in range(nb_epochs):
     np.random.shuffle(data)
    for batch in get_batches(data, batch_size=50):
        params_grad = evaluate_gradient(loss_function, batch, params)
        params = params - learning_rate * params_grad

平时当我们说SGD算法,实际上指的就是mini-batch gradient descent算法。

SGD算法的主要问题是学习率大小和策略需要手动选择,优化迭代比较慢,因此有很多方法对其进行改进。

2.2 动量法(momentum)

梯度下降算法是按照梯度的反方向进行参数更新,但是刚开始的时候梯度不稳定,方向改变是很正常的,梯度有时候一下正一下反,导致做了很多无用的迭代。而动量法做的很简单,相信之前的梯度。如果梯度方向不变,就越发更新的快,反之减弱当前梯度。

公式表达如下:

与SGD的对比如下:

动量法至今仍然是我觉得最为有用的学习率改进算法。那它和SGD的对比究竟如何呢?下面我们来实验不同的参数,需要在solver.prototxt中修改配置,完整的solver如下,需要修改的地方为标粗橙色部分,后面的实验同理

代码语言:javascript
复制
net: "allconv6.prototxt"
test_interval:100
test_iter:15
base_lr: 0.01
lr_policy: "step"
stepsize: 10000
gamma: 0.1
momentum: 0.9 ##动量项配置
weight_decay: 0.005
display: 100
max_iter: 100000
snapshot: 10000
snapshot_prefix: "models/allconv6_"
solver_mode: GPU

下图是实验结果对比:

我们可以发现,m=0.9时确实取得了最好的效果,m=0时效果最差,对于大部分的任务,我们在配置这个参数时也不需要修改,就采用m=0.9。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有三AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
批量计算
批量计算(BatchCompute,Batch)是为有大数据计算业务的企业、科研单位等提供高性价比且易用的计算服务。批量计算 Batch 可以根据用户提供的批处理规模,智能地管理作业和调动其所需的最佳资源。有了 Batch 的帮助,您可以将精力集中在如何分析和处理数据结果上。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档