從感知機到 SVM,再到深度學習(一)


    在上篇博客中提到,如果想要擬合一些空間中的點,可以用最小二乘法,最小二乘法其實是以樣例點和理論值之間的誤差最小作為目標。那么換個場景,如果有兩類不同的點,而我們不想要擬合這些點,而是想找到一條直線把點區分開來,就像下圖一樣,那么我們應該怎么做呢?這個是一個最簡單的分類問題。

二維線性可分示例圖
線性可分數據集
    先考慮最簡單的情況,也就是這兩類點是沒有交錯在一起的,能夠用一條直線 $ax_{1}+bx_{2}+c=0$ 把它們區分開(是線性可分的)。所以只要能夠確定參數 $a$ 和 $b$ 就行了。我們想讓紅點和黑點盡量分布在直線兩側,所以其實是想最小化最終分錯的點(誤分類點)的個數。那么怎么才算是分錯呢,現在我們只知道黃點和藍點應該不在同一側,但是並不知道具體應該在那一側(不只是這個圖,考慮一般情況)。但是對於直線而言,把直線兩側的點帶入直線方程得到的符號是相反的。我們可以根據這個判斷某一個點是在直線的大於 0 的一側還是小於 0 的一側。 對於直線(或超平面),其實我們為了方便,我們可以給直線加一些不會影響最終結果的限制,讓求解的模型少一些選擇,只要依舊可以通過調整參數找到最優解就沒問題。比如規定直線的大於 0 的一面一定是藍點,小於 0 的一面一定是黃點。可能有人會問,那找到最優的直線的時候藍點在小於 0 的一側怎么辦。但是沒關系,即使是同一條直線,也可以通過兩邊同乘以 -1 達到讓小於 0 和大於 0 換邊的情況,所以這樣假設沒有關系,在進行參數優化的時候它自己就可以通過調整 a,b 來達到要求。加上這個限制,最終的目標函數就很好寫了。首先給藍、黃點分別標記為 p, q,訓練集就是$\left ( x_{1}, x_{2}, y\right )$,y 屬於$\left \{ p, q \right \}$了。那么我們就是要最小化 $\sum f(ax_{1}+bx_{2}+c) $ ,其中 f 是一個用來數誤分類點的個數的函數,對於分錯的點 f 的函數值為 1,反之為 0。這個 f 函數有個名字叫激活函數(里面的信號強就激活一下)。根據限制,可以根據 $(y_{i}-mid) (ax_{1}+bx_{2}+c)$ (其中$mid=\frac{p+q}{2}$)是否大於 0 來判斷是否分錯。為了方便,就可以去 p, q 為 -1 和 +1,這樣這個判斷條件就變成 $y_{i} (ax_{1}+bx_{2}+c)$了。我們要最小化的函數就叫損失函數。     接下來就是要對這個損失函數進行調參優化了。可以看出來,這個函數其實是找到當前的所有誤分類點,然后通過它們進行調參,所以它是誤分類點驅動的。但是即使找到了所有的無誤分類點,由於損失函數是離散的,不連續也不可導,很難優化。所以需要找一個近似的,連續可導的函數來替換 f 函數。對於分錯的點,我們可以用 $\left | ax_{1}+bx_{2}+c \right |$ 去代替 f 中的 1 ,這里又面臨去絕對值的問題了,還是可以通過平方法去絕對值。而對於分對的點,還是 0。這樣損失函數就是$\sum(ax_{1}+bx_{2}+c)^{2}$,找到誤分類點之后就可以用梯度下降法優化了。但是對於這個問題,還有一個更巧妙的去絕對值的方式,既然我們已經知道 -1 在 $ax_{1}+bx_{2}+c$ 大於 0 的一側,而 1 在 <0 的一側,所以:$y_{i} * (ax_{1}+bx_{2}+c)$ 就一定是正的了。所以可以用$y_{i}(ax_{1}+bx_{2}+c)$ 替換 1,損失函數就是$\sum_{1}(ax_{1}+bx_{2}+c)$。以這個為損失函數的整個優化流程就是:
  1. 隨機給定 w, b
  2. 找到當前這條直線 \(ax_{1}+bx_{2}+c=0\) 的情況下,找到所有分錯的點(x_no,y_no)
  3. 把直線寫作矩陣的形式:\(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\) 是學習率。
  4. 重復 2, 3 步。直到找不到錯分的點或者到達迭代上限為止。

    經過實驗發現這種目標函數收斂比平方的那個的要快,而且對於點剛好在直線上時,平方法中求出來的 a, b 的梯度都是 0,就無法處理了,所以只能認為剛好在直線上也是分對了。而這種方法由於有 \(y_{i}\) 的先驗知識,b 的梯度至少不會是0,可以處理這種情況。當然還可以用點到直線的距離來代替用來計數的函數:, 同樣用 \(y_{i}\) 去絕對值,但是沒有必要,徒增了很多復雜度。
    如果初始值是線性不可分的,就會出現不收斂,一直在交叉的點之間震盪的情況。
    這個就是傳說中的感知機算法,這里的例子都是二維的,但是對於多維的情況也是一樣的。無非就是直線變成一個超平面 $wx+b=0 ,x = (x0,x1,...,xn), w = (w0,w1,...,wn) $了。感知機算法本身還有很多內容,比如如何證明算法是收斂的,用對偶方法提高速度等等,這些跟主線無關~,以后再寫吧。
    感知機算法雖然能夠將線性可分的數據集區分開,但是比較沒追求...只要能找到一條能把兩類點完全分開的直線就滿足了。但是這樣的直線是有無窮多條的,我們希望能根據訓練數據找到一條“最優”的,這樣有利於算法的泛化能力,也更加充分的利用了數據的信息。比如下圖:

