林軒田之機器學習課程筆記( how can machines learn之logistic regression)(32之10)

歡迎轉載,可以關注博客:http://blog.csdn.net/cqy_chen

概要

上節課我們求解了線性迴歸問題,同時採用線性迴歸問題的解去求解二分類問題,那麼本節主要講解邏輯迴歸,順便說一下,在實際工作中邏輯迴歸會作爲一個base line。比如在百度鳳巢的ctr中,會收集大量的特徵,然後採用邏輯迴歸求解,現在已經採用深度學習的方法。所以一般來說在做機器學習的時候,採用簡單到複雜的模型。

邏輯迴歸問題

首先回顧機器學習流程,對於分類問題如下:
這裏寫圖片描述
但是在醫院中我們還需要知道一個病人未來一段時間比如生病的概率是多少,手術成功的概率是多少?
有的時候不想知道這個結果,而是想知道得到這個結果的概率是多少。
這個時候,我們的f(x) 表示爲,給定一個X,取+1的概率是多少。取-1,就是1減嘍。

f(x)=P(+1|X){+1,1}

假如資料中的標籤已經有各種的概率,那麼直接採用線性迴歸就完事兒了啊,但是實際情況是得不到這樣的標籤的。
這裏寫圖片描述
這裏可以將右邊的標籤看做是左邊有噪音的結果。比如我本來想得到0.7的概率,結果返回到了+1,本來想0.3,結果返回了-1。
這裏寫圖片描述
那麼現在只有0和1的標籤,那麼怎麼來求解概率呢?
首先想到的是將各個特徵找到一個權重相乘相加,但是這樣得到的是一個實數,我們需要的是一個概率,在0~1之間的值。如何做呢?這個時候採用邏輯函數來將結果映射到0~1之間。
這裏寫圖片描述
單獨看看邏輯函數如下:
這裏寫圖片描述
邏輯函數:
θ(s)=11+es

這麼順便說一下,邏輯函數應用的範圍比較廣,在深度學習中,邏輯函數可以作爲激活函數

邏輯迴歸損失函數

我們對比下線性迴歸,邏輯迴歸,二分類的損失函數:
這裏寫圖片描述
那麼邏輯迴歸的損失函數是啥呢?如何來最小化呢?這就引入了似然函數,如下圖所示;
這裏寫圖片描述
所以最後我們的假設爲:

g=argmaxh likelihood(h)

又因爲:h(x)=1h(x)
這裏寫圖片描述
我們將h通過w來進行替換,因爲我們最後想要的是w。
maxw likelihood(w)=n=1Nθ(ynwTxn)

我們將上面的式子稍作轉換,因爲一般在求解的時候,更多的是求最小。上面的式子等價於:
minw1Nn=1Nlnθ(ynwTxn)=minw1Nn=1Nln(1+e(ynwTxn))=minw1Nn=1Nerr(yn,w,xn)

其中err(yn,w,xn)=ln(1+e(ynwTxn)) ,這個我們稱爲交叉熵損失函數。
關於交叉熵損失函數參考:
http://blog.csdn.net/jasonzzj/article/details/52017438
這裏要說明的是邏輯迴歸的損失函數是一個凸函數,如下圖:
這裏寫圖片描述

邏輯迴歸損失函數的梯度

我們知道現在有了邏輯迴歸的損失函數,現在需要最小化之,求得w。當目標函數是可微,凸函數那麼我們直接求得偏導數爲0的地方就好了。求得梯度得到:

Ein(w)=1Nn=1Nθ(ynwTxn)(ynxn)=1Nn=1Nynθ(ynwTxn)xn

要使得梯度爲0。一種情況是所以的θ=0 當且僅當ynwTxn>>0 這表示我們的資料是線性可分的。所以如果資料線性可分的情況下,那麼可以得到梯度爲0。
只要不可分,那麼不能採用這樣的辦法,這貌似不是一個閉式解。
又因爲我們知道邏輯迴歸的損失函數是一個凸函數,那麼可不可以採用像PLA的方式來求解呢?
這裏寫圖片描述

梯度下降求解

在上節中我們知道,邏輯迴歸沒有閉式解,損失函數是凸函數。那麼我們想象採用PLA的方式,一步步的更新我們的w,使得其趨於谷底,達到最好。

wt+1=wt+ηv

那麼現在我們需要解決兩件事情:
1)v,確定w的更新方向。
2)η ,更新步長。
來使得Ein 減小。現在先假設步長固定的,確定好方向。

泰勒展開式來拯救我們了,任何的函數,在定義域的一個很小區間內,我們可以展開爲其一階導數的函數,那麼上面的Ein 展開爲:
這裏寫圖片描述
那麼該問題就轉換爲了:
這裏寫圖片描述
所以我們要想wt 走到下一步wt+1 變小的話,那麼v應該是一階梯度的負方向。所以:

v=Ein(wt)||Ein(wt)||v

所以我們已經確定w更新的方向。那麼每一步走多大呢?
如果很小,就會導致運算非常慢,如果很大步呢?那就會導致凸函數可能跑到山谷對面了。
這裏寫圖片描述

泰勒展開也是限定在比較小的範圍內才成立。不能太大,太小運算過慢。所以最好是坡度比較大,走大步一點,坡度小走小點。這個時候坡度大就是表示梯度大,坡度小,梯度就小了。所以:

η||Ein(wt)||

由上面得式子我們得到:
wt+1=wtηEin(wt)||Ein(wt)||=wtkEin(wt)

這裏k=η||Ein(wt)|| 。這個不就是我們需要求解的η 麼?
所以最後我們得到:
wt+1=wtηEin(wt)

所以我們只要不斷的迭代算算,就一定會得到我們需要的解。

關於邏輯迴歸的代碼可以參考:
http://blog.csdn.net/cqy_chen/article/details/64479457

歡迎轉載,可以關注博客:http://blog.csdn.net/cqy_chen

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