1.过拟合问题
对于过拟合问题,通常原因是模型选择太过复杂,也有可能是训练数据太少。对于模型太复杂的情况,我们一般有如下考虑:一是通过分析删除部分特征(比如重复多余的特征或者对输出值贡献不太大的特征),但是这样有可能会损失一部分信息。所以,我们可以通过正则化的方法来降低参数值,从而避免过拟合问题。对于过拟合问题的详细描述,可以查看我的另一篇博客机器学习之欠拟合与过拟合。
2.正则化
回顾一下,在回归问题中,在确定模型之后,要根据该损失函数找出使得损失函数最小的参数矩阵。在整个回归过程中,最为重要的一步是确定回归模型。通常情况下,如果选择的模型太简单,就会欠拟合。如果模型选择太复杂,就会过拟合。正则化可以很好地解决之一问题,通过对某些参数进行“惩罚”,就可以达到降低参数值的目的。正则化的方法有很多,这里仅介绍L1正则化和L2正则化,对应的分别是Lasson回归和Ridge回归。正则化就是在损失函数中加入正则项(用 Ω ( θ ) \Omega(\theta) Ω(θ)表示),L1正则对应的正则项为: L 1 = λ ∑ i = 1 n ∣ θ i ∣ L1 = \lambda\sum_{i=1}^n|\theta_i| L1=λ∑i=1n∣θi∣,L2对应的正则项是: L 2 = λ ∑ i = 1 n θ i 2 L2 = \lambda\sum_{i=1}^n\theta_i^2 L2=λ∑i=1nθi2。例如线性回归的正则化损失函数为:
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + Ω ( θ ) (2.1) J(\theta)={1\over 2m} \sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})^2 + \Omega(\theta)\tag{2.1} J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2+Ω(θ)(2.1)
逻辑回归的正则化损失函数为:
J ( θ ) = 1 m ∑ i = 1 m [ − y ( i ) l n ( h θ ( x ( i ) ) ) − ( 1 − y ( i ) ) l n ( 1 − h θ ( x ( i ) ) ) ] + Ω ( θ ) (2.2) J(\theta)= \dfrac{1}{m}\sum_{i=1}^m[-y^{(i)}ln(h_\theta(x^{(i)}))-(1-y^{(i)})ln(1-h_\theta(x^{(i)}))] +\Omega(\theta) \tag{2.2} J(θ)=m1i=1∑m[−y(i)ln(hθ(x(i)))−(1−y(i))ln(1−hθ(x(i)))]+Ω(θ)(2.2)
3.L1正则与L2正则的不同
3.1L1正则
在介绍L1正则之前,我们有必要了解一下L0范数,L0范数表示向量中非零元素的个数,其数学表达式为:
∣ ∣ x ∣ ∣ 0 = ∑ j = 1 ∣ x ∣ x j ≠ 0 ? 1 : 0 (3.1.1) ||x||_0 = \sum_{j=1}^{|x|} x_j \neq 0?1:0 \tag{3.1.1} ∣∣x∣∣0=j=1∑∣x∣xj=0?1:0(3.1.1)
如果我们使用L0范数作为正则项(即 Ω ( θ ) = λ ∣ ∣ θ ∣ ∣ 0 \Omega(\theta)=\lambda||\theta||_0 Ω(θ)=λ∣∣θ∣∣0),那就说明我们希望权向量 w w w当中的大部分元素都是零。L0正则更通俗的解释是:如果要增加模型复杂度来加强模型的表达能力,对于增加的每个参数,我们都要进行这样的考量----该参数不为0时对初始损失函数(即不加正则项的损失函数)的降低程度是否达到 λ \lambda λ。如果不足 λ \lambda λ,我们认为增加这样的复杂度是得不偿失的。通过L0正则,可以使模型稀疏化,并且在一定程度上实现了特征选择(如果某个参数为0,相当于摒弃了该参数对应的样本特征)。但是由于L0正则项不连续、不可导、也不是凸函数,所以最小化L0正则损失函数是一个NP问题,相当复杂。所以我们需要更为有效的方式----L1正则。L1范数是L0范数最优凸近似,比L0范数更容易求得最优解。所以我们可以用L1正则来近似代替L0正则。如果采用L1正则,那么损失函数就变为:
J ( θ ) = J ( θ ) 0 + 1 2 m λ ∑ i = 1 n | θ i | ) (3.1.2) J(\theta) =J(\theta)_0 + \dfrac{1}{2m}\lambda\sum_{i=1}^n|\theta_i|) \tag{3.1.2} J(θ)=J(θ)0+2m1λi=1∑n|θi|)(3.1.2)
对参数求偏导数的结果就是:
∂ J ( θ ) ∂ θ 0 = ∂ J ( θ ) 0 ∂ θ 0 , ∂ J ( θ ) ∂ θ i = ∂ J ( θ ) 0 ∂ θ i + 1 m λ s g n ( θ i ) ( i = 1 , 2 , … , n ) (3.1.3) \dfrac{\partial J(\theta)}{\partial \theta_0 } = \dfrac{\partial J(\theta)_0}{\partial \theta_0},\dfrac{\partial J(\theta)}{\partial \theta_i } = \dfrac{\partial J(\theta)_0}{\partial \theta_i} + \dfrac{1}{m}\lambda sgn(\theta_i)\quad (i = 1,2,\dots,n) \tag{3.1.3} ∂θ0∂J(θ)=∂θ0∂J(θ)0,∂θi∂J(θ)=∂θi∂J(θ)0+m1λsgn(θi)(i=1,2,…,n)(3.1.3)
在梯度下降法中,对应的参数更新方式为:
θ 0 = θ 0 − α ∂ J ( θ ) 0 ∂ θ 0 , θ i = θ i − α ∂ J ( θ ) 0 ∂ θ i − α m λ s g n ( θ i ) ) ( i = 1 , 2 , … , n ) (3.1.4) \theta_0 = \theta_0 -\alpha\dfrac{\partial J(\theta)_0}{\partial \theta_0},\theta_i = \theta_i - \alpha\dfrac{\partial J(\theta)_0}{\partial \theta_i} -\dfrac{\alpha}{m} \lambda sgn(\theta_i)) \quad (i = 1,2,\dots,n) \tag{3.1.4} θ0=θ0−α∂θ0∂J(θ)0,θi=θi−α∂θi∂J(θ)0−mαλsgn(θi))(i=1,2,…,n)(3.1.4)
上述各式中, J ( θ 0 ) J(\theta_0) J(θ0)表示初始损失函数(即未添加正则项的损失函数),sgn为符号函数。正则项和 θ 0 \theta_0 θ0无关是因为 θ 0 \theta_0 θ0与任何特征项都无关(即不对应任何 x i x_i xi),所以 θ 0 \theta_0 θ0对过拟合的影响并不大,也就不需要在正则项中引入。
3.2L2正则
L0和L1正则都会使参数矩阵变得稀疏(即存在很多为0的元素),对样本特征有所舍弃,虽然对减小方差很有作用,但通常这会使偏差变大。那么有没有什么方法可以使方差变小的同时,偏差又不会变得太大呢?L2正则就可以解决这一问题。L2范数的数学表达式的直观解释是参数的平方的 λ \lambda λ倍求和,如果采用L2范数作为正则项,这会让部分参数值非常小,接近于0,但并不是等于0。这就保证了不会舍弃样本特征,只是让特征对应的权重变小。同样可以起到减小方差的作用,并且偏差不会变得太大。如果采用L1正则,那么损失函数就变为:
J ( θ ) = J ( θ ) 0 + 1 2 m λ ∑ i = 1 n θ i 2 (3.2.1) J(\theta) =J(\theta)_0 + \dfrac{1}{2m}\lambda\sum_{i=1}^n\theta_i^2 \tag{3.2.1} J(θ)=J(θ)0+2m1λi=1∑nθi2(3.2.1)
对参数求偏导数的结果就是:
∂ J ( θ ) ∂ θ 0 = ∂ J ( θ ) 0 ∂ θ 0 , ∂ J ( θ ) ∂ θ i = ∂ J ( θ ) 0 ∂ θ i + 1 m λ θ i ( i = 1 , 2 , … , n ) (3.1.2) \dfrac{\partial J(\theta)}{\partial \theta_0 } = \dfrac{\partial J(\theta)_0}{\partial \theta_0},\dfrac{\partial J(\theta)}{\partial \theta_i } = \dfrac{\partial J(\theta)_0}{\partial \theta_i} + \dfrac{1}{m}\lambda \theta_i \quad (i = 1,2,\dots,n) \tag{3.1.2} ∂θ0∂J(θ)=∂θ0∂J(θ)0,∂θi∂J(θ)=∂θi∂J(θ)0+m1λθi(i=1,2,…,n)(3.1.2)
在梯度下降法中,对应的参数更新方式为:
θ 0 = θ 0 − α ∂ J ( θ ) 0 ∂ θ 0 , θ i = θ i − ∂ J ( θ ) 0 ∂ θ i − α m 2 λ θ i ( i = 1 , 2 , … , n ) (3.2.3) \theta_0 = \theta_0 -\alpha\dfrac{\partial J(\theta)_0}{\partial \theta_0},\theta_i = \theta_i - \dfrac{\partial J(\theta)_0}{\partial \theta_i} -\dfrac{\alpha}{m} 2\lambda \theta_i \quad (i = 1,2,\dots,n) \tag{3.2.3} θ0=θ0−α∂θ0∂J(θ)0,θi=θi−∂θi∂J(θ)0−mα2λθi(i=1,2,…,n)(3.2.3)
上述各式中, J ( θ 0 ) J(\theta_0) J(θ0)表示初始损失函数(即未添加正则项的损失函数)。(不要纠结于系数,m和2m都是一样的,只是方便求偏导时约去1/2)。
对于线性回归来说,初始损失函数 J ( θ ) 0 = 1 2 m ∑ i = 0 m ( y ( i ) − h θ ( x ( i ) ) ) 2 J(\theta)_0 =\dfrac{1}{2m}\sum_{i=0}^m(y^{(i)}-h_\theta(x^{(i)}))^2 J(θ)0=2m1∑i=0m(y(i)−hθ(x(i)))2。
加入正则项后,最小二乘法求解结果为: θ = ( X T X + λ [ 0 1 1 ⋱ 1 ] ) − 1 X T Y \theta = \left(X^TX+\lambda \left[\begin{matrix} 0 \\ &1 \\ & & 1 \\ & & &\ddots \\ & & & & 1 \end{matrix} \right]\right)^{-1}X^TY θ=⎝⎜⎜⎜⎜⎛XTX+λ⎣⎢⎢⎢⎢⎡011⋱1⎦⎥⎥⎥⎥⎤⎠⎟⎟⎟⎟⎞−1XTY。
对于逻辑回归来说,初始损失函数 J ( θ ) 0 = 1 m ∑ i = 1 m [ − y l n ( h θ ( x ) ) − ( 1 − y ) l n ( 1 − h θ ( x ) ) ] J(\theta)_0= \dfrac{1}{m}\sum_{i=1}^m[-yln(h_\theta(x))-(1-y)ln(1-h_\theta(x))] J(θ)0=m1∑i=1m[−yln(hθ(x))−(1−y)ln(1−hθ(x))]。
4.总结
对于过拟合问题,我们可以采用正则化来解决。在机器学习中,我们一般会使用L2正则。在使用正则化的时候,要注意正则化参数 λ \lambda λ的选择。如果 λ \lambda λ太小,那么正则项几乎就没有起到作用,也就无法解决过拟合问题;如果 λ \lambda λ太大,这时除了 θ 0 \theta_0 θ0以外的其他参数 θ i ( i = 1 , 2 , … , n ) \theta_i(i = 1,2,\dots,n) θi(i=1,2,…,n)就会很小,最后得到的模型几乎就是一条水平直线,会出现欠拟合问题。