CTR 預測理論(十四):邏輯迴歸算法總結

1. 簡介

​ 邏輯迴歸是面試當中非常喜歡問到的一個機器學習算法,因爲表面上看邏輯迴歸形式上很簡單,很好掌握,但是一問起來就容易懵逼。所以在面試的時候給大家的第一個建議不要說自己精通邏輯迴歸,非常容易被問倒,從而減分。下面個人總結梳理下面試知識點。

2. 正式介紹

​ 如何凸顯你是一個對邏輯迴歸已經非常瞭解的人呢。那就是用一句話概括它!邏輯迴歸假設數據服從伯努利分佈,通過極大化似然函數的方法,運用梯度下降來求解參數,來達到將數據二分類的目的。

​ 這裏面其實包含了5個點 1:邏輯迴歸的假設,2:邏輯迴歸的損失函數,3:邏輯迴歸的求解方法,4:邏輯迴歸的目的,5:邏輯迴歸如何分類。這些問題是考覈你對邏輯迴歸的基本瞭解。

  • 邏輯迴歸的基本假設

    • 任何的模型都是有自己的假設,在這個假設下模型纔是適用的。邏輯迴歸的第一個基本假設是 假設數據服從伯努利分佈。 伯努利分佈有一個簡單的例子是拋硬幣,拋中爲正面的概率是 p,拋中爲負面的概率是 1−p.在邏輯迴歸這個模型裏面是假設 hθ(x)h_\theta\left(x\right ) 爲樣本爲正的概率,1hθ(x)1- h_\theta\left(x\right ) 爲樣本爲負的概率。那麼整個模型可以描述爲
      hθ(x;θ)=p h_\theta\left(x;\theta \right )=p

    • 邏輯迴歸的第二個假設是假設樣本爲正的概率是:
      p=11+eθTx p=\frac{1}{1+e^{-\theta^{T} x}}

    • 所以邏輯迴歸的最終形式 :
      hθ(x;θ)=11+eθTx h_\theta\left(x;\theta \right )=\frac{1}{1+e^{-\theta^{T} x}}

  • 邏輯迴歸的損失函數

    • 邏輯迴歸的損失函數是它的極大似然函數
      Lθ(x)=i=1mhθ(xi;θ)yi(1hθ(xi;θ))1yi L_\theta\left(x\right )= \prod _{i=1}^{m}h_\theta(x^{i};\theta )^{y{i}}*(1-h_\theta(x^{i};\theta))^{1-y^{i}}
  • 邏輯迴歸的求解方法

    • 由於該極大似然函數無法直接求解,我們一般通過對該函數進行梯度下降來不斷逼急最優解。在這個地方其實會有個加分的項,考察你對其他優化方法的瞭解。因爲就梯度下降本身來看的話就有隨機梯度下降,批梯度下降,small batch 梯度下降三種方式,面試官可能會問這三種方式的優劣以及如何選擇最合適的梯度下降方式。
      • 簡單來說 批梯度下降會獲得全局最優解,缺點是在更新每個參數的時候需要遍歷所有的數據,計算量會很大,並且會有很多的冗餘計算,導致的結果是當數據量大的時候,每個參數的更新都會很慢。
      • 隨機梯度下降是以高方差頻繁更新,優點是使得sgd會跳到新的和潛在更好的局部最優解,缺點是使得收斂到局部最優解的過程更加的複雜。
      • 小批量梯度下降結合了sgd和batch gd的優點,每次更新的時候使用n個樣本。減少了參數更新的次數,可以達到更加穩定收斂結果,一般在深度學習當中我們採用這種方法。
    • 其實這裏還有一個隱藏的更加深的加分項,看你了不瞭解諸如Adam,動量法等優化方法。因爲上述方法其實還有兩個致命的問題。
      • 第一個是如何對模型選擇合適的學習率。自始至終保持同樣的學習率其實不太合適。因爲一開始參數剛剛開始學習的時候,此時的參數和最優解隔的比較遠,需要保持一個較大的學習率儘快逼近最優解。但是學習到後面的時候,參數和最優解已經隔的比較近了,你還保持最初的學習率,容易越過最優點,在最優點附近來回振盪,通俗一點說,就很容易學過頭了,跑偏了。
      • 第二個是如何對參數選擇合適的學習率。在實踐中,對每個參數都保持的同樣的學習率也是很不合理的。有些參數更新頻繁,那麼學習率可以適當小一點。有些參數更新緩慢,那麼學習率就應該大一點。這裏我們不展開,有空我會專門出一個專題介紹。
  • 邏輯迴歸的目的

  • 該函數的目的便是將數據二分類,提高準確率。

  • 邏輯迴歸如何分類

    • 邏輯迴歸作爲一個迴歸(也就是y值是連續的),如何應用到分類上去呢。y值確實是一個連續的變量。邏輯迴歸的做法是劃定一個閾值,y值大於這個閾值的是一類,y值小於這個閾值的是另外一類。閾值具體如何調整根據實際情況選擇。一般會選擇0.5做爲閾值來劃分。

