【机器学习】—各类梯度下降算法 简要介绍 隐马尔可夫模型(HMM)来龙去脉(二) 单智能体、多智能体强化学习基本概念及算法分类?为啥提出多智能体强化学习,现状? 张量网络算法基础(八、张量网络机器学习【上】) MapReduce 简介 Python爬虫入门教程 81-100 小众爬虫框架looter,框架作者竟然在官方手册开车 机器人二维导航教程汇总 mapper 使用示例 Redis的概念及关系型与非关系型数据库对比 MySQL必知必会:使用WHERE、正则表达式、通配符过滤数据 Solr的增量更新和全量更新对比 MYSQL数据库维护 MATLAB与Mysql数据库连接并数据交换(基于ODBC) 数据库:PostgreSQL:基础功能使用介绍 MYSQL 5.7 高级SQL语句(3)——数据库函数和存储过程 mysql导出数据到表格讲解大全(导出数据带表头,导出数据中文乱码问题解决) SpringBoot升级/指定jackson版本 JAVA - EnumMap与EnumSet简单总结 js获取主机mac等信息【亲测有效】-- 附执行结果&代码 [记录六] Vue(全家桶)+node+koa2+mysql+nginx+redis,博客全栈项目之node后台连接mysql和redis,登陆接口的编写 C# 读取XML配置文件 MongoDB数据库设置密码 Redis之重设密码及开启远程访问 本地Navicat连接阿里云MySQL数据库注意要点 PHP Windows系统实现定时任务的两种方式bat版 面试官让我手写promise,我这样写,他很满意 超级码力在线编程大赛初赛 第二场 UML类图的依赖和关联详解(含代码) 【C语言】新手实现简单的石头剪刀布人机对战 Codeforces Round #666 (Div. 2)题解ABC Codeforces Round #666 (Div. 2)E Monster Invaders 华为今年不会推出运行鸿蒙OS的手机;Deno 1.3.2发布|极客头条 异或在笔试题中的超神表现 超级码力在线编程大赛初赛 第2场 T1-T4题解 1397D. Stoned Game(博弈) Codeforces Round #666(Div.2)A~D题题解 高性能微服务架构技术选型 阿里饿了么Java4面:(数据结构+框架源码+JVM+分布式) 2020java面试总结 使用ffmpeg提取mp4内部日期重命名文件(需lua) 【剑指Offer】56.2 数组中只出现一次的数字,其他出现3次 JAVA二三事-使用IO+Properties实现动态读取文本信息 排序算法的C语言实现C代码(未更完) RT-Thread 内核学习--信号量的初步使用 【剑指Offer】57.2 和为S的连续正数序列 Qt三方库开发技术:QXlsx介绍、编译和使用 4G DTU模块的作用和功能说明 【Tips】- Wifi模块和4G无线通信 【5G核心网】 Identifiers 身份标识 DPDK支持的硬件:CPU、网卡NIC、加密引擎、基带加速器
您的位置:首页 >计算机基础 >

【机器学习】—各类梯度下降算法 简要介绍

阅读之前看这里👉:博主是一名正在学习数据类知识的学生,在每个领域我们都应当是学生的心态,也不应该拥有身份标签来限制自己学习的范围,所以博客记录的是在学习过程中一些总结,也希望和大家一起进步,在记录之时,未免存在很多疏漏和不全,如有问题,还请私聊博主指正。
博客地址:天阑之蓝的博客,学习过程中不免有困难和迷茫,希望大家都能在这学习的过程中肯定自己,超越自己,最终创造自己。

目录

一、梯度下降(Batch Gradient Descent)二、随机梯度下降(SGD)三、小批量随机梯度下降(Mini Batch Stochastic Gradient Descent)四、Online GD

机器学习中梯度下降(Gradient Descent, GD)算法只需要计算损失函数的一阶导数,计算代价小,非常适合训练数据非常大的应用。

梯度下降法的物理意义很好理解,就是沿着当前点的梯度方向进行线搜索,找到下一个迭代点。但是,为什么有会派生出 batch、mini-batch、online这些GD算法呢?

batch、mini-batch、SGD、online的区别在于训练数据的选择上:

类型batchmini-batchSGDonline训练集固定固定固定实时更新单次迭代样本数整个训练集训练集的子集单个样本根据具体算法定算法复杂度高一般低低时效性低一般(delta 模型)一般(delta 模型)高收敛性稳定较稳定不稳定不稳定

一、梯度下降(Batch Gradient Descent)

梯度下降:我们知道曲面上方向导数的最大值的方向就代表了梯度的方向,因此我们在做梯度下降的时候,应该是沿着梯度的反方向进行权重的更新,可以有效的找到全局的最优解。

在梯度下降中,每一次迭代都需要用到所有的训练数据,一般来讲我们说的Batch Gradient Desent(即批梯度下降),跟梯度下降是一样的,这里的batch指的就是全部的训练数据。
损失函数:
在这里插入图片描述
训练过程:
在这里插入图片描述
它的实现大概就是下面这样子:

