第一次看见随机梯度上升算法是看《机器学习实战》这本书,当时也是一知半解,只是大概知道和高等数学中的函数求导有一定的关系。下边我们就好好研究下随机梯度上升(下降)和梯度上升(下降)。
设导数 y = f(x) 在 x0 的某个邻域内有定义,当自变量从 x0 变成
关于导数的说明
1)点导数是因变量在 x0 处的变化率,它反映了因变量随自变量的变化而变化的快慢成都
2)如果函数y = f(x)在开区间 I 内的每点都可导,就称f(x)在开区间 I 内可导
3)对于任一 x 属于 I ,都对应着函数f(x)的一个导数,这个函数叫做原来函数f(x)的导函数
4)导函数在x1 处 为 0,若 x<1 时,f’(x) > 0 ,这 f(x) 递增,若f’(x)<0 ,f(x)递减
5)f’(x0) 表示曲线y=f(x)在点 (x0,f( x0 ))处的切线斜率
函数z=f(x,y)在点(x0,y0)的某一邻域内有定义,当y固定在y0而x在 x0 处有增量 Δx 时,相应的有函数增量
如果函数z=f(x,y)在区域D内任一点(x,y)处对x的偏导数都存在,那么这个偏导数就是x,y的函数,它就称为函数z=f(x,y)对自变量x的偏导数,记做
偏导数的概念可以推广到二元以上的函数,如 u = f(x,y,z)在x,y,z处
区别:
导数指的是一元函数中,函数y=f(x)某一点沿x轴正方向的的变化率;
偏导数指的是多元函数中,函数y=f(x,y,z)在某一点沿某一坐标轴正方向的变化率。
偏导数的几何意义:
1:偏导数 z=fx(x0,y0) 表示的是曲面被 y=y0 所截得的曲线在点M处的切线 M0Tx 对x轴的斜率
2:偏导数 z=fy(x0,y0) 表示的是曲面被 x=x0 所截得的曲线在点M处的切线 M0Ty 对y轴的斜率
例子:
求 z=x2+3xy+y2 在点(1,2)处的偏导数。
通俗的解释是: 我们不仅要知道函数在坐标轴正方向上的变化率(即偏导数),而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率。
与方向导数有一定的关联,在微积分里面,对多元函数的参数求 ∂ 偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是 (∂f∂x,∂f∂y)T ,简称grad f(x,y)或者 ▽f(x,y) 。对于在点 (x0,y0) 的具体梯度向量就是 (∂f∂x0,∂f∂y0)T .或者 ▽f(x0,y0) ,如果是3个参数的向量梯度,就是 (∂f∂x,∂f∂y,∂f∂z)T ,以此类推。
那么这个梯度向量求出来有什么意义呢?他的意义从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数f(x,y),在点 (x0,y0) ,沿着梯度向量的方向就是 (∂f∂x0,∂f∂y0)T 的方向是f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是 −(∂f∂x0,∂f∂y0)T 的方向,梯度减少最快,也就是更加容易找到函数的最小值。
例如:
函数 f(x,y)=1x2+y2 ,分别对x,y求偏导数得:
注意点:
1)梯度是一个向量
2)梯度的方向是最大方向导数的方向
3)梯度的值是最大方向导数的值
在机器学习算法中,在最小化损失函数时,可以通过梯度下降思想来求得最小化的损失函数和对应的参数值,反过来,如果要求最大化的损失函数,可以通过梯度上升思想来求取。
1)步长(learning rate):步长决定了在梯度下降迭代过程中,每一步沿梯度负方向前进的长度
2)特征(feature):指的是样本中输入部门,比如样本(x0,y0),(x1,y1),则样本特征为x,样本输出为y
3)假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为 hθ(x) 。比如对于样本 (xi,yi)(i=1,2,...n) ,可以采用拟合函数如下: hθ(x)=θ0+θ1x 。
4)损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于样本(xi,yi)(i=1,2,…n),采用线性回归,损失函数为:
先决条件:确定优化模型的假设函数和损失函数
这里假定线性回归的假设函数为 hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn ,其中 θi(i=0,1,2...n) 为模型参数(公式中用 θ 代替), xi(i=0,1,2...n) 为每个样本的n个特征值。
则对应选定得损失函数为:
算法相关参数的初始化
主要是初始化 θ0,θ1...,θn ,算法终止距离 ε 以及步长 α 。在没有任何先验知识的时候,我喜欢将所有的 θ 初始化为0, 将步长初始化为1。在调优的时候再优化。
算法过程
1):确定当前损失函数的梯度,对于 θi ,其梯度表达式为:
2):用步长乘以损失函数的梯度,得到当前位置的下降距离,即
3):确定是否所有的 θi ,梯度下降的距离都小于 ε ,如果小于 ε ,则算法停止,当前所有的 θi(i=1,2,3,...,n) 即为最终结果。否则执行下一步。
4):更新所有的 θ ,对于 θi ,其更新表达式如下。更新完毕后继续转入步骤1)。
2.算法相关参数初始化:
θ 向量可以初始化为默认值,或者调优后的值。算法终止距离 ε ,步长 α 和 “梯度下降的代数方法”描述中一致。
3.算法过程
梯度上升和梯度下降的分析方式是一致的,只不过把 θ 的更新中 减号变为加号。
算法的步长选择。在前面的算法描述中,我提到取步长为1,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。
算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。
3.归一化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的均值 x¯ 和标准差std(x),然后转化为:
参考资料:
http://blog.csdn.net/walilk/article/details/50978864
https://www.zhihu.com/question/24658302
https://www.cnblogs.com/pinard/p/5970503.html
http://www.doc88.com/p-7844239247737.html