機器學習自學筆記02: Regression: Case Study for ML

by wenwu
0 comment
今日的課程來自於: https://youtu.be/CXgbekl66jc
參考筆記:https://github.com/Sakura-gh/ML-notes/blob/master/1_Introduction.md

這堂課老師用現有數據預測寶可夢的進化後CP值

Scenario: 根據已有的 data 來確定 scenario,我們的 data是 labeled,使用Supervised Learning

Task: 根據我們想要 function 的輸出類型決定 task ,我們預期得到是寶可夢進化後的 cp值,是一個 scalar ,因此使用的是 Regression

Model: 模型的選擇很多,這邊使用 Linear model


回顧一下machine learning 的三個步驟

  1. define a set of function
    定義一個function set (A set of function=Model)
  2. goodness of function
    讓machine可以衡量這個function 好不好
  3. pick the best function
    有一個好的演算法可以挑出最好的function

machine learning 的三個步驟

Step1: Model (function set )

如何挑選一個function 的模型呢? 基本上沒有明確的思路,只能憑經驗嘗試,而這邊使用linear model 。

Linear Model 線性模型

y 代表進化後的cp 值,Xcp 為進化前的cp值,w和b代表未知的參數。
y=b+w * Xcp 這個抽象的是式子就叫做model,是以上這些具體化的function 的集合,即function set 。
實際上這是一種 Linear Model ,但只考慮了寶可夢進化前的cp值,因而我們可以將其擴展為:

Xi: an attribute of input X (Xi is also called feature ,即特徵值)
Wi: weight of xi 
b: bias


Step2: Goodness of Function

參數說明:
x^i: 用上標表示一個完整的object的編號,i表示第i隻可夢(下標表示該object中的component)
y^i: 用 y 表示一個實際觀察到object輸出,上標 i 表示第 i 個 object
(因為打字的關係無法表示清楚,可以參考筆記)

Loss function 損失函數

Loss function 是 一個評估函數,就是一個function 的function,Loss function 實際上就是在衡量一組參數的好壞。

前面的model是自主挑選的,這裡的loss function 也是,最常用的方法就是採用方差和的形式來衡量model的好壞。

input : a function 
output: how bad/good it is

如果 L(f) 越大,說明該function表現得越不好;L(f)越小,說明該function 表現得越好。


Loss function 可視化

下圖是loss function 的可視化,圖中每一個點都代表一組(w,b),也就是對應著一個function;而該點的顏色對應著loss function的結果 L(w,b),顏色越紅表示loss function的值越大,表現的效果越不好 ; 越藍表示loss function 的值越大,表現的效果越好。


Step3: Pick the Best Function

我们已經確定了loss function,他可以衡量我們的model裡面每一個function的好壞,接下来我们要做的事情就是,從這個function set裡面,挑選一個最好的function

將 formulation/equation 寫下的樣子如下:

也就是那個使L(f)=L(w,b)=Loss 最小的 f 或(w,b),就是我們要找的f * 或(w*,b*)

利用線性代數的知識,可以解得這個 closed-form solution,但這裡採用的是一種更為普遍的方法 — — gradient descent(梯度下降法)


Gradient Descent 梯度下降

上面的例子比較簡單,用線性代數的方法可以解;而gradient descent 的方法應用更廣,只要 L(f) 是可微分的,gradient descent 都可以拿來處理這個 f ,找到表現最好的parameters 。

  • 單個參數的問題

假設現在的Loss function 為 L(w) 並且是可微的,我們的目標就是找到能讓 L(w) 最小的 w* ,實際上就是尋找切線L斜率為0的 global minima 最小值發生的點(需要小心local minima 斜率也是0)

  1. 首先隨機選取初始值 w0
  2. 計算 L 在 w=w0 的微分值 dL/dw,就是該點的切線斜率
  3. 如果微分的值為正,就往左找;如果微分的值為負,就往右邊找解。
    w的變化量step size 的大小取決於兩件事
    1. 微分值有多大,如果微分值(斜率)越大表示現在在一個月陡峭的地方,那要移動的距離就越大,反之越小
    2. learning rate(學習率) : η 。 每次踏出的step size 不只取決於現在的斜率,還取決於這個事前就設定好的 η (learning rate)。如果η (learning rate) 比較大,那每踏出一步的時候,參數w更新的幅度就大。
    如果η (learning rate) 設置的大,機器學習的速度也會比較快,但是如果太大,可能就會跳過最合適的global minima 的點。
  4. 每次參數更新的大小是 η * dL/dw ,每次更新的式子如下:

當我們找到微分為0的時候,就會停止了,所以通過gredient descent 找出來的solution 其實並不是最佳解 global minima

幸運的是, 在Linear regression上,是沒有local minima的,因此可以使用gradient descent 。

  • 兩個參數的問題

