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

梯度下降的定义及作用

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

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

#定义损失函数
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在收敛过程中和正确梯度相比来回摆动比较大的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CCF CSP认证 历年题目自练Day29

题目一 试题编号: 202112-1 试题名称: 序列查询 时间限制: 300ms 内存限制: 512.0MB 样例1输入 3 10 2 5 8 样例1输出 15 样例2输入 9 10 1 2 3 4 5 6 7 8 9 样例2输出 45 题目分析(个人理解) 还是…

Chrome Extensions v3 迁移清单

一、前置问题 1.1为什么需要迁移 v3? Chrome 计划完全停止 v2 版本维护,后续 v2 版本将无法上架谷歌插件商店,除此之外,未来新版本 Chrome 对于 v2 版本插件的限制会越来越大,比如安全性限制 iframe 嵌套只能通过沙盒…

云原生Kubernetes:Rancher管理k8s集群

目录 一、理论 1.Rancher 2.Rancher 安装及配置 二、实验 1.Rancher 安装及配置 三、问题 1. Rancher 部署监控系统报错 四、总结 一、理论 1.Rancher (1) 概念 Rancher 简介 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台,实现了 Kubernetes …

6. Python使用Asyncio开发TCP服务器简单案例

1. 说明 在Python中开发TCP/IP服务器有两种方式,一种使用Socket,需要在py文件中引入对应的socket包,这种方式只能执行单项任务;另一种方式使用Asyncio异步编程,可以一次创建多个服务器执行不同的任务。 2. 接口说明 …

利用MobaXterm连接服务器的全程配置

