第一次看见随机梯度上升算法是看《机器学习实战》这本书,当时也是一知半解,只是大概知道和高等数学中的函数求导有一定的关系。下边我们就好好研究下随机梯度上升(下降)和梯度上升(下降)。

高数中的导数

设导数 y = f(x) 在 $ x_0 $的某个邻域内有定义,当自变量从 $ x_0 $ 变成

函数y=f(x)的增量

与自变量的增量 $ \Delta x $ 之比:

称为f(x)的平均变化率。
如 $ \Delta x \rightarrow 0 $ 平均变化率的极限

存在,则称极限值为f(x)在$ x_0 $ 处的导数,并说f(x)在$ x_0 $ 处可导或有导数。当平均变化率极限不存在时,就说f(x)在 $ x_0 $ 处不可导或没有导数。

关于导数的说明

1)点导数是因变量在$ x_0 $ 处的变化率,它反映了因变量随自变量的变化而变化的快慢成都

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($x_0$))处的切线斜率

偏导数

函数z=f(x,y)在点(x0,y0)的某一邻域内有定义,当y固定在y0而x在 $x_0$ 处有增量$ \Delta x $ 时,相应的有函数增量

如果

存在,则称z=f(x,y)在点($x_0$,$y_0$)处对x的偏导数,记为:$ f_x(x_0,y_0) $

如果函数z=f(x,y)在区域D内任一点(x,y)处对x的偏导数都存在,那么这个偏导数就是x,y的函数,它就称为函数z=f(x,y)对自变量x的偏导数,记做

偏导数的概念可以推广到二元以上的函数,如 u = f(x,y,z)在x,y,z处

可以看出导数与偏导数本质是一致的,都是自变量趋近于0时,函数值的变化与自变量的变化量比值的极限,直观的说,偏导数也就是函数在某一点沿坐标轴正方向的变化率。

区别:
导数指的是一元函数中,函数y=f(x)某一点沿x轴正方向的的变化率;
偏导数指的是多元函数中,函数y=f(x,y,z)在某一点沿某一坐标轴正方向的变化率。

偏导数的几何意义:
偏导数$ z = f_x(x_0,y_0)$表示的是曲面被 $ y=y_0 $ 所截得的曲线在点M处的切线$ M_0T_x $对x轴的斜率
偏导数$ z = f_y(x_0,y_0)$表示的是曲面被 $ x=x_0 $ 所截得的曲线在点M处的切线$ M_0T_y $对y轴的斜率

例子:
求 $z = x^2 + 3 xy+y^2 $在点(1,2)处的偏导数。

所以:
$z_x(x=1,y=2) = 8$
$z_y(x=1,y=2) = 7$

方向导数

前边导数和偏导数的定义中,均是沿坐标轴正方向讨论函数的变化率。那么当讨论函数沿任意方向的变化率时,也就引出了方向导数的定义,即:某一点在某一趋近方向上的导数值。

通俗的解释是: 我们不仅要知道函数在坐标轴正方向上的变化率(即偏导数),而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率。  

梯度

与方向导数有一定的关联,在微积分里面,对多元函数的参数求 $ \partial $ 偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是 $
( \frac{ \partial f }{ \partial x },\frac{ \partial f }{ \partial y })^T
$ ,简称grad f(x,y)或者 $▽f(x,y)$。对于在点$(x_0,y_0)$的具体梯度向量就是$( \frac{ \partial f }{ \partial x_0 },\frac{ \partial f }{ \partial y_0 })^T$.或者$▽f(x_0,y_0)$,如果是3个参数的向量梯度,就是 $( \frac{ \partial f }{ \partial x },\frac{ \partial f }{ \partial y },\frac{ \partial f }{ \partial z })^T$,以此类推。

那么这个梯度向量求出来有什么意义呢?他的意义从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数f(x,y),在点$(x_0,y_0)$,沿着梯度向量的方向就是$( \frac{ \partial f }{ \partial x_0 },\frac{ \partial f }{ \partial y_0 })^T$的方向是f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是 $-( \frac{ \partial f }{ \partial x_0 },\frac{ \partial f }{ \partial y_0 })^T$的方向,梯度减少最快,也就是更加容易找到函数的最小值。

例如:
函数 $f(x,y) = \frac{1}{x^2+y^2} $ ,分别对x,y求偏导数得:

所以

函数在某一点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。

注意点:
1)梯度是一个向量
2)梯度的方向是最大方向导数的方向
3)梯度的值是最大方向导数的值

梯度下降与梯度上升

在机器学习算法中,在最小化损失函数时,可以通过梯度下降思想来求得最小化的损失函数和对应的参数值,反过来,如果要求最大化的损失函数,可以通过梯度上升思想来求取。

梯度下降

关于梯度下降的几个概念

1)步长(learning rate):步长决定了在梯度下降迭代过程中,每一步沿梯度负方向前进的长度
2)特征(feature):指的是样本中输入部门,比如样本(x0,y0),(x1,y1),则样本特征为x,样本输出为y
3)假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为$h_θ(x)$。比如对于样本$(x_i,y_i)(i=1,2,…n)$,可以采用拟合函数如下: $h_θ(x) = θ0+θ1_x$。
4)损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于样本(xi,yi)(i=1,2,…n),采用线性回归,损失函数为:

其中$x_i$表示样本特征x的第i个元素,$y_i$表示样本输出y的第i个元素,$h_\theta(x_i)$ 为假设函数。

梯度下降的代数方法描述

  1. 先决条件:确定优化模型的假设函数和损失函数
    这里假定线性回归的假设函数为$h_\theta(x_1,x_2,…x_n)=\theta_0+\theta_1x_1+…+\theta_nx_n$,其中 $\theta _i(i=0,1,2…n)$ 为模型参数(公式中用$\theta$代替),$x_i(i=0,1,2…n)$为每个样本的n个特征值。

    则对应选定得损失函数为:

  2. 算法相关参数的初始化
    主要是初始化 $ \theta _0,\theta _1…,\theta _n$,算法终止距离 $\varepsilon $ 以及步长 $ \alpha $。在没有任何先验知识的时候,我喜欢将所有的 $\theta$ 初始化为0, 将步长初始化为1。在调优的时候再优化。

  3. 算法过程

  • 1):确定当前损失函数的梯度,对于$\theta _i $,其梯度表达式为:

  • 2):用步长乘以损失函数的梯度,得到当前位置的下降距离,即

  • 3):确定是否所有的$\theta _i$ ,梯度下降的距离都小于 $ \varepsilon $,如果小于$ \varepsilon $,则算法停止,当前所有的 $\theta _i(i=1,2,3,…,n)$ 即为最终结果。否则执行下一步。

  • 4):更新所有的 $\theta$,对于$\theta _i $,其更新表达式如下。更新完毕后继续转入步骤1)。

    梯度下降的矩阵方式描述

    1. 先决条件:确定优化模型的假设函数和损失函数
      这里假定线性回归的假设函数为$h_\theta(x_1,x_2,…x_n)=\theta_0+\theta_1x_1+…+\theta_nx_n$,其中 $\theta _i(i=0,1,2…n)$ 为模型参数,$x_i(i=0,1,2…n)$为每个样本的n个特征值。
      假设函数对应的矩阵表示为:$ h_\theta (x) = X \theta $,假设函数 $h_\theta(x)$ 为mx1的向量,$\theta $ 为nx1的向量,里面有n个代数法的模型参数。X为mxn维的矩阵。m代表样本的个数,n代表样本的特征数。
      则对应选定得损失函数为:其中YY是样本的输出向量,维度为m*1


      2.算法相关参数初始化:
      $\theta$ 向量可以初始化为默认值,或者调优后的值。算法终止距离 $\varepsilon $ ,步长 $\alpha$ 和 “梯度下降的代数方法”描述中一致。


      3.算法过程
  • 1):确定当前位置的损失函数的梯度,对于 $ \theta $ 向量,其梯度表达式如下:

  • 2):用步长乘以损失函数的梯度,得到当前位置下降的距离,即 $\alpha \frac{ \partial }{\partial \theta } \jmath (\theta)$
  • 3):确定 $\theta$ 向量里面的每个值,梯度下降的距离都小于 $\varepsilon$,如果小于 $\varepsilon$ 则算法终止,当前 $\theta$ 向量即为最终结果。否则进入步骤4)
  • 4):更新 $\theta$ 向量,其更新表达式如下。更新完毕后继续转入步骤1)

梯度上升

梯度上升和梯度下降的分析方式是一致的,只不过把 $ \theta $ 的更新中 减号变为加号。

梯度下降的算法优化

  1. 算法的步长选择。在前面的算法描述中,我提到取步长为1,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。

  2. 算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。

3.归一化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的均值 $\bar{x}$ 和标准差std(x),然后转化为:

这样特征的新期望为0,新方差为1,迭代次数可以大大加快。


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


打开微信扫一扫,关注微信公众号【搜索与推荐Wiki】