This is a journal of learning Tensorflow, OpenAi Gym.

2017年11月12日 星期日

機器學習筆記─前言

前言
        一開始會接觸機器學習是為了要做程式交易,在查資料學習的過程中對這塊也越來越感興趣,但是隨著看到的資料越多,在這條路上遇到的挫折也越來越大,在看了台大李宏毅教授的課程之後才稍微對這一塊有基礎認識,因此決定開一個部落格紀錄一下課程筆記,若有興趣的人也可以來討論一下。


學習資料:
  1. 莫煩Python:這個網站應該不少人看過,一開始我也是從這個影片接觸機器學習的,但是老實說這個網站的入門知識相當粗淺,也許是網站定位的關係,因此很多名詞不會深入解釋,如果要用在實務坦白說有很大困難,不過對於演算法解釋得相當不錯,能夠讓人快速理解。
  2. 李弘毅教授的機器學習課程:台大有兩位教授都有開機器學習線上課程,一位是林軒田教授,另一位則是李弘毅教授。對數學底子很差的我來說,李宏毅教授的課程我比較看得懂,因此選擇先看這個課程的影片。李弘毅教授的機器學習課程主要會針對類神經網路下去做講解,一開始會從最基本的Regression開始講,接著會由分類問題引導到類神經網路,並講解CNN與RNN,最後再帶一些非監督式學習的演算法與強化學習。
一開始會建議先看莫煩的Youtube影片讓你對機器學習有基本概念,這系列影片除了要看熟還要看懂,因為他的影片是最最最粗淺的了,如果看不懂的話在接下來的學習會非常痛苦。
在這系列文章打完後我會回頭去看林軒田教授的機器學習基石,因為機器學習基石的內容是機器學習的根本,未來要走向實務勢必得把那系列課程學完,學完後再深入看李宏毅教授的深度學習課程。

這系列的文章將會基於李弘毅教授的課程對機器學習作介紹,預計的內容會有:
  1. Regression
  2. model的訓練、優化與選擇
  3. classification
  4. Deep Learning
  5. CNN
  6. RNN
  7. 強化學習

2017年10月4日 星期三

深度學習基礎─Model的訓練、優化與選擇

深度學習基礎─Model的訓練、優化與選擇

一、資料的分配



在訓練Model之前我們必須先將資料分成好幾塊。大多數人的做法是將原本的Data Set分成Training Data以及Testing Data,而Testing Data又分成public以及private,不過還有一種做法是將Training Data再分成Training Set以及Validation Set。

Training Data顧名思義就是用來訓練 model的,而Validation Data則是用來挑選以及修改model的。一個好的model他的表現再Training Data以及Validation Data上應該要差不多,如果他在Testing Data的表現很好,但是在Validation Data的表現很糟,此時就是處於Overfitting的狀態,但是如果他在Testing Data的表現就很糟,那麼就是Underfitting了。
在上圖中之所以會將Validation data歸類在Training Data裡面是因為重新設計且挑選好Model後,我們可以把Model 用整個Training Data 重新更新一次參數。

有的人可能會問,既然我們都有了Validation Data,那麼為何要再抓一個Testing Data呢?Testing Data 與 Validation Data的最大不同點在於我們不會針對他修正Model或是更新參數,他用來讓我們知道這個Model在真實情況下他的期望狀況會是如何。至於 Private Testing Data 的功能則是讓老師打作業成績用的(誤)。


還有一種做法叫做N-fold Crodd Validation。
以這個投影片為例,我們將Training Set 分成三份,其中兩份是Training Set 一分是 Validation Set ,這樣的分法就可以使我們的Traing Set 與 Validation Set有很多種不同排列組合。我們將三個不同的Model 在各個組合上做訓練並計算出Loss的平均值,就可以從中得到比較好的一個Model。

二、Loss 從哪裡來?


現在我們學會了如何分割Data Set,也有了最基本的Model(如果忘記了請複習上一篇文章),此時我們的model很有可能與target 有非常大的Loss,為了要降低Loss,我們必須先了解Loss 是怎麼來的。




Model 與 Target 之間的Loss主要來自於Bias以及Loss,在課程中老師以打靶的方式做比喻:
我們的目標值y是靶心,模型的預測值則是子彈,子彈與靶心的距離來自於Bias,Bias大就會離靶心很遠;打出去的子彈散的多開則取決於Variance,Variance大就要打很多次才會打中靶心。


假設我們將估測值Y(投影片上的Sample N points X上標n)取平均值m,那麼我們會發現它並不會與真實預測值的平均值Miu相等。此時我們再估測m的Variance會發現它會是Variable of x / N,也就是說樣本數N增加,那麼Variance就會越小。


至於Bias的估算方式則是抓上圖S的期望值,接著我們就會發現S的期望值剛好會是Variance of x 的N-1/N。

而Variance 與 Bias 與Model的複雜度有相當程度的關係

越複雜的Model 越容易得到大的Variance,因為越複雜的Model 越容易受到input data影響。



Bias的估算方式比較麻煩,因為一開始的時候我們根本不知道我們的Model丟出什麼東西,此時只好假設黑色線是我們的Target function,而藍色線則是Model測試上千次實驗後得到的平均值。
此時我們可以發現簡單的Model地的估算值比較集中,但是會離目標函數比較遠;複雜的Model雖然每次的預測值都散得很開,但是經過上千次的實驗預測後,平均值會與目標函數相近。


如果我們的Model在Training 階段就無法命中Target function (Underfitting),那麼就代表Bias 太大;如果我們的Model在training Data上表現不錯,但是在testing Data上卻有巨大的Error (Overfitting),此時就是Variance過大。

如果要解決Bias過大的問題,我們可以input 更多feature 或是提高model的複雜度來解決;如果是Variance過大,我們就要透過增加Data 或是透過 Regularization 的方式解決。
以下將介紹何謂Regularization 。



Regularization terms就是將每一個weights平方後乘上常數Landa,我們的Model為了要減少Loss就必須要盡可能的使wieghts減小,此時就會得到一個比較平滑的function,而我們認為比較平滑的function Loss會比較小
至於為什麼這樣做會得到一個比較平滑的function呢?
改辦後的Loss function 可以想像成我們直接對原本的model做了一點修改,我們在原本的function中於兩邊同時加上Summation(Weights * Xi的變化量),為了要減小輸入對輸出的影響,我們就必須盡可能的使Weights縮小,這樣一來就可以是複雜的model平滑一點了。



理論上來說,Landa越大則function越平滑,且在Testing Set的Loss就會越小,但是在Training Set的Loss則會比較大,原因的話其實滿直觀的,原本的model參數只要讓Loss越來越小就好,但是現在還要讓function更平滑,因此就會產生顧此失彼的情況。
至於為什麼增加一個參數就可以使function變平滑呢?因為當我們輸入一個值進來後它會使Y做變化,而這時候Regularization terms的功用就是使Y的變化不要那麼的大。



總結:
在我們設計好Model,分割好Data後,我們就會開始Train Model。一開始大家遇到Model Error很大的時候其實就會直接去塞進更多的feature或是把Model設計得更複雜,但是其實在做這些事之前我們應該要先了解Model 的問題是來自於Bias 還是 Variance,這樣子才能夠有效率的修正Model。

2017年9月20日 星期三

深度學習基礎─Regression

深度學習基礎─Regression


一、什麼是 Regression


Regression(中文:迴歸)是一個非常基礎的監督式學習,應該也是每個人第一個會接觸到的機器學習演算法吧。
Regression簡單的定義就是我們設計一個function,根據輸入的資料預測一些數值,這樣的function我們稱之為Regession function。
Regression的常見應用在像是股市的預測、消費者是否願意買某項產品這類的問題。

二、Regression function的設計


不論是什麼樣的機器學習演算法基本上都不會超出三個步驟

  1. 設計model
  2. function的優化
  3. 找出最優的function


第一步:設計model。

所謂的model就是很多個數學式的集合,透過這個數學式的集合我們可以順利的預測的我們要的值。

這些式子一般最基礎版本就是wx+b(其實就是一元一次方程式啦),不過我們必須要根據情況更換成別的function,例如資料分布看起來像二次方程式,我們最好得把function替換成二次方程式;有N個特徵值(feature)就將它換成N元一次方程式等等。

第二步:對function進行優化。

在設計好model之後我們就要來優化它啦!

在談論優化問題前我們要先來談談什麼是監督式學習。
所謂的監督式學習就是我們得出題目(資料與model)考電腦,而電腦必須學習(調整model參數)以得到好的成績(高正確率),不過如果題目出錯(不論是資料或是model)就不會有正確答案。

