在上篇博客中提到,如果想要擬合一些空間中的點,可以用最小二乘法,最小二乘法其實是以樣例點和理論值之間的誤差最小作為目標。那么換個場景,如果有兩類不同的點,而我們不想要擬合這些點,而是想找到一條直線把點區分開來,就像下圖一樣,那么我們應該怎么做呢?這個是一個最簡單的分類問題。
- 隨機給定 w, b
- 找到當前這條直線 \(ax_{1}+bx_{2}+c=0\) 的情況下,找到所有分錯的點(x_no,y_no)
- 把直線寫作矩陣的形式:\(wx+c=0\),其中\(w=(w_{1},w_{2})\), \(x=(x_{1},x_{2})^ \mathrm{ T }\),然后通過找到的誤分點用梯度下降法進行參數調優。
\(\frac{\partial L(w, b)}{\partial w}=\sum_{i=1}^{n} y_{i}x_{i}\)
\(\frac{\partial L(w,b)}{\partial b}=\sum_{i=1}^{n} y_{i}\)
\(w:=w+\alpha*\sum_{i=1}^{n} y_{i}x_{i}\)
\(b:=b+\alpha*\sum_{i=1}^{n} y_{i}\)
其中 \(\alpha\) 是學習率。 - 重復 2, 3 步。直到找不到錯分的點或者到達迭代上限為止。
經過實驗發現這種目標函數收斂比平方的那個的要快,而且對於點剛好在直線上時,平方法中求出來的 a, b 的梯度都是 0,就無法處理了,所以只能認為剛好在直線上也是分對了。而這種方法由於有 \(y_{i}\) 的先驗知識,b 的梯度至少不會是0,可以處理這種情況。當然還可以用點到直線的距離來代替用來計數的函數:, 同樣用 \(y_{i}\) 去絕對值,但是沒有必要,徒增了很多復雜度。
如果初始值是線性不可分的,就會出現不收斂,一直在交叉的點之間震盪的情況。
這個就是傳說中的感知機算法,這里的例子都是二維的,但是對於多維的情況也是一樣的。無非就是直線變成一個超平面 $wx+b=0 ,x = (x0,x1,...,xn), w = (w0,w1,...,wn) $了。感知機算法本身還有很多內容,比如如何證明算法是收斂的,用對偶方法提高速度等等,這些跟主線無關~,以后再寫吧。
感知機算法雖然能夠將線性可分的數據集區分開,但是比較沒追求...只要能找到一條能把兩類點完全分開的直線就滿足了。但是這樣的直線是有無窮多條的,我們希望能根據訓練數據找到一條“最優”的,這樣有利於算法的泛化能力,也更加充分的利用了數據的信息。比如下圖:
而感知機中用的是階躍函數,相對比較粗糙。
其中用 sigmoid 函數作為激活函數的就算法就叫 logistic 回歸了,也是最常用的。sigmod 函數在 x > 0 的時候 y > 0.5, x< 0 的時候 y<0.5。這樣函數就能與 0.5 進行比較,從而自動識別出點是否分對,以及分對(或分錯)的程度了。
那么這個怎么轉化為需要最大化的目標函數呢?其實這個還是用直線進行划分,我們還是假設 {a, b} 兩類,其中讓 a 類帶入直線大於 0, b 類小於零(之前已經解釋,這樣做是沒有問題的) 那么對於某個點,如果它是 a 類,我們就讓 p 盡量大 ,如果是 b 類我們是要讓 1 - p 盡量大。把這個目標寫成式子就是:對於某個點,我們要 \((y_{i} - a) p_{i} + (y_{i} - b) (1 - p_{i})\) 盡量大。為了方便,我們就取 a、b 為 0, 1,式子就變成 $y_{i}p_{i} + (y_{i} - 1) (1 - p_{i}) $了。所以對於整個數據集目標就是最大化 \(\sum y_{i}p_{i} + (y_{i} - 1)(1-p_{i})\)。可以對它直接求偏導進行參數優化。在最優化問題的,一般習慣上喜歡最小化某個函數,而那個函數就叫損失函數。所以這里可以把 \(-\sum y_{i}p_{i} + (y_{i} - 1)(1-p_{i})\)作為損失函數,要讓它最小。這樣做是沒問題的,但是比較朴素,效果也不好。
其實對於 sigmoid 函數而言,它已經把最后的輸出值限制在 [0, 1] 的范圍內,並且是以 0.5 為界。那么我們就可以把輸出值看做一個概率,把分對、分錯的程度(確信度)用一個概率值表示出來當分對的概率大於 0.5 的時候,我們就可以認為確實分對了。這樣就有很多更好的損失函數的公式可以直接用進來,比如交叉熵,極大似然估計等。
比如用交叉熵,交叉熵的公式是:\(H(p,q)=-\sum_{x} p(x)logq(x)\),其中p(x)表示訓練樣本的標簽,q(x) 表示模型預測的值,它其實是衡量了預測的值的分布和真實標簽分布之間的距離,具體參看 wiki 百科。
這里帶入交叉熵公式得到的損失函數是:$-\sum_{i=1}^{n} y_{i}p(x_{i}) + (y_{i} - 1)(1-p(x_{i})) $ 其中 n 為訓練樣本數。用的時候一般需要對 n 做個歸一化,得到$-\frac{1}{n}\sum_{i=1}^{n} y_{i}p(x_{i}) + (y_{i} - 1)(1-p(x_{i})) $ 。
然后用梯度下降法優化就行了,步驟是:
- 獲取 n 個訓練樣本 (x_{1}, x_{2}, y) , y 屬於\({0,1}\)
- 對於直線 \(wx+b=0\),需要 $min L(w, b) = -\frac{1}{n}\sum_{i=1}^{n} y_{i} sigmoid(x_{i}))) + (y_{i} - 1)(1-sigmoid(x_{i}))) \(,對參數求梯度: \)\frac{\partial L(w,b)}{w}=-\frac{1}{n}\sum_{i=1}^{n} x_{i}(y_{i}-sigmoid(wx_{i}+b))\( \)\frac{\partial L(w,b)}{b}=-\frac{1}{n}\sum_{i=1}^{n} y_{i}-sigmoid(wx_{i}+b)\( \)w := w - \alpha \frac{\partial L(w,b)}{w}\( \)b := b - \alpha \frac{\partial L(w,b)}{b}$
- 重復 1,2,直到 w, b 的梯度小於某個很小的值,或者達到循環上限。
如果用極大似然估計,由於在極大似然估計中需要取對數操作,為了方便,可以把 \(y_{i} p + (1 - y_{i}) (1-p)\) 改寫為 \(p^{y_{i}} (1-p)^{1 - y_{i}}\),這兩個是完全等價的。極大似然估計寫出來的式子是:
然后為了計算方便,取對數。為了把這個 max 變成 min,需要進行取反,這都是極大似然估計的標准步驟:
最后發現兩種方法得到的表達式是一樣的,所以后面的優化步驟都一樣。
這個就是 logistic 回歸的思路了。這里還是用二維的舉例,對於高維的情況幾乎是一樣的,就是參數從 \((w_{1},w_{2})\)變為 \((w_{1},w_{2},...,w_{n})\)了而已。由於 logistic 回歸是基於全部點去定義、優化目標函數,所以已經解決了只能處理二分類的問題。logistic 回歸可以很容易的擴展成能多分類的 softmax 算法,softmax 算法對於 n 類,就用 n-1 個超平面把它們分開。這個就是另外一個方法了。
那么 logistic 回歸就是完美的了嗎,它至少還有兩個缺點:1. 還是只能解決數據線性可分的問題 2. 考慮所有的點得到的最優直線還是會帶來一些問題,比如:
參考鏈接:
如需轉載,請注明出處.
出處:http://www.cnblogs.com/xinchen1111/p/8762186.html
