DLT-07-正则化

本文是**深度学习入门(deep learning tutorial, DLT)**系列的第五篇文章,主要介绍一下正则化的相关知识。想要学习深度学习或者想要了解机器学习的同学可以关注公众号GeodataAnalysis,我会逐步更新这一系列的文章。

在机器学习中,正则化是正则化系数的过程,即对系数进行惩罚,通过向模型添加额外参数来防止模型过度拟合,这有助于提高模型的可靠性、速度和准确性。可以这么说,正则化本质上是为了防止因网络参数过大导致模型过拟合的泛化技术。

1 过拟合的问题

下图是一个回归问题中过拟合的例子:

上图中第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据。我们可以看出,若给出一个新的值使之预测,它将表现的很差,是过拟合,虽然能非常好地适应我们的训练集但在新输入变量进行预测时可能会效果不好;而中间的模型似乎最合适。

分类问题中也存在这样的问题:

就以多项式理解, x x x 的次数越高,拟合的越好,但相应的预测的能力就可能变差。

问题是,如果我们发现了过拟合问题,应该如何处理?主要方法有以下两种:

  1. 丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA
  2. 正则化。 保留所有的特征,但是减少参数的大小(magnitude)。

2 回归模型的正则化

在第三章的多元线性回归中我们的模型是:

h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 2 + θ 3 x 3 3 + θ 4 x 4 4 {h_\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}^2}+{\theta_{3}}{x_{3}^3}+{\theta_{4}}{x_{4}^4} hθ(x)=θ0+θ1x1+θ2x22+θ3x33+θ4x44

我们可以从之前的事例中看出,正是那些高次项导致了过拟合的产生,所以如果我们能让这些高次项的系数接近于0的话,我们就能很好的拟合了。

所以我们要做的就是在一定程度上减小这些参数$\theta $ 的值,这就是正则化的基本方法。要决定减少 θ 3 {\theta_{3}} θ3 θ 4 {\theta_{4}} θ4的大小,首先要做的便是修改损失函数,在其中对 θ 3 {\theta_{3}} θ3 θ 4 {\theta_{4}} θ4 设置一点惩罚。这样做的话,我们在尝试最小化损失函数时也需要将这个惩罚纳入考虑中,并最终导致选择较小一些的 θ 3 {\theta_{3}} θ3 θ 4 {\theta_{4}} θ4

通过这样的损失函数选择出的 θ 3 {\theta_{3}} θ3 θ 4 {\theta_{4}} θ4 对预测结果的影响就比之前要小许多。假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让损失函数最优化的过程(即梯度下降)来选择这些惩罚的程度。这样的结果是得到了一个较为简单的能防止过拟合问题的损失函数:

J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ] J\left( \theta \right)=\frac{1}{2m}[\sum\limits_{i=1}^{m}{ { {({h_\theta}({ {x}^{(i)}})-{ {y}^{(i)}})}^{2}}+\lambda \sum\limits_{j=1}^{n}{\theta_{j}^{2}}]} J(θ)=2m1[i=1m(hθ(x(i))y(i))2+λj=1nθj2]

其中 λ \lambda λ又称为正则化参数(Regularization Parameter)。 注:根据惯例,我们不对 θ 0 {\theta_{0}} θ0 进行惩罚。

λ \lambda λ 的值太大了,那么 θ \theta θ(不包括 θ 0 {\theta_{0}} θ0)都会趋近于0,这样我们所得到的只能是一条平行于 x x x轴的直线。

所以对于正则化,我们要取一个合理的 λ \lambda λ 的值,这样才能更好的应用正则化。

回顾一下损失函数,为了使用正则化,让我们把这些概念应用到到线性回归和逻辑回归中去,那么我们就可以让他们避免过度拟合了。

3 分类模型的正则化

分类模型的正则化与回归模型类似,同样需要对损失函数进行调整。对逻辑回归的损失函数增加一个正则化的表达式,得到损失函数如下:

J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − h θ ( x ( i ) ) ) ] + λ 2 m ∑ i = 1 m θ j 2 J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}^{m}{[{ {y}^{(i)}}\log \left( {h_\theta}\left( { {x}^{(i)}} \right) \right)+\left( 1-{ {y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( { {x}^{(i)}} \right) \right)]} + \frac{\lambda}{2m}\sum\limits_{i=1}^{m}\theta_j^2 J(θ)=m1i=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]+2mλi=1mθj2

其代码表示为:

def loss_fun_reg(x, y, theta, r):
	first = y * np.log(hypothesis_fun(x, theta))
	second = (1 - y) * np.log(1 - hypothesis_fun(x, theta))
	third = r/(2*y.size)*np.sum(np.power(theta[1:], 2))
	return -np.sum(first + second)/(y.size) + third

要最小化该代价函数,通过求导,得出梯度下降算法为:

θ 0 : = θ 0 − a 1 m ∑ i = 1 m ( ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) ) j = 0 θ j : = θ j − a [ 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ m θ j ] j = 1 , 2 , . . . n \begin{aligned} {\theta_0} &:= {\theta_0}-a\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({ {x}^{(i)}})-{ {y}^{(i)}})x_{0}^{(i)}}) \quad \quad \quad \quad j=0 \newline {\theta_j} &:= {\theta_j}-a[\frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({ {x}^{(i)}})-{ {y}^{(i)}})x_{j}^{\left( i \right)}}+\frac{\lambda }{m}{\theta_j}] \quad j=1,2,...n \end{aligned} θ0θj:=θ0am1i=1m((hθ(x(i))y(i))x0(i))j=0:=θja[m1i=1m(hθ(x(i))y(i))xj(i)+mλθj]j=1,2,...n

其代码表示为:

def gradient_decent(x, y, theta, learning_rate, r):
	gradient = x @ (hypothesis_fun(x, theta) - y)/ y.size
	gradient[1:] = gradient[1:] + theta[1:]*r/y.size
	return theta - learning_rate * gradient

猜你喜欢

转载自blog.csdn.net/weixin_44785184/article/details/129536872