引自https://www.cnblogs.com/pinard/p/6029432.html,目前看到說得比較清晰的原理。
邏輯迴歸是一個分類算法,它可以處理二元分類以及多元分類。雖然它名字裏面有“迴歸”兩個字,卻不是一個迴歸算法。那爲什麼有“迴歸”這個誤導性的詞呢?個人認爲,雖然邏輯迴歸是分類模型,但是它的原理裏面卻殘留着迴歸模型的影子,本文對邏輯迴歸原理做一個總結。
1. 從線性迴歸到邏輯迴歸
我們知道,線性迴歸的模型是求出輸出特徵向量Y和輸入樣本矩陣X之間的線性關係係數θθ,滿足Y=XθY=Xθ。此時我們的Y是連續的,所以是迴歸模型。如果我們想要Y是離散的話,怎麼辦呢?一個可以想到的辦法是,我們對於這個Y再做一次函數轉換,變爲g(Y)g(Y)。如果我們令g(Y)g(Y)的值在某個實數區間的時候是類別A,在另一個實數區間的時候是類別B,以此類推,就得到了一個分類模型。如果結果的類別只有兩種,那麼就是一個二元分類模型了。邏輯迴歸的出發點就是從這來的。下面我們開始引入二元邏輯迴歸。
2. 二元邏輯迴歸的模型
上一節我們提到對線性迴歸的結果做一個在函數g上的轉換,可以變化爲邏輯迴歸。這個函數g在邏輯迴歸中我們一般取爲sigmoid函數,形式如下:
它有一個非常好的性質,即當z趨於正無窮時,趨於1,而當z趨於負無窮時,趨於0,這非常適合於我們的分類概率模型。另外,它還有一個很好的導數性質:
這個通過函數對求導很容易得到,後面我們會用到這個式子。
如果我們令中的z爲:,這樣就得到了二元邏輯迴歸模型的一般形式:
其中x爲樣本輸入,hθ(x)hθ(x)爲模型輸出,可以理解爲某一分類的概率大小。而θ爲分類模型的要求出的模型參數。對於模型輸出,我們讓它和我們的二元樣本輸出y(假設爲0和1)有這樣的對應關係,如果 ,即, 則y爲1。如果,即, 則y爲0。y=0.5是臨界情況,此時, 從邏輯迴歸模型本身無法確定分類。
的值越小,而分類爲0的的概率越高,反之,值越大的話分類爲1的的概率越高。如果靠近臨界點,則分類準確率會下降。
此處我們也可以將模型寫成矩陣模式:
其中爲模型輸出,爲 的維度。X爲樣本特徵矩陣,爲的維度。爲分類的模型係數,爲的向量。
理解了二元分類迴歸的模型,接着我們就要看模型的損失函數了,我們的目標是極小化損失函數來得到對應的模型係數。
3. 二元邏輯迴歸的損失函數
回顧下線性迴歸的損失函數,由於線性迴歸是連續的,所以可以使用模型誤差的的平方和來定義損失函數。但是邏輯迴歸不是連續的,自然線性迴歸損失函數定義的經驗就用不上了。不過我們可以用最大似然法來推導出我們的損失函數。
我們知道,按照第二節二元邏輯迴歸的定義,假設我們的樣本輸出是0或者1兩類。那麼我們有:
P(y=1|x,θ)=hθ(x)P(y=1|x,θ)=hθ(x)
P(y=0|x,θ)=1−hθ(x)P(y=0|x,θ)=1−hθ(x)
把這兩個式子寫成一個式子,就是:
P(y|x,θ)=hθ(x)y(1−hθ(x))1−yP(y|x,θ)=hθ(x)y(1−hθ(x))1−y
其中y的取值只能是0或者1。
用矩陣法表示,即爲:
P(Y|X,θ)=hθ(X)Y(E−hθ(X))1−YP(Y|X,θ)=hθ(X)Y(E−hθ(X))1−Y,其中E爲單位向量。
得到了y的概率分佈函數表達式,我們就可以用似然函數最大化來求解我們需要的模型係數θθ。
爲了方便求解,這裏我們用對數似然函數最大化,對數似然函數取反即爲我們的損失函數J(θJ(θ)。其中:
似然函數的代數表達式爲:
L(θ)=∏i=1m(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)L(θ)=∏i=1m(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)
其中m爲樣本的個數。
對似然函數對數化取反的表達式,即損失函數表達式爲:
J(θ)=−lnL(θ)=−∑i=1m(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))J(θ)=−lnL(θ)=−∑i=1m(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))
損失函數用矩陣法表達更加簡潔:
J(θ)=−Y∙loghθ(X)−(E−Y)∙log(E−hθ(X))J(θ)=−Y∙loghθ(X)−(E−Y)∙log(E−hθ(X))
其中E爲單位向量,∙∙爲內積。
4. 二元邏輯迴歸的損失函數的優化方法
對於二元邏輯迴歸的損失函數極小化,有比較多的方法,最常見的有梯度下降法,座標軸下降法,等牛頓法等。這裏推導出梯度下降法中θθ每次迭代的公式。由於代數法推導比較的繁瑣,我習慣於用矩陣法來做損失函數的優化過程,這裏給出矩陣法推導二元邏輯迴歸梯度的過程。
對於J(θ)=−Y∙loghθ(X)−(E−Y)∙log(E−hθ(X))J(θ)=−Y∙loghθ(X)−(E−Y)∙log(E−hθ(X)),我們用J(θ)J(θ)對θθ向量求導可得:
∂∂θJ(θ)=−Y∙XT1hθ(X)hθ(X)(1−hθ(X))+(E−Y)∙XT11−hθ(X)hθ(X)(1−hθ(X))∂∂θJ(θ)=−Y∙XT1hθ(X)hθ(X)(1−hθ(X))+(E−Y)∙XT11−hθ(X)hθ(X)(1−hθ(X))
這一步我們用到了矩陣求導的鏈式法則,和下面三個矩陣求導公式:
∂∂XlogX=1/X∂∂XlogX=1/X
∂∂zg(z)=g(z)(1−g(z))(g(z)爲sigmoid函數)∂∂zg(z)=g(z)(1−g(z))(g(z)爲sigmoid函數)
∂∂θXθ=XT∂∂θXθ=XT
對於剛纔的求導公式我們進行化簡可得:
∂∂θJ(θ)=XT(hθ(X)−Y)∂∂θJ(θ)=XT(hθ(X)−Y)
從而在梯度下降法中每一步向量θθ的迭代公式如下:
θ=θ−αXT(hθ(X)−Y)θ=θ−αXT(hθ(X)−Y)
其中,αα爲梯度下降法的步長。
實踐中,我們一般不用操心優化方法,大部分機器學習庫都內置了各種邏輯迴歸的優化方法,不過了解至少一種優化方法還是有必要的。
5. 二元邏輯迴歸的正則化
邏輯迴歸也會面臨過擬合問題,所以我們也要考慮正則化。常見的有L1正則化和L2正則化。
邏輯迴歸的L1正則化的損失函數表達式如下,相比普通的邏輯迴歸損失函數,增加了L1的範數做作爲懲罰,超參數αα作爲懲罰係數,調節懲罰項的大小。
二元邏輯迴歸的L1正則化損失函數表達式如下:
J(θ)=−Y∙loghθ(X)−(E−Y)∙log(1−hθ(X))+α||θ||1J(θ)=−Y∙loghθ(X)−(E−Y)∙log(1−hθ(X))+α||θ||1
其中||θ||1||θ||1爲θθ的L1範數。
邏輯迴歸的L1正則化損失函數的優化方法常用的有座標軸下降法和最小角迴歸法。
二元邏輯迴歸的L2正則化損失函數表達式如下:
J(θ)=−Y∙loghθ(X)−(E−Y)∙log(1−hθ(X))+12α||θ||22J(θ)=−Y∙loghθ(X)−(E−Y)∙log(1−hθ(X))+12α||θ||22
其中||θ||2||θ||2爲θθ的L2範數。
邏輯迴歸的L2正則化損失函數的優化方法和普通的邏輯迴歸類似。
6. 二元邏輯迴歸的推廣:多元邏輯迴歸
前面幾節我們的邏輯迴歸的模型和損失函數都侷限於二元邏輯迴歸,實際上二元邏輯迴歸的模型和損失函數很容易推廣到多元邏輯迴歸。比如總是認爲某種類型爲正值,其餘爲0值,這種方法爲最常用的one-vs-rest,簡稱OvR.
另一種多元邏輯迴歸的方法是Many-vs-Many(MvM),它會選擇一部分類別的樣本和另一部分類別的樣本來做邏輯迴歸二分類。最常用的是One-Vs-One(OvO)。OvO是MvM的特例。每次我們選擇兩類樣本來做二元邏輯迴歸。
這裏只介紹多元邏輯迴歸的softmax迴歸的一種特例推導:
首先回顧下二元邏輯迴歸。
P(y=1|x,θ)=hθ(x)=11+e−xθ=exθ1+exθP(y=1|x,θ)=hθ(x)=11+e−xθ=exθ1+exθ
P(y=0|x,θ)=1−hθ(x)=11+exθP(y=0|x,θ)=1−hθ(x)=11+exθ
其中y只能取到0和1。則有:
lnP(y=1|x,θ)P(y=0|x,θ)=xθlnP(y=1|x,θ)P(y=0|x,θ)=xθ
如果我們要推廣到多元邏輯迴歸,則模型要稍微做下擴展。
我們假設是K元分類模型,即樣本輸出y的取值爲1,2,。。。,K。
根據二元邏輯迴歸的經驗,我們有:
lnP(y=1|x,θ)P(y=K|x,θ)=xθ1lnP(y=1|x,θ)P(y=K|x,θ)=xθ1
lnP(y=2|x,θ)P(y=K|x,θ)=xθ2lnP(y=2|x,θ)P(y=K|x,θ)=xθ2
...
lnP(y=K−1|x,θ)P(y=K|x,θ)=xθK−1lnP(y=K−1|x,θ)P(y=K|x,θ)=xθK−1
上面有K-1個方程。
加上概率之和爲1的方程如下:
∑i=1KP(y=i|x,θ)=1∑i=1KP(y=i|x,θ)=1
從而得到K個方程,裏面有K個邏輯迴歸的概率分佈。
解出這個K元一次方程組,得到K元邏輯迴歸的概率分佈如下:
P(y=k|x,θ)=exθk/1+∑t=1K−1exθtP(y=k|x,θ)=exθk/1+∑t=1K−1exθt k = 1,2,...K-1
P(y=K|x,θ)=1/1+∑t=1K−1exθtP(y=K|x,θ)=1/1+∑t=1K−1exθt
多元邏輯迴歸的損失函數推導以及優化方法和二元邏輯迴歸類似,這裏就不累述。
7.小結
邏輯迴歸尤其是二元邏輯迴歸是非常常見的模型,訓練速度很快,雖然使用起來沒有支持向量機(SVM)那麼佔主流,但是解決普通的分類問題是足夠了,訓練速度也比起SVM要快不少。如果你要理解機器學習分類算法,那麼第一個應該學習的分類算法個人覺得應該是邏輯迴歸。理解了邏輯迴歸,其他的分類算法再學習起來應該沒有那麼難了。