参数学习算法之梯度下降
来源:互联网 发布:淘宝xbox one手柄 编辑:程序博客网 时间:2024/05/24 07:33
参照《机器学习》这本书的第4.4.3节。
一.解决目标及情景假设:
当给定一些数据,输入x向量已知,输出y也已知,设计一个线性函数y=h(x)去拟合这些数据。
既然是线性函数,在此不妨设为h(x)=w0*x0+w1*x1。
此时我们遇到的问题就是如何确定w0和w1这两个参数,即w=(w0,w1)这个向量。
既然是拟合,则拟合效果可以用误差函数:E(w)=∑ [ h(x)- y ] ^2 / 2 来衡量。
其中w是权重二维向量,x是输入二维向量,x和y都是训练集的数据,即已知。
至于后面除于2只是为了之后的推导过程中对E求导时候可以消除系数,暂时可以不管。
因为我们解决的目标是找出一个向量w=(w0,w1)使得E(w)值最小,即误差最小。
其实这个问题本质上也是搜索最优解的问题,如果用暴力搜索的话,随机取每个可能的值去让机器每天每夜地跑,显然这是不可能的。
所以此时有一种搜索策略:梯度下降。
二. 梯度下降(Gradiant Descent)方法:
梯度其实就是高数求导方法,对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)
这里的∑是对样本空间,即训练集进行一次遍历,耗费时间较大,可以使用梯度下降的随机近似:
随机梯度下降策略(Stochastic gradiant descent/incremental gradiant descent)来改进时间。
三.随机梯度下降的随机近似:
既然是随机近似,则顾名思义,肯定是用近似方法来改善梯度下降时候的时间复杂度问题。
正如上所说,在∂E/∂wi=∑(h(x)-y)*(xi) 的时候∑耗费了大量的时间,特别是在训练集庞大的时候。
所以肯定有人会猜想,如果把求和去掉如何,即变为∂E/∂wi=(h(x)-y)*(xi)。
幸运的是,猜想成立了。
只是要注意一下标准的梯度下降和随机梯度下降的区别:
1.标准下降时在权值更新前汇总所有样例得到的标准梯度,随机下降则是通过考察每次训练实例来更新。
2.对于步长 η的取值,标准梯度下降的η比随机梯度下降的大。
因为标准梯度下降的是使用准确的梯度,理直气壮地走,随机梯度下降使用的是近似的梯度,就得小心翼翼地走,怕一不小心误入歧途南辕北辙了。
3.当E(w)有多个局部极小值时,随机梯度反而更可能避免进入局部极小值中。
#include<stdio.h> #include <iostream>using namespace std;int main() { double matrix[4][2]={{1,4},{2,5},{5,1},{4,2}}; //4个输入为2维的特征值 double result[4]={19,26,19,20}; double theta[2]={0,0};//初始为零向量 double loss=10.0; //只是为了给循环条件loss一个初始值 for(int i=0;i<100&&loss>0.001;i++) //结束条件,最多100次,loss{ double error_sum=0; int j=i%4; //j from 0 to 3, 运行25个循环 { double h=0; for(int k=0;k<2;k++) { h+=matrix[j][k]*theta[k]; //hj = theta i * xi } cout<<"h"<<h<<endl; error_sum=result[j]-h; //y-hcout<<"sum"<<error_sum<<endl; for(int k=0;k<2;k++) { theta[k]+=0.01*(error_sum)*matrix[j][k];//这里是关键 阿尔法为0.01 } } cout<<"theta[0]"<<theta[0]<<"theta[1]"<<theta[1]<<endl; //printf("%lf,%lf\n",theta[0],theta[1]); //loss的大小可以显示出收敛的过程,并且用来控制收敛条件,小于0.01就结束 double loss=0; for(int j=0;j<4;j++) { double sum=0; for(int k=0;k<2;k++) { sum+=matrix[j][k]*theta[k]; } loss+=(sum-result[j])*(sum-result[j]); } cout<<"loss"; printf("%lf\n",loss); } system("pause"); return 0; }
- 参数学习算法之梯度下降
- 机器学习之梯度下降算法
- 机器学习算法之梯度下降法
- 机器学习-梯度下降算法
- 机器学习算法-梯度下降
- 机器学习:梯度下降算法
- 机器学习:梯度下降算法
- 梯度算法之批量梯度下降,随机梯度下降和小批量梯度下降
- 机器学习之梯度下降算法Gradient Descent
- 机器学习之梯度下降
- 神经网络算法学习---梯度下降和随机梯度下降
- 梯度算法之梯度上升和梯度下降
- 机器学习之梯度下降、批量梯度下降与随机梯度下降
- 【机器学习】(2):梯度下降算法
- 机器学习算法--梯度下降法
- 机器学习04-logistic梯度下降算法
- 机器学习—梯度下降算法
- 机器学习入门(5)--梯度下降算法
- what it
- Spring4.0.6 源码解读-DispatcherServlet
- 数据库:动态代理
- LINUX最大线程数及最大进程数
- 写一个名为my2DAlloc的函数,用它开辟一个二维数组
- 参数学习算法之梯度下降
- http://www.cnblogs.com/menlsh/archive/2013/05/19/3087810.html
- 应用Valgrind Linux程序的内存问题
- ftp命令
- Android ANR 起因的探究
- TableViewer双击激活CellEditor
- 用JdbcTemplateTool配合JdbcTemplate实现更便捷的数据库操作
- html中表单使用post方式提交,为什么没有值? get方式可以得到控件的值
- PAT 1030 完美数列(25)