1. 程式人生 > >UFLDL學習筆記系列 2

UFLDL學習筆記系列 2

監督學習和優化——邏輯迴歸(Logistic Regression)

問題描述

之前我們學習的是通過一個線性方程預測一個連續的值(e.g. 房屋價格)。但有時我們想要預測一個離散的值,比如一張圖片是不是貓,這屬於分類問題。而邏輯迴歸是一種簡單的分類演算法。在這裡,我們只討論二元分類問題,即y{0,1}y\in \{0,1\}

Logistic函式

給定x(i)y(i)x^{(i)},y^{(i)}是其標籤。若還是像線性迴歸中的描述方法:hθ(x)=θxh_\theta(x) = \mathbf{\theta}^\top x來描述標籤,則顯然是不合理的,因為y

y只能是0或者1,因此修改hθ(x)=g(θx)=11+eθxh_\theta(x) = g(\mathbf{\theta}^\top x) = \frac{1}{1+e^{-\mathbf{\theta}^\top x}}其中g(z)=11+ezg(z) = \frac{1}{1+e^{-z}} 該函式被叫做logistic函式或者sigmoid函式。該函式如下圖所示sigmoid函式可以看到g(z)(0,1)g(z) \in (0,1),因此hθ(x)h_\theta(x)的取值也在該範圍內。其他取值在[0,1]之間的函式也可以替代這裡的sigmoid函式。

演算法描述

假設hθ(x)h_\theta(x)表示分類為正類(y為1)的概率,則有P(y=1x;θ)=hθ(x)P(y=1|x;\theta) = h_\theta(x) P(y=0x;θ)=1hθ(x)P(y = 0|x;\theta) = 1-h_\theta(x)上面兩式可簡寫為下面的式子:P(yx;θ)=hθ(x)y(1hθ(x))1yP(y|x;\theta) = h_\theta(x)^y(1-h_\theta(x))^{1-y}假設m個訓練樣本是獨立生成的,則可以寫出引數的似然函式為:L

(θ)=p(yX;θ)=i=1mp(y(i)x(i);θ)=i=1mhθ(x(i))y(i)(1hθ(x(i)))1y(i)L(\theta) = p(\vec y | X;\theta)\\ = \prod_{i=1}^mp(y^{(i)}|x^{(i)};\theta)\\=\prod_{i=1}^mh_\theta(x^{(i)})^{y^{(i)}}(1-h_\theta(x^{(i)}))^{1-y^{(i)}}使用對數似然更加容易計算:l(θ)=logL(θ)=i1my(i)logh(x(i))+(1y(i))log(1h(x(i))l(\theta) = \log L(\theta) \\ = \sum_{i-1}^my^{(i)}\log h(x^{(i)}) + (1-y^{(i)})\log (1-h(x^{(i)}) 現在的任務轉變為最大化對數似然估計,即我們的l(θ)l(\theta)。最大化該函式可以使用上一章介紹的梯度下降進行計算。其中梯度為:θjl(θ)=i(yhθ(x))xj(i)\frac{\partial}{\partial \theta_j}l(\theta) = \sum_i(y - h_\theta(x)) x_j^{(i)}虛擬碼如下所示:       Repeat until convergence{ θj:=θj+αi=1m(y(i)hθ(x(i)))xj(i)(foreveryj)\theta_j :=\theta_j + \alpha\sum_{i=1}^m(y^{(i)} - h_\theta(x^{(i)}))x_j^{(i)} \ \ \ \ (for\ every\ j)} 可以發現,這與線性規劃的迭代公式一樣,但它們不是同一個演算法,因為目標函式hθ(x)h_\theta(x)不同了。

Exercise 1B

ex1/ex1b_logreg.m檔案中的程式碼實現的是對28*28畫素大小的0或者1的數字圖片進行分類。這裡需要我們完成的部分就是在logistic_regression.m檔案中計算目標函式l(θ)l(\theta)以及梯度θjl(θ)\frac{\partial}{\partial \theta_j}l(\theta)。 具體程式碼如下所示:

%compute the value of f
for i=1 : m
    f = f - (y(i) * log(1 / (1 + exp(-theta' * X(:,i)))) + (1 - y(i)) * log(1 - 1 / (1 + exp(-theta' * X(:,i)))));
end

% compute the gradient
for i = 1 : size(X,1)
    for j = 1 : m
        g(i) = g(i) + X(i,j) * (1 / (1 + exp(-theta' * X(:,j))) - y(j));
    end
end

最終訓練資料以及測試資料的正確率都能達到100%,這是由於此分類任務較簡單,且資料集充足。在一般分類問題中很難達到100%的正確率。 但此訓練執行耗時巨大,共計花費約100分鐘,主要在於θ\theta每次迭代都需要遍歷所有的訓練資料,而我們的程式碼使用迴圈來完成,是完全序列的,使執行時間大大增長。下一節會描述如何將資料向量化,從而加快了執行速度。