機器學習:邏輯迴歸詳細推導
如今機器學習、深度學習可謂炙手可熱,人工智慧也確實開始影響、改變著我們的生活。正因如此,很多同學開始接觸或者學習這方面的知識。機器學習的入門是有難度的,因為它不僅要求你會編碼,還要你熟悉高等數學,比如線性代數,微積分等,除此之外,還要懂統計學。如果你想入門機器學習,那麼一定要好好學習邏輯迴歸。原因如下:
1.邏輯迴歸可以幫你更好地理解機器學習;
2.邏輯迴歸已經可以解決多數問題了;
3.邏輯迴歸是統計學習的重要工具;
4.邏輯迴歸是神經網路的基礎;
下面開始我們的正文,在正式介紹邏輯迴歸前,我們先從邏輯迴歸的基礎--線性迴歸開始。
1.線性迴歸
現在有如下圖所示的資料集。線性迴歸(Linear Regression)試圖學習得一個線性模型儘可能準確地預測每一個x所對應真實值y的輸出標記。
上圖中的黃色直線就是我們想要學習得到的模型,也叫假設函式(Hypothetical function):
,使得 (1)
有了假設函式,就可以得到損失函式,它是用來估量你模型的預測值f(x)與真實值y的不一致程度,即誤差。
我們只要確定好模型中的w和b,即可確定模型。如何確定w和b呢,這裡就要引入均方誤差的概念,採用均方差作為損失函式。
均方誤差,也叫最小二乘法,是指真實值y和預測值f(x)之間的方差平均值,它是迴歸問題中最常用的效能度量,我們將用最小二乘法作為損失函式:
我們要讓式(2)均方誤差最小化,即
(3)
這樣,問題就轉為求解w和b使得式(2)的變式:
(4)
最小化的過程。這個過程也叫線性迴歸模型的最小二乘“引數估計”。
式(4)是關於w和b的凸函式,當它關於w和b的導數均為0時,得到w和b的最優解。這是偏導數的特性,大家應該都知道。
我們將式(4)分別對w和b求導,得到:
(5)
(6)
令式(5)和式(6)為零,即可得到:
(7)
(8)
式(7)中 為x所有取值的均值。
更一般的,我們將x的每一個取值向量化,即:
則,線性迴歸模型可以寫為:
(9)
2.聯絡函式
真實環境下,線性模型是很難適用的,或者說,適用的場景很少。比如,y的取值是在指數尺度上的對映,它的函式關係為:
(10)
對於這樣的模型我們如何使用線性模型的思想去建模呢?這就需要在原來的線性模型的基礎上,做些函式對映即可。我們先將
式(10)兩邊做些等價變化,得到下式:
(11)
這樣一來,在形式上是不是跟線性模型就很像了,我們看到等式右邊就是我們上面提到的線性模型,仍可做線性迴歸。但實質上我們已經是在對輸入x到輸出y的非線性函式建模了。
所以,對於非線性模型,我們只要稍作對映就可以繼續採用線性迴歸的思維去求解。更一般地,對於非線性模型,令
(12)
這樣就得到了廣義的線性模型。式(12)中的 就是“聯絡函式”。對於式(10),它的的 g 函式就是 函式。
這就是為什麼我們要先介紹線性模型的原因,因為下面的邏輯迴歸也是基於線性迴歸的思想。這就是數學之美!
3.sigmoid函式
要說邏輯迴歸,必須先說下它的核心,sigmoid函式。
我們知道,線性迴歸模型是針對迴歸問題的,邏輯迴歸雖然它的名字裡有“迴歸”二字,但它卻是一個用於解決分類問題的演算法。
這裡我們考慮二分類問題。對於二分類問題,它的輸出 y 取值只有 0 和 1 兩種。。這樣通過上面一節聯絡函式的介紹,大家應該知道,我們需要找到一個聯絡函式 g ,將線性迴歸模型的預測值,轉為 0 或者 1。最理想的函式是“單位階躍函式”,也稱做赫維賽德(Heaviside)函式。函式圖形如下:
但由於它不是連續函式,所以無法用作 g 函式。有沒有圖形類似上圖,且單調可微的函式替代它呢?答案就是我們這節的主角,sigmoid函式,也叫對數機率函式(logistic function)。
Sigmoid函式的表示式為:
(13)
它的函式圖形為:
將sigmoid函式作為 g 函式帶入到式(12)中,得到:
(14)
這樣我們就可以看出,我們依舊是用線性迴歸模型去逼近真實的對數機率函式模型。類似於式(11),我們將式(14)做些變化,得到:
(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.損失函式
在計算邏輯迴歸的損失函式之前,我們先做些準備工作。
我們先將線性部分的公式 簡化為 ,如果你不知道為什麼能這麼寫,那就該補補線性代數的功課了。這樣一來我們的假設函式,就可以寫成:
(16)
我們令:
(17)
(18)
則,我們的假設函式式(16)可寫成:
(19)
這樣,我們按照第一節使用最小二乘的方式得到公式(20):
(20)
我們知道求解最優解是通過求導的方式。但由於在邏輯迴歸中,假設函式的形式如式(16)所示,它無法使用線性模型的這種方式求最優解。為什麼線性模型可以,邏輯迴歸就不行了呢。因為線性迴歸的最小二乘方程是個凸函式,而邏輯迴歸的不是。他兩的圖形如下,左圖為邏輯迴歸,右圖為線性迴歸:
既然使用傳統的最小二乘發無法求出最優解,我們就需要換種方法,重新寫個損失函式。
我們使用“極大似然法”來求最優解。使用極大似然法得到新的損失函式為:
(21)
(22)
將式(21)(22)兩者合為一個完整的損失函式式(23):
(23)
更一般的,針對所有訓練樣本,我們的損失函式為:
(24)
有了損失函式,我們只要能找到 ,讓損失函式最小,就可以得到我們的假設函式 ,也就得到最終的邏輯迴歸模型。
通過不斷的更新 的值,讓損失函式不斷變小,直至最小的過程是一種最優化的過程。求解最優化問題的方法一般採用梯度下降法。
5.梯度下降法
梯度下降方法基於以下的觀察:如果實值函式 在點 a 處可微且有定義,那麼函式 在 a 點沿著梯度相反的方向 下降最快。
因而,如果 ,對於 為一個夠小數值時成立,那麼 。
考慮到這一點,我們可以從函式 的區域性極小值的初始估計 出發,並考慮如下序列 使得
,因此可得到 。
如果順利的話序列 收斂到期望的極值。
下面的圖片示例了這一過程,這裡假設 定義在平面上,並且函式影象是一個碗形。藍色的曲線是等高線(水平集),即函式 為常數的集合構成的曲線。紅色的箭頭指向該點梯度的反方向。(一點處的梯度方向與通過該點的等高線垂直)。沿著梯度下降方向,將最終到達碗底,即函式 值最小的點。
6.梯度公式推導
通過第五節的介紹,我們知道要想讓損失函式找到最小值,只要求出損失函式,即式(24)的關於 的偏導數(也就是梯度),然後通過梯度,不斷更新 值,從而得到最優解(也就是損失函式的極小值點)。
按照第五節的介紹,我們寫出 的更新表示式為:
也就是:
(25)
所以,到這裡,我們的工作就是對損失函式式(24)求關於 偏導數。
這是全部理論知識當中的難點也是煩點,有基礎的同學可以自行推導。下面是公式推導過程:
首先記下這幾個公式,第一個是損失函式,式(24),也就是我們要求導的物件:
然後是假設函式, 式(16):
我們令 ,則式(16)可以寫成下式:
(26)
然後,為了讓數學公式看著不那麼嚇人,不那麼複雜,我們將式(24)中的所有下標省掉,將 前面的係數 -1/m 先省略,從而簡寫成式(27)的形式:
(27)
將其展開:
將前兩項合併:
按照式(26),將 替換,得到:
對於等式右邊的第一部分 log 函式裡的分子分母分別乘以 ,等式右邊展開,得到
進一步化簡:
繼續化簡,注意中間的 '+' 號變為了 '-' 號,得到最終簡化的損失函式公式(28):
(28)
對式(28)求導,得到求導式(29):
(29)
在對簡化後的損失函式求導之前,先複習下梯度優化的精髓,鏈式法則。
鏈式法則或鏈鎖定則(英語:chain rule),是求複合函式導數的一個法則。設 f 和 g 為兩個關於 x 的可導函式,則複合函式的導數為:
所以式(28)等式右邊的log函式的關於θ的導數為:
進一步求導,得到:
最後得到式(29):
(30)
將式(30)代入式(29),得到:
進一步化簡,得到:
由式(26),可進一步得到:
(31)
由,得到最後的導數為:
由於開始我們為了方便,去掉了係數和小標,現在,將他們加上,得到最終的損失函式導數式(32):
(32)
得到導數後,我們將它代入 θ 的更新表示式(25)中,從而得到最終的結果:
(33)
有了式(33),下面我們就可以通過程式碼實現邏輯迴歸了,至此全文結束。
本文參考資料:
1.周志華,《機器學習》
2.吳恩達coursera教程,https://www.coursera.org/learn/machine-learning/home/welcome
3.維基百科