随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比
随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比
最优化(1)
版权声明:本文为博主原创文章,未经博主允许不得转载。
梯度下降(GD)是最小化风险函数、损失函数的一种常用方法,随机梯度下降和批量梯度下降是两种迭代求解思路,下面从公式和实现的角度对两者进行分析,如有哪个方面写的不对,希望网友纠正。
下面的h(x)是要拟合的函数,J(theta)损失函数,theta是参数,要迭代求解的值,theta求解出来了那最终要拟合的函数h(theta)就出来了。其中m是训练集的记录条数,j是参数的个数。
1、批量梯度下降的求解思路如下:
(1)将J(theta)对theta求偏导,得到每个theta对应的的梯度
(2)由于是要最小化风险函数,所以按每个参数theta的梯度负方向,来更新每个theta
(3)从上面公式可以注意到,它得到的是一个全局最优解,但是每迭代一步,都要用到训练集所有的数据,如果m很大,那么可想而知这种方法的迭代速度!!所以,这就引入了另外一种方法,随机梯度下降。
2、随机梯度下降的求解思路如下:
(1)上面的风险函数可以写成如下这种形式,损失函数对应的是训练集中每个样本的粒度,而上面批量梯度下降对应的是所有的训练样本:
(2)每个样本的损失函数,对theta求偏导得到对应梯度,来更新theta
(3)随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。
3、对于上面的linear regression问题,与批量梯度下降对比,随机梯度下降求解的会是最优解吗?
(1)批量梯度下降---最小化所有训练样本的损失函数,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小。
(2)随机梯度下降---最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。
4、梯度下降用来求最优解,哪些问题可以求得全局最优?哪些问题可能局部最优解?
对于上面的linear regression问题,最优化问题对theta的分布是unimodal,即从图形上面看只有一个peak,所以梯度下降最终求得的是全局最优解。然而对于multimodal的问题,因为存在多个peak值,很有可能梯度下降的最终结果是局部最优。
5、随机梯度和批量梯度的实现差别
以前一篇博文中NMF实现为例,列出两者的实现差别(注:其实对应Python的代码要直观的多,以后要练习多写python!)
- // 随机梯度下降,更新参数
- public void updatePQ_stochastic(double alpha, double beta) {
- for (int i = 0; i < M; i++) {
- ArrayList<Feature> Ri = this.dataset.getDataAt(i).getAllFeature();
- for (Feature Rij : Ri) {
- // eij=Rij.weight-PQ for updating P and Q
- double PQ = 0;
- for (int k = 0; k < K; k++) {
- PQ += P[i][k] * Q[k][Rij.dim];
- }
- double eij = Rij.weight - PQ;
- // update Pik and Qkj
- for (int k = 0; k < K; k++) {
- double oldPik = P[i][k];
- P[i][k] += alpha
- * (2 * eij * Q[k][Rij.dim] - beta * P[i][k]);
- Q[k][Rij.dim] += alpha
- * (2 * eij * oldPik - beta * Q[k][Rij.dim]);
- }
- }
- }
- }
- // 批量梯度下降,更新参数
- public void updatePQ_batch(double alpha, double beta) {
- for (int i = 0; i < M; i++) {
- ArrayList<Feature> Ri = this.dataset.getDataAt(i).getAllFeature();
- for (Feature Rij : Ri) {
- // Rij.error=Rij.weight-PQ for updating P and Q
- double PQ = 0;
- for (int k = 0; k < K; k++) {
- PQ += P[i][k] * Q[k][Rij.dim];
- }
- Rij.error = Rij.weight - PQ;
- }
- }
- for (int i = 0; i < M; i++) {
- ArrayList<Feature> Ri = this.dataset.getDataAt(i).getAllFeature();
- for (Feature Rij : Ri) {
- for (int k = 0; k < K; k++) {
- // 对参数更新的累积项
- double eq_sum = 0;
- double ep_sum = 0;
- for (int ki = 0; ki < M; ki++) {// 固定k和j之后,对所有i项加和
- ArrayList<Feature> tmp = this.dataset.getDataAt(i).getAllFeature();
- for (Feature Rj : tmp) {
- if (Rj.dim == Rij.dim)
- ep_sum += P[ki][k] * Rj.error;
- }
- }
- for (Feature Rj : Ri) {// 固定k和i之后,对多有j项加和
- eq_sum += Rj.error * Q[k][Rj.dim];
- }
- // 对参数更新
- P[i][k] += alpha * (2 * eq_sum - beta * P[i][k]);
- Q[k][Rij.dim] += alpha * (2 * ep_sum - beta * Q[k][Rij.dim]);
- }
- }
- }
- }
// 随机梯度下降,更新参数public void updatePQ_stochastic(double alpha, double beta) {for (int i = 0; i < M; i++) {ArrayList<Feature> Ri = this.dataset.getDataAt(i).getAllFeature();for (Feature Rij : Ri) {// eij=Rij.weight-PQ for updating P and Qdouble PQ = 0;for (int k = 0; k < K; k++) {PQ += P[i][k] * Q[k][Rij.dim];}double eij = Rij.weight - PQ;// update Pik and Qkjfor (int k = 0; k < K; k++) {double oldPik = P[i][k];P[i][k] += alpha* (2 * eij * Q[k][Rij.dim] - beta * P[i][k]);Q[k][Rij.dim] += alpha* (2 * eij * oldPik - beta * Q[k][Rij.dim]);}}}}// 批量梯度下降,更新参数public void updatePQ_batch(double alpha, double beta) {for (int i = 0; i < M; i++) {ArrayList<Feature> Ri = this.dataset.getDataAt(i).getAllFeature();for (Feature Rij : Ri) {// Rij.error=Rij.weight-PQ for updating P and Qdouble PQ = 0;for (int k = 0; k < K; k++) {PQ += P[i][k] * Q[k][Rij.dim];}Rij.error = Rij.weight - PQ;}}for (int i = 0; i < M; i++) {ArrayList<Feature> Ri = this.dataset.getDataAt(i).getAllFeature();for (Feature Rij : Ri) {for (int k = 0; k < K; k++) {// 对参数更新的累积项double eq_sum = 0;double ep_sum = 0;for (int ki = 0; ki < M; ki++) {// 固定k和j之后,对所有i项加和ArrayList<Feature> tmp = this.dataset.getDataAt(i).getAllFeature();for (Feature Rj : tmp) {if (Rj.dim == Rij.dim)ep_sum += P[ki][k] * Rj.error;}}for (Feature Rj : Ri) {// 固定k和i之后,对多有j项加和eq_sum += Rj.error * Q[k][Rj.dim];}// 对参数更新P[i][k] += alpha * (2 * eq_sum - beta * P[i][k]);Q[k][Rij.dim] += alpha * (2 * ep_sum - beta * Q[k][Rij.dim]);}}}}
随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比相关推荐
- 【Machine Learning实验1】batch gradient descent(批量梯度下降) 和 stochastic gradient descent(随机梯度下降)
批量梯度下降是一种对参数的update进行累积,然后批量更新的一种方式.用于在已知整个训练集时的一种训练方式,但对于大规模数据并不合适. 随机梯度下降是一种对参数随着样本训练,一个一个的及时updat ...
- 梯度下降法的三种形式批量梯度下降法、随机梯度下降以及小批量梯度下降法
梯度下降法的三种形式BGD.SGD以及MBGD 梯度下降法的三种形式BGD.SGD以及MBGD 阅读目录 1. 批量梯度下降法BGD 2. 随机梯度下降法SGD 3. 小批量梯度下降法MBGD 4. ...
- Lesson 4.34.4 梯度下降(Gradient Descent)基本原理与手动实现随机梯度下降与小批量梯度下降
Lesson 4.3 梯度下降(Gradient Descent)基本原理与手动实现 在上一小节中,我们已经成功的构建了逻辑回归的损失函数,但由于逻辑回归模型本身的特殊性,我们在构造损失函数时无法采用 ...
- 【数据挖掘】神经网络 后向传播算法 ( 梯度下降过程 | 梯度方向说明 | 梯度下降原理 | 损失函数 | 损失函数求导 | 批量梯度下降法 | 随机梯度下降法 | 小批量梯度下降法 )
文章目录 I . 梯度下降 Gradient Descent 简介 ( 梯度下降过程 | 梯度下降方向 ) II . 梯度下降 示例说明 ( 单个参数 ) III . 梯度下降 示例说明 ( 多个参数 ...
- 随机梯度下降法,批量梯度下降法和小批量梯度下降法以及代码实现
前言 梯度下降法是深度学习领域用于最优化的常见方法,根据使用的batch大小,可分为随机梯度下降法(SGD)和批量梯度下降法(BGD)和小批量梯度下降法(MBGD),这里简单介绍下并且提供Python ...
- 梯度下降:全梯度下降算法(FG)、随机梯度下降算法(SG)、小批量梯度下降算法(mini-batch)、随机平均梯度下降算法(SAG)。梯度下降法算法比较和进一步优化。
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 2.2 梯度下降(Gradient Descent) 2.2. ...
- 三种梯度下降法对比(Batch gradient descent、Mini-batch gradient descent 和 stochastic gradient descent)
梯度下降(GD)是最小化风险函数.损失函数的一种常用方法,随机梯度下降(stochastic gradient descent).批量梯度下降(Batch gradient descent)和mini ...
- 梯度下降法的三种形式BGD(批量梯度下降)、SGD(随机梯度下降)以及MBGD(小批量梯度下降)
在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练.其实,常用的梯度下降法还具体包含有三种不同的形式,它们也各自有着不同的优缺点. 下面我们以线性回归算法来对三种梯度下降法进行比较. ...
- 批量梯度下降,随机梯度下降和小批量梯度下降的区别
批量梯度下降,随机梯度下降和小批量梯度下降的区别主要体现在用于计算梯度的样本的数量: 批量梯度下降:在每次迭代时,用整个数据集的所有样本上的梯度计算更新. 随机梯度下降:在每次迭代时,用单个样本上的梯 ...
- 1. 批量梯度下降法BGD 2. 随机梯度下降法SGD 3. 小批量梯度下降法MBGD
排版也是醉了见原文:http://www.cnblogs.com/maybe2030/p/5089753.html 在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练.其实,常用的梯度 ...
最新文章
- 「图神经网络东」最新2022综述
- python验证用户登录的判断_python怎么判断用户是否登录?
- Docker是个啥?
- 手把手教你用nestjs框架7分钟生成crud风格接口
- 用libevent实现简易的telnet
- android 8 ril,Android系统启动——8 附录2:相关守护进程简介
- [剑指offer]面试题7:用两个栈实现队列
- 有效需求分析的基本流程
- mysql双机数据热备份_配置MySQL数据库双机热备份
- 台式计算机装系统,教你台式电脑重装系统方法
- 安装默认报表服务器虚拟目录,报表服务器虚拟目录
- 【注意力机制】SENet(Squeeze-and-Excitation Networks)详解
- unslider.js 实现移动web轮播
- cisco port-channel配置
- MATLAB中load用法
- amd linux raid,AMD RAID 安装指南.pdf
- A股各概念板块龙头股大全
- (转载自新华网)蓄势数载业初就 | 水下悬浮隧道项目一瞥
- Cocos2d-x for XNA:万丈高楼亦可不需平地起
- 服务化系统容量评估和性能保障
热门文章
- php elasticsearch ik,elasticsearch和analysis-ik的安装使用
- 隔空投送找不到_嗑技热点对标苹果AirDrop,安卓终于也能隔空投送
- 类属性、类方法;私有属性、公有属性;私有方法、公有方法;静态属性、静态方法;python的命名规范__xx__\__xx\_xx(自用笔记)
- 有符号二进制数--补码
- c++ const 常指针
- keras 提取某一层的feature_map
- Python 位运算符号
- Leetcode 94.二叉树的中序遍历 (每日一题 20210712)
- Spark DataFrameDataSet
- pandas 补充知识:data_range函数