今天我們將學到:
考慮下面複雜的資料分布,縱使我們前面有提到特徵組合的方式也很難將其分開,這時候線性模型就不敷使用了,因此我們需要更為複雜的模型來學習更為複雜的資料分布。
直觀又簡單的想法便是將線性模型做多層的堆疊,如下圖,將兩層線性模型連接,產生3x3=9的參數,然後再接到輸出層,這三層分別稱作輸入層、隱藏層、輸出層。
隱藏層的運算如下面矩陣乘法,如果你將它展開來,其實本質上他還是線性模型,堆疊再多層都仍然是線性的,這樣並沒有辦法描述更為複雜的模型,關鍵點就是,該如何引入非線性的行為呢?
為了引入非線性的行爲,所以在每一層隱藏層之間,加入一個非線性轉換,而這便是神經網路的做法,加入一個激活函數 (Activation function)。
一般最常聽到和使用的激活函數就是 ReLU 了,其數學式子如下,概念上就是小於 0 的數通通變成 0,大於 0 的正數就維持一樣。
下圖是一些常見的激活函數,更多地細節可以參考這裡:
了解神經網路的架構後,接著我們要知道的就是怎麼訓練它了,一般神經網路訓練是透過反向傳播(Back propagation) 的方式,做法就是將梯度下降透過連鎖律(Chain rule),一層反向回傳一層,藉此更新每一層的參數,詳細的數學可以參考這裡。
然而反向傳播會有幾個潛在的問題:
遇到這些問題對應可行的解法有:
訓練神經會遇到的問題也可以透過讓特徵值變小來減輕,特徵減小之後可以讓訓練時的參數盡量落在 +-1之間、也不會讓梯度來回彈跳,還可以避免離群值造成模型泛化不好的問題。
而一般將特徵值變小的方式有下列幾種:
而在訓練神經網路時,其中一種增加其泛化能力的方式是 Dropout,Dropout 的做法是在訓練的過程中,每一個神經元都有一個機率 p 被捨棄掉不考慮,藉由增加隨機性來提高泛化能力。
更深入探討 Dropout 意義的話,這個方式等效上是同時訓練一個全體模型(Ensemble model),由許多略微不同的神經網路所構成的隨機樹(Random forests)。
當然,Dropout 的比例是介於0~1之間的數,實作上通常使用0.2 ~ 0.5之間,不過還是會根據你的問題有所變化。
之前我們講到的問題都是二元(Binary)分類問題,然而現實中也會有多分類的問題,如下圖若要分辨座位的種類就是一個例子。
顯然地在多分類問題,邏輯迴歸就沒辦法直接拿來使用,不過我們可以用幾種間接的方式,例如 one vs all 或 one vs one。
one vs all 的做法就是將類別分成兩種,需要的種類和剩下其他的種類,透過這樣的分法就可以使用邏輯迴歸,但是需要訓練和種類數一樣多的模型。
one vs one 的做法就是選出兩個不同種類來做邏輯迴歸,然而可預期的這樣訓練的模型個數是平方次(Cn取2)
可以看得出來上面的做法並不夠好,有沒有只需要訓練一個模型的方式呢?答案是有的,就是使用 softmax 作為輸出,這樣就可以直接表示多分類的機率了。
在這個實作中,我們將學會:
登入 GCP,開啟Notebooks後,複製課程 Github repo (如Day9的Part 1 & 2步驟)。
在左邊的資料夾結構,點進 training-data-analyst > courses > machine_learning > deepdive > 05_artandscience ,然後打開檔案 c_neuralnetwork.ipynb。
先用 head()
、 describe()
看一下資料的基本資訊:
今天介紹了神經網路,明天我們將介紹什麼是 “嵌入(Embedding)”。