随着深度学习的兴起,愈来愈多的人从事算法工程师这一岗位。有时候他们自嘲本身为“天桥调参师”。固然,算法工程师的工做内容并无那么简单,由于设置超参数的过程须要专业知识和普遍的试验和试错过程。尤为是针对学习率(learning rate)、批量大小(batch size)、动量( momentum)和权重衰减(weight decay)这些超参数而言,没有简单易行的方法来设置。算法
深度学习模型充满了超参数,在如此高维空间中找到这些参数的最佳值并非一项容易的挑战。在讨论找到最佳超参数的方法以前,首先了解这些超参数:学习率、批量大小、动量和权重衰减。这些超参数相似于开关旋钮,能够在模型训练期间进行调整。为了使得模型可以得到最佳结果,须要找到这些超参数的最佳值。服务器
梯度降低是训练机器学习算法中经常使用的优化技术。训练机器学习算法的主要目的是调整权重w以最小化损失函数或成本函数。经过最小化成本函数,就能够找到产生最佳模型性能的参数[1]。
回归问题的典型损失函数图相似于碗的形状,以下所示。网络
在梯度降低算法中,首先随机模型参数,并计算每次学习迭代的偏差,不断更新模型参数以更接近致使最小成本的值。梯度降低算法将梯度乘以一个标量(学习率),以肯定下一个点。
若是用dW和db做为更新参数W和b的梯度,梯度降低算法以下:架构
若是学习率很小,那么训练会更加可靠,但花费的时间也更多,由于每次移动的步长很小。
若是学习率很大,那么训练可能不收敛。权重变化可能很大,以致于优化器错失最优化并使得损失变大。所以,最终目标是找到能够快速得到最小损失的最佳学习率。机器学习
通常而言,能够将梯度降低视为在山谷中滚动的球。但愿它可以在停留山脉的最深处,但有时可能会出错。函数
根据球开始滚动的位置,它可能会停留在山谷的底部。但不是最低的一个,这称为局部最小值。初始化模型权重的方式可能会致使局部最小值。为了不这种状况,能够随机始化权重向量。
用2-D表示损失面,以下所示:布局
红点是全局最小值,但愿可以达到这一点。使用梯度降低方法,更新将以下所示:性能
随着梯度降低的每次迭代,向上和向下振荡移动到局部最优。若是使用更大的学习率,那么垂直振荡将具备更高的幅度。这种垂直振荡会减慢梯度降低过程,并阻止设置更大的学习率,而学习速率过小会使梯度降低变慢。学习
目标是但愿在垂直方向上学习更慢,在水平方向上学习更快,这将有助于更快地达到全局最小值。测试
为了实现这一点,可使用具备动量的梯度降低 [2]。
梯度降低:
在动量方面,采用dW和db的指数加权平均值,而不是每一个时期单独使用dW和db。
其中β
是另外一个称为动量的超参数,取值范围从0到1。它设置先前值的平均值与当前值之间的权重,以计算新的加权平均值。
计算指数加权平均值后更新参数。
经过使用dW和db的指数加权平均值,将垂直方向上的振荡平均化为接近零。然而,在水平方向上,全部导数都指向水平方向的右侧,所以水平方向上的平均值仍然至关大。它容许算法采用更直接的路径朝向局部最优并阻尼垂直振荡。基于此,算法最终会在局部最优处进行几回迭代。
有三种梯度降低的方法:
b
个示例:训练时不是使用全部的示例,而是将训练集划分为称为批处理的较小尺寸,每次取b
个示例用来更新模型参数;在网格搜索[3]中,尝试每一个可能的参数配置。
步骤:
n =(learning_rate, batch_size)
;batch_size = [4,8,16,32]
,learning_rate = [0.1,0.01,0.0001]
;C1 =(0.1,4) - > acc = 92%
,C2 =(0.01,4) - > acc = 92.3%
等;随着维度的增多,搜索将在时间复杂度上发生爆炸。当维度小于或等于4时,一般使用这种方法。虽然它最终能保证找到最佳配置,但它仍然不是优选的,最好是使用随机搜索。
随机搜索[4]首先从配置空间中随机选取一个点,使用随机搜索更普遍地探索超参数空间。这能够在更少的迭代次数中找到最佳配置。例如:
在网格布局中,很容易注意到,即便已经训练了9个模型,而每一个变量只使用了3个值。然而,使用随机搜索,咱们不太可能不止一次地选择相同的变量,将使用9个不一样的值为每一个变量训练9个模型。更多详细分析,请参阅该文。
尽管随机搜索比网格搜索表现更好,但这两种方法在计算上仍然是昂贵且耗时的。在2018年,Leslie在其经典论文中提出了关于识别最佳超参数的各类方法的详细报告[5]。其中最好的方法是基于经过检查测试/验证损失以寻找欠拟合和过拟合的曲线来找到两者之间的平衡,以便争取最佳的超参数集合。
超参数调整过程无异于在钢丝上走路,以实现欠拟合和过拟合之间的平衡。
若是学习率过小,则可能发生过拟合。较高的学习率有助于正则训练,但若是学习率过大,训练就会出现偏差。所以,能够进行短距离网格搜索以找到收敛或发散的学习率,但还有另外一种方法称为“周期性学习率(CLR)”。
实验代表,训练期间使用不一样的学习率整体上是有益的,所以建议在一个取值范围内周期性地改变学习率,而不是将其设定为固定值。让学习率在必定范围内变化,而不是采用逐步、固定或指数级减小学习率值。即设置好最小和最大边界,学习率在这些边界之间循环变化。
LR范围测试:运行模型几个epoch,同时让学习率在高低学习率值之间线性增长。对于浅层的3层架构,最大设置为0.01
,而对于resnet这样的网络,学习率最大能够设置为3.0
。
从一轮循环肯定最大学习速率,并将最大值的十分之一做为最小学习率的表现也不错[6]。
与学习率不一样,其值不影响计算训练时间。批量大小受硬件内存的限制,而学习率则否则。建议使用适合硬件内存的较大批量大小,并使用更大的学习速率。
若是服务器有多个GPU,则总批量大小是单个GPU上的批量大小乘以GPU的数量。
动量和学习率密切相关。最佳学习率取决于动量,而动量又取决于学习率。与学习率同样,在不引发训练不稳定的状况下尽量设置大的动量值是颇有价值的。
0.9-0.99
)将起到伪增长学习率的做用并加速训练。可是,使用过大的动量值会致使训练结果不好。不管是循环学习速率仍是恒定学习速率,能够尝试在0.9到0.99范围内设定动量值,并从中选择一个表现最佳值。
体重衰减是正则化的一种形式,它在训练中起着重要做用,所以须要适当设定[7]。权重衰减被定义为将每一个时期的梯度降低中的每一个权重乘以因子λ(0 <λ<1
)。
通常而言,能够测试权重衰减值为1 /10³
、1 /10⁴
、1 /10⁵
和0
。较小的数据集和模型结构设置较大的权重衰减值,而较大的数据集和更深的模型结构设置较小的值。
若是使用恒定的学习率而不是使用学习率范围进行搜索,则最佳权重衰减会有所不一样。因为较大的学习率提供正则化,所以较小的权重衰减值是最佳的。
0.99
、0.97
、0.95
和0.9
进行测试,以得到动量的最佳值;0.8
或0.85
;10^-4
、10^-5
、10^-6
、0
;10^-2
、10^-3
、10^-4
;
原文连接 本文为云栖社区原创内容,未经容许不得转载。