本週第二部分,開始介紹如何讓多變數線性迴歸的gradient descent 做得更順暢。
舉例來說,假設有個房價公式會考量房子的大小 (X1) 和房間的數量 (X2),
因為房子的大小通常是以數百到上千平方呎來計算,而房間的數量基本上都是個位數 (0~5),
所以兩個X的數值有數量級的差異 (三~四位數 vs 個位數),
因此一個合理的 w1和w2,當然是w1會很小,而w2會很大,才有辦法產生合理的房價預測值 (除非X1真的有很大的影響力…)。
如果畫成散布圖,就會如下:
左邊是feature 的數字,因為房屋尺寸的的數值很大,分布也很廣,而房間數的數值很小、分布窄,
因此Feature 的分布圖顯得很扁平。
而 parameter方面,因為很小的w1就足以造成很大的變化,因此 w1勢必反而會數值很小,分布也很窄,
而w2就反之,要夠大的數字才能夠造成足夠的變化,
所以會讓parameter的 contour圖呈現出很高瘦的形態,而這樣的形態會對gradient descent造成什麼影響呢?
答案是如果 cost function的contour plot 太瘦長,做gradient時會容易衝過頭,導致需要來回震盪多次才能找到最低點,
但如果經過 feature scaling 把兩個feature 的數量級化成差不多,
在兩軸都比較平均成為類圓形的contour plot 會讓gradient descent更容易直直往最低點衝。
Feature scaling 的方法有很多種,
第一種方法是所有數值都除以各自的 X 中最大的數字,使其最大值都被限制在1,
就能讓分布圖從原本的扁平狀展開來。
方法二, mean normalization ,
分母是全距,也就是該x的最大值扣掉最小值,分子則是每一個x 相對於平均值的距離,
這個方法會讓每一種X都被scale 到[-1,1] 之間的區間,以致於達到normiaztion的效果,
如果不知道最大值和最小值的話,也可以把分母置換成標準差 (standard deviation),稱之為Z-score normalization,
讓資料符合標準的常態分布。
在程式碼中,如上面這般定義好 normalization之後,比較normalize 前/後 feature的差異,
可以發現:
Normalization 可以維持每一個feature原本的分布,但讓他們 X 軸的scale 在差不多的水位。
總而言之, feature scaling 的目的是在多變數線性迴歸時,讓每一個feature的尺度能相近,讓模型能更快收歛。
原則上期望會在-1~1之間,如果不要相差太多的話也沒關係,
但是如果數字太大 (上百) 或太小 (小數點後3位)等等,就建議執行feature scaling 把feature給rescale。
既然 feature scaling 的目的是要讓模型更快收歛,那接下來就來看到底要如何才知道模型收歛了沒,
方法是透過上面投影片中的圖 ,即所謂 learning curve,橫軸是 gradient 時 weighting 和 bias 更新的次數,
而縱軸則是cost function 在每次 weighting 和 bias 更新後算出來的數值。
因此每一個iteration 都會有一個新的 weighting 和 bias,而我們要檢視這個 cost function的數值是否一直降低,
當 cost function的數字開始趨於穩定、不再降低時,就是模型收歛的時候了,
由於到底要花幾個 iteration才會收歛其實是case by case,
所以實務上會設定一個很小的門檻,比方說 0.001,只要cost function 不再增加>這個數值,就視為已達到global minimum。
總結來說,我們在建模的過程中,需要觀察cost function有沒有隨著參數的更新而不斷下降,
如果是不斷起起伏伏,基本上代表learning rate 設定得太大,所以模型反而越過最低點,跑到另一個相對高的位置了,
而如果 cost 不斷上升,除了learning rate 太大以外,也有可能是程式寫錯了,
比方說,明明參數的更新要用負號,但程式卻寫成正號,就有可能帶著cost function一路遠離最小值了,
因此在設定learning rate時,可以優先從一個很小的數值,比方說0.001開始,
但是太小的數值也有可能導致收歛的速度太忙,
所以可以用10倍為單位,比方說 0.001, 0.01, 0.1等,嘗試什麼樣的learning rate 可以兼顧收歛的能力與效率。
接下來,另一個可以用來加強模型的手法叫做 feature engineering 即特徵工程,
做這件事的目的是要讓我們的feature 能夠更好地描述我們要預測的目標,
比方說預測房價時,如果原本的feature 是房子的長度與寬度,而我們判斷其面積也是一個重要因子的話,
就可以把長度與寬度給相乘起來變成一個新的feature,就相當於直接暗示我們的模型說: 面積也是一個重要因子,
我們已經透過人力去暗示演算法答案了。
最後,在真實的世界中,不會只有線性的狀況,很多時候我們面臨的是非線性的,需要多項式來解決的狀況,
比方說房價問題,房價有可能會在一開始時是急劇上升,但是當大到一個程度後,因為大家消費能力到了極限,
所以反而成長的趨勢會趨緩,如果用線式方程式呆呆地做fitting,可能會得到過大的估計值,
但使用二次方程式時,曲線終究會往下走,這並不符合常理,因為越大的房子應該還是要越貴,
所以這時就要再加上一個3次方項,讓曲線在經過一段平滑區之後還是會繼續往上走,
要注意的是,這樣的操作會讓feature 的數量級相差很多,因此要運用 feature scaling 的技巧。
或是運用feature engineering 的概念,既然使用3次方項會衝太快,
那改使用根號,有類似的效果而且曲線相對來說會比較平滑。
總結來說,本週引入了多個feature 的 multi-variate regression 概念,
並且延伸 cost function 與 gradient descent 的概念,
然後分享了包括 hyperparameter tuninng、feature engineering 和 feature scaling 等多個技巧,
讓大家的模型可以更快收歛,表現也更好。
迴歸的觀念至此告一段落,接下來要來介紹機器學習的另一個主流題型: 分類問題 (classification)。
留言列表