欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2023-12-30 19:32:58
...

梯度下降

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

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

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

点我了解牛顿法

我们通过Python代码以实例展示牛顿法求解方程(x3)3=0(x-3)^{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入门、原理与进阶实战》。
百度百科——牛顿法

上一篇:

下一篇: