1. 程式人生 > >機器學習:邏輯迴歸詳細推導

機器學習:邏輯迴歸詳細推導

如今機器學習、深度學習可謂炙手可熱,人工智慧也確實開始影響、改變著我們的生活。正因如此,很多同學開始接觸或者學習這方面的知識。機器學習的入門是有難度的,因為它不僅要求你會編碼,還要你熟悉高等數學,比如線性代數,微積分等,除此之外,還要懂統計學。如果你想入門機器學習,那麼一定要好好學習邏輯迴歸。原因如下:

    1.邏輯迴歸可以幫你更好地理解機器學習;

    2.邏輯迴歸已經可以解決多數問題了;

    3.邏輯迴歸是統計學習的重要工具;

    4.邏輯迴歸是神經網路的基礎;

下面開始我們的正文,在正式介紹邏輯迴歸前,我們先從邏輯迴歸的基礎--線性迴歸開始。

 

1.線性迴歸

現在有如下圖所示的資料集D = \left \{ (x_{1},y_{1}),(x_{2},y_{2}),\cdots ,(x_{m},y_{m}) \right \}。線性迴歸(Linear Regression)試圖學習得一個線性模型儘可能準確地預測每一個x所對應真實值y的輸出標記。

machine learning tutorials

上圖中的黃色直線就是我們想要學習得到的模型,也叫假設函式(Hypothetical function):

                          h(x_{i})=wx_{i}+b ,使得 h(x_{i}) \simeq y_{i}                           (1)

有了假設函式,就可以得到損失函式,它是用來估量你模型的預測值f(x)與真實值y的不一致程度,即誤差。

我們只要確定好模型中的w和b,即可確定模型。如何確定w和b呢,這裡就要引入均方誤差的概念,採用均方差作為損失函式。 

均方誤差,也叫最小二乘法,是指真實值y和預測值f(x)之間的方差平均值,它是迴歸問題中最常用的效能度量,我們將用最小二乘法作為損失函式:

                                    J = \frac{1}{m}\sum_{i=1}^{m}(h(x_{i})-y_{i})^{2}

                                                    (2)

我們要讓式(2)均方誤差最小化,即

                                   (w^{*},b^{*}) = \arg min_{w,b}\sum_{i=1}^{m}(h(x_{i})-y_{i})^{2}

                                               =\arg min_{w,b}\sum_{i=1}^{m}(y_{i}-wx_{i}-b)^{2}                           (3)

 

這樣,問題就轉為求解w和b使得式(2)的變式:

                                  J_{(w,b))}=\sum_{i=1}^{m}(y_{i}-wx_{i}-b)^{2}                                            (4)

最小化的過程。這個過程也叫線性迴歸模型的最小二乘“引數估計”。

式(4)是關於w和b的凸函式,當它關於w和b的導數均為0時,得到w和b的最優解。這是偏導數的特性,大家應該都知道。

我們將式(4)分別對w和b求導,得到:

                                \frac{\partial E_{(w,b)}}{\partial w} = 2\left (\sum_{i=1}^{m}x^{2}_{i} -\sum_{i=1}^{m}(y_{i}-b)x_{i}\right )                             (5)

                               \frac{\partial E_{(w,b)}}{\partial b} = 2\left (mb -\sum_{i=1}^{m}(y_{i}-wx_{i})\right )                                  (6)

令式(5)和式(6)為零,即可得到:

                                w= \frac{\sum_{i=1}^{m}y_{i}(x_{i}-\bar{x})}{\sum_{i=1}^{m}x^{2}_{i}-\frac{1}{m}\left ( \sum_{i=1}^{m}x_{i} \right )^{2}}                                           (7)

                                     b=\frac{1}{m}\sum_{i=1}^{m}(y_{i}-wx_{i})                                                     (8)

式(7)中 \bar{x} 為x所有取值的均值。

更一般的,我們將x的每一個取值向量化,即:

                                              x_{i} = (x_{i1},x_{i2},\cdots ,x_{in})

則,線性迴歸模型可以寫為:

                                    \bg_white h(x_{i})=w^{T}x_{i}+b                                                            (9)

 

2.聯絡函式

真實環境下,線性模型是很難適用的,或者說,適用的場景很少。比如,y的取值是在指數尺度上的對映,它的函式關係為:

                                                     y = e^{w^{T}x+b}                                                            (10)

對於這樣的模型我們如何使用線性模型的思想去建模呢?這就需要在原來的線性模型的基礎上,做些函式對映即可。我們先將

式(10)兩邊做些等價變化,得到下式:

                                                \ln y = w^{T}x+b                                                         (11)

這樣一來,在形式上是不是跟線性模型就很像了,我們看到等式右邊就是我們上面提到的線性模型,仍可做線性迴歸。但實質上我們已經是在對輸入x到輸出y的非線性函式建模了。

所以,對於非線性模型,我們只要稍作對映就可以繼續採用線性迴歸的思維去求解。更一般地,對於非線性模型,令

                                              y = g^{-1}(w^{T}x+b)                                                         (12)

這樣就得到了廣義的線性模型。式(12)中的 g^{-1} 就是“聯絡函式”。對於式(10),它的的 g 函式就是 \ln 函式。

這就是為什麼我們要先介紹線性模型的原因,因為下面的邏輯迴歸也是基於線性迴歸的思想。這就是數學之美!

 

3.sigmoid函式

要說邏輯迴歸,必須先說下它的核心,sigmoid函式。

我們知道,線性迴歸模型是針對迴歸問題的,邏輯迴歸雖然它的名字裡有“迴歸”二字,但它卻是一個用於解決分類問題的演算法。

這裡我們考慮二分類問題。對於二分類問題,它的輸出 y 取值只有 0 和 1 兩種。y\in \left \{ 0,1 \right \}。這樣通過上面一節聯絡函式的介紹,大家應該知道,我們需要找到一個聯絡函式 g ,將線性迴歸模型的預測值,轉為 0 或者 1。最理想的函式是“單位階躍函式”,也稱做赫維賽德(Heaviside)函式。函式圖形如下:             

                                                    Dirac distribution CDF.svg

但由於它不是連續函式,所以無法用作 g 函式。有沒有圖形類似上圖,且單調可微的函式替代它呢?答案就是我們這節的主角,sigmoid函式,也叫對數機率函式(logistic function)。

Sigmoid函式的表示式為:

                                             y = \frac{1}{1+e^{-z}}                                                       (13)

它的函式圖形為:

                                                     

將sigmoid函式作為 g 函式帶入到式(12)中,得到:

                                        y = \frac{1}{1+e^{-(w^{T}x+b)}}                                                  (14)

這樣我們就可以看出,我們依舊是用線性迴歸模型去逼近真實的對數機率函式模型。類似於式(11),我們將式(14)做些變化,得到:

                                      \ln \frac{y}{1-y} = w^{T}x+b                                               (15)

如果我們把 y 看做是 x 為 1 的可能性,那麼1 - y 就是 x 為 0 的可能性。這兩者的比值就是“機率”。反應了 x 為 1 的相對可能性。對它們的比值取對數,就得到“對數機率”(log odds,也叫logit),這就是邏輯迴歸命名的由來。其實它跟邏輯兩個字根本不搭嘎(手動滑稽)。

所以邏輯迴歸的本質是概率。它可以得到y的預測值為0和1的概率,在sklearn中,通過邏輯迴歸建模,使用 predict_proba 方法可以看到0,1對應的概率。使用 predict 方法則以0.5為分界線,直接告訴你x對應的預測結果0還是1。

 

4.損失函式

在計算邏輯迴歸的損失函式之前,我們先做些準備工作。

我們先將線性部分的公式 w^{T}x+b 簡化為 \theta ^{T}x,如果你不知道為什麼能這麼寫,那就該補補線性代數的功課了。這樣一來我們的假設函式,就可以寫成:

                                     h_{\theta }(x) = \frac{1}{1+e^{-\theta ^{T}x}}                                                (16)

我們令:

                                         z = \theta ^{T}x                                                                (17)

                                    g(z) = \frac{1}{1+e^{-z}}                                                        (18)

則,我們的假設函式式(16)可寫成:

                                     h_{\theta }(x) = g(\theta ^{T}x)                                                       (19)             

這樣,我們按照第一節使用最小二乘的方式得到公式(20):

                              J(\theta ) =\frac{1}{m}\sum_{i=1}^{m}(h_{\theta }(x_{i}) - y_{i})^{2}                                     (20)

我們知道求解最優解是通過求導的方式。但由於在邏輯迴歸中,假設函式的形式如式(16)所示,它無法使用線性模型的這種方式求最優解。為什麼線性模型可以,邏輯迴歸就不行了呢。因為線性迴歸的最小二乘方程是個凸函式,而邏輯迴歸的不是。他兩的圖形如下,左圖為邏輯迴歸,右圖為線性迴歸:

 

