判斷學習速率是否合適?每步都下降即可。這篇先不整理吧...
這節學習的是邏輯回歸(Logistic Regression),也算進入了比較正統的機器學習算法。啥叫正統呢?我概念里面機器學習算法一般是這樣一個步驟:
1)對於一個問題,我們用數學語言來描述它,然后建立一個模型,例如回歸模型或者分類模型等來描述這個問題;
2)通過最大似然、最大后驗概率或者最小化分類誤差等等建立模型的代價函數,也就是一個最優化問題。找到最優化問題的解,也就是能擬合我們的數據的最好的模型參數;
3)然后我們需要求解這個代價函數,找到最優解。這求解也就分很多種情況了:
a)如果這個優化函數存在解析解。例如我們求最值一般是對代價函數求導,找到導數為0的點,也就是最大值或者最小值的地方了。如果代價函數能簡單求導,並且求導后為0的式子存在解析解,那么我們就可以直接得到最優的參數了。
b)如果式子很難求導,例如函數里面存在隱含的變量或者變量相互間存在耦合,也就互相依賴的情況。或者求導后式子得不到解釋解,例如未知參數的個數大於已知方程組的個數等。這時候我們就需要借助迭代算法來一步一步找到最有解了。迭代是個很神奇的東西,它將遠大的目標(也就是找到最優的解,例如爬上山頂)記在心上,然后給自己定個短期目標(也就是每走一步,就離遠大的目標更近一點),腳踏實地,心無旁貸,像個蝸牛一樣,一步一步往上爬,支撐它的唯一信念是:只要我每一步都爬高一點,那么積跬步,肯定能達到自己人生的巔峰,盡享山登絕頂我為峰的豪邁與忘我。
另外需要考慮的情況是,如果代價函數是凸函數,那么就存在全局最優解,方圓五百里就只有一個山峰,那命中注定了,它就是你要找的唯一了。但如果是非凸的,那么就會有很多局部最優的解,有一望無際的山峰,人的視野是偉大的也是渺小的,你不知道哪個山峰才是最高的,可能你會被命運作弄,很無辜的陷入一個局部最優里面,坐井觀天,以為自己找到的就是最好的。沒想到山外有山,人外有人,光芒總在未知的遠處默默綻放。但也許命運眷戀善良的你,帶給你的總是最好的歸宿。也有很多不信命的人,覺得人定勝天的人,誓要找到最好的,否則不會罷休,永不向命運妥協,除非自己有一天累了,倒下了,也要靠剩下的一口氣,邁出一口氣能支撐的路程。好悲涼啊……哈哈。
直覺上,一個線性模型的輸出值 y 越大,這個事件 P(Y=1|x) 發生的概率就越大。 另一方面,我們可以用事件的幾率(odds)來表示事件發生與不發生的比值,假設發生的概率是 p ,那么發生的幾率(odds)是 p/(1-p) , odds 的值域是 0 到正無窮,幾率越大,發生的可能性越大。將我們的直覺與幾率聯系起來的就是下面這個(log odds)或者是 logit 函數 (有點牽強 - -!):
進而可以求出概率 p 關於 w 點乘 x 的表示:
這就是傳說中的 sigmoid function 了,以 w 點乘 x 為自變量,函數圖像如下:
![]()
(注:從圖中可以看到 wx 越大,p 值越高,在線性分類器中,一般 wx = 0 是分界面,對應了 logistic regression 中 p = 0.5)
一、邏輯回歸(LogisticRegression)
Logistic regression (邏輯回歸)是當前業界比較常用的機器學習方法,用於估計某種事物的可能性。之前在經典之作《數學之美》中也看到了它用於廣告預測,也就是根據某廣告被用戶點擊的可能性,把最可能被用戶點擊的廣告擺在用戶能看到的地方,然后叫他“你點我啊!”用戶點了,你就有錢收了。這就是為什么我們的電腦現在廣告泛濫的原因了。
還有類似的某用戶購買某商品的可能性,某病人患有某種疾病的可能性啊等等。
Logistic regression可以用來回歸,也可以用來分類,主要是二分類。還記得上幾節講的支持向量機SVM嗎?它就是個二分類的例如,它可以將兩個不同類別的樣本給分開,思想是找到最能區分它們的那個分類超平面。但當你給一個新的樣本給它,它能夠給你的只有一個答案,你這個樣本是正類還是負類。例如你問SVM,某個女生是否喜歡你,它只會回答你喜歡或者不喜歡。這對我們來說,顯得太粗魯了,要不希望,要不絕望,這都不利於身心健康。那如果它可以告訴我,她很喜歡、有一點喜歡、不怎么喜歡或者一點都不喜歡,你想都不用想了等等,告訴你她有49%的幾率喜歡你,總比直接說她不喜歡你,來得溫柔。而且還提供了額外的信息,她來到你的身邊你有多少希望,你得再努力多少倍,知己知彼百戰百勝,哈哈。Logistic regression就是這么溫柔的,它給我們提供的就是你的這個樣本屬於正類的可能性是多少。
得來點數學。假設我們的樣本是{x, y},y是0或者1,表示正類或者負類,x是我們的m維的樣本特征向量。那么這個樣本x屬於正類,也就是y=1的“概率”可以通過下面的邏輯函數來表示:
這里θ是模型參數,也就是回歸系數,σ是sigmoid函數。實際上這個函數是由下面的對數幾率(也就是x屬於正類的可能性和負類的可能性的比值的對數)變換得到的:
換句話說,y也就是我們關系的變量,例如她喜不喜歡你,與多個自變量(因素)有關,例如你人品怎樣、車子是兩個輪的還是四個輪的、長得勝過潘安還是和犀利哥有得一拼、有千尺豪宅還是三寸茅廬等等,我們把這些因素表示為x1, x2,…, xm。那這個女的怎樣考量這些因素呢?最快的方式就是把這些因素的得分都加起來,最后得到的和越大,就表示越喜歡。但每個人心里其實都有一桿稱,每個人考慮的因素不同,蘿卜青菜,各有所愛嘛。例如這個女生更看中你的人品,人品的權值是0.6,不看重你有沒有錢,沒錢了一起努力奮斗,那么有沒有錢的權值是0.001等等。我們將這些對應x1, x2,…, xm的權值叫做回歸系數,表達為θ1, θ2,…, θm。他們的加權和就是你的總得分了。請選擇你的心儀男生,非誠勿擾!哈哈。
所以說上面的logistic回歸就是一個線性分類模型,它與線性回歸的不同點在於:為了將線性回歸輸出的很大范圍的數,例如從負無窮到正無窮,壓縮到0和1之間,這樣的輸出值表達為“可能性”才能說服廣大民眾。當然了,把大值壓縮到這個范圍還有個很好的好處,就是可以消除特別冒尖的變量的影響(不知道理解的是否正確)。而實現這個偉大的功能其實就只需要平凡一舉,也就是在輸出加一個logistic函數。另外,對於二分類來說,可以簡單的認為:如果樣本x屬於正類的概率大於0.5,那么就判定它是正類,否則就是負類。實際上,SVM的類概率就是樣本到邊界的距離,這個活實際上就讓logistic regression給干了。
所以說,LogisticRegression 就是一個被logistic方程歸一化后的線性回歸,僅此而已。
好了,關於LR的八卦就聊到這。歸入到正統的機器學習框架下,模型選好了,只是模型的參數θ還是未知的,我們需要用我們收集到的數據來訓練求解得到它。那我們下一步要做的事情就是建立代價函數了。
LogisticRegression最基本的學習算法是最大似然。
假設我們有n個獨立的訓練樣本{(x1, y1) ,(x2, y2),…, (xn, yn)},y={0, 1}。那每一個觀察到的樣本(xi, yi)出現的概率是:
上面為什么是這樣呢?當y=1的時候,后面那一項是不是沒有了,那就只剩下x屬於1類的概率,當y=0的時候,第一項是不是沒有了,那就只剩下后面那個x屬於0的概率(1減去x屬於1的概率)。所以不管y是0還是1,上面得到的數,都是(x, y)出現的概率。那我們的整個樣本集,也就是n個獨立的樣本出現的似然函數為(因為每個樣本都是獨立的,所以n個樣本出現的概率就是他們各自出現的概率相乘):
那最大似然法就是求模型中使得似然函數最大的系數取值θ*。這個最大似然就是我們的代價函數(cost function)了。
OK,那代價函數有了,我們下一步要做的就是優化求解了。我們先嘗試對上面的代價函數求導,看導數為0的時候可不可以解出來,也就是有沒有解析解,有這個解的時候,就皆大歡喜了,一步到位。如果沒有就需要通過迭代了,耗時耗力。
我們先變換下L(θ):取自然對數,然后化簡(不要看到一堆公式就害怕哦,很簡單的哦,只需要耐心一點點,自己動手推推就知道了。注:有xi的時候,表示它是第i個樣本,下面沒有做區分了,相信你的眼睛是雪亮的),得到:
這時候,用L(θ)對θ求導,得到:
然后我們令該導數為0,你會很失望的發現,它無法解析求解。不信你就去嘗試一下。所以沒辦法了,只能借助高大上的迭代來搞定了。這里選用了經典的梯度下降算法。
注:因為本文中是求解的Logit回歸的代價函數是似然函數,需要最大化似然函數。所以我們要用的是梯度上升算法。但因為其和梯度下降的原理是一樣的,只是一個是找最大值,一個是找最小值。找最大值的方向就是梯度的方向,最小值的方向就是梯度的負方向。不影響我們的說明。另外,最大似然可以通過取負對數,轉化為求最小值
產生這個現象的原因是存在一些無法正確分類的樣本點,也就是我們的數據集並非線性可分,但我們的logistic regression是線性分類模型,對非線性可分情況無能為力。然而我們的優化程序並沒能意識到這些不正常的樣本點,還一視同仁的對待,調整系數去減少對這些樣本的分類誤差,從而導致了在每次迭代時引發系數的劇烈改變。對我們來說,我們期待算法能避免來回波動,從而快速穩定和收斂到某個值。
對隨機梯度下降算法,我們做兩處改進來避免上述的波動問題:
1)在每次迭代時,調整更新步長alpha的值。隨着迭代的進行,alpha越來越小,這會緩解系數的高頻波動(也就是每次迭代系數改變得太大,跳的跨度太大)。當然了,為了避免alpha隨着迭代不斷減小到接近於0(這時候,系數幾乎沒有調整,那么迭代也沒有意義了),我們約束alpha一定大於一個稍微大點的常數項。
2)每次迭代,改變樣本的優化順序。也就是隨機選擇樣本來更新回歸系數。這樣做可以減少周期性的波動,因為樣本順序的改變,使得每次迭代不再形成周期性。
1.從方差代價函數說起
代價函數經常用方差代價函數(即采用均方誤差MSE),比如對於一個神經元(單輸入單輸出,sigmoid函數),定義其代價函數為:
其中y是我們期望的輸出,a為神經元的實際輸出【 a=σ(z), where z=wx+b 】。
在訓練神經網絡過程中,我們通過梯度下降算法來更新w和b,因此需要計算代價函數對w和b的導數:
然后更新w、b:
w <—— w - η* ∂C/∂w = w - η * a *σ′(z)
b <—— b - η* ∂C/∂b = b - η * a * σ′(z)
因為sigmoid函數的性質,導致σ′(z)在z取大部分值時會很小(如下圖標出來的兩端,幾近於平坦),這樣會使得w和b更新非常慢(因為η * a * σ′(z)這一項接近於0)。
2.交叉熵代價函數(cross-entropy cost function)
為了克服這個缺點,引入了交叉熵代價函數(下面的公式對應一個神經元,多輸入單輸出):
其中y為期望的輸出,a為神經元實際輸出【a=σ(z), where z=∑Wj*Xj+b】
與方差代價函數一樣,交叉熵代價函數同樣有兩個性質:
- 非負性。(所以我們的目標就是最小化代價函數)
- 當真實輸出a與期望輸出y接近的時候,代價函數接近於0.(比如y=0,a~0;y=1,a~1時,代價函數都接近0)。
另外,它可以克服方差代價函數更新權重過慢的問題。我們同樣看看它的導數:
可以看到,導數中沒有σ′(z)這一項,權重的更新是受σ(z)−y這一項影響,即受誤差的影響。所以當誤差大的時候,權重更新就快,當誤差小的時候,權重的更新就慢。這是一個很好的性質。
3.總結
-
當我們用sigmoid函數作為神經元的激活函數時,最好使用交叉熵代價函數來替代方差代價函數,以避免訓練過程太慢。
-
不過,你也許會問,為什么是交叉熵函數?導數中不帶σ′(z)項的函數有無數種,怎么就想到用交叉熵函數?這自然是有來頭的,更深入的討論就不寫了,少年請自行了解。
-
另外,交叉熵函數的形式是−[ylna+(1−y)ln(1−a)]而不是 −[alny+(1−a)ln(1−y)],為什么?因為當期望輸出的y=0時,lny沒有意義;當期望y=1時,ln(1-y)沒有意義。而因為a是sigmoid函數的實際輸出,永遠不會等於0或1,只會無限接近於0或者1,因此不存在這個問題。
logistic regression 在多類上的推廣又叫 softmax regression, 在數字手寫識別中,我們要識別的是十個類別,每次從輸入層輸入 28×28 個像素,輸出層就可以得到本次輸入可能為 0, 1, 2… 的概率。
在 softmax regression 中,輸入的樣本屬於第 j 類的概率可以寫成:
(注:對比第一部分提到過的中間一步,有什么不同?)
注意到,這個回歸的參數向量減去一個常數向量,會有什么結果:
沒有變化!這說明如果某一個向量是代價函數的極小值點,那么這個向量在減去一個任意的常數向量也是極小值點,這是因為 softmax 模型被過度參數化了。(題外話:回想一下在線性模型中,同時將 w 和 b 擴大兩倍,模型的分界線沒有變化,但是模型的輸出可信度卻增大了兩倍,而在訓練迭代中, w 和 b 絕對值越來越大,所以 SVM 中就有了函數距離和幾何距離的概念)
既然模型被過度參數化了,我們就事先確定一個參數,比如將 w1 替換成全零向量,將 w1.x = 0 帶入 binomial softmax regression ,得到了我們最開始的二項 logistic regression (可以動手算一算), 用圖就可以表示為
(注:虛線表示為 0 的權重,在第一張圖中沒有畫出來,可以看到 logistic regression 就是 softmax regression 的一種特殊情況)。
實際應用中,為了使算法實現更簡單清楚,往往保留所有參數,而不任意地將某一參數設置為 0。我們可以對代價函數做一個改動:加入權重衰減 (weight decay)。 權重衰減可以解決 softmax 回歸的參數冗余所帶來的數值問題。並且此時代價函數變成了嚴格的凸函數, Hessian矩陣變為可逆矩陣,保證有唯一的解。(感覺與線性分類器里限制 ||w|| 或者設置某一個 w 為全零向量一樣起到了減參的作用,但是這個計算起來簡單清晰,可以用高斯分布的 MAP 來推導,其結果是將 w 軟性地限制在超球空間,有一點 “soft” 的味道,個人理解^ ^)
加入權重衰減后的代價函數是:
等號右邊第一項是訓練樣本 label 對應的輸出節點上的概率的負對數,第二項是 weight decay ,可以使用梯度下降法和 L-BFGS 等算法可以保證收斂到全局最優解。總結起來,logistic regression 是 softmax regression 的一種特殊形式,前者是二類問題,后者是多類問題,前者的非線性函數的唯一確定的 sigmoid function (默認 label 為 0 的權重為全零向量的推導結果), 后者是 softmax, 有時候我們並不特意把它們區分開來。
第一部分:Logistic Regression
/*************(一)~(二)、Classification / Hypothesis Representation***********/
假設隨Tumor Size變化,預測病人的腫瘤是惡性(malignant)還是良性(benign)的情況。
給出8個數據如下:
假設進行linear regression得到的hypothesis線性方程如上圖中粉線所示,則可以確定一個threshold:0.5進行predict
y=1, if h(x)>=0.5
y=0, if h(x)<0.5
即malignant=0.5的點投影下來,其右邊的點預測y=1;左邊預測y=0;則能夠很好地進行分類。
那么,如果數據集是這樣的呢?
這種情況下,假設linear regression預測為藍線,那么由0.5的boundary得到的線性方程中,不能很好地進行分類。因為不滿足
y=1, h(x)>0.5
y=0, h(x)<=0.5
這時,我們引入logistic regression model:
所謂Sigmoid function或Logistic function就是這樣一個函數g(z)見上圖所示
當z>=0時,g(z)>=0.5;當z<0時,g(z)<0.5
由下圖中公式知,給定了數據x和參數θ,y=0和y=1的概率和=1
/*****************************(三)、decision boundary**************************/
所謂Decision Boundary就是能夠將所有數據點進行很好地分類的h(x)邊界。
如下圖所示,假設形如h(x)=g(θ0+θ1x1+θ2x2)的hypothesis參數θ=[-3,1,1]T, 則有
predict Y=1, if -3+x1+x2>=0
predict Y=0, if -3+x1+x2<0
剛好能夠將圖中所示數據集進行很好地分類
Another Example:
answer:
除了線性boundary還有非線性decision boundaries,比如
下圖中,進行分類的decision boundary就是一個半徑為1的圓,如圖所示:
該部分講述簡化的logistic regression系統中how to implement gradient descents for logistic regression.
假設我們的數據點中y只會取0和1, 對於一個logistic regression model系統,有,那么cost function定義如下:
由於y只會取0,1,那么就可以寫成
成
不信的話可以把y=0,y=1分別代入,可以發現這個J(θ)和上面的Cost(hθ(x),y)是一樣的(*^__^*) ,那么剩下的工作就是求能最小化 J(θ)的θ了~
在第一章中我們已經講了如何應用Gradient Descent, 也就是下圖Repeat中的部分,將θ中所有維同時進行更新,而J(θ)的導數可以由下面的式子求得,結果如下圖手寫所示:
現在將其帶入Repeat中
:
這是我們驚奇的發現,它和第一章中我們得到的公式是一樣滴~
也就是說,下圖中所示,不管h(x)的表達式是線性的還是logistic regression model, 都能得到如下的參數更新過程。
比如我想分成K類,那么就將其中一類作為positive,另(k-1)合起來作為negative,這樣進行K個h(θ)的參數優化,每次得到的一個hθ(x)是指給定θ和x,它屬於positive的類的概率。
按照上面這種方法,給定一個輸入向量x,獲得最大hθ(x)的類就是x所分到的類。
The Problem of overfitting:
overfitting就是過擬合,如下圖中最右邊的那幅圖。對於以上講述的兩類(logistic regression和linear regression)都有overfitting的問題,下面分別用兩幅圖進行解釋:
<Linear Regression>:
<logistic regression>:
怎樣解決過擬合問題呢?兩個方法:
1. 減少feature個數(人工定義留多少個feature、算法選取這些feature)
2. 規格化(留下所有的feature,但對於部分feature定義其parameter非常小)
對於linear regression model, 我們的問題是最小化
寫作矩陣表示即
i.e. the loss function can be written as
there we can get:
After regularization, however,we have:
對於Regularization,方法如下,定義cost function中θ3,θ4的parameter非常大,那么最小化cost function后就有非常小的θ3,θ4了。
寫作公式如下,在cost function中加入θ1~θn的懲罰項:
這里要注意λ的設置,見下面這個題目:
Q:
A:λ很大會導致所有θ≈0
<Linear regression>:
首先看一下,按照上面的cost function的公式,如何應用gradient descent進行參數更新。
對於θ0,沒有懲罰項,更新公式跟原來一樣
對於其他θj,J(θ)對其求導后還要加上一項(λ/m)*θj,見下圖:
如果不使用梯度下降法(gradient descent+regularization),而是用矩陣計算(normal equation)來求θ,也就求使J(θ)min的θ,令J(θ)對θj求導的所有導數等於0,有公式如下
如果不使用梯度下降法(gradient descent+regularization),而是用矩陣計算(normal equation)來求θ,也就求使J(θ)min的θ,令J(θ)對θj求導的所有導數等於0,有公式如下:
而且已經證明,上面公式中括號內的東西是可逆的。
<Logistic regression>:
前面已經講過Logisitic Regression的cost function和overfitting的情況,如下圖中所示:
和linear regression一樣,我們給J(θ)加入關於θ的懲罰項來抑制過擬合:
用Gradient Descent的方法,令J(θ)對θj求導都等於0,得到
這里我們發現,其實和線性回歸的θ更新方法是一樣的。