在https://blog.csdn.net/hxx123520/article/details/104183577这个链接中已经详细推导了线性损失函数函数的由来以及使用梯度下降和矩阵式求解求得 θ \theta θ使得损失函数最小。这个链接只是单纯了介绍了梯度下降和矩阵式求解的方法。今天在详细的介绍一下线性损失函数使用梯度下降的整体流程以及引入正则化。
首先先介绍两个概念:梯度下降法和梯度下降思想。
梯度下降算法是一种通过迭代计算来不断逼近目标函数的局部最优解的优化算法。当目标函数是凸函数(MSE就是一个凸函数)时,局部最优解就是全局最优解,在机器学习中目标函数就是损失函数。
梯度下降的思想很简单,假设你一觉醒来发现自己身处某一座山的山顶,你想要下山,采用梯度下降的思想,你首先确定了你要去的方向,找到这个方向上的最佳下山方向,向下走了一小段。然后你休息一下,顺便找到了接下来最佳的下山方向…一直重复执行这个操作,直到你顺利到达山脚。但是可能一开始你并不知道你在山顶的那个地方,可能是左边的红圈,也可能是右边的红圈。很显然,他们到达的山脚是不同的,所以这些“山脚”其实就是一个个 局部最优解(local minimum) ,你选择的方向不同,就会得到不同的局部最优解。而你并不能确定到底哪个才是我们需要的全局最优解(global minimum) 。
而对于凸函数,例如线性回归的均方误差损失函数,无论选取如何的初始点,你到达的“山脚”都会到最低的那个地方。即最终都会收敛到相同的最小值。
在实际的计算中,“梯度”就是下山的方向,是函数在当前点的偏导数组成的向量。沿着梯度方向函数数值增长最快,沿着梯度相反方向函数下降最快。
接下来我们来看线性损失函数:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta )=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})^{2}
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
对于某个参数每次调整的公式如下:
θ
j
:
=
θ
j
−
α
∂
∂
θ
j
J
(
θ
)
\theta _{j}:=\theta _{j}-\alpha\frac{\partial }{\partial \theta _{j}}J(\theta )
θj:=θj−α∂θj∂J(θ)
对
θ
\theta
θ 赋值,使得
J
(
θ
)
J(\theta )
J(θ)按梯度下降最快方向进行,一直迭代下去,最终得到局部最小值。其中是α(learning rate )叫做学习步长,代表下降幅度,步长,小会导致收敛慢,大会导致错过最优点。它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。
对于这个问题,求导的目的,基本上可以说取这个红点的切线,就是这样一条红色的直线,刚好与函数相切于这一点,让我们看看这条红色直线的斜率,就是这条刚好与函数曲线相切的这条直线,这条直线的斜率正好是这个三角形的高度除以这个水平长度,现在,这条线有一个正斜率,也就是说它有正导数,因此,我得到的新的
θ
1
\theta _{1}
θ1,
θ
1
\theta _{1}
θ1 更新后等于
θ
1
\theta _{1}
θ1 减去一个正数乘以
α
\alpha
α 。
假设损失函数有两个参数 θ 0 \theta _{0} θ0和 θ 1 \theta _{1} θ1
θ
0
\theta _{0}
θ0的调整公式如下:
θ
0
:
=
θ
0
−
α
∂
∂
θ
0
J
(
θ
)
\theta _{0}:=\theta _{0}-\alpha\frac{\partial }{\partial \theta _{0}}J(\theta )
θ0:=θ0−α∂θ0∂J(θ)
θ
1
\theta _{1}
θ1的调整公式如下:
θ
1
:
=
θ
1
−
α
∂
∂
θ
1
J
(
θ
)
\theta _{1}:=\theta _{1}-\alpha\frac{\partial }{\partial \theta _{1}}J(\theta )
θ1:=θ1−α∂θ1∂J(θ)
接下来求解梯度
∂
∂
θ
0
J
(
θ
)
\frac{\partial }{\partial \theta _{0}}J(\theta )
∂θ0∂J(θ)和
∂
∂
θ
1
J
(
θ
)
\frac{\partial }{\partial \theta _{1}}J(\theta )
∂θ1∂J(θ)推导过程:
训练集中只有一个样本:
上面就是当训练集只有一个样本时的
θ
0
\theta _{0}
θ0和
θ
1
\theta _{1}
θ1的梯度推导过程,进行一个整合其实就是如下公式:
∂
∂
θ
j
J
(
θ
)
=
(
h
θ
(
x
)
−
y
)
x
j
\frac{\partial }{\partial \theta_{j}}J(\theta )=(h_{\theta }(x)-y)x_{j}
∂θj∂J(θ)=(hθ(x)−y)xj
θ
0
\theta _{0}
θ0的调整如下:
θ
0
:
=
θ
0
−
α
(
h
θ
(
x
)
−
y
)
x
0
\theta _{0}:=\theta _{0}-\alpha(h_{\theta }(x)-y)x_{0}
θ0:=θ0−α(hθ(x)−y)x0
θ
1
\theta _{1}
θ1的调整如下:
θ
1
:
=
θ
1
−
α
(
h
θ
(
x
)
−
y
)
x
1
\theta _{1}:=\theta _{1}-\alpha(h_{\theta }(x)-y)x_{1}
θ1:=θ1−α(hθ(x)−y)x1
整合
θ
j
\theta _{j}
θj的调整公式如下:
θ
j
:
=
θ
j
−
α
(
h
θ
(
x
)
−
y
)
x
j
\theta _{j}:=\theta _{j}-\alpha(h_{\theta }(x)-y)x_{j}
θj:=θj−α(hθ(x)−y)xj
训练集中有m个样本:
上面就是当训练集有m个样本时的
θ
0
\theta _{0}
θ0和
θ
1
\theta _{1}
θ1的梯度推导过程,进行一个整合其实就是如下公式:
∂
∂
θ
j
J
(
θ
)
=
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\frac{\partial }{\partial \theta_{j}}J(\theta )=\frac{1}{m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}
∂θj∂J(θ)=m1i=1∑m(hθ(x(i))−y(i))xj(i)
θ
0
\theta _{0}
θ0的调整如下:
θ
0
:
=
θ
0
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
0
(
i
)
\theta _{0}:=\theta _{0}-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})x_{0}^{(i)}
θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))x0(i)
θ
1
\theta _{1}
θ1的调整如下:
θ
1
:
=
θ
1
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
1
(
i
)
\theta _{1}:=\theta _{1}-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})x_{1}^{(i)}
θ1:=θ1−αm1i=1∑m(hθ(x(i))−y(i))x1(i)
整合
θ
j
\theta _{j}
θj的调整公式如下:
θ
j
:
=
θ
j
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\theta _{j}:=\theta _{j}-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}
θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
从上面的流程可以总结具体步骤为:
1. 随机初始化
θ
0
\theta_0
θ0和
θ
1
\theta_1
θ1 ,即给一个随机的点
(
θ
0
,
θ
1
)
(\theta_0,\theta_1)
(θ0,θ1) 开始下降
2.同时减小
θ
0
,
θ
1
\theta_0 ,\theta_1
θ0,θ1,到达一个新的点。
3.循环执行第二步直至收敛。
梯度下降算法中还有一个较为重要的地方就是选择学习率
只要学习率足够小, J ( θ ) J(\theta) J(θ) 就会必然减小。但如果学习率 a 太小,梯度下降的收敛过程可能会很慢,梯度下降的迭代次数会增多。就会让算法失去意义。而学习率 a 过大,会使梯度下降的过程不断震荡,导致无法收敛。
具体情况如下:
看到这里,机智的你可能会想到,学习率大的时候下降快,小的时候下降稳,那这样,我是不是可以先选个大的学习率来让函数快速下降,然后改用小的学习率逼近收敛?实际上是不需要的,适当大的固定的学习率也可以保证收敛,因为越接近最优值时梯度越小,梯度与学习率的乘积也会越小,对x的更新也就越小。也就是说,越接近最优值,梯度下降的增量就会自动变得越小。
以上的梯度下降算法,有时也称为 批量梯度下降 ,指的是在每个单独的梯度下降中,我们都要计算微分求导项(也就是 θ 0 , θ 1 \theta_0 ,\theta_1 θ0,θ1的求导),这个项需要对所有m个训练样本求和。所以在梯度下降的每一步中,我们都用到了所有的训练样本,即“批量”的来历。
正则化
正则化就是为了解决过拟合问题,这边先简单的介绍一下正则化线性回归的推导,详细的正则化内容将在下一篇中讲解。
对于线性回归的求解,本文使用的基于梯度下降求解,线性回归的代价函数如下:
J
(
θ
)
=
1
2
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
J(\theta )=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})^{2}
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
正则化线性回归的代价函数:
J
(
θ
)
=
1
2
m
[
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
2
+
λ
∑
j
=
1
n
θ
j
2
]
J(\theta )=\frac{1}{2m}\left [ \sum_{i=1}^{m} \left ( h_{\theta }\left ( x^{(i)} \right )-y^{(i)} \right )^{2}+\lambda \sum_{j=1}^{n} \theta_{j}^{2} \right ]
J(θ)=2m1[i=1∑m(hθ(x(i))−y(i))2+λj=1∑nθj2]
可以看出,在线性损失函数中加入了正则项,正规化项中的λ称为正规化参数。
在前面列举的例子是线性代价函数m个样本
θ
0
\theta _{0}
θ0和
θ
1
\theta _{1}
θ1的推导过程,在实际情况中包含j个参数,会反复更新参数
θ
j
\theta _{j}
θj,其中j=0,1,2,3,…,n。
先把j=0的情况单独写出来:
θ
0
:
=
θ
0
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
0
(
i
)
\theta _{0}:=\theta _{0}-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})x_{0}^{(i)}
θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))x0(i)
j=(1,2,3,4…n)
θ
j
:
=
θ
j
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\theta _{j}:=\theta _{j}-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}
θj:=θj−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
对于正则化的线性回归,惩罚参数从θ1开始,不惩罚θ0。所以当修改这个正则化线性回归的算法时,将对θ0有所不同。
具体地说,如果要对这个算法进行修改,并用它求解正则化的目标函数,我们需要做的是把下面的这一项加上正则化项:
θ
0
:
=
θ
0
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
0
(
i
)
\theta _{0}:=\theta _{0}-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})x_{0}^{(i)}
θ0:=θ0−αm1i=1∑m(hθ(x(i))−y(i))x0(i)
j=(1,2,3,4…n)
θ
j
:
=
θ
j
−
α
[
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
+
λ
m
θ
j
]
\theta _{j}:=\theta _{j}-\alpha\left [ \frac{1}{m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}+\frac{\lambda }{m}\theta _{j}\right ]
θj:=θj−α[m1i=1∑m(hθ(x(i))−y(i))xj(i)+mλθj]
可以改写成这种形式:
θ
j
:
=
θ
j
(
1
−
α
λ
m
)
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\theta _{j}:=\theta _{j}\left ( 1-\alpha \frac{\lambda }{m} \right )-\alpha \frac{1}{m}\sum_{i=1}^{m}\left ( h_{\theta } \left ( x^{(i)} \right )-y^{(i)}\right )x_{j}^{(i)}
θj:=θj(1−αmλ)−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
下面是正则化线性代价函数中当
θ
j
\theta _{j}
θj中j为(1,2,3…n,不包含0)梯度的推导,以及最小化正则化代价函数J(θ)的梯度下降算法
具体来讲,这一项的值:
1
−
α
λ
m
1-\alpha \frac{\lambda }{m}
1−αmλ
通常是一个小于1的具体的实数(通常情况下是一个比1小一点点的值),所以我们可以把它想成一个像0.99一样的数字。
所以 θj 更新的结果可以看作是被替换为 θj 的0.99倍(把θj向0压缩了一点点)。
另外后面的这一项:
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\alpha \frac{1}{m}\sum_{i=1}^{m}\left ( h_{\theta } \left ( x^{(i)} \right )-y^{(i)}\right )x_{j}^{(i)}
αm1i=1∑m(hθ(x(i))−y(i))xj(i)
实际上与原来的梯度下降更新完全一样。当使用正则化线性回归时,需要做的就是在每一个被正则化的参数θj上乘以了一个比1小一点点的数字,然后,执行跟以前一样的更新。