梯度下降法

来源:互联网 发布:linux文件重命名rename 编辑:程序博客网 时间:2024/05/22 17:32

微笑本文是作者阅读博客整理所得,感谢原文作者

一、梯度gradient

http://zh.wikipedia.org/wiki/%E6%A2%AF%E5%BA%A6

在标量场f中的一点处存在一个矢量G,该矢量方向为f在该点处变化率最大的方向,其模也等于这个最大变化率的数值,则矢量G称为标量场f的梯度。

在向量微积分中,标量场的梯度是一个向量场。

标量场中某一点上的梯度指向标量场增长最快的方向,梯度的长度是这个最大的变化率。

更严格的说,从欧氏空间Rn到R的函数的梯度是在Rn某一点最佳的线性近似。在这个意义上,梯度是雅戈比矩阵的一个特殊情况。

在单变量的实值函数的情况,梯度只是导数,或者,对于一个线性函数,也就是线的斜率。

梯度一词有时用于斜度,也就是一个曲面沿着给定方向的倾斜程度。

一个标量函数\varphi的梯度记为:\nabla \varphi 或 \rm grad \varphi, 其中\nabla(nabla)表示矢量微分算子。

 

二、梯度下降法

http://zh.wikipedia.org/wiki/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95

梯度下降法,基于这样的观察:

如果实值函数 F(\mathbf{x}) 在点 \mathbf{a} 处可微且有定义,那么函数 F(\mathbf{x})在 \mathbf{a} 点沿着梯度相反的方向 -\nabla F(\mathbf{a}) 下降最快。因而,如果

\mathbf{b}=\mathbf{a}-\gamma\nabla F(\mathbf{a})

对于 \gamma>0 为一个够小数值时成立,那么 F(\mathbf{a})\geq F(\mathbf{b})

\mathbf{a} 是向量。

考虑到这一点,我们可以从函数 F 的局部极小值的初始估计 \mathbf{x}_0 出发,并考虑如下序列 \mathbf{x}_0, \mathbf{x}_1, \mathbf{x}_2, \dots 使得

\mathbf{x}_{n+1}=\mathbf{x}_n-\gamma_n \nabla F(\mathbf{x}_n),\ n \ge 0.

因此可得到

F(\mathbf{x}_0)\ge F(\mathbf{x}_1)\ge F(\mathbf{x}_2)\ge \cdots,

如果顺利的话序列 (\mathbf{x}_n) 收敛到期望的极值。注意每次迭代步长 \gamma 可以改变。

 

梯度下降法的缺点是:

  • 靠近极小值时速度减慢。
  • 直线搜索可能会产生一些问题。
  • 可能会'之字型'地下降。

 

三、随机梯度下降法stochastic gradient descent,也叫增量梯度下降

由于梯度下降法收敛速度慢,而随机梯度下降法会快很多

–根据某个单独样例的误差增量计算权值更新,得到近似的梯度下降搜索(随机取一个样例)

–可以看作为每个单独的训练样例定义不同的误差函数

–在迭代所有训练样例时,这些权值更新的序列给出了对于原来误差函数的梯度下降的一个合理近似

–通过使下降速率的值足够小,可以使随机梯度下降以任意程度接近于真实梯度下降

•标准梯度下降和随机梯度下降之间的关键区别

–标准梯度下降是在权值更新前对所有样例汇总误差,而随机梯度下降的权值是通过考查某个训练样例来更新的

–在标准梯度下降中,权值更新的每一步对多个样例求和,需要更多的计算

–标准梯度下降,由于使用真正的梯度,标准梯度下降对于每一次权值更新经常使用比随机梯度下降大的步长

–如果标准误差曲面有多个局部极小值,随机梯度下降有时可能避免陷入这些局部极小值中

刚刚看完斯坦福大学机器学习第四讲(牛顿法),也对学习过程做一次总结吧。

一、误差准则函数与随机梯度下降:

数学一点将就是,对于给定的一个点集(X,Y),找到一条曲线或者曲面,对其进行拟合之。同时称X中的变量为特征(Feature),Y值为预测值。

如图:


一个典型的机器学习的过程,首先给出一组输入数据X,我们的算法会通过一系列的过程得到一个估计的函数,这个函数有能力对没有见过的新数据给出一个新的估计Y,也被称为构建一个模型。

我们用X1、X2...Xn 去描述feature里面的分量,用Y来描述我们的估计,得到一下模型:


我们需要一种机制去评价这个模型对数据的描述到底够不够准确,而采集的数据x、y通常来说是存在误差的(多数情况下误差服从高斯分布),于是,自然的,引入误差函数:


关键的一点是如何调整theta值,使误差函数J最小化。J函数构成一个曲面或者曲线,我们的目的是找到该曲面的最低点:


假设随机站在该曲面的一点,要以最快的速度到达最低点,我们当然会沿着坡度最大的方向往下走(梯度的反方向)

用数学描述就是一个求偏导数的过程:


这样,参数theta的更新过程描述为以下:

   (α表示算法的学习速率)

二、算法实现与测试:

通过一组数据拟合 y = theta1*x1 +theta2*x2

[python] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. #Python 3.3.5  
  2. # matrix_A  训练集  
  3. matrix_A = [[1,4], [2,5], [5,1], [4,2]]  
  4. Matrix_y = [19,26,19,20]  
  5. theta = [2,5]  
  6. #学习速率  
  7. leraing_rate = 0.005  
  8. loss = 50  
  9. iters = 1  
  10. Eps = 0.0001  
  11. while loss>Eps and iters <1000 :  
  12.     loss = 0  
  13.     for i in range(3) :  
  14.         h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]   
  15.         theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]  
  16.         theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]  
  17.     for i in range(3) :  
  18.         Error = 0  
  19.         Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]  
  20.         Error = Error*Error  
  21.         loss = loss +Error  
  22.     iters = iters +1  
  23. print ('theta=',theta)  
  24. print ('iters=',iters)  
求解结果:
[python] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. >>>   
  2. theta= [2.99809592161579454.001522800837675]  
  3. iters= 75  
但如果对输入数据添加一些噪声

[python] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. matrix_A = [[1.05,4], [2.1,5], [5,1], [4,2]]  
求解结果为:

[python] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. >>>   
  2. theta= [3.00959506851977253.944718521027671]  
  3. iters= 1000  
可见在有噪声的情况下,要及时调整模型误差精度、迭代次数上限,一期达到我们的需求。


1 0
原创粉丝点击