梯度下降(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并不是每次迭代都向着整体最优化方向。
一、梯度gradient
http://zh.wikipedia.org/wiki/%E6%A2%AF%E5%BA%A6
在标量场f中的一点处存在一个矢量G,该矢量方向为f在该点处变化率最大的方向,其模也等于这个最大变化率的数值,则矢量G称为标量场f的梯度。
在向量微积分 中,标量场 的梯度是一个向量场 。
标量场中某一点上的梯度指向标量场增长最快的方向,梯度的长度是这个最大的变化率。
更严格的说,从欧氏空间Rn到R的函数的梯度是在Rn某一点最佳的线性近似。在这个意义上,梯度是雅戈比矩阵的一个特殊情况。
在单变量的实值函数 的情况,梯度只是导数 ,或者,对于一个线性函数 ,也就是线的斜率 。
梯度一词有时用于斜度 ,也就是一个曲面 沿着给定方向的倾斜程度。
一个标量函数的梯度记为: 或 , 其中(nabla )表示矢量微分算子 。
二、梯度下降法
http://zh.wikipedia.org/wiki/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95
梯度下降法,基于这样的观察:
如果实值函数 在点 处可微 且有定义,那么函数 在 点沿着梯度 相反的方向 下降最快。因而,如果
对于 为一个够小数值时成立,那么 。
是向量。
考虑到这一点,我们可以从函数 的局部极小值的初始估计 出发,并考虑如下序列 使得
因此可得到
如果顺利的话序列 收敛到期望的极值。注意每次迭代步长 可以改变。
梯度下降法的缺点是:
靠近极小值时速度减慢。
直线搜索可能会产生一些问题。
可能会'之字型'地下降。
三、随机梯度下降法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 ?
#Python 3.3.5
# matrix_A 训练集
matrix_A = [[1,4], [2,5], [5,1], [4,2]]
Matrix_y = [19,26,19,20]
theta = [2,5]
#学习速率
leraing_rate = 0.005
loss = 50
iters = 1
Eps = 0.0001
while loss>Eps and iters <1000 :
loss = 0
for i in range(3) :
h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]
theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]
theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]
for i in range(3) :
Error = 0
Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]
Error = Error*Error
loss = loss +Error
iters = iters +1
print ('theta=',theta)
print ('iters=',iters)
求解结果:
>>>
theta= [2.9980959216157945, 4.001522800837675]
iters= 75
但如果对输入数据添加一些噪声
matrix_A = [[1.05,4], [2.1,5], [5,1], [4,2]]
求解结果为:
>>>
theta= [3.0095950685197725, 3.944718521027671]
iters= 1000
可见在有噪声的情况下,要及时调整模型误差精度、迭代次数上限,一期达到我们的需求。