3. 對邏輯迴歸的進一步提問

​ 邏輯迴歸雖然從形式上非常的簡單,但是其內涵是非常的豐富。有很多問題是可以進行思考的

  • 邏輯迴歸的損失函數爲什麼要使用極大似然函數作爲損失函數?

    • 損失函數一般有四種,平方損失函數,對數損失函數,Hinge Loss, 0-1損失函數,絕對值損失函數。將極大似然函數取對數以後等同於對數損失函數。在邏輯迴歸這個模型下,對數損失函數的訓練求解參數的速度是比較快的。至於原因大家可以求出這個式子的梯度更新
      θj=θj+α(y(i)h0(xi))xj(i) \theta_{j} = \theta_{j} + \alpha (y^{(i)} - h_{0}(x^{i}))x_{j}^{(i)}

      這個式子的更新速度只和 xjix^{i}_j , yiy^{i} 相關。和sigmod函數本身的梯度是無關的。這樣更新的速度是可以自始至終都比較的穩定。

    • 爲什麼不選平方損失函數的呢?其一是因爲如果你使用平方損失函數,你會發現梯度更新的速度和sigmod函數本身的梯度是很相關的。sigmod函數在它在定義域內的梯度都不大於0.25。這樣訓練會非常的慢。

  • 邏輯迴歸在訓練的過程當中,如果有很多的特徵高度相關或者說有一個特徵重複了100遍,會造成怎樣的影響?

    • 先說結論,如果在損失函數最終收斂的情況下,其實就算有很多特徵高度相關也不會影響分類器的效果。
    • 但是對特徵本身來說的話,假設只有一個特徵,在不考慮採樣的情況下,你現在將它重複100遍。訓練以後完以後,數據還是這麼多,但是這個特徵本身重複了100遍,實質上將原來的特徵分成了100份,每一個特徵都是原來特徵權重值的百分之一。
    • 如果在隨機採樣的情況下,其實訓練收斂完以後,還是可以認爲這100個特徵和原來那一個特徵扮演的效果一樣,只是可能中間很多特徵的值正負相消了。
  • 爲什麼我們還是會在訓練的過程當中將高度相關的特徵去掉?

    • 去掉高度相關的特徵會讓模型的可解釋性更好
    • 可以大大提高訓練的速度。如果模型當中有很多特徵高度相關的話,就算損失函數本身收斂了,但實際上參數是沒有收斂的,這樣會拉低訓練的速度。其次是特徵多了,本身就會增大訓練的時間。

4. 邏輯迴歸的數學公式推導

