文章目录
(一)梯度下降(Gradient Descent)
梯度下降是一个用来求函数最小值的算法。我们将使用梯度下降算法来求出代价函数 J ( θ 0 , θ 1 ) J(\theta_{0}, \theta_{1}) J(θ0,θ1) 的最小值
即你有一个代价函数集,你要寻找最合适的参数使得这个代价函数最小!
梯度下降算法,可以用来最小化任何代价函数。
具体步骤:
- 随机选择一个参数组合 ( θ 0 , θ 1 , . . . . . . , θ n ) \left( {\theta_{0}},{\theta_{1}},......,{\theta_{n}}\right) (θ0,θ1,......,θn),这里是随机选择 ( θ 0 , θ 1 ) \left( {\theta_{0}},{\theta_{1}} \right) (θ0,θ1)
- 计算代价函数
- 通过不断改变 ( θ 0 , θ 1 ) \left({\theta_{0}},{\theta_{1}} \right) (θ0,θ1)的值,来使代价函数 J ( θ 0 , θ 1 ) J(\theta_{0}, \theta_{1}) J(θ0,θ1)不断减小,直到找到最小值(最优解),一般只能找到局部最小值(local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值(global minimum)。选择不同的初始参数组合,可能会找到不同的局部最小值。
重复这个步骤,直到收敛(repeat until convergence) {
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
)
{\theta_{j}}:={\theta_{j}}-\alpha \frac{\partial }{\partial {\theta_{j}}}J\left(\theta \right)
θj:=θj−α∂θj∂J(θ)(这就是梯度下降法的更新规则,即不断更新参数的值)
α
\alpha
α被称为学习率,用来控制梯度下降时,我们迈出多大的步子,
α
\alpha
α始终大于0
}
注意:
θ
j
{\theta_{j}}
θj代表的是第
j
j
j个参数
正确更新步骤应该同时更新参数:
t
e
m
p
0
:
=
θ
0
−
α
∂
∂
θ
0
J
(
θ
0
,
θ
1
)
{temp0}:={\theta_{0}}-\alpha \frac{\partial }{\partial {\theta_{0}}}J(\theta_{0}, \theta_{1})
temp0:=θ0−α∂θ0∂J(θ0,θ1)
t
e
m
p
1
:
=
θ
1
−
α
∂
∂
θ
1
J
(
θ
0
,
θ
1
)
{temp1}:={\theta_{1}}-\alpha \frac{\partial }{\partial {\theta_{1}}}J(\theta_{0}, \theta_{1})
temp1:=θ1−α∂θ1∂J(θ0,θ1)
θ
0
:
=
t
e
m
p
0
{\theta_{0}}:={temp0}
θ0:=temp0
θ
1
:
=
t
e
m
p
1
{\theta_{1}}:={temp1}
θ1:=temp1
注意:temp0和temp1的计算要在下面两个赋值操作之前,不然就会造成参数更新不同步的错误。
(1)梯度下降参数的更新过程
以更新
θ
1
{\theta_{1}}
θ1为例:
θ
1
:
=
θ
1
−
α
∂
∂
θ
1
J
(
θ
1
)
{\theta_{1}}:={\theta_{1}}-\alpha \frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right)
θ1:=θ1−α∂θ1∂J(θ1),其中
α
\alpha
α始终是大于0的。
在上图中,右边的点
(
θ
1
,
J
(
θ
1
)
)
(\theta_{1},J(\theta_{1}))
(θ1,J(θ1))的切线斜率为
∂
∂
θ
1
J
(
θ
1
)
\frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right)
∂θ1∂J(θ1),即对代价函数
J
(
θ
0
,
θ
1
)
J(\theta_{0},\theta_{1})
J(θ0,θ1)求
θ
1
\theta_{1}
θ1的偏导。因为切线斜率大于0,即
∂
∂
θ
1
J
(
θ
1
)
\frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right)
∂θ1∂J(θ1)>0,所以
α
∂
∂
θ
1
J
(
θ
1
)
\alpha \frac{\partial }{\partial{\theta_{1}}}J\left(\theta_{1} \right)
α∂θ1∂J(θ1)>0,所以
θ
1
:
=
θ
1
−
α
∂
∂
θ
1
J
(
θ
1
)
{\theta_{1}}:={\theta_{1}}-\alpha \frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right)
θ1:=θ1−α∂θ1∂J(θ1)会减小,即
θ
1
\theta_{1}
θ1往左边方向移动,而这个点
(
θ
1
,
J
(
θ
1
)
)
(\theta_{1},J(\theta_{1}))
(θ1,J(θ1))也会如上图蓝色箭头所示那样往函数的最小值地方靠近,一直到紫色箭头所指的地方停止。因为紫色箭头所指这里的切线斜率为0,即导数为0,即
∂
∂
θ
1
J
(
θ
1
)
\frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right)
∂θ1∂J(θ1)为0,所以
θ
1
:
=
θ
1
−
α
∂
∂
θ
1
J
(
θ
1
)
{\theta_{1}}:={\theta_{1}}-\alpha \frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right)
θ1:=θ1−α∂θ1∂J(θ1)最终变为
θ
1
:
=
θ
1
−
0
{\theta_{1}}:={\theta_{1}}-0
θ1:=θ1−0,此时
θ
1
\theta_{1}
θ1不会再发生变化。
在上图中,左边的点
(
θ
1
,
J
(
θ
1
)
)
(\theta_{1},J(\theta_{1}))
(θ1,J(θ1))的切线斜率为
∂
∂
θ
1
J
(
θ
1
)
\frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right)
∂θ1∂J(θ1),即对代价函数
J
(
θ
0
,
θ
1
)
J(\theta_{0},\theta_{1})
J(θ0,θ1)求
θ
1
\theta_{1}
θ1的偏导。因为切线斜率小于0,即
∂
∂
θ
1
J
(
θ
1
)
\frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right)
∂θ1∂J(θ1)<0,所以
α
∂
∂
θ
1
J
(
θ
1
)
\alpha \frac{\partial }{\partial{\theta_{1}}}J\left(\theta_{1} \right)
α∂θ1∂J(θ1)<0,所以
θ
1
:
=
θ
1
−
α
∂
∂
θ
1
J
(
θ
1
)
{\theta_{1}}:={\theta_{1}}-\alpha \frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right)
θ1:=θ1−α∂θ1∂J(θ1)会变大,即
θ
1
\theta_{1}
θ1往右边方向移动,而这个点
(
θ
1
,
J
(
θ
1
)
)
(\theta_{1},J(\theta_{1}))
(θ1,J(θ1))也会如上图蓝色箭头所示那样往函数的最小值地方靠近,一直到紫色箭头所指的地方停止。因为紫色箭头所指这里的切线斜率为0,即导数为0,即
∂
∂
θ
1
J
(
θ
1
)
\frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right)
∂θ1∂J(θ1)为0,所以
θ
1
:
=
θ
1
−
α
∂
∂
θ
1
J
(
θ
1
)
{\theta_{1}}:={\theta_{1}}-\alpha \frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right)
θ1:=θ1−α∂θ1∂J(θ1)最终变为
θ
1
:
=
θ
1
−
0
{\theta_{1}}:={\theta_{1}}-0
θ1:=θ1−0,此时
θ
1
\theta_{1}
θ1不会再发生变化。
(2)关于学习率的那点事
α \alpha α被称为学习率,用来控制梯度下降时,我们迈出多大的步子,
2.1学习率大小的问题
如图所示
如果 α \alpha α太小了,即学习速率太小,可能会很慢,因为它会一点点挪动,它会需要很多步才能到达全局最低点。通俗地讲,如果 α \alpha α太小你的程序需要运行很久!
如果 α \alpha α太大,那么梯度下降法可能会越过最低点,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远,导致无法收敛,甚至发散,如右图所示。
2.2在梯度下降算法中的学习率 α \alpha α需不需要改变?
在梯度下降法中,当我们接近局部最低点时,梯度下降法会自动采取更小的幅度,这是因为当我们接近局部最低点时,很显然在局部最低时导数等于零,所以当我们接近局部最低时,导数值会自动变得越来越小(因为越靠近局部最低点时,切线斜率就越小,即 ∂ ∂ θ 1 J ( θ 1 ) \frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right) ∂θ1∂J(θ1)会越来越小,所以 α ∂ ∂ θ 1 J ( θ 1 ) \alpha \frac{\partial }{\partial {\theta_{1}}}J\left(\theta_{1} \right) α∂θ1∂J(θ1)会越来越小),所以梯度下降将自动采取较小的幅度,这就是梯度下降的做法。所以实际上没有必要再另外减小 α \alpha α