兩個參數的gradient descent 和一個參數的gradient descent 的步驟一樣。

  1. 首先設定兩個參數的初始值 w0 & b0
  2. 然後分別計算 ( w0,b0 ) 這個點上 L( w0,b0) 對 w 和b 的偏微分
    ∂L/∂w & ∂L/∂b
  3. 更新參數,當迭代跳出時,( wi,bi ) 應為極小值點

實際上,L 的gradient 就是微積分中的那個梯度的概念,即

注意 : 兩個的η (learning rate) 必須保持一致,這樣每次更新座標的step size 是等比例縮放的,保證座標前進的方向始終和梯度下降的方向一致,否則座標前進的方向會發生偏移。


gradient descent 的缺點 :

gradient descent 有一個令人擔心的地方,就是gradient descent 找到 微分等於零的地方,只是local minima ,並不是global minima。
如果今天我們的 Loss function 是坑坑巴巴的,那麼就很難找到global minima,而我們初始值得設立,也會影響到是否能夠找到global minima。

但是在Linear regression 裡,loss function 基本上是convex 的,他是一個凸函數。所以不管初始值在哪裡,根據gradient descent都能夠找到同一組參數。


Overfitting

現在具體對L作w&b的偏微分

根據gradient descent ,我們得到 b=-188.4, w=2.7

我們需要有一套評估系統來評價我們得到的預測值與實際值得誤差,將training data的誤差相加=31.9 , testing data 的誤差相加=35.0

training data 的誤差比 testing data 的誤差較小,也符合常識。

上圖可以發現,有些點不完全適用於我們找得function ,我們該如何重新設計model ,是否有更好的function呢?

以下嘗試不同微度的 function : 分別有二次式到五次式(圖片只放了三次式到五次式)

在gradient descent可以找到best function的前提下(多次式为Non-linear model,存在local optimal局部最佳解,gradient descent不一定能找到global minima),function所包含的項的次數越高,越複雜,error在training data上的表現就會越來越小;但是,我们關心的不是model在 training data上的error 表現,而是model在testing data上的error表現。

可以發現在二次式&三次式 training data 和testing data 的error 越來越小,但是到了四次式&五次式時,training data的error 越來越小 ,但是testing data 的error 卻爆掉了,通常被稱為overfitting。

因此Model 不是越複雜越好,而是選擇一個最合適的model,在本例中,三次式是最適合的model。


物種Xs的影響

之前我們的model只考量了寶可夢進化前的cp值。顯然這是不對的,除了cp值外,還受到物種Xs的影響,因此我們重新設計model

並且將model 寫成一式。


HP值Xhp\height Xh\ weight Xw的影響

考量所有可能有影響的參數,設計出這個最複雜的model

算出來的training error=1.9,但是 testing data=102.3 ! 
這麼複雜的model 很大的機率會發生overfitting


Regularization 解決 overfitting

regularization可以使曲線變得更加smooth,training data上的error變大,但是 testing data上的error變小。

其實regularization就是重新定義step2的時候,重新redesign loss function

原來的loss function 只考慮的prediction的error;而regularization則是在原來的loss function加上了一項λ Σ(wi)² , 這就是法這個model裡面所有的wi 的平方和用 λ 加權。(原先的Loss function是考慮 error,而λ Σ(wi)² 則是考慮smooth )

我們當然希望Loss function可以越小越好。同時,我們也期待參數wi越小 甚至接近於0,就能使function較平滑。如果我們有一個較平滑的function,那當今天我們輸入(input)有變化時,output的變化就不會太大。
也就是說,當wi 越接近0時,輸出對輸入就不會這麼敏感。

那位甚麼剛剛沒有提到bias 這項呢? bias 的大小對function的平滑程度是沒有關係的,因為調整bias只會使function上下移動而已,所以並沒有加入bias 。


如何選擇 λ 值,以取得最好的值

λ值越大,在loss function 中 考慮smooth那一項(λ Σ(wi)²) 的影響力就越大,而我們的function 就越平滑。
從下圖可知,當λ 越大時,training data 上得到的error 就會越大, 因為當λ 越大的時候,我們就越傾向於考慮w的值,而越少考慮error的大小。
但是有趣的是,雖然在training data 上得到的error越大,但是testing data 的error 可能會比較小。

下圖中,当λ从0到100變大的时候,training error不段變大,testing error反而不段變小;但是當λ太大的时候(>100),在testing data上的error就會越來越大

我們喜歡比叫平滑的function,因為它對noise不那麼sensitive;但是我們又不喜歡太平滑的function,因為它就失去了對data擬合的能力;而function的平滑程度,就需要通過调整λ來決定。就像下圖中,當λ=100时,在testing data上的error最小,因此我们選擇 λ=100 。

Related Articles

發表迴響