機器學習的優化方法就是設計一個 loss function 計算每一筆資料的誤差值,而計算方式有許多種,而最常見的是最小平方法。
我們可以假定每筆資料都是一個座標(X , Y),X就是我們輸入的feature,Y就是他的值。至於為何最小平方法可以找到最小的loss呢?我們可以參考這一篇文章

第三步:選擇最優的參數

在尋找最小的loss的過程中,我們可以用暴力法去把每一個w和b算出來,透過暴力法也許我們可以找到一個Global minimun (最佳解),但是因為w跟b有無限多個,也許等到天荒地老我們也沒辦法找到它,因此我們將會採用一個方法叫做Gradient Descent
Gradient Descent的方法就是一開始先將loss function的參數隨機設定成W0,接著我們對參數w做微分便可得到當前loss function的斜率,若斜率為負,我們增加W0;若為正,就減少W0;斜率的絕對值越大,那麼更新的速度就會越快,Gradent Descent會一直重複上述動作做直到微分值為0。

將上述的中文敘述寫成數學式就會變成這張投影片,而投影片的紅色標注的常數就是Learning rate,這個常數會決定每一次更新要讓function走多長的距離。

我們把loss function的分布圖畫成一個二維的圖就會長的像上面這樣,紅色的線就是做Gradient Descent後的得到向量(Gradient),Gradient就是loss的法線向量,當我們一直重複做Gradient Descent就會前往最中間的點也就是local minima。
如果看不懂可以看莫凡的影片,看完之後對Gradeint Descent的運作就會有比較好的了解。

Gradient Descent 可能遇到的問題以及改善

Gradient Descent確實很棒,但是它並不是沒有缺點的,下面我們將會探討Gradient Descent會遇到什麼問題,並且如何改善。

1. 要如何決定Learning Rate的值?


Learning rate對於Gradeint Descent來說是一個相當重要的參數,如果Learning rate過大(如黃線或是綠線),那麼就會產生震盪的情形,甚至無法讓loss收斂;如果Learning rate過小(藍線),就會要花很多時間才能找到local minima。

為了解決這樣的問題,我們可以將Learning Rate設計成動態的,其中一個演算法就是Adagrad。
Adagrad的原理就是對於每一個參數我們都會給他一個它專屬的Learning rate(例如W0有一個Learning rate R0,W1有R1等等),Adagrad計算的方式為:將learning rate除以loss function的微分值平方後相加後算出平均值最後取平方根(下面的公式),如此一來Gradent 越大,我們每一次走的步伐就越小。

2. 如何使Gradient Descent的速度加快?

在原始的Gradient Descent中,我們會先把所有的資料做完loss後才做Gradient Descent,但是這樣其實速度有點慢,因此就出現一個改良的方式叫做Stochastic Gradient Descent。
在Stochastic Gradient Descent中,我們跑一個data就做一次Gradient Descent ,如果有20份data,就會跑20次Gradient Descent ,這樣一來速度就會快很多很多。
另一個方式是做Feature Scaling,也就是預處理。


有時候不同的feature之間的值會差異很大,例如X1=1,2,3....,X2=100,200,300,在這樣的情況下對於我們做Gradient Descent是相當不利的。我們可以觀察上面這張圖,在尚未做Scaling的時候Loss function的圖形是一個長橢圓形,Gradient一開始候並不會指向圓心(local minima),在這樣的情況下如果我們不做Adagrad會很難得到local minima,因此我們必續對X1與X2做一些手腳讓他比較容易被計算。
在經過適當出處理後,loss function就會如右邊那張圖是正圓形,每一次的Gradient都能夠確保走向local minima。
接下來要講解Scaling的方式。
假設我們有R個feature,並且每一個feature都有i個資料,對於每一個dimension i 的feature我們要去計算出第i個平均值以及標準差,
而新的feature就會是第R個feature的第i個資料減掉第i個平均值再除以第i個標準差。

3. 微分=0就一定是Local minima?


並不是每一次微分=0的值都會是最低點,在saddle point的微分值也是0,但是saddle point 卻不是 local minima,以上突來說其實它比較像是反趨點,另外在非常接近local minima的時候更新速度會相對慢很多。

由於Gradient Descent沒有辦法找到 Global Minima,因此我們只能多做幾次訓練找到最好的model。至於model如何選?下一篇文章將會有進一步的講解。