既然使用傳統的最小二乘發無法求出最優解,我們就需要換種方法,重新寫個損失函式。

我們使用“極大似然法”來求最優解。使用極大似然法得到新的損失函式為:

                                  cost(h_{\theta }(x),y)= \right.-log(h_{\theta }(x)),y=1                               (21)

                                 cost(h_{\theta }(x),y)= \right.-log(1 -h_{\theta }(x)),y=0                         (22)

將式(21)(22)兩者合為一個完整的損失函式式(23):

                    cost(h_{\theta }(x),y)= -ylog(h_{\theta }(x)) - (1-y)log(1-h_{\theta }(x))          (23)

更一般的,針對所有訓練樣本,我們的損失函式為:

                      J(\theta )= \frac{1}{m}\sum_{i=1}^{m}cost(h_{\theta }(x_{i}),y_{i})    

         J(\theta)= -\frac{1}{m}\left [ \sum_{i=1}^{m}y_{i}log(h_{\theta }(x_{i})) + (1-y_{i})log(1-h_{\theta }(x_{i}))\right ]                (24)

有了損失函式,我們只要能找到 \theta,讓損失函式最小,就可以得到我們的假設函式 h_{\theta }(x),也就得到最終的邏輯迴歸模型。

通過不斷的更新 \theta 的值,讓損失函式不斷變小,直至最小的過程是一種最優化的過程。求解最優化問題的方法一般採用梯度下降法。

 

5.梯度下降法

梯度下降方法基於以下的觀察:如果實值函式 f(x) 在點 a 處可微且有定義,那麼函式 f(x) 在 a 點沿著梯度相反的方向 -\bigtriangledown f(a)下降最快。

因而,如果  \bg_white b=a - \eta \bigtriangledown f(a) ,對於 \bg_white \eta > 0 為一個夠小數值時成立,那麼  \bg_white f(b) \leq f(a) 。

考慮到這一點,我們可以從函式 f(x)  的區域性極小值的初始估計 x_{0}  出發,並考慮如下序列 x_{0},x_{1},x_{2}...x_{m}  使得

x_{n+1}=x_{n} - \eta \bigtriangledown f(x_{n}) ,因此可得到 f(x_{m}) \leq ...\leq f(x_{1})\leq f(x_{0}) 。

如果順利的話序列  \left ( x_{m} \right )  收斂到期望的極值。

下面的圖片示例了這一過程,這裡假設  f(x)  定義在平面上,並且函式影象是一個碗形。藍色的曲線是等高線(水平集),即函式  f(x)  為常數的集合構成的曲線。紅色的箭頭指向該點梯度的反方向。(一點處的梯度方向與通過該點的等高線垂直)。沿著梯度下降方向,將最終到達碗底,即函式 f(x)  值最小的點。

 

                                                    

 

6.梯度公式推導

通過第五節的介紹,我們知道要想讓損失函式找到最小值,只要求出損失函式,即式(24)的關於 \theta  的偏導數(也就是梯度),然後通過梯度,不斷更新 \theta 值,從而得到最優解(也就是損失函式的極小值點)。

按照第五節的介紹,我們寫出  \theta 的更新表示式為:

                                      \large \theta_{n+1} = \theta _{n} - \eta \bigtriangledown J\left ( \theta \right )

也就是:

                                      \large \theta_{j+1} = \theta _{j} - \eta \frac{\partial }{\partial \theta _{j}}J\left ( \theta \right )                                (25)

所以,到這裡,我們的工作就是對損失函式式(24)求關於  \theta  偏導數。

這是全部理論知識當中的難點也是煩點,有基礎的同學可以自行推導。下面是公式推導過程:

首先記下這幾個公式,第一個是損失函式,式(24),也就是我們要求導的物件:

J(\theta)= -\frac{1}{m}\left [ \sum_{i=1}^{m}y_{i}log(h_{\theta }(x_{i})) + (1-y_{i})log(1-h_{\theta }(x_{i}))\right ]

然後是假設函式, 式(16):

h_{\theta }(x_{i}) = \frac{1}{1+e^{-\theta ^{T}x_{i}}}

我們令 z = \theta ^{T}x,則式(16)可以寫成下式:

