转载请注明出处: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
Δx→0 平均变化率的极限
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 }
Δx→0limΔxΔy=Δx→0limΔ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}
Δx→0limΔ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),
∂x∂z,∂x∂f,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)=Δx→0limΔ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)=Δy→0limΔ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)=Δz→0limΔ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
∂x∂z=2x+3y
∂
z
∂
y
=
2
y
+
3
x
\frac{ \partial z}{\partial y} = 2y +3x
∂y∂z=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 }
∂l∂f(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 (∂x∂f,∂y∂f)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 (∂x0∂f,∂y0∂f)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 (∂x∂f,∂y∂f,∂z∂f)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 (∂x0∂f,∂y0∂f)T的方向是f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是 − ( ∂ f ∂ x 0 , ∂ f ∂ y 0 ) T -( \frac{ \partial f }{ \partial x_0 },\frac{ \partial f }{ \partial y_0 })^T −(∂x0∂f,∂y0∂f)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}
∂x∂f=−(x2+y2)22x
∂
f
∂
y
=
−
2
y
(
x
2
+
y
2
)
2
\frac{ \partial f }{ \partial y}=-\frac{2y}{ (x^2+y^2)^2}
∂y∂f=−(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=0∑m(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) 为假设函数。
梯度下降的代数方法描述
-
先决条件:确定优化模型的假设函数和损失函数
这里假定线性回归的假设函数为 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=0∑m(hθ(x0,x1,...,xn)−yi)2 -
算法相关参数的初始化
主要是初始化 θ 0 , θ 1 . . . , θ n \theta _0,\theta _1...,\theta _n θ0,θ1...,θn,算法终止距离 ε \varepsilon ε 以及步长 α \alpha α。在没有任何先验知识的时候,我喜欢将所有的 θ \theta θ 初始化为0, 将步长初始化为1。在调优的时候再优化。 -
算法过程
-
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)
梯度下降的矩阵方式描述
- 先决条件:确定优化模型的假设函数和损失函数
这里假定线性回归的假设函数为 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,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。
-
算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。
3.归一化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的均值
x
ˉ
\bar{x}
xˉ 和标准差std(x),然后转化为:
x
−
x
ˉ
s
t
d
(
x
)
\frac{x - \bar{x}}{std(x)}
std(x)x−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

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