tensorflow学习笔记:梯度下降与退化学习率
梯度下降
写过了**函数、损失函数,接下来就到梯度下降了。接下来记录一下梯度下降的相关知识。
梯度下降是让模型接近最小偏差的过程。
梯度下降是一种优化算法,常常被成为最速下降法(在运筹学中常提到的优化算法主要为最速下降法以及牛顿法。)。梯度下降的方向选取梯度的负方向,沿着下降方向按一定的学习率进行搜索,通过迭代迫近极小值。
我们通过Python代码以实例展示牛顿法求解方程的根的过程。
def f(x):
return (x-3)**3 '''定义 f(x) = (x-3)^3'''
def fd(x):
return 3*((x-3)**2) '''定义 f'(x) = 3*((x-3)^2)'''
def newtonMethod(n,assum):
#牛顿法
time = n
x = assum
Next = 0
A = f(x)
B = fd(x)
print('A = ' + str(A) + ',B = ' + str(B) + ',time = ' + str(time))
if f(x) == 0.0:
return time,x
else:
Next = x - A/B
print('Next x = '+ str(Next))
if A - f(Next) < 1e-6:
print('Meet f(x) = 0,x = ' + str(Next)) '''设置迭代跳出条件,同时输出满足f(x) = 0的x值'''
else:
return newtonMethod(n+1,Next)
newtonMethod(0,4.0) '''设置从0开始计数,x0 = 4.0'''
在神经网络当中常用到的是最速下降法。这里梯度下降主要是为了寻找最小的损失值,从而反推出对应的学习参数 b
(偏置)、w
(权重)。就是所谓的反向传播过程。
常见的梯度下降方法可以分为:
- 批量梯度下降
- 随机梯度下降
- 小批量梯度下降
批量梯度下降
遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度和更新梯度。每次要更新参数都需要把所有数据看一遍,计算量较大,时间花销也很且不支持在线学习。
随机梯度下降
每看一个数据就算一次损失函数,然后求梯度更新参数。这种方法速度比较快,但是收敛性能不佳,容易出现在极值点附近徘徊的情况。
小批量梯度下降
将数据分为若干个批次,按批次来更新参数,通过一批中的一组数据来决定梯度的方向,降低了随机性,也让样本数与整体之间的比值得到了降低。
Tensorflow中的梯度下降函数
这里主要提一下随机梯度下降优化的函数。(为什么不说最好的小批量梯度下降呢?因为我们可以定义一个batchsize来决定一个样本的大小,将数据整合乘若干的数据集,然后还是调用随机梯度下降。小批量化数据集通过自己些代码操作即可。)
在Tensorflow中是通过一个Optimizer的优化器类及逆行训练优化的。下面列举一些常用的梯度下降优化器:
tf.train.GradientDescentOptimizer(learning_rate,use_locking=False,name='GradientDescent')#一般的梯度下降
tf.train.AdadeltaOptimizer(learning_rate=0.001,rho=0.95,epsilon=1e-08,use_locking=False,name='Adadelta')#创建Adadelta算法优化器
tf.train.AdagradOptimizer(learning_rate,initial_accumulator_value=0.1,use_locking=False,name='Adagrad')#创建Adagrad算法优化器
tf.train.MomentumOptimizer(learning_rate,momentum,use_locking=False,use_nesterov=False,name='Momentum')#创建Momentum优化器,momentum:动量,一个tensor或者浮点型。
tf.train.AdamOptimizer(learning_rate=0.001,beta1=0.8,beta2=0.899,epsilon=1e08,use_locking=False,name='Adam')#创建Adam算法优化器
tf.train.FtrlOptimizer(learning_rate,learning_rate_power=-0.5,
initial_accumulator_value=0.1,
l1_regularization_strength=0.0,
l2_regularization_strength=0.0,
use_locking=False,name='Ftrl')#创建FTRL算法优化器
tf.train.RMSPropOptimizer(learning_rate,decay=0.9,momentum=0.0,epsilon=1e-10,use_locking=False,name='RMSProp')#创建RMSPro算法优化器
在神经网络宏,首先要初始化一个算法优化器,然后调用minimize(loss),传入损失值节点,再启动一个外层循环,优化器就会按照循环的次数一次次沿着loss最小值的方向优化参数。
整个过程总的求导和反向传播操作,都是再优化器里自动完成的,常用的主要是Adam优化器。例如
optimizer = tf.train.AdamOptimizer(0.01).minimize(loss)
退化学习率
优化器中的learming_rate就是学习率。在运筹学中常常成为步长因子。
设置学习率的大小,是在精度和速度之间寻找一个平衡:
- 学习率比较大,训练的速度会提升,但是会造成精度不够。
- 学习率比较小,精度虽然提升了,但是训练会耗费非常多的时间。
退化学习率(衰减学习率),在训练的初期可以使用较大的学习率以提高学习速度,当训练到一定程度后,把学习率调小来提高训练精度。他的定义如下:
def exponential_decay(learning_rate,global_step,decay_steps,decay_rate,staircase=False,name=None):
decayed_learning_rate = learmind_rate * decay_rate * (global_step/decay_steps)
return decayed_learning_rate
tensorflow中自带的一个函数:
tf.train.exponential_decay(learning_rate,global_step,100000,0.96)
他需要参入的参数主要意义是:一开始的学习率,迭代到多少步的时候,学习率每一步都按照每10万步缩小到0.96%的速度衰减。
通过增大批次处理样本的数量也可以起到退化学习率的效果。
退化学习率的小实例
import tensorflow as tf
global_step = tf.Variable(0, trainable=False)
initial_learning_rate = 0.1 #定义最初的学习率
#让学习率到达global_step步时每一步按照100步缩小0.9%的速度缩小学习率
learning_rate = tf.train.exponential_decay(initial_learning_rate,
global_step,
decay_steps=100,decay_rate=0.9)
opt = tf.train.GradientDescentOptimizer(learning_rate)#定义一般的优化器
add_global = global_step.assign_add(1)#指定每次增加1
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print("初始学习率为:",sess.run(learning_rate))
for i in range(10):
g, rate = sess.run([add_global, learning_rate])
print("第%d步的学习率为:%f"%(g,rate))
我得到的运行结果:
初始学习率为: 0.1
第1步的学习率为:0.099895
第2步的学习率为:0.099790
第3步的学习率为:0.099684
第4步的学习率为:0.099579
第5步的学习率为:0.099475
第6步的学习率为:0.099370
第7步的学习率为:0.099265
第8步的学习率为:0.099161
第9步的学习率为:0.099056
第10步的学习率为:0.098952
可以看到学习率在按照一定的下降速度变小。
写在最后
百度百科中对牛顿法写得特别详细,想了解得可以点击连接去看看,里面还有各种语言写的例子,特别方便理解。我借此重新温习了一下运筹学课堂上学习到得东西,觉得受益匪浅。我这里写的肯定是不全面的,欢迎各位在评论区补充关于梯度下降以及退化学习率的相关知识。一起探索更多的深度学习内容知识吧。
欢迎大家在评论区纠错。
部分内容参考:
李金洪老师的《深度学习之TensorFlow入门、原理与进阶实战》。
百度百科——牛顿法
推荐阅读
-
tensorflow学习笔记:梯度下降与退化学习率
-
机器学习个人笔记——(二)线性回归,最小二乘法和梯度下降
-
tensorflow学习笔记之tfrecord文件的生成与读取
-
pytorch学习笔记(三十三):梯度下降和随机梯度下降
-
tensorflow 学习笔记3 placeholder与**函数
-
监督学习应用(Linear Regression)与梯度下降
-
【pytorch深度学习实践】笔记—03-1.梯度下降算法
-
机器学习个人笔记——(二)线性回归,最小二乘法和梯度下降
-
【Tensorflow与深度学习笔记day07】5.2. ANN网络分析+Mnist手写数字识别+one-hot编码+SoftMax回归+损失计算-交叉熵损失+实现神经网络模型+模型正确率评估
-
tensorflow 恢复指定层与不同层指定不同学习率的方法