tensorflow学习笔记:梯度下降与退化学习率

梯度下降

写过了激活函数、损失函数,接下来就到梯度下降了。接下来记录一下梯度下降的相关知识。

梯度下降是让模型接近最小偏差的过程。

梯度下降是一种优化算法,常常被成为最速下降法(在运筹学中常提到的优化算法主要为最速下降法以及牛顿法。)。梯度下降的方向选取梯度的负方向,沿着下降方向按一定的学习率进行搜索,通过迭代迫近极小值。

点我了解牛顿法

我们通过Python代码以实例展示牛顿法求解方程 ( x − 3 ) 3 = 0 (x-3)^{3}=0 (x3)3=0的根的过程。

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入门、原理与进阶实战》。
百度百科——牛顿法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值