logistic迴歸算法是一種分類算法,主要用於二分類的實現,其數學模型爲
p=h(θ)=11+eθTx,g(z)=11+ez,g(z)=g(z)(1g(z)) p=h(\theta)=\frac{1}{1+e^{-\theta^Tx}}, g(z)=\frac{1}{1 + e^{-z}} , g(z)^{'} = g(z)(1-g(z))
假設
p(y=1x,θ)=h0(x) p(y=1|x,\theta) = h_{0}(x)

p(y=0x,θ)=1h0(x) p(y=0|x,\theta) = 1- h_{0}(x)

p(yx,θ)=(h0(x))y(1(h0(x))1yp(y|x,\theta) = (h_{0}(x))^y(1-(h_{0}(x))^{1-y}

根據似然函數
L(θ)=p(yx;θ)=i=1mh0(x(i))y(i)(1h0(x(i))1y(i) L(\theta)=p(y|x;\theta)=\prod_{i=1}^{m}h_{0}(x^{(i)})^{y^{(i)}}(1-h_{0}(x^{(i)})^{1-y^{(i)}}

取對數
l(θ)=log(L(θ))=i=1m(y(i)logh0(x(i))+(1y(i))log(1h0(x(i))) l(\theta) = log(L(\theta))=\sum_{i=1}^{m}{(y^{(i)}logh_{0}(x^{(i)}) + (1-y^{(i)})log(1-h_{0}(x^{(i)}))}

求導數
δl(θ)δθj=i=1m(y(i)h0(x(i))1y(i)1h0(x(i)))δh(x(i))δθj \frac{\delta l(\theta)}{\delta \theta_{j}} = \sum_{i=1}^{m}{(\frac{y^{(i)}}{h_{0}(x^{(i)})}-\frac{1-y^{(i)}}{1-h_{0}(x^{(i)})})\frac{\delta h(x^{(i)})}{\delta \theta_j}}

=i=1m(y(i)h0(x(i))1y(i)1h0(x(i)))δg(θTx(i))δθj = \sum_{i=1}^{m}{(\frac{y^{(i)}}{h_{0}(x^{(i)})}-\frac{1-y^{(i)}}{1-h_{0}(x^{(i)})})\frac{\delta g(\theta^Tx^{(i)})}{\delta \theta_j}}

=i=1m(y(i)g(θTx(i))xj(i) = \sum_{i=1}^{m}{(y^{(i)}} - g(\theta^Tx^{(i)})x_{j}^{(i)}

logistic求解 θ\theta 可以使用梯度下降, α\alpha 爲學習率

如果採用Batch gradient descent:
θj=θj+αi=1m(y(i)h0(xi))xj(i) \theta_{j} = \theta_{j} + \alpha \sum_{i=1}^{m}(y^{(i)} - h_{0}(x^{i}))x_{j}^{(i)}
若是採用SGD:
θj=θj+α(y(i)h0(xi))xj(i) \theta_{j} = \theta_{j} + \alpha (y^{(i)} - h_{0}(x^{i}))x_{j}^{(i)}

5. 邏輯迴歸的損失函數推導(交叉熵推導)

說起交叉熵損失函數「Cross Entropy Loss」,腦海中立馬浮現出它的公式:
L=[ylog y^+(1y)log (1y^)] L=-[ylog\ \hat y+(1-y)log\ (1-\hat y)]
我們已經對這個交叉熵函數非常熟悉,大多數情況下都是直接拿來使用就好。但是它是怎麼來的?爲什麼它能表徵真實樣本標籤和預測概率之間的差值?上面的交叉熵函數是否有其它變種?也許很多朋友還不是很清楚!沒關係,接下來我將盡可能以最通俗的語言回答上面這幾個問題。

6. 交叉熵損失函數的數學原理

我們知道,在二分類問題模型:例如邏輯迴歸「Logistic Regression」、神經網絡「Neural Network」等,真實樣本的標籤爲 [0,1],分別表示負類和正類。模型的最後通常會經過一個 Sigmoid 函數,輸出一個概率值,這個概率值反映了預測爲正類的可能性:概率越大,可能性越大。

Sigmoid 函數的表達式和圖形如下所示:
g(s)=11+es g(s)=\frac{1}{1+e^{-s}}

在這裏插入圖片描述

其中 s 是模型上一層的輸出,Sigmoid 函數有這樣的特點:s = 0 時,g(s) = 0.5;s >> 0 時, g ≈ 1,s << 0 時,g ≈ 0。顯然,g(s) 將前一級的線性輸出映射到 [0,1] 之間的數值概率上。這裏的 g(s) 就是交叉熵公式中的模型預測輸出 。

我們說了,預測輸出即 Sigmoid 函數的輸出表徵了當前樣本標籤爲 1 的概率:
y^=P(y=1x) \hat y=P(y=1|x)
很明顯,當前樣本標籤爲 0 的概率就可以表達成:
1y^=P(y=0x) 1-\hat y=P(y=0|x)
重點來了,如果我們從極大似然性的角度出發,把上面兩種情況整合到一起:
P(yx)=y^y(1y^)1y P(y|x)=\hat y^y\cdot (1-\hat y)^{1-y}
不懂極大似然估計也沒關係。我們可以這麼來看:

當真實樣本標籤 y = 0 時,上面式子第一項就爲 1,概率等式轉化爲:
P(y=0x)=1y^ P(y=0|x)=1-\hat y
當真實樣本標籤 y = 1 時,上面式子第二項就爲 1,概率等式轉化爲:
P(y=1x)=y^ P(y=1|x)=\hat y
兩種情況下概率表達式跟之前的完全一致,只不過我們把兩種情況整合在一起了。

重點看一下整合之後的概率表達式,我們希望的是概率 P(y|x) 越大越好。首先,我們對 P(y|x) 引入 log 函數,因爲 log 運算並不會影響函數本身的單調性。則有:
log P(yx)=log(y^y(1y^)1y)=ylog y^+(1y)log(1y^) log\ P(y|x)=log(\hat y^y\cdot (1-\hat y)^{1-y})=ylog\ \hat y+(1-y)log(1-\hat y)
我們希望 log P(y|x) 越大越好,反過來,只要 log P(y|x) 的負值 -log P(y|x) 越小就行了。那我們就可以引入損失函數,且令 Loss = -log P(y|x)即可。則得到損失函數爲:
L=[ylog y^+(1y)log (1y^)] L=-[ylog\ \hat y+(1-y)log\ (1-\hat y)]

非常簡單,我們已經推導出了單個樣本的損失函數

上面說的都是一個樣本的時候,多個樣本的表達式是:

多個樣本的概率即聯合概率,等於每個的乘積。
p(yx)=imp(y(i)x(i)) p(y|x) = \prod _{i}^{m} p(y^{(i)}| x^{(i)})

logp(yx)=imlogp(y(i)x(i)) log p(y|x) = \sum _{i}^{m} log p(y^{(i)}| x^{(i)})

logp(y(i)x(i))=L(y(i)x(i)) logp(y^{(i)}| x^{(i)}) = - L(y^{(i)}| x^{(i)})

logp(y(i)x(i))=imL(y(i)x(i)) logp(y^{(i)}| x^{(i)})=-\sum _{i}^{m}L(y^{(i)}| x^{(i)})

加上1m\frac{1}{m}對式子進行縮放,便於計算。
J(w,b)=1mimL(y(i)x(i)) J(w,b) =\frac{1}{m}\sum _{i}^{m} L(y^{(i)}| x^{(i)})

J=1mΣi=1m[y(i)logy^(i)+(1y(i))log(1y^(i))] J = - \frac{1}{m}\Sigma_{i=1}^{m}[y^{(i)} log \hat{y}^{(i)} + (1-y^{(i)})log(1- \hat{y}^{(i)})]

這樣,我們已經完整地實現了交叉熵損失函數的推導過程。

7. 邏輯迴歸的優缺點總結

​ 面試的時候,別人也經常會問到,你在使用邏輯迴歸的時候有哪些感受。覺得它有哪些優缺點。

在這裏我們總結了邏輯迴歸應用到工業界當中一些優點:

  • 形式簡單,模型的可解釋性非常好。從特徵的權重可以看到不同的特徵對最後結果的影響,某個特徵的權重值比較高,那麼這個特徵最後對結果的影響會比較大。

  • 模型效果不錯。在工程上是可以接受的(作爲baseline),如果特徵工程做的好,效果不會太差,並且特徵工程可以大家並行開發,大大加快開發的速度。

  • 訓練速度較快。分類的時候,計算量僅僅只和特徵的數目相關。並且邏輯迴歸的分佈式優化sgd發展比較成熟,訓練的速度可以通過堆機器進一步提高,這樣我們可以在短時間內迭代好幾個版本的模型。

  • 資源佔用小,尤其是內存。因爲只需要存儲各個維度的特徵值,。

  • 方便輸出結果調整。邏輯迴歸可以很方便的得到最後的分類結果,因爲輸出的是每個樣本的概率分數,我們可以很容易的對這些概率分數進行cutoff,也就是劃分閾值(大於某個閾值的是一類,小於某個閾值的是一類)。

但是邏輯迴歸本身也有許多的缺點:

  • 準確率並不是很高。因爲形式非常的簡單(非常類似線性模型),很難去擬合數據的真實分佈。

  • 很難處理數據不平衡的問題。舉個例子:如果我們對於一個正負樣本非常不平衡的問題比如正負樣本比 10000:1.我們把所有樣本都預測爲正也能使損失函數的值比較小。但是作爲一個分類器,它對正負樣本的區分能力不會很好。

  • 處理非線性數據較麻煩。邏輯迴歸在不引入其他方法的情況下,只能處理線性可分的數據,或者進一步說,處理二分類的問題 。

  • 邏輯迴歸本身無法篩選特徵。有時候,我們會用gbdt來篩選特徵,然後再上邏輯迴歸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章