高中数学学过,函数在一阶导数为零的地方达到其最大值和最小值。梯度下降算法基于相同的原理,即调整系数(权重和偏置)使损失函数的梯度下降。

在回归中,使用梯度下降来优化损失函数并获得系数。本节将介绍如何使用 TensorFlow 的梯度下降优化器及其变体。

按照损失函数的负梯度成比例地对系数(W 和 b)进行更新。根据训练样本的大小,有三种梯度下降的变体:

  1. Vanilla 梯度下降:在 Vanilla 梯度下降(也称作批梯度下降)中,在每个循环中计算整个训练集的损失函数的梯度。该方法可能很慢并且难以处理非常大的数据集。该方法能保证收敛到凸损失函数的全局最小值,但对于非凸损失函数可能会稳定在局部极小值处。
  2. 随机梯度下降:在随机梯度下降中,一次提供一个训练样本用于更新权重和偏置,从而使损失函数的梯度减小,然后再转向下一个训练样本。整个过程重复了若干个循环。由于每次更新一次,所以它比 Vanilla 快,但由于频繁更新,所以损失函数值的方差会比较大。
  3. 小批量梯度下降:该方法结合了前两者的优点,利用一批训练样本来更新参数。

TensorFlow优化器的使用

首先确定想用的优化器。TensorFlow 为你提供了各种各样的优化器:

  • 这里从最流行、最简单的梯度下降优化器开始:

    GradientDescentOptimizer 中的 learning_rate 参数可以是一个常数或张量。它的值介于 0 和 1 之间。

    必须为优化器给定要优化的函数。使用它的方法实现最小化。该方法计算梯度并将梯度应用于系数的学习。该函数在 TensorFlow 文档中的定义如下:

    综上所述,这里定义计算图:

    馈送给 feed_dict 的 X 和 Y 数据可以是 X 和 Y 个点(随机梯度)、整个训练集(Vanilla)或成批次的。

  • 梯度下降中的另一个变化是增加了动量项。为此,使用优化器 tf.train.MomentumOptimizer()。它可以把 learning_rate 和 momentum 作为初始化参数:

     
  • 可以使用 tf.train.AdadeltaOptimizer() 来实现一个自适应的、单调递减的学习率,它使用两个初始化参数 learning_rate 和衰减因子 rho:

     
  • TensorFlow 也支持 Hinton 的 RMSprop,其工作方式类似于 Adadelta 的 tf.train.RMSpropOptimizer():

    Adadelta 和 RMSprop 之间的细微不同可参考 http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf 和 https://arxiv.org/pdf/1212.5701.pdf

  • 另一种 TensorFlow 支持的常用优化器是 Adam 优化器。该方法利用梯度的一阶和二阶矩对不同的系数计算不同的自适应学习率:

     
  • 除此之外,TensorFlow 还提供了以下优化器:

通常建议你从较大学习率开始,并在学习过程中将其降低。这有助于对训练进行微调。可以使用 TensorFlow 中的 tf.train.exponential_decay 方法来实现这一点。

根据 TensorFlow 文档,在训练模型时,通常建议在训练过程中降低学习率。该函数利用指数衰减函数初始化学习率。需要一个 global_step 值来计算衰减的学习率。可以传递一个在每个训练步骤中递增的 TensorFlow 变量。函数返回衰减的学习率。

变量:

  • learning_rate:标量float32或float64张量或者Python数字。初始学习率。
  • global_step:标量int32或int64张量或者Python数字。用于衰减计算的全局步数,非负。
  • decay_steps:标量int32或int64张量或者Python数字。正数,参考之前所述的衰减计算。
  • decay_rate:标量float32或float64张量或者Python数字。衰减率。
  • staircase:布尔值。若为真则以离散的间隔衰减学习率。
  • name:字符串。可选的操作名。默认为ExponentialDecay。

返回:

  • 与learning_rate类型相同的标量张量。衰减的学习率。

实现指数衰减学习率的代码如下:

推荐阅读

下面是讲解不同优化器的链接:

最新文章

  1. C# 利用反射给不同类型对象同名属性赋值
  2. SQL Server中的锁的简单学习
  3. 截取视图某一段另存为部分视图(Partial View)
  4. qt_文本编辑器实现_附带详细注释和源码下载
  5. 【贪心】bzoj 3709:[PA2014]Bohater
  6. CI框架中自定义view文件夹位置
  7. MySQL 5.7 启用查询日志
  8. hdu5294||2015多校联合第一场1007 最短路+最大流
  9. BZOJ 1024 SCOI 2009 生日快乐 深搜
  10. mysql中游标的使用案例详解(学习笔记)
  11. js 数组去重复的方法
  12. bzoj3156防御准备 斜率优化dp
  13. eval()和$.parseJSON()注意事项
  14. java核心-多线程-Java多线程编程涉及到包、类
  15. SQL UPDATE with INNER JOIN
  16. SpringBoot笔记--FastJson
  17. 创建springboot的聚合工程(三)
  18. Confluence 6 使用 LDAP 授权连接一个内部目录 - 拷贝用户到登录
  19. json添加数据
  20. OpenFastPath(1):快平面接口是否支持多ip

热门文章

  1. 【MySQL】深入理解MySQL锁和事务隔离级别
  2. mysql 赋权语句
  3. 数据库-第八章 数据库编程-8.4 ODBC编程
  4. [工具推荐]005.Axure RP Pro 7.0模拟C#TAB控件
  5. Spring_AOP_AspectJ支持的通知注解
  6. 我的第一个jQuery插件开发(日期选择器,datePicker),功能还不完善,但用于学习参考已经足够了。
  7. 小技巧:用 GitBook 组织 Markdown 文档
  8. jchdl - GSL实例 - Div
  9. 前端HTML 定位position 绝对定位 相对定位
  10. ActiveMQ 笔记(四)Spring\SpringBoot 整合 Activemq