2016-10-23 16:33:03 mao_feng 阅读数 29396
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39627 人正在学习 去看看 唐宇迪


学习率是深度学习中的一个重要的超参,如何调整学习率是训练出好模型的关键要素之一。在通过SGD求解问题的极小值时,梯度不能太大,也不能太小。太大容易出现超调现象,即在极值点两端不断发散,或是剧烈震荡,总之随着迭代次数增大loss没有减小的趋势;太小会导致无法快速地找到好的下降的方向,随着迭代次数增大loss基本不变。

因此,我们常常用一些退火的方法调整学习率。学习率调整方法基本上有两种


1. 基于经验的手动调整。 通过尝试不同的固定学习率,如0.1, 0.01, 0.001等,观察迭代次数和loss的变化关系,找到loss下降最快关系对应的学习率。

2. 基于策略的调整。

   2.1 fixed 、exponential、polynomial

   2.2. 自适应动态调整。adadelta、adagrad、ftrl、momentum、rmsprop、sgd



关于学习率的大小
* 太大: loss爆炸, 或者nan
* 太小: 半天loss没反映(但是, LR需要降低的情况也是这样, 这里可视化网络中间结果, 不是weights, 有效果, 俩者可视化结果是不一样的, 太小的话中间结果有点水波纹或者噪点的样子, 因为filter学习太慢的原因, 试过就会知道很明显)
* 需要进一步降低了: loss在当前LR下一路降了下来, 但是半天不再降了.
* 如果有个复杂点的任务, 刚开始, 是需要人肉盯着调LR的. 后面熟悉这个任务网络学习的特性后, 可以扔一边跑去了.
* 如果上面的Loss设计那块你没法合理, 初始情况下容易爆, 先上一个小LR保证不爆, 等loss降下来了, 再慢慢升LR, 之后当然还会慢慢再降LR, 虽然这很蛋疼.
* LR在可以工作的最大值下往小收一收, 免得ReLU把神经元弄死了. 当然, 我是个心急的人, 总爱设个大点的.



2019-06-28 20:12:32 qq_37764129 阅读数 695
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39627 人正在学习 去看看 唐宇迪

一、学习率的介绍

      学习率是深度学习中的一个重要的超参,如何调整学习率是训练出好模型的关键要素之一。在通过SGD求解问题的极小值时,梯度不能太大,也不能太小。太大容易出现超调现象,即在极值点两端不断发散,或是剧烈震荡,总之随着迭代次数增大loss没有减小的趋势;太小会导致无法快速地找到好的下降的方向,随着迭代次数增大loss基本不变。学习率越小,损失梯度下降的速度越慢,收敛的时间更长【1】。
      如公式所示:
                                                        new_weight= existing_weight — learning_rate * gradient
(新权值 = 当前权值 – 学习率 × 梯度)
                                   
                                                        采用小学习速率(顶部)和大学习速率(底部)的梯度下降

        如果学习率过小,梯度下降很慢,如果学习率过大,如Andrew Ng的Stanford公开课程所说梯度下降的步子过大可能会跨过最优值。不同的学习率对loss的影响如下图所示【2】:
                            


二、学习率的调整方法

        根据数据集的大小来选择合适的学习率,当使平方和误差作为成本函数时,随着数据量的增多学习率应该被设置为相应更小的值(从梯度下降算法的原理可以分析得出)。另一种方法就是,选择不受数据集大小影响成本函数-均值平方差函数

        训练全过程并不是使用一个固定值的学习速度,而是随着时间的推移让学习率动态变化,比如刚开始训练,离下山地点的最优值还很远,那么可以使用较大的学习率下的快一点,当快接近最优值时为避免跨过最优值,下山速度要放缓,即应使用较小学习率训练,具体情况下因为我们也不知道训练时的最优值,所以具体的解决办法是:在每次迭代后,使用估计的模型的参数来查看误差函数的值,如果相对于上一次迭代,错误率减少了,就可以增大学习率如果相对于上一次迭代,错误率增大了,那么应该重新设置上一轮迭代的值,并且减少学习率到之前的50%。因此,这是一种学习率自适应调节的方法。在Caffe、Tensorflow等深度学习框架中都有很简单直接的学习率动态变化设置方法。

      因此,我们常常用一些**退火**的方法调整学习率。学习率调整方法基本上有两种:
    1. 基于经验的手动调整。

      通过尝试不同的固定学习率,如3、1、0.5、0.1、0.05、0.01、0.005,0.005、0.0001、0.00001等,观察迭代次数和loss的变化关系,找到loss下降最快关系对应的学习率。关于学习率的大小所带来的loss变化:

  1. 太大: loss爆炸, 或者nan
  2. 太小: 半天loss没反映(但是, LR(learning rate)需要降低的情况也是这样, 这里可视化网络中间结果, 不是weights, 有效果, 俩者可视化结果是不一样的, 太小的话中间结果有点水波纹或者噪点的样子, 因为filter学习太慢的原因, 试过就会知道很明显)
  3. 需要进一步降低了: loss在当前LR下一路降了下来, 但是半天不再降了.
  4.  如果有个复杂点的任务, 刚开始, 是需要人肉盯着调LR的. 后面熟悉这个任务网络学习的特性后, 可以扔一边跑去了.
  5.  如果上面的Loss设计那块你没法合理, 初始情况下容易爆, 先上一个小LR保证不爆, 等loss降下来了, 再慢慢升LR, 之后当然还会慢慢再降LR, 虽然这很蛋疼.
  6. LR在可以工作的最大值下往小收一收, 免得ReLU把神经元弄死了.

    2. 基于策略的调整。
           2.1 fixed 、exponential、polynomial
           2.2. 自适应动态调整。adadelta、adagrad、ftrl、momentum、rmsprop、sgd
