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

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

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


学习率是深度学习中的一个重要的超参,如何调整学习率是训练出好模型的关键要素之一。在通过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 阅读数 851
  • 机器学习&深度学习系统实战!

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

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

一、学习率的介绍

      学习率是深度学习中的一个重要的超参,如何调整学习率是训练出好模型的关键要素之一。在通过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 阅读数 1484
  • 机器学习&深度学习系统实战!

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

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

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

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

简书 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-06-15 21:59:31 x454045816 阅读数 106
  • 机器学习&深度学习系统实战!

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

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

欢迎关注微信公众号“智能算法” – 原文链接(阅读体验更佳):

深度学习算法(第7期)----深度学习之避免过拟合(正则化)

上一期,我们一起学习了深度学习中的学习率的悲惨命运,

深度学习算法(第6期)----深度学习之学习率的命运

今天我们一起学习下深度学习中如何避免过拟合,我们多多交流,共同进步。本期主要内容如下:

  • 提前停止训练
  • L1和L2范数正则化
  • DroupOut
  • 最大范数正则化
  • 数据增强
  • 小结

我们知道,深度学习有成千上万个参数,甚至数百万。由于有巨大的参数,所以整个网络有着难以置信的自由度,能够拟合复杂的数据集。也就是说,这个巨大的灵活度意味着在训练集上很容易过拟合。这里,我们主要通过几个常见的方法,来看下如何避免过拟合,主要有:过早的停止训练,L1和L2范数的正则化,DroupOut, 最大范数正则化,数据增强等。

一. 提前停止训练

为了避免对训练集造成过拟合,一个很好的方法就是在过拟合之前就停止对网络的训练(之前文章有介绍过)。也就是说在测试集上的性能开始下降之前的时候停止对训练数据集的训练。

在TensorFlow中就是在训练的时候,通过对测试集上性能的评估,每隔一定的间隔进行保存一个当前最优的网络,如果该网络比上一个间隔更好,则替换掉上一个网络。这样在训练结束后,将保存一个整个网络训练过程中出现最优的一个模型。尽管在实践中提前停止训练的方法能够的很好,但是通常情况下,如果能够结合其他正则化技术的话,能够变现更佳。

 

二. L1和L2范数正则化

正如之前我们学习线性模型的时候一样,我们也可以在神经网络用L1和L2范数进行约束权重(一般 不对偏置项)。在TensorFlow中实现正则化还是比较简单的,只需要在损失函数中加上合适的正则项即可。比如:假如我们的网络只有一个隐藏层,权重为weights1,一个输出层,权重为weight2。那么我们就能对权重用L1正则化,如下:

上面的方法虽然没问题,但是,如果我们的网络有很多层,那么上面的这种方法就不是太方便了。幸运的是,对于多层的正则化,TensorFlow有更好的方法。TensorFlow中有很多创建变量的函数在创建的时候都会接受一个正则化的参数。我们可以传输带权重的函数作为一个参数,并且返回相应的正则化是损失。如下:

 

上面的代码创建一个有两个隐藏层和一个输出层的神经网络,并且对于每一层的权重,都在图中创建了节点和计算L1正则化损失。TensorFlow自动把所有的正则化损失加到一个特定的集合中。我们只需要将这些正则化损失加到整体损失中,如下:

 

三. DropOut

然而,在深度神经网络中,最流行的正则化技术则是DropOut, 这项技术在2012年由G.E.Hinton提出。后来被Nitish Srivastava发展并证明是非常成功的。即使最优秀的网络,如果增加DropOut技术,准确率也能够提升1~2个百分点。这看起来提高并不是太多,但是如果一个模型已经达到95%的准确率,那么提高两个百分点意味着错误率降低了40%(从5%到3%)。

其实,这是一个蛮简单的算法:就是在training的每一步,每一个神经元(包括输入神经元,但是不包括输出神经元),都有一个概率p被丢弃。被丢弃的神经元,意味着在本次training中完全被放弃,但是可能在下次迭代中被激活。这个超参数p成为DropOut率,一般设置为50%。如下图:

咋一看,这种粗鲁的做法能够很好的工作有些不可思议。但是事实证明确实可行!由于每一个神经元随机的放弃,最终训练的结果会使每一个神经元都不会过分依赖于其他的神经元,而是使努力使自己达到最优。最终网络对输入的轻微变化不在敏感,进而得到一个鲁棒性很强的网络。

因为我们训练的时候会随机的丢弃一些神经元(概率为p),但是预测的时候就没办法随机丢弃了。如果丢弃一些神经元,这会带来结果不稳定的问题,也就是给定一个测试数据,有时候输出a有时候输出b,结果不稳定,这是实际系统不能接受的,用户可能认为模型预测不准。那么一种”补偿“的方案就是每个神经元的权重都乘以一个(1-p),或者在训练的时候除以(1-p),这样在“总体上”使得测试数据和训练数据是大致一样的。比如一个神经元的输出是x,那么在训练的时候它有(1-p)的概率参与训练,p的概率丢弃,那么它输出的期望是(1-p)x+p0=(1-p)x。因此测试的时候把这个神经元的权重乘以(1-p)可以得到同样的期望。

在TensorFlow中如何运用dropout呢?只需要简单的在输入层和隐藏层之前加上dropout函数即可。在training的 过程中,这个函数会随机将一些神经元置为0,并且自动除以(1-p)。下面代码展示了如何在TensorFlow中运用dropout正则化技术,如下:

正如之前batch Normalization一样,在训练的时候我们需要设置is_training 为true,测试的时候设为false。当我们观察到模型出现过拟合的时候,我们可以增加dropout率,也就是说减小keep_prob率。相反,如果模型欠出现拟合的时候,可以增加keep_prob率,减小dropout率。通常对于大的网络增加dropout率,小的网络减少dropout率往往会有帮助。

然而,一般情况下,加入dropout的话,会使训练收敛明显放慢。但是往往会得到更好的模型,很值!

四. 最大范数正则化

另外一个神经网络中常见的正则化技术就是最大范数正则化。对于每一个神经元的权重,都受到如下的约束:

其中||w||_2为L2范数,r为最大范数。通常情况下,我们通过计算w的L2范数来进行达到目的。如下:

最大范数正则化,往往能够降低过拟合,如果不适用batch正则化的话,也可以减轻梯度消失和梯度爆炸的问题。

TensorFlow并没有提供一个现成的最大范数正则化函数,但是实施起来也并不麻烦。如下:

上面代码创建一个clip_weights的节点,用来调整weights变量。我们可以在每一次迭代之后加上这个操作,如下:

我们可以通过scope来观察权重的变化,如下:

也可以通过root scope来得到权重,如下:

 

如果我们不知道变量的名字,那么可以通过TensorBoard或者简单的用global_variables()函数来查看变量名,如下:

尽管上面的方法可行,但是显得有些繁琐。一个更为简洁的方法就是创建一个最大范数正则化的函数,就好比前面学的L1,L2范数正则化函数一样,如下:

上面的函数返回的是一个参数化的函数max_norm(),可以向其他正则化一样:

注意到最大范数正则化不需要在全局的损失函数上增加正则项,所以max_norm()函数返回为None。但是我们仍需要在每次迭代之后运行clip_weights,这就是为什么max_norm()函数中将clip_weights增加到collection中。我们需要获取clip操作并在每次迭代之后运行,如下:

 

五. 数据增强

最后一个正则化技术就是数据增强,主要是认为的从已有的数据中人为的产生新的数据,进而来增加数据集,降低过拟合。比如,我们要对蘑菇图片进行分类,我们可以通过轻微的旋转,平移,缩放等方法来产生新的数据,如下图:

这就去迫使模型能对蘑菇的位置,大小,方位等适应,也可以通过改变图片的对比度来使得模型适应不同的光照。通过这些方法,可以使大大扩大数据集。

TensorFlow中提供了一些图像操作的方法,比如平移,旋转,缩放,翻转,剪切,调整光照对比度,饱和度,色度等,这就使得对数据增强比较方便。

 

六. 小结

这期我们主要通过几个常见的方法:过早的停止训练,L1和L2范数的正则化,DroupOut, 最大范数正则化,数据增强等。来避免模型过拟合,几种方法各有千秋,找到最适合自己模型的方法才是王道。

 

(如需更好的了解相关知识,欢迎加入智能算法社区,在“智能算法”公众号发送“社区”,即可加入算法微信群和QQ群)

 

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

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

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

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

 

学习率调整

阅读数 1282

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