天天看點

機器學習(九)- Regularization

Regularization

承接上一篇overfitting,我們來講一講關于Regularization正則化。

正則化本質上就是保留所有的特征的同時,簡化我們的模型,使得我們的模型經過學習之後不會過拟合。所謂的簡化模型呢,就是讓特征參數變得很小,越小說明這個特征占的比重就小,對模型的影響就小,模型就相對簡單。

我們以線性回歸為例,直覺看來,就是讓複雜的曲線變得平滑,就相當于下圖中的 θ 3 \theta_3 θ3​和 θ 4 \theta_4 θ4​約等于0,當然不等于0,因為沒有舍棄。

機器學習(九)- Regularization

正則化的實作

正則化的實作方式是在我們的代價函數後面加入一個正則項(懲罰項)

J ( θ ) = c o s t ( h θ ( x ) , y ) + λ 2 m ∑ j = 1 n θ j 2 J(\theta) = cost(h_\theta(x),y)+\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2 J(θ)=cost(hθ​(x),y)+2mλ​j=1∑n​θj2​

其中 λ 2 m ∑ j = 1 n θ j 2 \frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2 2mλ​∑j=1n​θj2​ 就是正則項, λ \lambda λ 是正則系數,正則系數的作用就在于調整前後兩項的大小去達到一種平衡,第一項是我們原來的代價函數,它的作用在于讓我們能夠很好的fit我們的訓練集,第二項是我們的正則項,它的作用在于懲罰我們的特征參數簡化我們的模型防止過拟合。那麼 λ \lambda λ 如果太大,就會導緻所有的特征參數都被懲罰的很小,正則項占據了主導,導緻underfit欠拟合,如果太小,懲罰作用幾乎沒有,導緻overfit過拟合。是以适當的對 λ \lambda λ取值,才能達到效果。

那麼我們進一步看一下參數更新方程:

KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲ \theta :&= \t…

習慣上,我們是不懲罰 θ 0 \theta_0 θ0​的。

正則化的線性回歸

上面已經給出了方程,我們隻需要把我們的代價函數帶進去即可:

J ( θ ) = 1 2 m ( ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ) J(\theta) = \frac{1}{2m}(\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{j=1}^n\theta_j^2) J(θ)=2m1​(i=1∑m​(hθ​(x(i))−y(i))2+λj=1∑n​θj2​)

R e p e a t { θ 0 : = θ 0 − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x 0 ( i ) θ j : = θ j − α ( 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) + λ m θ j )     ( j = 1 , 2 , . . . , n ) } \begin{aligned} Repeat &\{ \\ \theta_0 &:=\theta_0-\alpha\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})x_0^{(i)}\\ \theta_j &:=\theta_j-\alpha(\frac{1}{m}\sum_{i=1}^m (h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}+\frac{\lambda}{m}\theta_j)\ \ \ (j=1,2,...,n)\\ \} \end{aligned} Repeatθ0​θj​}​{:=θ0​−αm1​i=1∑m​(hθ​(x(i))−y(i))x0(i)​:=θj​−α(m1​i=1∑m​(hθ​(x(i))−y(i))xj(i)​+mλ​θj​)   (j=1,2,...,n)​

對于正規方程:

θ = ( X T X + λ L ) − 1 X T y w h e r e     L = [ 0 1 1 . . . 1 ] \begin{aligned} \theta & = (X^TX+\lambda L)^{-1}X^Ty \\ where \ \ \ L&= \begin{bmatrix} 0&& \\ &1& \\ &&1 \\ &&&... \\ &&&&1 \\ \end{bmatrix} \end{aligned} θwhere   L​=(XTX+λL)−1XTy=⎣⎢⎢⎢⎢⎡​0​1​1​...​1​⎦⎥⎥⎥⎥⎤​​

正則項的引入還帶來一個好處,就算原來的 X T X X^TX XTX是不可逆的,加入了正則項之後 ( X T X + λ L ) (X^TX+\lambda L) (XTX+λL)是一定可逆的。

正則化的邏輯回歸

上面已經給出了方程,我們隻需要把我們的代價函數帶進去即可:

J ( θ ) = − 1 m ( ∑ i = 1 m y ( i ) log ⁡ h θ ( x ( i ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − h θ ( x ( i ) ) ) ) + λ 2 m ∑ j = 1 n θ j 2 J(\theta) = -\frac{1}{m}(\sum_{i=1}^my^{(i)}\log h_\theta(x^{(i)})+(1-y^{(i)})\log (1-h_\theta(x^{(i)})))+\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2 J(θ)=−m1​(i=1∑m​y(i)loghθ​(x(i))+(1−y(i))log(1−hθ​(x(i))))+2mλ​j=1∑n​θj2​

參數更新方程就不列了,跟線性回歸的相同,隻不過 h θ ( x ) h_\theta(x) hθ​(x)不同而已。

下面列舉一個matlab執行個體來說明,先給出矩陣形式:

J ( θ ) = − 1 m ( y T log ⁡ g ( X θ ) + ( 1 − y T ) log ⁡ ( 1 − g ( X θ ) ) ) + λ 2 m θ 1 , 2 , . . . , n T θ 1 , 2 , . . . , n θ 0 : = θ 0 − α 1 m x 0 T ( g ( X θ ) − y ) θ 1 , 2 , . . . , n : = θ 1 , 2 , . . . , n − α 1 m X 1 , 2 , . . . , n T ( g ( X θ ) − y ) \begin{aligned} J(\theta) & = -\frac{1}{m}(y^T\log g(X\theta)+(1-y^T)\log (1-g(X\theta)))+\frac{\lambda}{2m}\theta_{1,2,...,n}^T\theta_{1,2,...,n}\\ \theta_0 :&= \theta_0-\alpha\frac{1}{m}x_0^T(g(X\theta)-y)\\ \theta_{1,2,...,n} :&= \theta_{1,2,...,n}-\alpha\frac{1}{m}X_{1,2,...,n}^T(g(X\theta)-y) \end{aligned} J(θ)θ0​:θ1,2,...,n​:​=−m1​(yTlogg(Xθ)+(1−yT)log(1−g(Xθ)))+2mλ​θ1,2,...,nT​θ1,2,...,n​=θ0​−αm1​x0T​(g(Xθ)−y)=θ1,2,...,n​−αm1​X1,2,...,nT​(g(Xθ)−y)​

% 說明一下這是stanford第三周作業,前面的資料處理部分就不交代了,下面的兩個function應該獨立成.m檔案被調用

function g = sigmoid(z)
g = 1./(1+exp(-z));
end

function [J, grad] = costFunctionReg(theta, X, y, lambda)
m = length(y); % number of training examples
J = -1/m*(y'*log(sigmoid(X*theta))+ ...
    (1-y')*log(1-sigmoid(X*theta)))+ ...
    lambda/(2*m)*sum(theta(2:end).^2);
grad(1) = 1/m*(X(:,1)'*(sigmoid(X*theta)-y));
grad(2:end) = 1/m*(X(:,2:end)'*(sigmoid(X*theta)-y))+lambda/m*theta(2:end);
end


% Initialize fitting parameters
initial_theta = zeros(size(X, 2), 1);
% Set regularization parameter lambda to 1 (you should vary this)
lambda = 1;
% Set Options
options = optimset('GradObj', 'on', 'MaxIter', 400);
% Optimize
[theta, J, exit_flag] = ...
	fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options);