梯度下降法超参数?梯度下降法的目的和原理
一、梯度下降法的目的和原理
梯度下降法(Gradient Descent)是一种常用的优化算法,目的是小化一个函数,尤其是在机器学习与深度学习中,用于小化损失函数,来寻找模型参数的优解。
###目的:
其主要目的是找到函数的局部或全局极小值。在机器学习中,这通常对应于找到可以小化损失函数的模型参数集,这样的模型能够好地拟合训练数据。
###原理:
梯度下降法的工作原理是利用函数在参数空间中的梯度(gradient)来决定搜索的方向。梯度是一个多变量函数在特定点的所有偏导数构成的向量,它指向函数增长快的方向。因此,函数减少快的方向是梯度的相反方向。
####具体步骤为:
1.初始化参数:首先,选择一个函数的起始点,即参数的初始值。这可以是一个随机选择的点,或者是基于先前信息的估算。
2.计算梯度:接着,计算在当前参数值下,函数的梯度。
3.确定步长(learning rate):确定一个步长,也称作学习率,在机器学习中这是一个超参数,它控制我们在梯度的相反方向上移动的距离。学习率既不能太大(可能导致‘跳过’低点),也不能太小(导致收敛速度很慢)。
4.参数更新:将当前参数沿着梯度的相反方向移动一段由学习率决定的距离来更新参数。
5.迭代:重复第2到第4步,直到满足停止准则,比如梯度的变化非常小(表示找到了极小值),或者达到了设定的迭代次数。
通过这个迭代过程,我们可以逐渐调整参数,使得函数值不断降低,直到达到一个小值或足够接近小值的点。
二、神经网络中自适应的梯度下降优化算法(二)
Adagrad算法可以针对不同的参数自适应的采用不同的更新频率,对低频出现的特征采用低的更新率,对高频出现的特征采用高的更新率,因此,对于稀疏的数据它表现的很好,很好的提升了SGD的鲁棒性,在Google的通过Youtube视频识别猫的神经网络训练中有很好的表现。
梯度更新规则:
g(t,i)表示在t时刻目标函数对θ(i)的偏导数。SGD的每个参数的更新过程如下:
Adagrad的每个参数更新过程如下:
G(t)是一个对角矩阵,对角线上的每个元素是t时刻前所有θ(i)的梯度的平方和。ε通常取值在1e-8量级,它的存在是为了避免除数为0。一个有趣的现象是,如果没有平方根*作,算法的表现就非常糟糕。
Adagrad的主要缺点是,它的分母是平方梯度的累积,它的值会一直增加,终导致学习率衰减到非常小,从而使得学习算法无法进行下去。
TensorFlow实现:
tf.train.AdagradOptimizer(learning_rate, initial_accumulator_value=0.1, use_locking=False, name='Adagrad')
Adadelta算法主要解决Adagrad的缺陷,它不再累加过去所有的梯度,而是仅累积过去固定个数的梯度。
Adadelta不是采用平方梯度的简单累加,而是采用历史平方梯度的衰减的平均。
γ通常等于0.9
分母相当于梯度的均方根(root mean squared, RMS),即将所有值平方求和,求其均值,再开平方,就得到均方根值。
梯度更新规则:
将学习率η设置为
,我们就不需要提前设定学习率。
RMSprop是Geoff Hinton提出的一种自适应学习率的方法,它与Adadelta方法都是为了解决Adagrad学习率急剧下降问题的。它与Adadelta方法是一致的。
梯度更新规则
超参数设定值:
Hinton建议设定γ=0.9,学习率η=0.001。
TensorFlow实现:
tf.train.RMSPropOptimizer.__init__(learning_rate, decay, momentum=0.0, epsilon=1e-10, use_locking=False, name='RMSProp')
Adam也是对不同的参数自适应设置不同的学习率。它对历史梯度和历史平方梯度同时采用指数梯度衰减(exponentially decaying average)。
梯度更新规则
Adam作者观察到,如果m(t)和v(t)初始化为零向量,并且衰减率很小时(比如β1和β2都非常接近于1时),在开始的迭代中,m(t)和v(t)总是向零偏移,所以需要做偏移校正。
然后用校正后的值进行梯度更新:
Adam作者建议β1=0.9,β2=0.999,ε=10^{-8}
,在实践中,Adam比其它算法的效果要好。
TensorFlow实现:
tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')
Adam更新规则中的梯度缩放与历史梯度的L2范数成反比。
我们可以把这个规则泛化到Lp范数。
当p值增大的时候,Lp的值往往会变得不稳定,所以在实践中L1和L2使用的比较普遍。但是Adamax作者发现L∞可以收敛到一个稳定值。
然后我们可以采用u(t)代替
来更新Adam中的梯度。
同时u(t)不需要做零偏校正。默认取值建议:
三、神经网络超参数选择
深度学习模型通常由随机梯度下降算法进行训练。随机梯度下降算法有许多变形:例如 Adam、RMSProp、Adagrad等等。这些算法都需要你设置学习率。学习率决定了在一个小批量(mini-batch)中权重在梯度方向要移动多远。
如果学习率很低,训练会变得更加可靠,但是优化会耗费较长的时间,因为朝向损失函数小值的每个步长很小。
如果学习率很高,训练可能根本不会收敛,损失函数一直处于波动中,甚至会发散。权重的改变量可能非常大,使得优化越过小值,使得损失函数变得更糟。
训练应当从相对较大的学习率开始。这是因为在开始时,初始的随机权重远离优值。在训练过程中,学习率应当下降,以允许细粒度的权重更新。
参考:
批次大小是每一次训练神经网络送入模型的样本数。在合理的范围之内,越大的 batch size使下降方向越准确,震荡越小,通常取值为[16,32,64,128]。
Batch_Size=全部数据集缺点:
1)随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
2)以 Rprop的方式迭代,会由于各个 Batch之间的采样差异性,各次梯度修正值相互抵消,无法修正。
Batch_Size= 1缺点:
使用**学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。
在合理范围内,增大 Batch_Size有何好处?
1)内存利用率提高了,大矩阵乘法的并行化效率提高。
2)跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
3)在一定范围内,一般来说 Batch_Size越大,其确定的下降方向越准,引起训练震荡越小。
盲目增大 Batch_Size有何坏处?
1)内存利用率提高了,但是内存容量可能撑不住了。
2)跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
3) Batch_Size增大到一定程度,其确定的下降方向已经基本不再变化。
参考:
迭代次数是指整个训练集输入到神经网络进行训练的次数,当测试错误率和训练错误率相差较小,且测试准确率趋于稳定时(达到优),可认为当前迭代次数合适;当测试错误率先变小后变大时则说明迭代次数过大了,需要减小迭代次数,否则容易出现过拟合。
用激活函数给神经网络加入一些非线性因素,使得网络可以更好地解决较为复杂的问题。参考:
它能够把输入的连续实值变换为0和1之间的输出。
缺点:
1)在深度神经网络中梯度反向传递时导致梯度*炸和梯度消失,其中梯度*炸发生的概率非常小,而梯度消失发生的概率比较大。
2) Sigmoid的 output不是0均值,使得收敛缓慢。batch的输入能缓解这个问题。
它解决了Sigmoid函数的不是zero-centered输出问题,然而梯度消失的问题和幂运算的问题仍然存在。
tanh函数具有中心对称性,适合于有对称性的二分类
虽然简单,但却是近几年的重要成果,有以下几大优点:
1)解决了梯度消散问题(在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh
ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生:(1)非常不幸的参数初始化,这种情况比较少见(2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx而非 0,如 PReLU。
1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据(可以经过数据预处理实现)和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多“dead”神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU或者 Maxout.
3)好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU和 Maxout.
公式:
优化器比较: