TensorFlow入门(二十二、梯度下降)

梯度下降的定义及作用

梯度下降本身是一个最优化算法,通常也被称为最速下降法。常被用于机器学习和人工智能中递归性地逼近最小偏差模型,也就是使用它找到一个函数的局部极小值。

使用过程中,梯度下降算法以函数上当前点对于梯度(或者是近似梯度)反方向的规定步长距离点进行迭代搜索。因此,它可以快速求解出某个函数的极小值或最小值。特别是对于n维问题求最优解,梯度下降法是最常用的方法之一。

python 复制代码
#定义损失函数
cost = tf.reduce_mean(tf.square(Y - z))
#定义学习率
learning_rate = 0.01
#设置优化函数
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

以上训练过程中,每次的正向传播后都会得到输出值与真实值的损失值,也就是cost,这个损失值越小,代表模型越好,而梯度下降的算法就用在这里,帮助寻找最小的那个损失值,从而反推出对应的学习参数b和w,从而达到优化模型的效果。

梯度下降算法的分类

常用的梯度下降算法可以分为以下三种:

①批量梯度下降法

也称为Batch Gradient Descent,简称BGD。该方法每遍历全部数据集就算一次损失函数,然后算函数对各个参数的梯度和更新梯度。这种方法的缺点是每更新一次参数,都要把数据集里的所有样本遍历一遍,计算量大,计算速度慢,不支持在线学习

②随机梯度下降法

也称为Stochastic Gradient Descent,简称SGD。该方法每遍历一个数据就算一下损失函数,然后求梯度更新参数。这个方法速度比较快,但是收敛性能不太好,容易在最优点附近晃来晃去,命中不到最优点。两次参数的更新也有可能互相抵消,造成目标函数震荡比较剧烈

③小批量梯度下降法

也称为Mini-batch gradient descent,即小批的梯度下降,简称MBGD。该方法是为了克服上面两种方法的缺点,采取的一种折中方法。它把数据分为若干批,按批来更新参数,这样一批中的一组数据共同决定了本次梯度的方向,下降起来就不容易跑偏,减少了随机性。另一方面因为每批的样本数与整个数据集相比小了很多,计算量也不是很大

TensorFlow中的梯度下降函数

在TensorFlow中,梯度下降优化函数有统一的优化器基类Optimizer。这个类定义了训练模型时与操作相关的API。

①tf.train.Optimizer.compute_gradients(loss,var_list = None,gate_gradients = 1,aggregation_method = None,colocate_gradients_with_ops = False,grad_loss = None)

该函数对var_list中的变量计算loss的梯度,返回一个以元组(gradient,variable)组成的列表。是函数minimize()的第一部分

②tf.train.Optimizer.apply_gradients(grads_and_vars,global_step = None,name = None)

该函数将计算出的梯度应用到变量上,返回一个应用指定的梯度操作Operation,对global_step做自增操作。是函数minimize()的第二部分。

③tf.train.Optimizer.minimize(loss,global_step = None,var_list = None,gate_gradients = 1,aggregation_method =None,colocate_gradients_with_ops = False,name = None,grad_loss = None)

该函数添加操作节点,用于最小化loss,并更新var_list。简单地合并了compute_gradients()与apply_gradients()函数,返回一个优化更新后的var_list。如果global_step非None,该操作还会为global_step做自增操作。

实际训练过程中,不直接使用类Optimizer,而是使用它的子类,如GradientDescentOptimizer,AdagradOptimizer,MomentumOptimizer等。不同的子类,对应不同的算法。

①tf.train.GradientDescentOptimizer(learning_rate,use_locking = False,name = GradientDescent)

该优化器是一个实现梯度下降算法的一般优化器类,用于构造一个新的梯度下降优化器实例。其中参数learning_rate是优化器将采用的学习速率,它可以是一个张量或一个浮点值。use_locking如果值为True,则使用锁进行更新操作。name是可选的,是应用梯度时创建的操作名称前缀,默认为"GradientDescent"。GradientDescentOptimizer的计算方法很简单,用学习率乘每个参数所对应的梯度来更新网络参数。

②tf.train.AdagradOptimizer(learning_rate,initial_accumulator_value = 0.1,use_locking = False,name = "Adagrad")