二維線性可分圖1
圖 1.
二維線性可分圖3
圖 2.
    感知機會認為上面的圖都是最優解。但是顯然第二個優於第一個。那么怎么解決呢?     我們期望能找到一條基於當前訓練數據的“最優”的直線。所謂“最優”還是需要量化,其實就對應了最大化目標函數。而感知機之所以沒有最優是因為它的目標函數 $\sum f(ax_{1}+bx_{2}+c)$ 過於粗糙了,它只考慮當前錯分的點,分對的點的 f 值都是 0,本質上優化的還是分錯的點的個數,所以當點全部分對之后目標函數就達到最優了。但其實點全部分對之后直線還有優化的空間,比如直 線離開兩類數據都盡量遠一點。那么如果我們能夠給出一個更精細的 f 函數,不止能告訴目標函數某個點是否分對了,還能夠告訴它分正確的程度有多大,或者是分錯的程度有多大。也就是說當點分對或分錯的時候,f 的值不再是 0 或 1 了,而是一個表示分對、分錯的確信度的值,那么最終直線就能到一個更精細的最優位置,即盡量不分錯,且分對的程度之和最大。而這個計數的函數(激活函數)只要滿足單調遞增就行了,表示分對程度越大,獎勵就越大,反之也是。用的時候比較常見的有: 線性函數 $y=x$
線性函數圖像
線性函數圖像
sigmoid 函數 $y=\frac{1}{1+e^-x}$
sigmoid 函數圖像
sigmoid 函數圖像

而感知機中用的是階躍函數,相對比較粗糙。
    其中用 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})) $ 。
然后用梯度下降法優化就行了,步驟是:

  1. 獲取 n 個訓練樣本 (x_{1}, x_{2}, y) , y 屬於\({0,1}\)
  2. 對於直線 \(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}$
  3. 重復 1,2,直到 w, b 的梯度小於某個很小的值,或者達到循環上限。

    如果用極大似然估計,由於在極大似然估計中需要取對數操作,為了方便,可以把 \(y_{i} p + (1 - y_{i}) (1-p)\) 改寫為 \(p^{y_{i}} (1-p)^{1 - y_{i}}\),這兩個是完全等價的。極大似然估計寫出來的式子是:

