梯度算法之梯度上升和梯度下降

转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer

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

高数中的导数

设导数 y = f(x) 在 x 0 x_0 x0的某个邻域内有定义,当自变量从 x 0 x_0 x0 变成
x 0 + Δ x x_{0} + \Delta x x0+Δx
函数y=f(x)的增量

Δ y = f ( x 0 + Δ x ) − f ( x 0 ) \Delta y = f(x_0 + \Delta x) - f(x_0) Δy=f(x0+Δx)f(x0)
与自变量的增量 Δ x \Delta x Δx 之比:

Δ y Δ x = f ( x 0 + Δ x ) − f ( x 0 ) Δ x \frac{ \Delta y }{ \Delta x } = \frac{ f(x_0 + \Delta x)-f(x_0) }{ \Delta x } ΔxΔy=Δxf(x0+Δx)f(x0)
称为f(x)的平均变化率。
Δ x → 0 \Delta x \rightarrow 0 Δx0 平均变化率的极限
lim ⁡ Δ x → 0 Δ y Δ x = lim ⁡ Δ x → 0 f ( x 0 + Δ x ) − f ( x 0 ) Δ x \lim_{\Delta x \rightarrow 0} \frac{ \Delta y }{ \Delta x } = \lim_{\Delta x \rightarrow 0} \frac{ f(x_0 + \Delta x)-f(x_0) }{ \Delta x } Δx0limΔxΔy=Δx0limΔxf(x0+Δx)f(x0)
存在,则称极限值为f(x)在 x 0 x_0 x0 处的导数,并说f(x)在 x 0 x_0 x0 处可导或有导数。当平均变化率极限不存在时,就说f(x)在 x 0 x_0 x0 处不可导或没有导数。

关于导数的说明

1)点导数是因变量在 x 0 x_0 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( x 0 x_0 x0))处的切线斜率

偏导数

函数z=f(x,y)在点(x0,y0)的某一邻域内有定义,当y固定在y0而x在 x 0 x_0 x0 处有增量 Δ x \Delta x Δx 时,相应的有函数增量
f ( x 0 + Δ x , y 0 ) − f ( x 0 , y 0 ) f(x_0 + \Delta x, y_0) - f(x_0,y_0) f(x0+Δx,y0)f(x0,y0)
如果
lim ⁡ Δ x → 0 f ( x 0 + Δ x , y 0 ) − f ( x 0 , y 0 ) Δ x \lim_{\Delta x\rightarrow 0 } \frac {f(x_0 + \Delta x, y_0) - f(x_0,y_0)}{\Delta x} Δx0limΔxf(x0+Δx,y0)f(x0,y0)
存在,则称z=f(x,y)在点( x 0 x_0 x0, y 0 y_0 y0)处对x的偏导数,记为: f x ( x 0 , y 0 ) f_x(x_0,y_0) fx(x0,y0)

如果函数z=f(x,y)在区域D内任一点(x,y)处对x的偏导数都存在,那么这个偏导数就是x,y的函数,它就称为函数z=f(x,y)对自变量x的偏导数,记做
∂ z ∂ x , ∂ f ∂ x , z x , f x ( x , y ) , \frac{ \partial z }{ \partial x } , \frac{ \partial f }{ \partial x } , z_x , f_x(x,y), xz,xf,zx,fx(x,y),

偏导数的概念可以推广到二元以上的函数,如 u = f(x,y,z)在x,y,z处
f x ( x , y , z ) = lim ⁡ Δ x → 0 f ( x + Δ x , y , z ) − f ( x , y , z ) Δ x f_x(x,y,z)=\lim_{\Delta x \rightarrow 0} \frac{f(x + \Delta x,y,z) -f(x,y,z)}{\Delta x} fx(x,y,z)=Δx0limΔxf(x+Δx,y,z)f(x,y,z)
f y ( x , y , z ) = lim ⁡ Δ y → 0 f ( x , y + Δ y , z ) − f ( x , y , z ) Δ y f_y(x,y,z)=\lim_{\Delta y \rightarrow 0} \frac{f(x,y + \Delta y,z) -f(x,y,z)}{\Delta y} fy(x,y,z)=Δy0limΔyf(x,y+Δy,z)f(x,y,z)
f z ( x , y , z ) = lim ⁡ Δ z → 0 f ( x , y , z + Δ z ) − f ( x , y , z ) Δ z f_z(x,y,z)=\lim_{\Delta z \rightarrow 0} \frac{f(x,y,z + \Delta z) -f(x,y,z)}{\Delta z} fz(x,y,z)=Δz0limΔzf(x,y,z+Δz)f(x,y,z)
可以看出导数与偏导数本质是一致的,都是自变量趋近于0时,函数值的变化与自变量的变化量比值的极限,直观的说,偏导数也就是函数在某一点沿坐标轴正方向的变化率。

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

偏导数的几何意义:
1:偏导数 z = f x ( x 0 , y 0 ) z = f_x(x_0,y_0) z=fx(x0,y0)表示的是曲面被 y = y 0 y=y_0 y=y0 所截得的曲线在点M处的切线 M 0 T x M_0T_x M0Tx对x轴的斜率

2:偏导数 z = f y ( x 0 , y 0 ) z = f_y(x_0,y_0) z=fy(x0,y0)表示的是曲面被 x = x 0 x=x_0 x=x0 所截得的曲线在点M处的切线 M 0 T y M_0T_y M0Ty对y轴的斜率