该函数构造一个使用"Adagrad"算法的优化器。其中参数initial_accumulator_value代表第一次训练时,分母梯度大小的初始值。name默认是"Adagrad"。AdagradOptimizer实际上属于自适应的梯度下降算法。其主要思想是,如果一个可学习的参数已经梯度下降了很多,则减缓其下降的速度,反之如果一个参数和初始化相比没有下降很多,则保证它有一个比较大的下降速度。

③tf.train.AdadeltaOptimizer(learning_rate = 0.001,rho = 0.95,epsilon = 1e-0.8,use_locking = False,name = "Adadelta")

该函数构造一个使用Adadelta算法的优化器,其中参数rho为衰减率,可以是一个张量或一个浮点值。epsilon是非常小的数,其为了防止在实现中除以零。name默认是"Adadelta",AdaDelta是google提出的一种对于AdaOptimizer的改进,也是一种自适应的优化器。

④tf.train.MomentumOptimizer(learning_rate,momentum,use_locking = False,name = "Momentum",use_nesterov = False)

该函数构造一个使用momentum算法的优化器。其中参数momentum是动量值的系数。参数use_nesterov用于设置是否使用nesterov版本的带动量的梯度下降。该函数是使用动量(Momentum)的随机梯度下降法(SGD),主要思想是引入一个积攒历史梯度信息动量来加速SGD。在计算一次梯度下降的同时,会考虑到上一次梯度下降的大小和方向。

⑤tf.train.AdamOptimizer(learning_rate = 0.001,beta1 = 0.9,beta2 = 0.999,epsilon = 1e-08,use_locking = False,name = "Adam")

该函数构造一个使用Adam算法的优化器。Adam即Adaptive Moment Estimation(自适应矩估计),是一个寻找全局最优点的优化算法,引入了二次梯度校正。其中参数beta1是一阶矩估计的指数衰减率,beta2是二阶矩估计的指数衰减率。

⑥tf.train.RMSPropOptimizer(learning_rate,decay = 0.9,momentum = 0.0,epsilon = 1e-10,use_locking = False,name = "RMSProp")

该函数构造一个使用RMSProp算法的优化器。其中参数decay控制历史梯度值的衰减速率。

如何选择优化器

Adagrad,Adadelta,RMSProp,Adam都属于自适应学习率算法,适用于训练数据是稀疏的场景。其中,RMSProp是Adagrad算法的一个扩展,它处理的是急剧下降的学习率。而Adam在RMSProp的基础上增加了偏差校正(bias-correction)和动量(momentum)。

随着梯度变得越来越稀疏,Adam的优化效果略优于RMSProp。RMSProp、Adadelta、Adam三个算法较为相似,在类似的情况下,效果也是相似的。比较上述四种算法,Adam是最好的选择,被应用得最为广泛。

MomentumOptimizer属于动量优化法。引入动量主要解决SGD的两个问题 : 一是随机梯度的方法(引入的噪声);二是SGD在收敛过程中和正确梯度相比来回摆动比较大的问题。

相关推荐
计算机源码社5 分钟前
分享一个餐饮连锁店点餐系统 餐馆食材采购系统Java、python、php三个版本(源码、调试、LW、开题、PPT)
java·python·php·毕业设计项目·计算机课程设计·计算机毕业设计源码·计算机毕业设计选题
汤兰月10 分钟前
Python中的观察者模式:从基础到实战
开发语言·python·观察者模式
chnyi6_ya21 分钟前
论文笔记:Online Class-Incremental Continual Learning with Adversarial Shapley Value
论文阅读·人工智能
中杯可乐多加冰21 分钟前
【AI驱动TDSQL-C Serverless数据库技术实战】 AI电商数据分析系统——探索Text2SQL下AI驱动代码进行实际业务
c语言·人工智能·serverless·tdsql·腾讯云数据库
西柚与蓝莓2 小时前
【开源开放体系总结】
python
萱仔学习自我记录2 小时前
PEFT库和transformers库在NLP大模型中的使用和常用方法详解
人工智能·机器学习
BulingQAQ5 小时前
论文阅读:PET/CT Cross-modal medical image fusion of lung tumors based on DCIF-GAN
论文阅读·深度学习·生成对抗网络·计算机视觉·gan
hsling松子5 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
belldeep5 小时前
python:reportlab 将多个图片合并成一个PDF文件
python·pdf·reportlab
正在走向自律5 小时前
机器学习框架
人工智能·机器学习