機器學習基石系列(7) — 羅吉斯回歸和機器學習的基本元素

Martin Huang
機器學習系列
Published in
Mar 17, 2021

這篇是討論機器學習基石裡面舉的第二個線性模型 — 羅吉斯回歸(logistic regression),並用以介紹一些機器學習裡面,甚至是深度學習裡常運用的概念。就我的想法,林教授在講解這幾個單元時,主軸並非是介紹這些模型的運算、原理,而是用它們使機器學習的概念更具體,並藉此引申一些相關的知識。

當然,這些模型本身也是相當好用的,但說實在的,如果是學統計的人,必定對這些方法也相當熟悉。何必非用機器學習的角度切入不可?教材的安排,必然有其用心之處。

羅吉斯回歸

Soft binary classification

先回到最早在講二元分類的時候,target function將所有的輸入投射到兩種輸出:+1/-1,這是「硬性」(沒有彈性)的歸類。如果現在把target function的輸出做一點調整,不再是強制要求侷限在+1/-1,而是在某個區間(0~+1),然後再根據其偏向哪邊,做進一步的分類,這樣的方式就稱作「軟性」(保留一點彈性)歸類(soft binary classification)。

例如:根據病人的資料評估某個疾病發生的風險。是否得到疾病,是一個二元分類的題目;在得到或不得到疾病的條件下有多少風險(機率),就是一個soft binary classification。

理想的狀況是資料輸出標記就在0~+1之間,這樣在不考慮雜訊的情況下,直接找h就可以了。實際上輸出的資料還是會比較像二元分類,有一個陰性/陽性的結果。可以把這個結果想成抽樣的結果:例如第一筆資料結果是陽性(+1/○),而理想的資料裡我們要的數值可能是0.9,則可以看成在這筆資料上,用0.9的機率抽樣了一次,得到的是○。下一筆資料在理想的資料裡數值是0.2,而結果是陰性(0/╳),表示用0.2的機率抽樣,結果是╳。這樣看來,理想的資料就是p(+1|x),而實際的資料是p(y|x)。如此一來,y成為了一個有分布的狀態,我們也可以說,這是一個「有雜訊」的資料。

理想的資料型態和實際拿到的資料型態。出處:林軒田<機器學習基石>,第10講,第38段,第4張

像這樣,我們希望得到的是一個區間的輸出(例如機率,落在0~1之間),但拿到的資料卻是二元分類的結果,要怎麼找到好的target function?

羅吉斯函數

從前面一路過來,我們知道首先是萃取特徵。把一項項的資料輸入歸納成特徵,x_1, x_2, … , x_n,然後最前面再加個常數項x_0,這101招已經做得很熟練了。接著熟練的第二招就是乘上權重加在一起,所以我們再找一組w=w_0, w_1, w_2, … , w_n,相乘相加得到

在這裡把它稱作加權的風險分數(weighted ”risk score”),因為我們最後是要評估風險嘛。做到這裡,如果直接輸出就是線性回歸了,所以這還不是我們要的;我們要把它轉換成一個區間值。s越大,風險越大;反之越小。這裡使用一個函數,把所有的值轉到相對應0~1的區間之中:θ(s)。

圖1. 。出處:林軒田<機器學習基石>,第10講,第38段,第5張

經過轉換得到的數值可以視為機率,即estimated probability(預測機率),而θ,就是羅吉斯函數(logistic function)。則我們要找的target function,會從logistic hypothesis中挑選:

θ最常使用的式子如下:

隨著s越大,θ值越接近1。s越小,θ值越接近0。經過代換,我們要追求的是

這是一條平滑,全段可微分,乙狀形的曲線。最後要逼近的target function是二元的p(y|x)。

錯誤評估 — cross entropy error

理想的資料裡,target function f(x)是p(+1|x)。在實際拿到的資料中,y是+/-1,所以如果y=+1,p(y|x)=f(x);若y=-1,則p(y|x)=1-f(x),因為在機率的區間裡,二元分布的機率,其和為1。