比如:

lr = tf.Variable(0.001, dtype=tf.float32)#学习率
# 定义损失函数和优化器,损失函数用sigmoid交叉熵,优化器选择AdamOptimizer
#tf.nn.sigmoid_cross_entropy_with_logits():对于给定的logits计算sigmoid的交叉熵。
#tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=pred, labels=one_hot_labels))
optimizer = tf.train.AdamOptimizer(learning_rate=lr).minimize(loss) #是一个寻找全局最优点的优化算法,引入了二次方梯度校正

这是关于tf.nn.sigmoid_cross_entropy_with_logits()函数和tf.reduce_mean()函数的介绍

这篇文章讨论了调整学习率的理论研究:【AI学习】理解深度学习中的学习率及多种选择策略
 

参考:
【1】深度学习如何设置学习率:https://blog.csdn.net/mao_feng/article/details/52902666 

【2】深度学习(五)学习率的调节:https://blog.csdn.net/hzqgangtiexia/article/details/80509211 

 

2019-03-06 10:05:43 daydayjump 阅读数 1115
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39627 人正在学习 去看看 唐宇迪

首先是找到的三篇不错的博客,看完收获很多。链接如下:

机器之心 学习速率设置指南

简书 batchsize和lr的笔记

雷锋网 抛弃learning rate decay

学习率(learning rate)属于调参过程的一部分,目前常见的是通过设置schedule,根据特定的规则更新学习率。常用的方式就是learning rate decay。当然在最近提出了增大batchsize来保持学习率的策略,在第三篇博客可以进行了解。

接下来,是自己读这三篇博客和论文的理解。

1、学习率属于需要设置的关键超参数,在最小化训练网络的损失函数时,学习率缩放了权重更新的幅度。学习率太低,训练速度会很慢;学习率太高,有可能梯度下降过程中直接跳过了最低点,训练变得发散。

2、新知识点损失函数地图(loss landscape) 论文地址。 用来可视化损失函数的曲率,得到三维立体图形,研究多种因素(网络架构,各种超参数,优化器等)对损失函数形态的影响。

3、设置最优的学习率,是为了损失函数下降的最快。一共有三种阶段,损失函数基本不动(lr低),损失函数下降最快(lr优),损失函数发散(lr高)。

4、学习率设置常用的技巧是学习率退火(learning rate annealing),其中具体的方法有随步数衰减(step decay),指数衰减等。一般在编写代码中可以直接使用TF或者pytorch给出的衰减技巧。如果需要自己来设置学习率衰减策略,往往是创建一个学习率时间表(learning rate schedue),根据自己设定的规则进行更新。

5、周期学习率(cyclical learning rate,CLR) 论文地址,采用三角形更新规则,需要设置三个参数,max_lr、base_lr和stepsize(一个周期的一半),提出周期学习率表,在两个约束值之间变动。

6、热重启的随机梯度下降(SGDR)论文地址,采用余弦退火表(cosine annealing)和周期性热重启(warm restart)技术相结合。对于热重启的理解就是,每个周期结束后,在现有收敛的参数基础上再次开始。区别在于不是从头开始,相当于学习率降到最低后退出,在现有基础上再次提高学习率继续探索梯度下降的局部低点。

