梯度下降法和随机梯度下降法的区别
这几天在看《统计学习方法》这本书,发现 梯度下降法 在 感知机 等机器学习算法中有很重要的应用,所以就特别查了些资料。
一.介绍
梯度下降法(gradient descent)是求解无约束最优化问题的一种常用方法,有实现简单的优点。梯度下降法是迭代算法,每一步需要求解目标函数的梯度向量。
二.应用场景
1.给定许多组数据(xi, yi),xi (向量)为输入,yi为输出。设计一个线性函数y=h(x)去拟合这些数据。
2.感知机:感知机(perceptron)为二类分类的线性分类模型。 输入为实例的特征向量,输出为实例的类别, 取+1 和 -1 二值。
下面分别对这两种应用场景进行分析。
1.对于第一种场景:
既然是线性函数,在此不妨设为 h(x) = w0*x0 + w1*x1。
此时我们遇到的问题就是如何确定w0和w1这两个参数,即w=(w0,w1)这个向量。
既然是拟合,则拟合效果可以用平方损失函数:E(w)=∑ [ h(x)- y ] ^2 / 2 来衡量。
其中w是权重二维向量,x是输入二维向量,x和y都是训练集的数据,即已知。
至于后面除于2只是为了之后的推导过程中对E求导时候可以消除系数,暂时可以不管。
因此该问题变成了求E(w)最小值的无约束最优化问题
2.对于第二种场景:
假设输入空间(特征向量)为x,输出空间为y = {+1, -1},由输入空间到输出空间的如下函数
f(x) = sign(w · x + b) w∈Rn 其中 w 叫做权值或者权值向量, b叫做偏振。w · x 表示向量w和x的点积
感知机sign(w · x + b)的损失函数为 L(w, b) = -∑yi(w · xi + b) x ∈M, M为误分类点集合。
因此该问题变成了求L(w, b)最小值的无约束最优化问题
三.梯度下降方法
梯度其实就是高数求导方法,对E这个公式针对每个维数(w0,w1)求偏导后的向量▽E(w)=(∂E/∂w0,∂E/∂w1)
1. 对于第一种场景
对E这个公式针对每个维数(w0,w1)求偏导后的向量▽E(w)=(∂E/∂w0,∂E/∂w1)
梯度为最陡峭上升的方向,对应的梯度下降的训练法则为: w=w-η▽E(w) 这里的η代表学习速率,决定梯度下降搜索中的步长 。
上式的w是向量,即可用将该式写成分量形式为:wi=wi-η*∂E/∂wi
现在关键就使计算∂E/∂wi:
推导过程很简单,书上写的很详细,这里只记录结论(其实就是对目标函数求导):
∂E/∂wi=∑(h(x)-y)*(xi)
这里的∑是对样本空间,即训练集进行一次遍历,耗费时间较大,可以使用梯度下降的随机近似:
2. 对于第二种场景
感知机学习算法是误分类驱动的,具体采用随机梯度下降方法
▽wL(w, b) = -∑yixi
▽bL(w, b) = -∑yi
随机选取一个误分类点(xi, yi), 对w, b进行更新:
w <—— w - η * (-yixi)
b <—— b - η * (-yi) 式中η(0 < η <= 1)是步长,在统计学习中又称为学习率(learning rate)
四.随机梯度下降的随机近似:
既然是随机近似,则顾名思义,肯定是用近似方法来改善梯度下降时候的时间复杂度问题。
正如上所说,在∂E/∂wi=∑(h(x)-y)*(xi) 的时候∑耗费了大量的时间,特别是在训练集庞大的时候。
所以肯定有人会猜想,如果把求和去掉如何,即变为∂E/∂wi=(h(x)-y)*(xi)。
幸运的是,猜想成立了。
只是要注意一下标准的梯度下降和随机梯度下降的区别:
1.标准下降时在权值更新前汇总所有样例得到的标准梯度,随机下降则是通过考察每次训练实例来更新。
2.对于步长 η的取值,标准梯度下降的η比随机梯度下降的大。
因为标准梯度下降的是使用准确的梯度,理直气壮地走,随机梯度下降使用的是近似的梯度,就得小心翼翼地走,怕一不小心误入歧途南辕北辙了。
3.当E(w)有多个局部极小值时,随机梯度反而更可能避免进入局部极小值中。
四.代码及实例:
1. 对于第一种场景
1 /*2 * 随机梯度下降实验:3 * 训练集输入为矩阵:4 * 1,45 * 2,56 * 5,17 * 4,28 * 输出结果为:9 * 19 10 * 26 11 * 19 12 * 20 13 * 需要参数为 w: 14 * ? 15 * ? 16 * 17 * 目标函数:y=w0*x0+w1*x1; 18 * 19 * */ 20 #include<stdio.h> 21 #include <stdlib.h> 22 int main() 23 { 24 double matrix[4][2]={{1,4},{2,5},{5,1},{4,2}}; 25 double result[4]={19,26,19,20}; 26 double w[2]={0,0};//初始为零向量 27 double loss=10.0; 28 const double n = 0.01; //步长 29 for(int i=0;i<100&&loss>0.001;i++) 30 { 31 double error_sum=0; 32 int j=i%4; 33 { 34 double h=0; 35 for(int k=0;k<2;k++) 36 { 37 h+=matrix[j][k]*w[k]; 38 } 39 error_sum = h - result[j]; 40 for(int k=0;k<2;k++) 41 { 42 w[k]-= n * (error_sum) * matrix[j][k];//这里是关键 43 } 44 } 45 printf("%lf,%lf\n",w[0],w[1]); 46 double loss=0; 47 for(int j=0;j<4;j++) 48 { 49 double sum=0; 50 for(int k=0;k<2;k++) 51 { 52 sum += matrix[j][k] * w[k]; 53 } 54 loss += (sum - result[j]) * (sum-result[j]); 55 } 56 printf("%lf\n",loss); 57 } 58 59 system("pause"); 60 return 0; 61 }
结果可以得出 w0=3,w1=4。
1 /*2 * 基于感知机的随机梯度下降实验: 《统计学习方法》- p29-例2.1 3 * 训练集输入为矩阵:4 * 3,35 * 4,36 * 1,17 * 输出结果为(表示实例的分类):8 * 1 9 * 1 10 * -1 11 * 需要参数为 w: 12 * ? 13 * ? 14 * 15 * 目标函数:y = w0 * x0 + w1 * x1 + b; 16 * 17 * */ 18 #include<stdio.h> 19 #include <stdlib.h> 20 int main() 21 { 22 double x[3][2]={{3,3},{4,3},{1,1}}; 23 double y[4]={1, 1, -1}; 24 double w[2]={0,0};//初始为零向量 25 double b = 0; 26 int j; 27 const double n = 1; //步长 28 29 while(1) 30 { 31 for(j=0;j<3;j++) 32 { 33 if(y[j] * (w[0] * x[j][0] + w[1] * x[j][1] + b) <= 0) 34 break; 35 } 36 if(j < 3) 37 { 38 for(int k=0;k<2;k++) 39 w[k] += n * y[j] * x[j][k];//这里是关键 40 b += n * y[j]; 41 } 42 else 43 break; 44 printf("%d :%lf,%lf %lf\n", j, w[0], w[1], b); 45 46 } 47 48 system("pause"); 49 return 0; 50 }
结果可以得出 w0=1,w1=1, b = -3 。
梯度下降法和随机梯度下降法的区别相关推荐
- 梯度下降算法_批梯度下降法,Minibatch梯度下降法和随机梯度下降法之间的区别...
什么是梯度下降法? 梯度下降法是一种机器学习中常用的优化算法,用来找到一个函数(f)的参数(系数)的值,使成本函数(cost)最小. 当参数不能解析计算时(如使用线性代数),并且必须通过优化算法搜索时 ...
- 梯度下降法和随机梯度下降法
1. 梯度 在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度.比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y) ...
- 『ML笔记』梯度下降法和随机梯度下降法和小批量梯度对比
目录 1. 梯度下降法(gradient descent) 2. 随机梯度下降(Stochastic gradient descent) 3. 小批量梯度下降(Mini-Batch gradient ...
- 梯度下降法和随机梯度下降,批量梯度下降法,小批量梯度下降(SGD,MGD,BMGD)
梯度下降法 其有着三种不同的形式: 批量梯度下降(Batch Gradient Descent). 随机梯度下降(Stochastic Gradient Descent) 以及小批量梯度下降(Mini ...
- 梯度下降和随机梯度下降的区别
在学习机器学习的过程中梯度下降这个词出现的频率很高,在运用的过程中不能很好的理解算法的意思,于是从网路上查找了一些资料. 一.介绍 梯度下降法(gradient descent)是求解无约束最优化问题 ...
- 批量梯度下降,随机梯度下降和小批量梯度下降的区别
批量梯度下降,随机梯度下降和小批量梯度下降的区别主要体现在用于计算梯度的样本的数量: 批量梯度下降:在每次迭代时,用整个数据集的所有样本上的梯度计算更新. 随机梯度下降:在每次迭代时,用单个样本上的梯 ...
- 最优化方法:梯度下降(批梯度下降和随机梯度下降)
http://blog.csdn.net/pipisorry/article/details/23692455 梯度下降法(Gradient Descent) 梯度下降法是一个一阶最优化算法,通常也称 ...
- 大白话5分钟带你走进人工智能-第十一节梯度下降之手动实现梯度下降和随机梯度下降的代码(6)...
第十一节梯度下降之手动实现梯度下降和随机梯度下降的代码(6) 我们回忆一下,之前咱们讲什么了?梯度下降,那么梯度下降是一种什么算法呢?函数最优化 ...
- 梯度、梯度下降,随机梯度下降
一.梯度gradient http://zh.wikipedia.org/wiki/%E6%A2%AF%E5%BA%A6 在标量场f中的一点处存在一个矢量G,该矢量方向为f在该点处变化率最大的方向,其 ...
最新文章
- .NET EF框架的安装、及三种开发模式
- python tuple类型和list_Python 04_List 和 Tuple 类型
- 监控系统或者网站服务器的报警及复位,机房监控系统标准和常见故障
- js面向对象编程:this究竟代表什么?第二篇
- EMNLP 2020 《MUTANT: A Training Paradigm for Out-of-Distribution Generalization in VQA》论文笔记
- K8S部署hazelcast
- 计算机二级考试c语言公共基础知识,全国计算机二级c语言公共基础知识考试内容.doc...
- mysql和oracle区别总结(二)
- 技术周刊(2019-02-11 Serverless)
- 让多核CPU占用率曲线听你指挥(Windows实现)——《编程之美》1.1学习笔记
- Java做题错误知识点总结(頑張って)!
- css absolute relative 定位
- Android聊天软件开发(基于网易云IM即时通讯)——发送图片消息(五)
- (SCI分区)查SCI期刊JCR分区的图解步骤
- pfSense®与OPNsense®技术比较
- JQuery注册登录
- SymPy学习之Plotting Module
- 战网在线更改服务器,暴雪的“战网”是如何从无到有 并改变了在线游戏的?...
- Bayesian information criterion和 Akaike information criterion中的模型参数个数(自由度)计算 | 以高斯混合分布为例
- 26、python数据表透视分析、交叉分析、实现透视表功能