有一群資料D,其輸入對應輸出依序是{(x_1,○), (x_2, ╳), … , (x_n, ╳)}。這組資料是如何產生的?如果放到一個大群體來看,也是抽樣出來的。所以我們先有一個機率抽到第一筆資料x_1,其機率為p(x_1)。接著抽到的結果,因為是雜訊也有分布,其機率為p(y|x_1),或者,在這裡是p(○|x_1)。所以,要產生第一筆資料,其機率為p(x_1)×p(○|x_1)。同理,第二筆資料產生的機率為p(x_2)×p(╳|x_2)。則,同時產生這兩筆資料的機率就是全部乘在一起了:p(x_1)×p(○|x_1)×p(x_2)×p(╳|x_2)。推廣到整組資料,產生出這組資料的機率為p(x_1)×p(○|x_1)×p(x_2)×p(╳|x_2)×…p(x_n)×p(╳|x_n)。

接著把○視為y=+1,所以p(y|x)=f(x);╳視為y=-1,所以p(y|x)=1-f(x)。整組資料產生的機率為p(x_1)×f(x_1)×p(x_2)×(1-f(x_2))×…×p(x_n)×(1-f(x_n))。為什麼要這樣換?因為如果有一個h(x),它能產生這組資料,那理論上f(x)也能產生出來。所以,如果達到這個情況,我們可以說h(x)接近f(x),學習的目標達成。h(x)和f(x)之間的落差就是我們要評估的錯誤。

怎麼找到這個h(x)?從學習的角度來說,越容易產生這組資料的h(x),越有可能是f(x)吧?因為,如果連這組資料都產生不出來,就更難知道資料外的世界,它能不能預測得到。所以,產生這組資料的機率最大的h(x)就是目標。

在這裡要運用羅吉斯函數的一個特性:對稱性。從圖1.可以知道,函數的形狀對應其值是有對稱性的;是一種點對稱。1-f(x)的值,剛好等於 f(-x)。利用這個性質改寫機率的式子,得到

在h之間比較時,p(x_1)、p(x_2)、…、p(x_N)不重要,因為大家用的都是這一組資料。所以差異只在h(x_1)、h(x_2)、…、h(x_N)。我們可以說,h產生資料的機率正比於每一項h(輸出),或者說,h(x_Ny_N)。y_N可為+/-1。而

代換之後,得到

在前面處理二元分類,或線性回歸時,我們常用的是連加。另外,我們比較常做的是求最小值(E_in),而非最大值。所以,這邊用兩個數學方法把它轉變乘我們熟悉的操作方式:

  1. 取對數,讓連乘變連加。此外,為了微積分方便,選用自然對數ln。
  2. 前面加個負號,最大值就變最小值了。

於是整理之後的式子如下:

然後

代換掉θ,得到

式1. cross entropy error

ln括弧內的項可以寫為err(w, x_n, y_n)。這是一種針對每個資料點評估錯誤的方式。它有個鼎鼎大名的名字,即使在現在的深度學習也很常用這個損失函數,叫做 — cross entropy error

梯度和步長,以及學習速率

進一步要求cross entropy error的最小值。先講結論:這是一個凸函數。這應該是要證明的,不過因為我們還要用這個概念來接續後面的重點,所以這裡先略過,等之後有機會再補充。

凸函數的特性是:曲線平滑,可微分,可二次微分,且二次微分之後得到的矩陣為一正定矩陣。這邊我們要求函數的極值,只要用到一階導數就可以了。極值的位置,一階導數為0。一階導數就是切線斜率,或者在這裡,如果把函數曲線視為一段階梯,那切線斜率就是某個步階的高度 — 梯度。

圖2. 梯度

但這個式子組成有點複雜,即使是一階導數也不是很好處理。我們把它分成幾個部分來看:首先是自然對數裡面的真數區,1+exp(-y_nw^Tx_n),把它用□代替。然後把自然指數裡的-y_nw^Tx_n又獨立成一區,用○表示。接著就要用微積分裡最常使用的老把戲 — 鏈鎖率出來了:

在第一行中,先是用□,然後再用○代換。第二行,巧妙利用自然對數和自然底數在微分的特性計算結果。第三行做個整理,然後發現就是我們的主角,θ。把x_n,i堆起來可以得到一個向量x_n,把它整理一下,得到

式2.

是我們微分之後得到的結果。整個式子可以看成經過θ函數加權,然後相加曲平均的概念。要為0,有兩個狀況:

  1. θ函數為0。看看圖1.,什麼時候有機會?就是-y_nw^Tx_n很小的時候(負很多),也就是y_nw^Tx_n很大的時候(正很多)。這表示y和wx必須同號,裡面的每一項都要同號。也就是說,資料線性可分的時候,對吧?我們在二元分類,要做的就是找到一個h,其內的w和x相乘之後和y同號。這就是線性可分的時候。
  2. 加權總合為0。但w是一個非線性方程式。

我們換個想法,不直接去找w讓加權總合為0的值,而用替換的 — 就像在二元分類器,找w時的作法一樣。wx若和y同號就保持;如果不同號,就+y_nx_n取代原本的w。這個流程,我們可以寫成

的樣子。其中

是提供改變w的方向,我們給他一個變數v代替;另外在它前面我們乘一個1,表示改變的速度,給一個變數叫η。這樣,調整v和η,我們可以組合出新的演算法;但不管是怎麼調整,一定是逐步看過資料之後調整的,不會是憑空亂跳。所以這種遍歷資料以調整演算法的方式,就稱作iterate optimization approach。我們在把它寫清楚一點:

式3.

為了方便計算,我們把方向盤v和油門η再訂得更清楚一點:v只負責控制方向,不管速率的,所以v的範數是1。η呢,不管方向,只管邁開的步長,或油門催的大小,所以預設其值為正,以免混入方向性。據此,可以把式2換個觀念來表示:我們要追求的,其實是

式4.

不過這仍無損於w是一個非線性方程式的事實。除此之外,還多了一個ηv,更棘手了。沒關係,我們把曲線放大。當η夠小時,曲線的極小片段可以視為一條直線,就可以用線性的方式處理了:

某個點就是附近的點加上斜率乘以點跟點之間的x距離。這邊是多維空間,但意思是類似的。斜率就是梯度,而「x距離」是變數ηv。把這個概念代到式4去:

其中E_in(w_t)、η和梯度是已知,或者說我們可以設定的。所以最關鍵的剩下v而已。或者,我們用追求「v乘以梯度」的最小值來看看:v是一組向量,梯度也是向量,兩個向量內積的最小值,就是方向相反的時候。這樣我們就知道v可以用什麼來代換了:

從直觀上也不難理解,我們要逆著現在的梯度方向前進,才會來到最小值區。

w更新的方法為

式5. 梯度下降法

這種方法就是赫赫有名的梯度下降法(gradient descend)。

再回來看看η吧。剛剛說,梯度下降的前提是η夠小,不然如果一步跨太大出去,掉到哪裡都不知道,說不定反而爬上去了呢。但η小的問題很明顯:要花很長的時間更新w。有沒有什麼方法可以調整呢?有。讓η不是定值:在梯度大的時候就用大的值邁開步伐走,等到梯度開始趨緩時再用小碎步謹慎前進。這時的η和

成比例關係。那可以把這個比例關係代回梯度下降法:

式6. 學習速率的梯度下降

菱形就是這個比例關係。它又叫做學習速率(learning rate),其實在深度學習裡,它才是常被寫作η的那個。這裡因為要和原本已經給予步長的η做區隔,選用另一個符號表示,以說明他們是不一樣的東西。

總結

羅吉斯回歸的演算法流程:

  1. 先設定起始w_0。
  2. 對於每一筆資料,計算式2.求梯度。
  3. 利用式6.梯度更新,直到梯度為0,趨近0,或達到足夠的步數。什麼時候才夠?沒有一定。

以上是羅吉斯回歸的介紹,並趁此說明了cross entropy error、梯度、梯度下降、步長、學習速率等等在機器學習,乃至於深度學習都被廣泛運用的概念。羅吉斯回歸不像線性回歸有個「公式解」,而必須逐步推進,更有學習的感覺,應該不會再被懷疑它不是一種機器學習方法了吧!

下一篇,我們要用到目前為止學到的演算法處理線性問題。

--

--

Martin Huang
機器學習系列

崎嶇的發展 目前主攻CV,但正在往NLP的路上。 歡迎合作或聯絡:martin12345m@gmail.com