一、服务器上的操作 1.1 保证openssh的安装 openssh安装命令如下 apt-get update apt install openssh-server1.2 保证SSH服务没有在相应端口上侦听连接 1确保本地 SSH 服务正在运行 可以尝试使用以下命令检查 SSH 服务的状态(在大多数 Linux 系统上&#xff0…

c语言之strlen函数使用和实现

文章目录 前言一、strlen函数使用二、实现方法 前言 c语言之strlen函数使用和实现 一、strlen函数使用 strlen函数返回的是在字符串中的个数&#xff0c;但不包含字符串结束符’\0’ #include<stdio.h> #include<string.h> int main() {char str1[] "abcd…

分布式存储系统Ceph应用详解

Ceph的应用 一、Ceph 存储池(Pool)1.1 Ceph存储池的基本概念1.2 原理1.3 一个Pool资源池应该包含多少PG数&#xff1f;1.4 Ceph 存储池相关管理命令1.4.1 创建1.4.2 查看1.4.3 修改1.4.4 删除 二、 CephFS文件系统MDS接口三、创建CephFS文件系统MDS接口3.1 服务端操作Step1 在管…

【frp实现内网穿透踩坑到成功篇】

【frp实现内网穿透踩坑到成功篇】 背景&需求配置服务器端配置客户端总结 背景&需求 白嫖了一个tencent入门级服务器 ∗ 1 *1 ∗1&#xff0c;学校实验室内网服务器 ∗ 1 *1 ∗1&#xff0c;需要访问内网的服务器。一顿搜寻资料后确定大致的路子&#xff1a; 第一步是…

虹科分享 | 独特的FRER机制:TSN如何确保网络的可靠性?

1.IEEE802.1 CB协议 Frame Replication and Elimination for Reliability(FRER)是IEEE 802.1CB协议的一个重要特性&#xff0c;旨在增强以太网网络的可靠性。FRER利用帧复制和消除技术提供冗余保护和从连接故障中快速恢复。 FRER-IEEE 802.1CB协议的应用场景&#xff1a; 高…

【HttpRunner】接口自动化测试框架

简介 2018年python开发者大会上&#xff0c;了解到HttpRuuner开源自动化测试框架&#xff0c;采用YAML/JSON格式管理用例&#xff0c;能录制和转换生成用例功能&#xff0c;充分做到用例与测试代码分离&#xff0c;相比excel维护测试场景数据更加简洁。在此&#xff0c;利用业…

docker版jxTMS使用指南:使用命令行参数定制启动

本文讲解4.6版jxTMS中的命令行开关&#xff0c;整个系列的文章请查看&#xff1a;4.6版升级内容 docker版本的使用&#xff0c;请查看&#xff1a;docker版jxTMS使用指南 4.0版jxTMS的说明&#xff0c;请查看&#xff1a;4.0版升级内容 4.2版jxTMS的说明&#xff0c;请查看&…

阿里云韩国服务器测试IP地址及公网带宽收费价格表

阿里云服务器韩国&#xff08;首尔&#xff09;地域公网带宽价格表&#xff0c;1M带宽价格是23.0元/月&#xff0c;按使用流量1GB价格是0.8元&#xff0c;阿里云韩国服务器测试IP地址&#xff1a;149.129.12.20&#xff0c;阿里云百科aliyunbaike.com来详细说下阿里云韩国服务器…

火伞云Web应用防火墙的特点与优势

在前文中&#xff0c;我们已经介绍了Web应用防火墙&#xff08;WAF&#xff09;的基本原理和重要性。接下来&#xff0c;我们将深入探讨火伞云Web应用防火墙的特点与优势&#xff0c;了解它如何为企业提供更为完善和专业的网络安全保障。 一、强大的防御能力 火伞云Web应用防火…

基于MindSpore的llama微调在OpenI平台上运行

基于MindSpore的llama微调在OpenI平台上运行 克隆预训练模型 克隆chatglm-6b代码仓&#xff0c;下载分布式的模型文件 git lfs install git clone https://huggingface.co/openlm-research/open_llama_7b准备环境 安装Transformer pip install transformers执行转换脚本 …

参加CSP-J第一轮后的感受

本人现在初二。作为一名学了4年多c的人&#xff0c;我一直都挺想考过CSP。于是&#xff0c;去年我就去考了。 当时初一&#xff0c;感觉自己实力不够&#xff0c;就只报了J组的。果不其然&#xff0c;63分&#xff0c;没过。 经过1年的苦练&#xff0c;今年又去考了。 J组78分&…

SVN报错fail to run the WC Db work queue associated with,清理失败,乱码的解决方式

替换掉 wc.db 文件即可 SVN报错fail to run the WC Db work queue associated with&#xff0c;清理失败&#xff0c;乱码的解决方式_svn failed to run the wc db-CSDN博客

Python滑动窗口算法:滑动窗口算法(4 by 4 sliding window price)

我知道滑动窗口算法的时间复杂度是 o&#xff08;N&#xff09;&#xff0c;但是可变大小的滑动窗口算法的时间复杂度是多少。 对于 e- 数组 [1,2,3,4,5,6] 当滑动窗口的大小为 1 时窗口-[1],[2],[3],[4],[5],[6] 当滑动窗口的大小为 2 时窗口-[1,2],[2,3],[3,4],[4,5],…

DamiBus v0.51 发布

DamiBus&#xff0c;专为本地多模块之间通讯解耦而设计&#xff08;尤其是未知模块、隔离模块、领域模块&#xff09;。零依赖&#xff0c;特适合 DDD。 特点 结合 Bus 与 RPC 的概念&#xff0c;可作事件分发&#xff0c;可作接口调用&#xff0c;可作响应订阅。 支持事务传…

CSS 复杂卡片/导航栏特效运用目录

主要是记录复杂卡片/导航栏相关的特效实践案例和实现思路。 章节名称完成度难度文章地址完整代码下载地址多曲面卡片实现完成复杂文章链接代码下载倒置边框半径卡片完成一般文章链接代码下载

再谈Java泛型

一.类型参数的约束 我们可以对泛型传进来的参数做一些约束&#xff0c;比如说 用extends表明传进来的参数类型必须是必须是某个类型的子类型或者本身 当然也可以用接口约束&#xff0c;也是用extends表明传进来的参数类型必须实现某个接口。用&连接&#xff0c;注意class…