什么是过拟合
过拟合指当我们设定的方程
y
=
θ
0
x
0
+
θ
1
x
1
+
⋯
+
θ
n
x
n
y=\theta_0x^0+\theta_1x^1+\cdots+\theta_nx^n
y=θ0x0+θ1x1+⋯+θnxn
中,参数
θ
\theta
θ的数目超过了我们实际需要的数目,此时虽然我们学习后得到的曲线代价函数
J
(
θ
)
J(\theta)
J(θ)值很小,甚至可以穿过数据集的每个点。但拟合出的曲线会因为他的高次性产生很多不必要的起伏弯折,从而使预测结果失真。
下图来自吴恩达机器学习:
在逻辑回归问题里也会有相似的问题:
如何解决过拟合问题
减少特征值数量
一种是通过人来判断应该删掉什么特征值,配合数据可视化等方法,我们可以对应该用什么式子去拟合数据有个大概的估计。不过在特征值很多的情况下,这样的方法很难实现。
还有一种就是通过算法选择了,这个算法暂时不会在本篇博客中讨论。
缺点就是剔除部分特征值后,相应的信息就损失了,如果我们想尽可能完整地保留采集到的数据,这个方法就显得不那么好了。
正则化
正则化可以保留所有特征值,但是降低了参数 θ \theta θ的大小。在样本有很多特征值且每个特征值都会做出一点贡献时非常有效。
线性回归的正则化
在上面的例子中,过拟合的问题主要来源于高次项,是它们让我们的拟合曲线变的扭曲了。如果我们降低这些高次项参数的权值,这个高次曲线就会逐渐退化为低次曲线。所以我们将代价函数修改为
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(h_\theta(x^{(i)})-y^{(i)})^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]
由于在代价函数里添加了与参数值大小直接相关的项,所以在学习过程中算法就会尽量减小参数大小,从而达到我们降低参数权值的目的。注意这里的
j
j
j是从1开始的,也就是说一般情况下我们并不会正则化
θ
0
\theta_0
θ0。事实上,正则化
θ
0
\theta_0
θ0与否对结果并没有什么影响。
其中, λ \lambda λ为正则化参数,作用为平衡对训练集的拟合程度与参数大小,使得学习结果的更加合理。所以 λ \lambda λ的设置对于避免过拟合至关重要,除了人工调整,当然也有算法可以自动地选择 λ \lambda λ,不过这些内容不会出现在本篇博客。
梯度下降
对于
θ
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)
对于其他参数,我们在上面的公式里再加一项正则项的求导结果即可:
θ
j
:
=
θ
j
−
α
[
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
0
(
i
)
+
λ
m
θ
j
]
:
=
θ
j
(
1
−
α
λ
m
)
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
0
(
i
)
\theta_j:=\theta_j-\alpha\left[\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_0^{(i)}+\frac{\lambda}{m}\theta_j \right]\\ :=\theta_j(1-\alpha\frac{\lambda}{m})-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_0^{(i)}
θj:=θj−α[m1i=1∑m(hθ(x(i))−y(i))x0(i)+mλθj]:=θj(1−αmλ)−αm1i=1∑m(hθ(x(i))−y(i))x0(i)
可以看出,使用正则化后,每次更新是在原梯度下降的基础上把
θ
j
\theta_j
θj压缩成
1
−
α
λ
m
1-\alpha\frac{\lambda}{m}
1−αmλ倍(
0
<
1
−
α
λ
m
<
1
0<1-\alpha\frac{\lambda}{m}<1
0<1−αmλ<1,大约
0.99
0.99
0.99的样子)。
Normal Equation
在这篇博客里,我们已经推导了未正则化的Normal Equation表达式为
Θ
=
(
X
T
X
)
−
1
X
T
Y
Θ=(X ^T X)^{−1} X^T Y
Θ=(XTX)−1XTY
Normal Equation的思想就是直接求解偏导数为0的解,在正则化后,偏导数其实就多了一项
λ
m
θ
j
\frac{\lambda}{m}\theta_j
mλθj,把这一项进去就可以得到正则化后的Normal Equation为
Θ
=
(
X
T
X
+
λ
[
0
⋯
1
⋯
⋮
1
⋯
⋮
1
⋮
⋱
⋮
⋯
1
]
)
−
1
X
T
Y
\Theta=(X ^T X+ \lambda\left[\begin{matrix} 0&&\cdots&&&\\ &1&&\cdots&&\\ \vdots&&1&&\cdots&\\ &\vdots&&1&&\\ &&\vdots&&\ddots&\vdots\\ &&&&\cdots&1\\ \end{matrix}\right] )^{−1} X^T Y
Θ=(XTX+λ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡0⋮1⋮⋯1⋮⋯1⋯⋱⋯⋮1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤)−1XTY
在这里,正则化还有一个好处,加上了正则项之后,可以证明该矩阵一定是可逆的,解决了某些情况下
X
T
X
X^TX
XTX不可逆的问题。
逻辑回归的正则化
与线性回归的正则化类似,我们也在代价函数中加上正则项,使代价函数变为
J
(
θ
)
=
−
1
m
∑
i
=
1
m
[
y
log
(
h
θ
(
x
⃗
)
)
+
(
1
−
y
)
log
(
1
−
h
θ
(
x
⃗
)
)
]
+
λ
2
m
∑
j
=
1
n
θ
j
2
J(\theta)=-\frac{1}{m}\sum_{i=1}^m\left[y\log(h_\theta(\vec{x}))+(1-y)\log(1-h_\theta(\vec{x}))\right] +\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2
J(θ)=−m1i=1∑m[ylog(hθ(x))+(1−y)log(1−hθ(x))]+2mλj=1∑nθj2
从而让我们的算法更倾向于减小参数值的大小,使高次项的影响变小。
梯度下降
对于
θ
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)
对于其他参数,我们在上面的公式里再加一项正则项的求导结果即可:
θ
j
:
=
θ
j
−
α
[
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
+
λ
m
θ
j
]
:
=
θ
j
(
1
−
α
λ
m
)
−
α
1
m
∑
i
=
1
m
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
\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]\\ :=\theta_j(1-\alpha\frac{\lambda}{m})-\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)+mλθj]:=θj(1−αmλ)−αm1i=1∑m(hθ(x(i))−y(i))xj(i)
形式跟线性回归的梯度下降还是一样的,不过还是注意两个算法的
h
θ
h_\theta
hθ定义并不相同。