例子:
z = x 2 + 3 x y + y 2 z = x^2 + 3 xy+y^2 z=x2+3xy+y2在点(1,2)处的偏导数。
∂ z ∂ x = 2 x + 3 y \frac{ \partial z}{\partial x} = 2x +3y xz=2x+3y
∂ z ∂ y = 2 y + 3 x \frac{ \partial z}{\partial y} = 2y +3x yz=2y+3x
所以:
z x ( x = 1 , y = 2 ) = 8 z_x(x=1,y=2) = 8 zx(x=1,y=2)=8
z y ( x = 1 , y = 2 ) = 7 z_y(x=1,y=2) = 7 zy(x=1,y=2)=7

方向导数

∂ ∂ l f ( x 0 , x 1 , . . . , x n ) = lim ⁡ ρ → 0 Δ y Δ x = lim ⁡ ρ → 0 f ( x 0 + Δ x 0 , . . . , x j + Δ x j , . . . , x n + Δ x n ) − f ( x 0 , . . . , x j , . . . , x n ) ρ \frac{ \partial }{ \partial l } f(x_0,x_1,...,x_n) = \lim_{\rho \rightarrow 0} \frac{\Delta y}{ \Delta x } = \lim_{\rho \rightarrow 0} \frac{ f(x_0 + \Delta x_0,...,x_j + \Delta x_j,...,x_n + \Delta x_n)-f(x_0,...,x_j,...,x_n)}{ \rho } lf(x0,x1,...,xn)=ρ0limΔxΔy=ρ0limρf(x0+Δx0,...,xj+Δxj,...,xn+Δxn)f(x0,...,xj,...,xn)
ρ = ( Δ x 0 ) 2 + . . . + ( Δ x j ) 2 + . . . + ( Δ x n ) 2 \rho = \sqrt{ (\Delta x_0)^{2} +...+(\Delta x_j)^{2}+...+(\Delta x_n)^{2}} ρ=(Δx0)2+...+(Δxj)2+...+(Δxn)2
前边导数和偏导数的定义中,均是沿坐标轴正方向讨论函数的变化率。那么当讨论函数沿任意方向的变化率时,也就引出了方向导数的定义,即:某一点在某一趋近方向上的导数值。

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

梯度

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

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

例如:
函数 $f(x,y) = \frac{1}{x2+y2} $ ,分别对x,y求偏导数得:
∂ f ∂ x = − 2 x ( x 2 + y 2 ) 2 \frac{ \partial f }{ \partial x}=-\frac{2x}{ (x^2+y^2)^2} xf=(x2+y2)22x
∂ f ∂ y = − 2 y ( x 2 + y 2 ) 2 \frac{ \partial f }{ \partial y}=-\frac{2y}{ (x^2+y^2)^2} yf=(x2+y2)22y
所以
g r a d ( 1 x 2 + y 2 ) = ( − 2 x ( x 2 + y 2 ) 2 , − 2 y ( x 2 + y 2 ) 2 ) grad( \frac{1}{x^2+y^2} ) = (-\frac{2x}{ (x^2+y^2)^2} ,-\frac{2y}{ (x^2+y^2)^2}) grad(x2+y21)=((x2+y2)22x,(x2+y2)22y)
函数在某一点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。

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

梯度下降与梯度上升

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

梯度下降

关于梯度下降的几个概念

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

梯度下降的代数方法描述

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

    则对应选定得损失函数为:
    ȷ ( θ 0 , θ 1 , . . . , , θ n ) = ∑ i = 0 m ( h θ ( x 0 , x 1 , . . . , x n ) − y i ) 2 \jmath (\theta _0,\theta _1,...,,\theta _n)=\sum_{i=0}^{m}( h_\theta(x_0,x_1,...,x_n)-y_i )^2 ȷ(θ0,θ1,...,,θn)=i=0m(hθ(x0,x1,...,xn)yi)2

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

  3. 算法过程

  • 1):确定当前损失函数的梯度,对于 θ i \theta _i θi,其梯度表达式为:
    ∂ ∂ θ i ȷ ( θ 1 , θ 2 , . . . , θ n ) \frac{\partial }{\partial \theta _i}\jmath (\theta _1,\theta _2,...,\theta _n) θiȷ(θ1,θ2,...,θn)

  • 2):用步长乘以损失函数的梯度,得到当前位置的下降距离,即
    α ∂ ȷ ( θ 1 , θ 2 , . . . , θ n ) ∂ θ i \alpha \frac{\partial \jmath (\theta _1,\theta _2,...,\theta _n)}{\partial \theta _i} αθiȷ(θ1,θ2,...,θn)

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

  • 4):更新所有的 θ \theta θ,对于 θ i \theta _i θi,其更新表达式如下。更新完毕后继续转入步骤1)。
    θ i = θ i − α ∂ ȷ ( θ 1 , θ 2 , . . . , θ n ) ∂ θ i \theta _i = \theta _i - \alpha \frac{\partial \jmath (\theta _1,\theta _2,...,\theta _n)}{\partial \theta _i} θi=θiαθiȷ(θ1,θ2,...,θn)

梯度下降的矩阵方式描述

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

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

3.算法过程

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

梯度上升

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

梯度下降的算法优化

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

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

3.归一化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的均值 x ˉ \bar{x} xˉ 和标准差std(x),然后转化为:
x − x ˉ s t d ( x ) \frac{x - \bar{x}}{std(x)} std(x)xxˉ
这样特征的新期望为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


【技术服务】,详情点击查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

扫一扫 关注微信公众号!号主 专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!


  • 21
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值