Machine Learning學習日記 — Coursera篇 (Week 3.2):Cost Function, Simplified Cost Function and Gradient Descent, Advanced Optimization
Logistic Regression Model
大綱
- Cost Function
- Simplified Cost Function and Gradient Descent
- Advanced Optimization
1. Cost Function
我們可不可以繼續用之前Linear Regression的cost function呢?
答案是不行。
但是cost function不就是為了求得我們的預測函數的誤差嗎?
為什麼不能繼續沿用呢?
因為當函數不再是線性函數時,sigmoid的函數平方項將會造成一個 unconvex的函數圖形
這意味著,我們很有可能走到一個距離global optimal solution還很遠的地方就停下來了(local optimal solution),正如上圖所示
因此我們要找到一個新的函數可以讓我們的J(θ)長得像下面的convex圖形
新的cost function函數:
大家可能會感到疑惑:這個函數到底要幹什麼?
這個函數的精華就是當預測失敗的時候,我們要讓預測誤差變得很大
並隨著預測數字離正確答案越近,預測誤差會漸漸趨近於0
第一行:-log(hθ(x)),if y=1
這代表當y為1的時候,根據我們的hypothsis及正確答案的數據計算所得到的預測誤差
而hθ(x)所得出的就是一個介於0和1的機率數值(預測結果為1的機率)
而這個函式會形成下列圖形(實際上這只是圖形的一部分,因為我們只繪出x=0~1的函式圖形):
可以想像成f(x) = -log(x),x的範圍是從0至1
而我們可以發現當x越往0趨近,cost(其誤差)會趨近無限大,因為這代表著其與正確答案 y=1的差距
反之當x越往1趨近,cost會趨近於0直至變成0
第二行:-log(1-hθ(x)),if y=0
則會形成下列圖形
當x越往1趨近,cost(其誤差)會趨近無限大,因為這代表著其與正確答案 y=0的差距
反之當x越往0趨近,cost會趨近於0直至變成0
在上述的cost function中,可以發現當我們設定出一個 hypothesis後,我們透過加總其hypothesis跟solution的誤差來求得我們的J(θ)
而我們預期可以找到一個最佳的hypothesis使得所有的cost加總為最小(Andrew說covex的相關分析超出課程範圍)
總之,這代表著此函數將可以形成一個 convex圖形,並可以依此找到global optimal solution
隨堂練習
Ans:
2. Simplified Cost Function and Gradient Descent
我們現在有了計算每個誤差及cost function的函式
但現在有個問題:
難道每次我們計算預估誤差時,都要先檢查一下y是1或是0嗎?
而且這種需要先行判別的函數沒有辦法直接偏微分,並導出Gradient Descent
有沒有更簡潔有力的寫法呢?
for i = 1 to m {
x = X(i); // x為第i項的資料
-----------------------------------------------
if (y == 1){
Total_cost = Total_cost + (-log(hθ(x)));
}
else if (y == 0){
Total_cost = Total_cost + (-log(1-hθ(x)));
}
-----------------------------------------------
}
是可以更簡潔的。
下面這個函式大家可以試著把 y = 1跟 0代入,在消掉項目就可以得到原本的cost function,可以參考下圖的做法
OK,那Gradient Descent的函式便一如既往的將cost function偏微分
將上圖展開後會發現,若單看下面這張圖(Logistic的Gradient Descent)會發現跟Linear Regression的Gradient Descent的函數差不了多少
差別是在hθ(x):藍色是Linear Regression,紅色是Logistic Regression
隨堂練習(1)
Ans:
隨堂練習(2)
Ans:
3. Advanced Optimization
Methods to run the algorithm(using Gradient Descent) more efficiently
有兩件事是需自行定義的項目:J(θ)及J(θ)的偏導向
但是在這之後的處理方法的不同,導致了所選擇的演算法的不同
在圖中紅色圈起來的就是我們一直以來都在使用的Gradient Descent演算法
其他的數種方法都超出課程範圍。下面是對於conjugate,BFGS,L-BFGS與Gradient Descent之間大略的比較:
簡單的說,就是這些演算法我們不用指定α值,但缺點就是更為複雜
Andrew建議我們直接使用前人已經建立好的函式庫,而不是自己重新造輪。
以下將會介紹在Octave中的一個函式庫,我們僅需代入一些參數即可快速算出最佳的θ值跟J(θ)
假設我們已得知了函式J(θ)跟偏導數,一般人可以一眼看出,若要得到最小的J(θ)值的話,θ1跟θ2都設為5將會得到最小的 cost。
但今天我們要用Gradient Descent來求得最佳的θ值要怎麼解呢?
要怎麼讓電腦自己運行這個函數、運行多少次、監控函數有沒有收斂?
答案就是:呼叫fminuc函數。
fminuc函數會導入一共三個參數:
1. initialTheta:一般會設定 θ值為0
2. options:設定
(1)使用Gradient Descent方法('GradObj'),並設定開啟狀態('on')
(2)設定最大('MaxIter')循環的次數('100'),這邊的最大指的是在函數最多只會run 100次(如果有提早達成J(θ)最小值的標準的話就會提早結束)
3.@costFunction
@costFunction 指的就是下圖的函式
最後fminunc會回傳三個值:
1. optTheta:使J(θ)最小化的θ值
2. functionVal:最小的J(θ)值
3. exitFlag:不同的數字代表著不同的含義,ex:若為 1代表函數已收斂
可參考fminunc的文件
隨堂練習
Ans: