1.深度学习的一些基本概念,学习率、batch、epoch、optimizer、评价函数(损失函数)等
1.1 学习率(Learning Rate)
学习率:是控制模型学习效率(步长)的权重。
学习率的大小区分
区别 | 学习率大 | 学习率小 |
---|---|---|
学习速度 | 快 | 慢 |
应用场合 | 训练初期 | 数次Epoch过后 |
缺点 | 1.容易损失过大 2.容易发生振荡 | 1.容易过拟合 2.收敛速度慢 |
学习率的设置
在训练过程中,一般根据训练轮数设置动态变化的学习率:
1.刚开始训练时:学习率以 0.01 ~ 0.001 为宜。
2.一定轮数过后:逐渐减缓。
3.接近训练结束:学习速率的衰减应该在100倍以上。
学习率减缓机制
轮数减缓 | 指数减缓 | 分数减缓 | |
---|---|---|---|
英文名 | step decay | exponential decay | 1/t1/t decay |
方法 | 每N轮学习率减半 | 学习率按训练轮数增长指数插值递减 | lrt=lr0/(1+kt)lrt=lr0/(1+kt) ,kk 控制减缓幅度,tt 为训练轮数 |
loss-Epoch图像
理想情况下曲线应该是滑梯式下降,如图中的[绿线]:
- 曲线 初始时 上扬 [红线]: Solution:初始 学习率过大 导致 振荡,应减小学习率,并 从头 开始训练 。
- 曲线 初始时 强势下降 没多久 归于水平 [紫线]: Solution:后期 学习率过大 导致 无法拟合,应减小学习率,并 重新训练后面几轮 。
- 曲线 全程缓慢 [黄线]: Solution:初始 学习率过小 导致 收敛慢,应 增大学习率,并从头开始训练。
1.2 Batch(批次)
批量,即Batch,是深度学习中的一个重要概念。
批量通常指两个不同的概念——如果对应的是模型训练方法,那么批量指的是将所有数据处理完以后一次性更新权重或者参数的估计;如果对应的是模型训练中的数据,那么批量通常指的是一次输入供模型计算用的数据量。
基于批量概念的模型训练通常按照如下步骤进行:
处理所有数据
更新参数
初始化参数
得到新的权重
批量算法相对应的是递增算法,其步骤如下:
处理一个或者一组数据点
更新参数
初始化参数
得到新的权重
对比:
这里的主要区别是批量算法一次处理所有的数据;而在递增算法中,每处理一个或者数个观测值就要更新一次参数。
在后向传播算法中,“处理”对应的具体操作就是计算损失函数的梯度变化曲线。如果是批量算法,则计算平均或者总的损失函数的梯度变化曲线;而如果是递增算法,则计算损失函数仅在对应于该观测值或者数个观测值时的梯度变化曲线。
“更新”则是从已有的参数值中减去梯度变化率和学习速率的乘积。
为什么要用batch?
batch可以大致理解为计算损失函数时需要用到的样本个数,以上两种不同的概念,仅是在样本个数差异上的不同体现。
1.遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度。这称为Batch gradient descent,批梯度下降。这种方法缺点很明显,计算量大,吃内存,不适用于在线学习。
2.每输入一个数据就计算一次损失函数,进而求梯度并更新参数,称为随机梯度下降,stochastic gradient descent,这种方法速度较快,但由于迭代一次仅依靠单一样本,很容易在相邻的两次迭代计算中的产生梯度差距非常大,甚至方向相反,因此容易不收敛。
3.另一种就是将上述两种方法的折中,称为mini-batch gradient decent,将数据集分成一定数量的批,梯度不容易跑偏容易收敛,同时减少了一次处理的数据数量,因而计算量也小了很多,速度较快。
批量梯度下降法(BGD, Batch Gradient Descent)
随机梯度下降法(SGD, Stochastic Gradient Descent)
小批量梯度下降法(Mini-batch Gradient Descent)
优点 | 缺点 |
---|---|
1.相对于海量数据的大内存,Mini-batch只需要小内存 | 1.批次越小,梯度的估值不准确 |
2.速度更快 | 2.批次越小,越不容易收敛 |
3. 选取局部的梯度方向,较之全局的学习率简单 | 3.所有参数都是用同样的learning rate |
当数据集较大时,并不是适合一次将所有样本批量输入进行训练,而应该使用一个合适的数量来训练,这个合适的数量又该如何选择?
batch_size如何选择?
在合理范围内增大batch_size:
1.能提高内存使用率。
2.减少Epoch迭代次数,提高训练速度。
3.一定范围内batch_size越大,确定的梯度下降方向越准确。
盲目增大batch_size:
1.内存不足。
2.Epoch迭代次数过少,要想达到相同的精度,时间花费增加,调参整体进度下降。
3.batch_size大到一定程度,梯度方向基本不改变。
总结:在硬件配置允许下,从小(也不能过小)增大batch_size,直至一个比较合适的数量,有人指出,将batch_size设置成2的次方倍能加快速度(未经考证)。
自适应梯度剪切
由于链式法则的计算,当网络的层数非常多时,经常出现梯度消失或者梯度爆炸的现象。体现在图像,就是损失函数有一个悬崖式的变化。如果设置的学习率太大,那么可能出现修改过度,甚至丢失已经优化好的数据。而自适应梯度剪切就是根据你的学习率,调整梯度的角度,确保收敛的稳定性。
高学习率
提高收敛速度的最直接方式就是增大学习率,但单纯的增大高学习率会产生收敛问题(收敛不稳定),虽然作者已经用了自适应梯度剪切的方法来增大收敛稳定性。但作者在设置学习率时,也能使用一下技巧来增强收敛稳定性。具体的做法是,一开始设置一个很大的学习率(CDSR简单地令每层的学习率相同),每过20个epochs,将学习率缩小十倍。这么做的原理也很直观,一开始训练时网络损失函数还较大,能够大胆地用高学习率来缩短收敛时间,随着训练次数得增多,模型趋向收敛,如果继续用高学习率,就会破坏收敛稳定性,所以改用小学习率,确保网络收敛。这么多次缩小学习率,进一步缩小了收敛时间。
原文:https://blog.csdn.net/gwplovekimi/article/details/83041627