h_{\theta }(x) = \frac{1}{1+e^{-z}} = \frac{e^{z}}{1+e^{z}}                                              (26)

然後,為了讓數學公式看著不那麼嚇人,不那麼複雜,我們將式(24)中的所有下標省掉,將 前面的係數 -1/m 先省略,從而簡寫成式(27)的形式:

J(\theta)= ylog(h_{\theta }(x)) + (1-y)log(1-h_{\theta }(x))       (27)

將其展開:

J(\theta)= ylog(h_{\theta }(x)) - ylog(1-h_{\theta }(x)) + log(1-h_{\theta }(x))

將前兩項合併:

J(\theta)= ylog(\frac{h_{\theta }(x)}{1-h_{\theta }(x)}) + log(1-h_{\theta }(x))

按照式(26),將  h_{\theta }(x)   替換,得到:

J(\theta)= ylog(\frac{ \frac{e^{z}}{1+e^{z}} }{ 1-\frac{e^{z}}{1+e^{z}} }) + log(1-\frac{e^{z}}{1+e^{z}})

對於等式右邊的第一部分 log 函式裡的分子分母分別乘以  1+e^{z},等式右邊展開,得到

J(\theta)= ylog(\frac{e^{z}}{1+e^{z}-e^{z}}) + log(\frac{1+e^{z}-e^{z}}{1+e^{z}})

進一步化簡:

J(\theta)= ylog(e^{z}) + log(\frac{1}{1+e^{z}})

繼續化簡,注意中間的 '+' 號變為了 '-' 號,得到最終簡化的損失函式公式(28):

J(\theta)= yz- log(1+e^{z})                                                       (28)

對式(28)求導,得到求導式(29):

\frac{\partial J}{\partial \theta }= y\frac{\partial z}{\partial \theta }- \left [ log(1+e^{z}) \right ]{}'                                               (29)

在對簡化後的損失函式求導之前,先複習下梯度優化的精髓,鏈式法則。

鏈式法則鏈鎖定則(英語:chain rule),是求複合函式導數的一個法則。設 f 和 g 為兩個關於 x 的可導函式,則複合函式(f\circ g)(x)的導數(f\circ g)'(x)為:

(f\circ g)'(x)=f'(g(x))g'(x).

所以式(28)等式右邊的log函式的關於θ的導數為:

log(1+e^{z}){}' = \frac{1}{1+e^{z}}\cdot (1+e^{z}){}'\cdot \frac{\partial z}{\partial \theta }

進一步求導,得到:

log(1+e^{z}){}' = \frac{1}{1+e^{z}}\cdot e^{z}\cdot \frac{\partial z}{\partial \theta }

最後得到式(29):

log(1+e^{z}){}' = \frac{e^{z}}{1+e^{z}}\frac{\partial z}{\partial \theta }                                            (30)

將式(30)代入式(29),得到:

\frac{\partial J}{\partial \theta }= y\frac{\partial z}{\partial \theta }- \frac{e^{z}}{1+e^{z}}\frac{\partial z}{\partial \theta }

進一步化簡,得到:

\frac{\partial J}{\partial \theta }= (y- \frac{e^{z}}{1+e^{z}})\frac{\partial z}{\partial \theta }

由式(26),可進一步得到:

\frac{\partial J}{\partial \theta }= (y- h_{\theta }(x))\frac{\partial z}{\partial \theta }                                                      (31)

z = \theta ^{T}x,得到最後的導數為:

\frac{\partial J}{\partial \theta }= (y- h_{\theta }(x))x

由於開始我們為了方便,去掉了係數和小標,現在,將他們加上,得到最終的損失函式導數式(32):

\frac{\partial J}{\partial \theta }= \frac{1}{m} \sum_{i=1}^{m} (h_{\theta }(x^{i}) - y^{i})x^{i}                                      (32)

得到導數後,我們將它代入 θ 的更新表示式(25)中,從而得到最終的結果:

\large \theta_{j+1} = \theta _{j} - \frac{\eta }{m} \sum_{i=1}^{m} (h_{\theta }(x^{i}) - y^{i})x^{i}_{j}                                  (33)

有了式(33),下面我們就可以通過程式碼實現邏輯迴歸了,至此全文結束。

 

本文參考資料:

1.周志華,《機器學習》

2.吳恩達coursera教程,https://www.coursera.org/learn/machine-learning/home/welcome

3.維基百科