定义:在损失函数上加上某些规则(限制、惩罚项),缩小解空间,从而减少求出过拟合解的可能性。
本质:牺牲模型在训练集上的正确率来提高推广泛化能力,W(模型参数)在数值上越小越好,这样可以更好的抵抗数值的扰动。
目的:防止训练的参数过拟合,增加模型的鲁棒性。
L1范数与L2范数
L1范数公式:(曼哈顿距离)
L
1
=
∣
∣
w
∣
∣
1
=
∑
i
=
1
n
∣
w
i
∣
L_1=||w||_{1}=\sum_{i=1}^{n}|w_i|
L1=∣∣w∣∣1=i=1∑n∣wi∣
L2范数公式:(欧氏距离)
L
2
=
∣
∣
w
∣
∣
2
=
∑
i
=
1
n
(
w
i
)
2
L2=||w||_2=\sqrt{\sum_{i=1}^{n}(w_i)^2}
L2=∣∣w∣∣2=i=1∑n(wi)2
对应范数,空间中向量到原点的距离公式如下:
L
p
=
∣
∣
w
∣
∣
p
=
∑
i
=
1
n
x
i
p
p
X
=
(
x
1
,
x
2
,
.
.
.
,
x
n
)
L_p=||w||_p=\sqrt[p]{\sum_{i=1}^{n}x_i^p}\\ X=(x_1,x_2,...,x_n)
Lp=∣∣w∣∣p=pi=1∑nxipX=(x1,x2,...,xn)
上述范式可以加到任何算法的损失函数中,可以提到模型的泛化能力。
接下来介绍三种常用的正则化方法:套索回归(Lasso)、岭回归(Ridge)、弹性网络(Elastic-Net)
套索回归(Lasso)
先从简单线性回归的损失函数公式——最小二乘法来看:
J
(
θ
)
=
1
2
∑
i
=
1
n
(
h
θ
(
x
i
)
−
y
i
)
2
令
J
0
=
J
(
θ
)
,
并且对其进行
L
1
范式,正则化损失函数
,
则有下列式子
J(\theta)=\frac{1}{2}\sum_{i=1}^{n}(h_{\theta}(x^i)-y^i)^2\\ 令J_0=J(\theta),并且对其进行L1范式,正则化损失函数,则有下列式子\\
J(θ)=21i=1∑n(hθ(xi)−yi)2令J0=J(θ),并且对其进行L1范式,正则化损失函数,则有下列式子
J = J 0 + α ∗ ∑ i = 1 n ∣ w i ∣ 令 L 1 = α ∗ ∑ i = 1 n ∣ w i ∣ (权值的绝对值之和) J=J_0+\alpha*\sum_{i=1}^n|w_i|\\ 令L1=\alpha*\sum_{i=1}^n|w_i|(权值的绝对值之和)\\ J=J0+α∗i=1∑n∣wi∣令L1=α∗i=1∑n∣wi∣(权值的绝对值之和)
所以说正则化的损失函数公式如下:
J
=
J
0
+
L
1
J=J_0+L1
J=J0+L1
因为L1是带有绝对值符号的式子,所以J不完全可微。而求解损失函数利用的是梯度下降的方法,本质是求解损失函数J的最小值,所以可以将问题转换成**==>求解在L1范式约束下J0**什么时候取最小值。如下图:(正方形为约束条件,L1的α越小,其正方形的图形越大)
约束正方形中的顶点(特殊点)会导致一些特征值w为0,说明那些特征并不重要,不需要考虑,是可以删除的。同时,这也说明了套索回归(Lasso)具有稀疏性。
因为α可以控制约束范围,所以在求解的时候一般要把其设置成一个比较合理的值,并且要知道α越大,则越多参数为0。
权重更新规则
先介绍一个重要函数——符号函数sgn(x)
s
g
n
(
w
i
)
=
{
1
w
i
>
0
−
1
w
i
<
0
}
sgn(w_i)=\begin{Bmatrix} 1 & w_i>0\\ -1&w_i<0 \end{Bmatrix}
sgn(wi)={1−1wi>0wi<0}
由公式可以看出,wi=0,则函数不可导。而进行L1范式正则化的损失函数的参数更新还是依据梯度下降的,所以其更新的公式如下:
θ
j
n
+
1
=
θ
j
n
−
η
∗
α
α
θ
j
J
\theta^{n+1}_j=\theta^n_j-\eta*\frac{\alpha}{\alpha \theta_j}J
θjn+1=θjn−η∗αθjαJ
θ j n + 1 = θ j n − η ∗ α α θ j ( J 0 + L 1 ) \theta^{n+1}_j=\theta^n_j-\eta*\frac{\alpha}{\alpha \theta_j}(J_0+L1) θjn+1=θjn−η∗αθjα(J0+L1)
α α θ j J 0 = ∑ i = 1 n ( h θ ( x i ) − y i ) x j i \frac{\alpha}{\alpha\theta_j}J_0=\sum_{i=1}^{n}(h_{\theta}(x^i)-y^i)x_j^i αθjαJ0=i=1∑n(hθ(xi)−yi)xji
α α θ j L 1 = α ∗ s g n ( w i ) \frac{\alpha}{\alpha\theta_j}L1=\alpha*sgn(w_i) αθjαL1=α∗sgn(wi)
对上述式子进行整合:
θ
j
n
+
1
=
θ
j
n
−
η
∗
∑
i
=
1
n
(
h
θ
(
x
i
)
−
y
i
)
x
j
i
−
η
∗
α
∗
s
g
n
(
w
i
)
η
>
0
,
α
>
0
如果
w
i
>
0
,
则
w
i
+
1
减小,反之增大
\theta^{n+1}_j=\theta^n_j-\eta*\sum_{i=1}^n(h_{\theta}(x^i)-y^i)x_j^i-\eta*\alpha*sgn(w_i)\\ \eta>0,\alpha>0\\ 如果w_i>0,则w_{i+1}减小,反之增大
θjn+1=θjn−η∗i=1∑n(hθ(xi)−yi)xji−η∗α∗sgn(wi)η>0,α>0如果wi>0,则wi+1减小,反之增大
代码测试,如下:
from sklearn.linear_model import Lasso
# 创建数据
X = np.random.rand(100,20)
w = np.random.randn(20,1)
b = np.random.randint(1,20,size=1)
y = X.dot(w) + b + np.random.randn(100,1)
# 使用Lasso回归进行预测,具有稀疏性质
lasso = Lasso(alpha=0.1)
lasso.fit(X,y)
print('真是的w,b为:\n',w,b)
print('Lasso求解的w,b为:\n',lasso.coef_,lasso.intercept_)
岭回归(Ridge)
依旧从线性回归出发,其损失函数为:
J
(
θ
)
=
1
2
∑
i
=
1
n
(
h
θ
(
x
i
)
−
y
i
)
2
令
J
0
=
J
(
θ
)
,
并且对其进行
L
2
范式,正则化损失函数
,
则有下列式子
J(\theta)=\frac{1}{2}\sum_{i=1}^{n}(h_{\theta}(x^i)-y^i)^2\\ 令J_0=J(\theta),并且对其进行L2范式,正则化损失函数,则有下列式子\\
J(θ)=21i=1∑n(hθ(xi)−yi)2令J0=J(θ),并且对其进行L2范式,正则化损失函数,则有下列式子
J = J 0 + α ∗ ∑ i = 1 n ( w i ) 2 令 L 2 = α ∗ ∑ i = 1 n ( w i ) 2 (权值的绝对值之和) J=J_0+\alpha*\sum_{i=1}^n(w_i)^2\\ 令L2=\alpha*\sum_{i=1}^n(w_i)^2(权值的绝对值之和)\\ J=J0+α∗i=1∑n(wi)2令L2=α∗i=1∑n(wi)2(权值的绝对值之和)
因此可以得到通过岭回归后的得到新的损失函数,如下:
J
=
J
0
+
L
2
J=J_0+L2
J=J0+L2
对L2的公式进行绘制图像,可以发现其是圆形,如下图:
从图中可以看出,其比较难与特殊点相交,不具有稀疏性,较Lasso而言,不太可能出现比较多参数w都为0的情况。
权重更新规则
由梯度下降进行权重更新,可得:
θ
j
n
+
1
=
θ
j
n
−
η
∗
α
α
θ
j
J
\theta^{n+1}_j=\theta^n_j-\eta*\frac{\alpha}{\alpha \theta_j}J
θjn+1=θjn−η∗αθjαJ
θ j n + 1 = θ j n − η ∗ α α θ j ( J 0 + L 2 ) \theta^{n+1}_j=\theta^n_j-\eta*\frac{\alpha}{\alpha \theta_j}(J_0+L2) θjn+1=θjn−η∗αθjα(J0+L2)
α α θ j J 0 = ∑ i = 1 n ( h θ ( x i ) − y i ) x j i \frac{\alpha}{\alpha\theta_j}J_0=\sum_{i=1}^{n}(h_{\theta}(x^i)-y^i)x_j^i αθjαJ0=i=1∑n(hθ(xi)−yi)xji
α α θ j L 2 = 2 ∗ α ∗ w i \frac{\alpha}{\alpha\theta_j}L2=2*\alpha*w_i αθjαL2=2∗α∗wi
对上述式子进行整合可得:
θ
j
n
+
1
=
θ
j
n
(
1
−
η
∗
2
∗
α
)
−
η
∗
∑
i
=
1
n
(
h
θ
(
x
i
)
−
y
i
)
x
j
i
\theta^{n+1}_j=\theta^n_j(1-\eta*2*\alpha)-\eta*\sum_{i=1}^n(h_{\theta}(x^i)-y^i)x^i_j
θjn+1=θjn(1−η∗2∗α)−η∗i=1∑n(hθ(xi)−yi)xji
观察上式可发现,其θ会加速减小,可以获得更小的参数值,可以有效地防止过拟合。
代码测试,如下:
# 导入随机梯度下降的包
from sklearn.linear_model import SGDRegressor,LinearRegression
# 导入岭回归
from sklearn.linear_model import Ridge
# 创建数据
X = np.random.rand(100,5)
w = np.random.randint(1,10,size=(5,1))
b = np.random.randint(1,10,size=1)
# 加点噪声,生成数据
y = X.dot(w) + b + np.random.randn(100,1)
# 测试
print('真实的答案是:',w,b)
ridge = Ridge(alpha=1, solver='sag')
ridge.fit(X,y)
print('岭回归求解的答案是:', ridge.coef_,ridge.intercept_)
弹性网络(Elastic-Net)
公式如下:
min
w
1
x
n
s
a
m
p
l
e
s
∣
∣
X
w
−
y
∣
∣
2
2
+
α
∗
ρ
∣
∣
w
∣
∣
1
+
α
(
1
−
ρ
)
2
∣
∣
w
∣
∣
2
2
\min_{w}\frac{1}{xn_{samples}}||Xw-y||_2^2+\alpha*\rho||w||_1+\frac{\alpha(1-\rho)}{2}||w||_2^2
wminxnsamples1∣∣Xw−y∣∣22+α∗ρ∣∣w∣∣1+2α(1−ρ)∣∣w∣∣22
- 允许使用L1、L2范数作为先验正则项训练的线性回归模型
- 允许学习到一个只有少量参数是非零系数的模型(lasso),但仍保持Ridge的正则性质
- 在多特征相互关联的时候比较有效
代码测试,如下:
from sklearn.linear_model import SGDRegressor,LinearRegression
from sklearn.linear_model import ElasticNet
# 创建数据
X = 2 * np.random.rand(100,20)
w = np.random.randn(20,1)
b = np.random.randint(1,20,size=1)
y = X.dot(w) + b + np.random.randn(100,1)
# 使用弹性网络(l1_ratio越接近1,像lasso的概率越大,越接近0,越像Ridge)
elasticnet = ElasticNet(alpha= 0.5,l1_ratio=0.4)
elasticnet.fit(X,y)
print('初始的w,b为:\n',w,b)
print('elasticnet求解的w,b为\n',elasticnet.coef_,elasticnet.intercept_)
# 使用随机梯度下降,这里的l1_ratio是控制是使用哪个范式进行计算的
sgd = SGDRegressor(penalty='l2', alpha=0, l1_ratio=0)
sgd.fit(X,y.reshape(-1))
print('sgd求解的答案为:\n',sgd.coef_,sgd.intercept_)