梯度下降法

来源:互联网 发布:老男孩python 编辑:程序博客网 时间:2024/05/17 08:51
这几天在看《统计学习方法》这本书,发现 梯度下降法 在 感知机 等机器学习算法中有很重要的应用,所以就特别查了些资料。   

 

   一.介绍

      梯度下降法(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,4 5  * 2,5 6  * 5,1 7  * 4,2 8  * 输出结果为: 9  * 1910  * 2611  * 1912  * 2013  * 需要参数为 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. 对于第二种场景
复制代码
 1 /* 2  * 基于感知机的随机梯度下降实验:  《统计学习方法》- p29-例2.1  3  * 训练集输入为矩阵: 4  * 3,3 5  * 4,3 6  * 1,1 7  * 输出结果为(表示实例的分类): 8  * 1  9  * 110  * -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          else43             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 。

       

 

参考:

 

1.    http://blog.csdn.net/wuyanyi/article/details/8003946

 

2.    李航 统计学习方法

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 教师资格证面试准考证号忘了怎么办 初中学校说处分不给毕业证怎么办? 自动档一键打火的车没电了怎么办 物流代收货款一直拿不到钱怎么办 丰巢快递柜收不到验证码怎么办 拼多多三级惩罚下架3天怎么办 在万达买的衣服穿一次烂了怎么办 内蒙古对于没有地的农民改怎么办 微信号码重新注册后回零钱怎么办 安卓系统文件苹果手机打不开怎么办 课题必须发表论文吗?查重怎么办 学信网学籍绑定输错5次怎么办 大学学校图书馆借的书丢了怎么办 借阅机里的图书不显示书名怎么办 苹果6s锁屏密码忘了怎么办 父亲去世后妈将父亲存款带走怎么办 狗和别的狗打架腿瘸了怎么办 神经病砍人警察不积极处理怎么办 才买了车里面的气味很大怎么办 家里装修两年了很大的木味怎么办 装修一年的房子夏天味很大怎么办 死了怕下地狱活着又受煎熬怎么办 狗狗的疫苗证丢了怎么办 剃了毛的狗不睡觉怎么办 家里的小狗送人了孩子一直哭怎么办 半个月的小狗一天没拉屎怎么办 把狗狗的毛剃了怎么办 用了维a酸乳膏过敏怎么办 药水点痣留下的红印怎么办 小孩牙齿被虫子吃了个洞怎么办 一岁宝宝贫血值是84怎么办 荒岛求生手机版被困在石室里怎么办 工伤认定期间被厂里辞退工资怎么办 怀孕50天看恐怖片肚子阴痛怎么办 欧卡二进游戏就卡画面了怎么办 魅族手机的微信图标找不到了怎么办 金立手机:微信图标找不到怎么办? 鞋厂装跟机老是卡钉怎么办 苹果手机摔了一下开不了机怎么办 百度网盘解析的种子保存不了怎么办 下载了种子百度网盘解析不了怎么办