7、关于batchsize和LR之间的关系有两篇论文:

On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima

Don't Decay the Learning Rate, Increase the Batch Size

第一篇论文warm start实验比较重要,先用小batch训练,之后热启动用大batch训练,模型的泛化能力提高。

第二篇论文主要是在说增大batchsize之后可以不要衰减学习率。

8、普遍认为小batchsize训练的模型泛化能力更好,有助于SGD的收敛。帮助SGD收敛到平滑最小值(flat minima),而不是尖锐最小值(sharp minima)。

最后的话:

自己主要是对learning rate进行了较为全面的了解,背后的数学原理没有涉及,当然因为现在许多代码都是集成的,也省去了不少麻烦。个人觉得虽然现在有抛弃LR decay,但设置schedule进行衰减训练才是比较适用的。

2019-11-06 16:52:06 yang_daxia 阅读数 21
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39627 人正在学习 去看看 唐宇迪

1. 初始化  非常重要

优先Xavier, hekaiming

调了几天的batch, normalization没啥用, 一步初始化提高了50个点....

2.学习率

大学习率, 跑的快, 那么在同样的时间就可以调更多的参数, 一般用warm up, 只要不爆炸, 可以尽可能的大

3.batch

先学习率, 再batch, 因为batch增大, 建议lr相应增大倍数

4.normalization

batch norm在大batch推荐

小batch推荐group norm  但是也不一样, 可以实验进行验证

5.尝试Relu-->GELU

参考:https://zhuanlan.zhihu.com/p/24720954

https://www.zhihu.com/question/41631631

 

2017-11-07 06:44:53 Uwr44UOuQcNsUQb60zk2 阅读数 605
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39627 人正在学习 去看看 唐宇迪
谷歌大脑在最新的一篇论文中提出,通过增加训练过程中的 batch size,能够在训练集和测试集上取得类似学习率衰减的表现。此外这种方法还有一系列的优势:参数更新数量更少、更强大的并行、更短的训练时间等等。机器之心对此论文做了摘要介绍,更详细的内容请阅读原论文。


论文链接:https://arxiv.org/abs/1711.00489


摘要:学习率衰减是一种常见的方法。在这篇论文中,我们展示了通过增加训练过程中的 batch size 也能在训练集和测试集上获得同样的学习曲线。这一方法对随机梯度下降(SGD)、带有动量的 SGD、Nesterov 动量和 Adam 同样有效。在经过同样数量的训练 epoch 之后,它能获得同样的测试准确率,且需要进行的参数更新更少,从而实现更强大的并行、更短的训练时间。通过增加学习率ϵ、缩放 batch size B∝ϵ,我们可以进一步减少参数更新的数量。最后,你可以增加动量系数 m,缩放 B∝1/(1−m),尽管这会稍微降低测试准确率。最重要的是,该技术能让我们在不调整超参数的情况下,重设对大型 batch 训练的现有训练调度方法(schdule)。我们在 ImageNet 上训练 ResNet-v2,验证准确率达到 77%,参数更新低于 2500,高效利用了 65536 张图片的训练 batch。


图 1:作为训练 epcoch 中的函数,学习率(a)和 batch size(b)的调度方法

图 2:训练集的交叉熵,(a)横轴为训练 epoch 的数量,(b)横轴为参数更新数量。三种学习曲线变化一致,但增加 batch size 能极大地减少所需参数更新的数量。

图 3:训练过程中的测试集准确率,(a)带有动量的 SGD,(b)带有 Nesterov 动量的 SGD。在两种情形中,三种调度方法的曲线变化保持一致。

图 4:训练过程中的测试集准确率,(a)vanilla SGD,(b)Adam。同样,三种调度方法的测试集表现一致。

图 5:不同的训练调度方法下,测试集准确率随着参数更新数量的变化而变化。通过增加 batch size 取代学习率衰减的「增加 batch size」方法;把初始学习率从 0.1 增加到 0.5 的「增加初始学习率」方法;最后是把动量系数从 0.9 增加到 0.98 的「增加动量系数」方法。

图 6:在 ImageNet 上训练 Inception-ResNet-V2。增加 batch size 能获得与学习率衰减类似的结果,但这种方法能够减少参数更新的数量,从 14000 降低到 6000。我们可以把每个实验运行两次来说明其中的变化。


图 7:在 ImageNet 上训练 Inception-ResNet-V2。增加动量参数能够减少所需参数更新的数量,但也导致最终测试准确率的略微下降。


没有更多推荐了,返回首页