$max \quad L(w,b) = \prod_{i=1}^{n} p^{y_{i}} (1-p)^{1 - y_{i}}$

    然后為了計算方便,取對數。為了把這個 max 變成 min,需要進行取反,這都是極大似然估計的標准步驟:

$min \quad L(w,b) = -\sum_{i=1}^{n} (y_{i}logp+ (1 - y_{i})log(1-p))$

    最后發現兩種方法得到的表達式是一樣的,所以后面的優化步驟都一樣。
    這個就是 logistic 回歸的思路了。這里還是用二維的舉例,對於高維的情況幾乎是一樣的,就是參數從 \((w_{1},w_{2})\)變為 \((w_{1},w_{2},...,w_{n})\)了而已。由於 logistic 回歸是基於全部點去定義、優化目標函數,所以已經解決了只能處理二分類的問題。logistic 回歸可以很容易的擴展成能多分類的 softmax 算法,softmax 算法對於 n 類,就用 n-1 個超平面把它們分開。這個就是另外一個方法了。
那么 logistic 回歸就是完美的了嗎,它至少還有兩個缺點:1. 還是只能解決數據線性可分的問題 2. 考慮所有的點得到的最優直線還是會帶來一些問題,比如:

logisitic 分類問題圖像
圖1
logisitic 分類問題圖像
圖2
    明顯圖 2 優於圖1 ,圖 1 的泛化能力較差,新的黑點很容易就被分到黃點一側了。     為什么會這樣呢?通過 sigmoid 函數的圖像可以看出來。     兩個類別的數據量是一樣的。但是由於黑點有一部分離得比較遠,所以把直線向黑點側移動一些對於那些黑點而言目標函數減少的很少。而黃點比較集中且離平面較近,讓平面遠離黃點的收益更大。這個問題當數據量不平衡的時候會更加嚴重。     那么如果用線性函數作為激活函數呢?這樣對於兩類的數據量不相同的時候這個問題依然會出現。     感知機只考慮分錯的點,會無法找到最理想的直線。而 logistic 回歸考慮了所有點,但是對於離得比較遠的點,甚至異常點也會過於敏感(比如這里黃點離得比較遠的點就對平面產生了很大影響)。其實問題還是在我們對“最優直線”的定義上,我們其實是想讓最終的直線離開兩邊的點都盡量遠。所以其實可以只考慮離直線最近的那些點,只要讓它們和直線的距離盡量大就行了。
logisitic 分類問題圖像
最小間隔示意圖
    如圖,黑色虛線就是當前需要優化的目標。當它過於靠近黃點的時候,優化的目標就會變成直線跟最近的黃點的距離。因為需要對點和直線衡量距離,而不是像感知機中只要知道點在直線的那一側就行了。所以這里就需要用點到直線的距離公式了,距離公式為 $\frac {|w_{1}x_{1} + w_{2}x_{2} + w_{3}|}{||(w_{1}, w_{2})||}$,用 y_{i} 去絕對值,得到$d(x) = y_{i}\frac {w_{1}x_{1} + w_{2}x_{2} + w_{3}}{||(w_{1}, w_{2})||}$。目標是讓距離直線最近的那個點到直線的距離越大越好,即 $max_{w,b}min_{x} \quad d(x)$。這個式子寫成帶約束的優化問題就是: $$\begin{align*} max_{\gamma,w,b} \quad \gamma \\ &s.t. \quad y_{i}\frac {w_{1}x_{1} + w_{2}x_{2} + w_{3}}{||(w_{1}, w_{2})||} > \gamma \end{align*}$$ 用這個目標函數的算法叫最優間隔分類器。接下來就需要用凸優化的理論來求解這個優化問題了,比較復雜,下次再寫吧。**下一篇在[這里](http://www.cnblogs.com/xinchen1111/p/8763448.html)。**

參考鏈接:

  1. 【機器學習-斯坦福】學習筆記7 - 最優間隔分類器問題
  2. 交叉熵(Cross-Entropy)
  3. 感知機:從原理到訓練
  4. 拉格朗日乘數法

如需轉載,請注明出處.
出處:http://www.cnblogs.com/xinchen1111/p/8762186.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM