Table of Contents
機器學習自學筆記06: Logistic regression
前一篇講到Classification 分類, 今天就要來講Logistic regression ! 我們就從machine learning 的三個步驟開始吧!
Three Steps of machine learning
- step 1: Function set
這裡使用的function set 就是 Logistic regression!
wi: weight , b: bias , σ(z): sigmoid function
xi: input , P(C1|x): output (是一個機率)

- step 2: Goodness of a function
假設我們有一組training data: x1, x2,x3 … xN,並且知道它們的類別(C1, C2) 假設這筆training data 是從我們的function 所定義的posterior probability 所產生的,而w和b就決定了這個posterior probability ,所以就可以計算這組(w,b)產生N筆 training data 的機率。利用最大估計法,最好的參數就是使likelihood 值最大的最佳解。

經過一番整理之後,我們可以將要minimize的對象寫成下面的形式

這裡的X^n ,表示第一個樣本點,y^n表示第n個樣本點的class標籤,最終這個summation的形式,裡面其實是兩個Bernouli distribution的cross entropy(交叉熵),把f(X^n) & y^n 都當成Bernoulli distribution,兩者的cross entropy, 就是我們要minimize 的對象。
cross entropy的含意就是這兩個distribution 有多近,如果 p和 q 兩個distribution 一模一樣的話,那他們的 cross entropy 就是0。這裡的 f(X^n)就是function 的 output ,y^n 表示預期的target,因此 cross entropy 實際上表達的是希望這個function 的 output 和他的 target 越接近越好。

最後,我們要找的參數實際上就是 :

- step 3: find the best function
實際上就是去找到使 loss function(也就是cross entropy) 最小的那組 w* & b*,這裡用gradient descent 的方法進行運算就行了
這裡sigma function 的微分可以直接作為公式記下來: ∂σ(z)/∂z = σ(z)(1-σ(z)) ,sigma 和他的微分的圖像如下:

偏微之後,可以得到的式子如下,表示gradient descent 每次update 只需要做:

代表現在我們的update 取決於三件事情:
- learning rate η,是自己設定的
- xi: 來自data
- y^n-f(x^n) ,代表function的 output與理想的target的差異大小
如果離目標越遠,update 的步伐就要越大
Logistic Regression vs Linear Regression
在第二篇自學筆記中,有提到使用Linear regression的model 套用在 Machine Learning 的三個步驟。現在來比較Logistic regression 和 Linear regression 的不同。
- compare step 1
Logistic regression 是把每一個feature xi 加權相加,加上bias ,再通過sigma function,當作function 的output
因為Logistic 的output 是通過sigma function 產生的,因此一定是介於0~1之間;而linear regression 的output 可以是任何值 - compare step 2
Logistic regression 中,我們定義的loss function,即要去minimize 的對象,是所有樣本的output和實際target 在 Bernoulli distribution 下的 cross entropy總和
在Linear regression 中,loss function 的定義相對比較簡單,就是單純的function 的output 和實際target 在數值上的平方和的均值 - compare step3
Logistic regression 和 Linear regression 的wi update的方式是一模一樣的,唯一不一樣的是Logistic regression 的target 和output 都必須在0~1之間,而linear regression 的target 和output 的範圍可以是任意值

如果Logistic regression 的 loss function 使用square error?
假設現在第 n 個點的目標是class 1 (y^n=1),此時如果function 的 output f(x^n)=1的話,表示已經離target 非常接近,f(x^n)-y^n = 0,而 ∂L/∂w 就會變成0 ; 假設y^n=1 ,且f(x^n)=0 ,兩項相減=1,表示距離target很遙遠,而這時∂L/∂w也=0

如果我們把參數的變化對total loss 作圖的話,loss function 選擇 cross entropy or square error ,參數的變化跟loss 的變化情況如下圖顯示: (黑色的是cross entropy ,紅色是 square error)

假設中心點是我們的目標。可以發現cross entropy 比較有起伏一點,而square error 則相反。
Cross entropy在距離目標遠時,微分值大,參數update 的變化量也大,跨出去的步伐也大,就會比較快找到我們的目標。
若使用Square error 的話,有可能一開始就卡住了,不容易找到目標。
所以儘管square error 可以使用,但是會非~ 常~ 慢 ~~
Discriminative vs Generative
logistic regression 的方法,我們把它稱之為 Discriminative ;
之前用gaussian 來描述posterior probability 這件事,我們稱之為 Generative

實際上他們兩個使用的model(function) 是一樣的。
Logistic regression可以用gradient descent 的方法直接把b 和 w 找出來;如果用Generative model 的話,我們要先去算 u1\u2\Σ ,然後算出b 和 w
而兩個方法找出的b 和 w是不一樣的。就算我們的function set 是同一個,但是做了不同的假設,所以同樣training data 找出的參數會是不異樣的
在Logistic regression 中,我們沒有做任何實質性假設,沒有對probability distribution 有任何描述,只是單純的找b 和 w
而在Generative model 裡面,我們對probability distribution有實際性的假設。之前是假設Gaussian,甚至假設在相互獨立的前提下是否可以是naive bayes ,根據這些假設我們最終才找到b 和 w
哪一個假設的結果是較好的呢? 下圖是兩個的結果

實際上Discriminative 的方法常常會比Generative 的方法表現的較好,下面舉一個例子:
toy exmaple
假設總共有兩個class ,training data 如下: 每一筆 data 有兩個feature , 總共有13筆data
如果現在有一組testing data ,兩個feature 都是1 ,憑直覺來說他肯定是class1 ,但是若用naive bayes 的方法,得到的結果如何呢?

通過naive bayes 的結果竟然這筆testing data 屬於class 2 的可能性更大,這跟我們的直覺相反。
對naive bayes 來說,他是不考慮不同dimension之間的correlation ,naive bayes 認為在dimension相互獨立的前提下,class 2 沒有sample 出都是1 的 data , 因為sample 的數量不夠多,如果sample 夠多,他認為class 2 觀察到都是1的data 可能性會比class 1要大
因為naive bayes 認為從class 2 中找到樣本點 x 的機率是 x 中第一個feature 出現的機率與第二個feature 出現的機率的乘積 : P(x|C2)=P(x1=1|C2) * P(x2=1|C2) ;但是直覺告訴自己,兩個feature 之間肯定有某種關聯,P(x|C2)不能夠這麼輕易的被拆分成兩個獨立的機率乘積,也就是: Naive bayes 自做聰明的多設了一些條件
所以Discriminative model 和Generative model 的差別就在於 :
Discriminative model 是完全不做任何假設的
Generative model則假設你的data來自某個機率模型
Generative model 做的事情就是腦補,他會自己去想像一些事情,於是與我們天然的想法不太一樣。就像在toy example 裡,我們做了naive bayes 這樣一個假設(事實上我們並不知道這兩個feature 是否相互獨立),於是naive bayes 會在class 2 裡並沒有出現兩個feature 都是1的樣本點的前提下,自己去腦補這樣的點
通常腦補不是一件好事,因為你給你的data強加了一些他沒有告訴你的屬性,但是! 在data 很少的情況下,腦補也是有用的。
discriminative model並不是在所有的情況下都可以贏過generative model
discriminative model 是十分依賴data的,而 generative model 可以在data數量不足或資料本身的label有一些問題時,對資料做假設,反而能將資料不足的問題降低
Discriminative vs Generative 兩種方法的比較
關於分類的問題(主要二元分類),我們一般有兩種方法處理問題:
Discriminative & Generative ,注意到分類的model都是從bayes 出發的 :

- Discriminative
不會做任何假設,因此無法通過假定的probability distribution 得到P(x|Ci)的表達是,因此使用的是(2),直接利用cross entropy 和 gradient descent 結合maximum likelihood 得到最佳的b & w 解,以確定model 的具體形式
Discriminative的優點在於: 在data 充足的情況下,他訓練出來的model的準確率一般是比generative model 來得高 - Generative model
Generative model 會假設一個帶參數的probability contribute ,利用這個假設的機率分布函數帶入(1)中去計算P(x|Ci)&P(x|Cj) ,結合maximun likelihood 估計法最終得到最樣的參數以確定這個Model 的具體形式
Generative 的好處是: 它對data的依賴並沒有像Discriminative這麼嚴重,在data數量少 或是data本身就存在noise的情況下受到影響會更小,它還可以做到prior 部分與class-dependent 部分分開處裡,如果可以借助其他的方式提高prior model 的準確率,對整一個model是有所幫助的。
Multi-class Classification
softmax
之前都提到二元分類的情況,這裡討論多元的分類問題,其原理的推倒過程與二元分類基本一致
假設有三個class : C1、C2、C3,每一個class 都有自己的weight 和 bias ,這裡w1、w2、w3代表三個vector ,而b1、b2、b3分別代表三個const,input x 也是一個vector (zi=wi*x+bi ,i=1、2、3)
softmax 的意思是對最大值做強化,因為在做第一步的時候,對 z 取 exponential 會使最大和最小值得差距拉得更開,也就是強化大的值
我們把z1、z2、z3丟進一個softmax 的function , softmax 做得事情是這樣三步
- 取exponential ,得到exp(z1)、exp(z2)、exp(z3)
- 把三個exponential 相加,得到total sum
- 將total sum 分別除去這三項

原來的output z 可以是任何值,但是做完softmax ,你的output會限制住,output yi 的值一定是介於0~1之間,並且相加為一。以上圖為例,yi表示input x 屬於第 i 個 class 的機率,比如屬於C1的機率是 y1=0.88,屬於C2的機率是 y2=0.12,屬於C3的機率是 y3=0
而softmax 的output,就是拿來當z 的posterior probability
multi-class classification 的過程 :
在input x 經過三個是式子分別生成z1、z2、z3,經過softmax 轉化成output y1、y2、y3,他們分別是這三個class 的posterior probability ,因為 Σy = 1 所以可以直接將y當作是probability contribution 。
我們在training 的時候還需要有一個target , 因為是三個class ,output 是三維的,對應的target也是三維的,為了滿足cross entropy 的條件,target y 也必須是 probability distribution,這裡我們不能使用1、2、3 作為class 的區分,為了保證所有class 之間的關係是一樣的,這裡使用類似於one-hot 編碼的方式 (下圖底下)

這時候就可以計算一下output y和 target y 之間的 cross entropy (= Σyi lnyi ),同二元分類一樣,多元酚類問題也是通過maximum likelihood 得到最終的 cross entropy 表達式,這裡不再贅述。
Limitation of Logistic Regression
Logistic regression 其實有很強的限制,比如說下面的data,若要用logistic regression 分類,其實是做不到的。因為logistic regression 的boundary 就是一條直線,但是在這個平面上怎麼分都無法將兩個class 分開

Feature Transformation
如果堅持要用logistic regression 的話,有一招就做 Feature transformation ,原本的feature 分布不好劃用,那經過轉化之後,找一個比較好的feature space ,讓logistic regression能夠處理
假設新的x1′ 是原本的點到 [ 0, 0] 的距離,x2′ 是原本的點到 [ 1, 1] 的距離,重新映射之後如下圖右側(紅色兩點重疊),此時就可以用Logistic regression 來分類

但麻煩的是,我們並不知道怎麼做feature transformation,如果在這上面花費太多時間就得不償失了,於是我們會希望這個 Transformation是機器自己產生的,怎麼讓機器自己產生呢? 我們可以讓很多 Logistic regression cascade (連接)起來
我們讓一個input x 的兩個feature x1、x2 經過兩個logistic regression的 transform ,得到新的feature x1’、x2′ ,在這個新的feature space 上, class 1 和 class 2 是可以用一條直線分開的,那麼最後只要再接上另外一個logistic regression 的 model ,根據最新的feature ,就可以將 class 1 和 class 2分類

因此這整個流程是,先用n個 logistic regression 做feature Transformation(n 為每個樣本點的feature數量) ,生成 n 個新的feature,最後再用一個logistic regression做分類
下圖是二維feature 的例子,分別表示四個點經過transformation之後的 x1’、x2’,在新的feature space 中可以通過最後logistic regression分類

注意,這個的Logistic Regression只是一條直線,它指的是“屬於這類”或“不屬於這類”這兩種情況,因此最後的這個Logistic Regression是跟要檢測的目標類相關的,當只是二元分類的時候,最後只需要一個Logistic Regression即可,當面對多元分類問題,需要一到多個Logistic Regression來劃出多條直線劃分所有的類
Powerful Cascading Logistic Regression
通過上面的例子,我們發現,多個 Logistic Regression連接起来会產生powerful的效果,我們把每一個 Logistic Regression叫做一個 neuron(神經元),把這個Logistic Regression串起來所形成的 network,就叫做Neural Network,就是類神經網路,這個東西 就是Deep Learning!

筆記參考 :https://github.com/Sakura-gh/ML-notes/blob/master/ML-notes-pdf/7_Logistic%20Regression.pdf