for epoch in range(epoches):y_pred = np.dot(weight, x_train.T)deviation = y_pred - y_train.reshape(y_pred.shape)gradient = 1/len(x_train) * np.dot(deviation, x_train)weight = weight - learning_rate*gradient

优点:

每次迭代的梯度方向计算由所有训练样本共同投票决定,所以它的比较稳定,不会产生大的震荡。

缺点:

与SGD相比,收敛的速度比较慢(参数更新的慢)。

当处理大数据量的时候,因为需要对所有的数据进行矩阵计算,所以会造成内存不够。

二、随机梯度下降(SGD)

在随机梯度下降当中,每一次迭代(更新参数)只用到一条随机抽取的数据。所以随机梯度下降参数的更新次数更多,为epoches*m次,m为样本量,而在梯度下降中,参数的更新次数仅为epoches次。

它的训练过程是:
在这里插入图片描述
它的实现大概是这样子的:

for epoch in range(epoches):for i in range(len(x_train):index = random.randint(0,len(x_train))y_pred = np.dot(weight, x_train[index].T)deviation = y_pred - y_train[index].reshape(y_pred.shape)gradient = np.dot(deviation, x_train[index])weight = weight - learning_rate*gradient

梯度下降和随机梯度下降在指定训练次数(epoches)的情况下,他们的计算大致一样的,因为在梯度下降中做了mxn和nx1的矩阵运算,而在随机梯度下降中则是做了m次的1xn和nx1的矩阵运算。所以不能说随机梯度下降就一定比梯度下降结束的要早。主要是因为它参数更新次数多,所以收敛的速度比较快。由于numpy的矩阵运算会比for循环更快,所以甚至梯度下降有可能比随机梯度下降结束得更早。当然在以收敛条件作为结束条件的模型下,随机梯度下降可能比梯度下降结束的早些。

优点:

收敛速度快(参数更新次数多)。

缺点:

每次迭代只依靠一条训练数据,如果该训练数据不是典型数据的话,w的震荡很大,稳定性不好。

更新参数的频率大,自然开销也大。

三、小批量随机梯度下降(Mini Batch Stochastic Gradient Descent)

这是机器学习当中最常用到的方法,因为它是前两种方法的调和,所以能够拥有GD和SGD的优点,也能一定程度上摆脱GD和SGD的缺点。常用于数据量较大的情形。

他用了一些小样本来近似全部的,其本质就是既然SGD中1个样本的近似不一定准,那就用更大的30个或50(batch_size)个样本来近似,即mini-batch SGD每次迭代仅对n个随机样本计算题都,直至收敛。

随机在训练集中选取一个mini-batch,每个mini-batch包含n个样本;(n<N,N为总训练集样本数)在每个mini-batch里计算每个样本的梯度,然后在这个mini-batch里求和取平均作为最终的梯度来更新参数;(注意虽然这里好像用到了BGD,但整体整体mini-batch的选择是用到了SGD)以上两步可以看做是一次迭代,这样经过不断迭代,直至收敛

它的实现大概是这样子的:

def batch_generator(x, y, batch_size): //batch生成器nsamples = len(x)batch_num = int(nsamples / batch_size)indexes = np.random.permutation(nsamples)for i in range(batch_num):yield (x[indexes[i*batch_size:(i+1)*batch_size]], y[indexes[i*batch_size:(i+1)*batch_size]])for epoch in range(epoches):for x_batch, y_batch in batch_generator(X_train, y_train, batch_size):y_hat = np.dot(weight, x_batch.T)deviation = y_hat - y_batch.reshape(y_hat.shape)gradient = 1/len(x_batch) * np.dot(deviation, x_batch)weight = weight - learning_rate*gradient

四、Online GD

随着互联网行业的蓬勃发展,数据变得越来越“廉价”。很多应用有实时的,不间断的训练数据产生。在线学习(Online Learning)算法就是充分利用实时数据的一个训练算法。

Online GD于mini-batch GD/SGD的区别在于,所有训练数据只用一次,然后丢弃。这样做的好处是可以最终模型的变化趋势。比如搜索广告的点击率(CTR)预估模型,网民的点击行为会随着时间改变。用batch算法(每天更新一次)一方面耗时较长(需要对所有历史数据重新训练);另一方面,无法及时反馈用户的点击行为迁移。而Online Leaning的算法可以实时的最终网民的点击行为迁移。

参考:
1.https://blog.csdn.net/qq_40765537/article/details/105792978
2.https://www.cnblogs.com/richqian/p/4549590.html
—————————————————————————————————————————————————
博主码字不易,大家关注点个赞转发再走呗 ,您的三连是激发我创作的源动力^ - ^
在这里插入图片描述

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。