iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 26
0
Google Developers Machine Learning

Machine Learning with TensorFlow on Google Cloud Platform系列 第 26

鐵人賽Day26 - Art and Science of Machine Learning (4/6)

神經網路

主旨:了解和訓練神經網路

今天我們將學到:

  • 如何有效地訓練神經網路
  • 多分類的神經網路

神經網路簡介

考慮下面複雜的資料分布,縱使我們前面有提到特徵組合的方式也很難將其分開,這時候線性模型就不敷使用了,因此我們需要更為複雜的模型來學習更為複雜的資料分布。

直觀又簡單的想法便是將線性模型做多層的堆疊,如下圖,將兩層線性模型連接,產生3x3=9的參數,然後再接到輸出層,這三層分別稱作輸入層、隱藏層、輸出層

隱藏層的運算如下面矩陣乘法,如果你將它展開來,其實本質上他還是線性模型,堆疊再多層都仍然是線性的,這樣並沒有辦法描述更為複雜的模型,關鍵點就是,該如何引入非線性的行為呢?

為了引入非線性的行爲,所以在每一層隱藏層之間,加入一個非線性轉換,而這便是神經網路的做法,加入一個激活函數 (Activation function)

一般最常聽到和使用的激活函數就是 ReLU 了,其數學式子如下,概念上就是小於 0 的數通通變成 0,大於 0 的正數就維持一樣。

下圖是一些常見的激活函數,更多地細節可以參考這裡

訓練神經網路

了解神經網路的架構後,接著我們要知道的就是怎麼訓練它了,一般神經網路訓練是透過反向傳播(Back propagation) 的方式,做法就是將梯度下降透過連鎖律(Chain rule),一層反向回傳一層,藉此更新每一層的參數,詳細的數學可以參考這裡

然而反向傳播會有幾個潛在的問題:

  1. 梯度會消失
    • 因為反向傳播每層是接連相乘,造成梯度越來越小
  2. 梯度會爆炸
    • 學習率選擇很重要
  3. ReLU層會失效
    • 需要監看參數值為 0 的比率,太多表示參數都一直落在負的區域,然後又被 ReLU 給限制

遇到這些問題對應可行的解法有:

  1. 使用 ReLU 而不要用 Sigmoid 或 tanh
  2. 批次歸一 (Batch Normalization)
  3. 降低學習率

訓練神經會遇到的問題也可以透過讓特徵值變小來減輕,特徵減小之後可以讓訓練時的參數盡量落在 +-1之間、也不會讓梯度來回彈跳,還可以避免離群值造成模型泛化不好的問題。

而一般將特徵值變小的方式有下列幾種:

  1. 線性縮放
  2. 最大最小值強制剪裁 (clipping)
  3. 對數縮放

而在訓練神經網路時,其中一種增加其泛化能力的方式是 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 Lab實作-19]:使用神經網路來建構ML模型

這個實作中,我們將學會:

  • 使用 TensorFlow 的 DNNRegressor class 來做房價預測

[Part 1]:神經網路

  1. 登入 GCP,開啟Notebooks後,複製課程 Github repo (如Day9的Part 1 & 2步驟)。

  2. 在左邊的資料夾結構,點進 training-data-analyst > courses > machine_learning > deepdive > 05_artandscience ,然後打開檔案 c_neuralnetwork.ipynb

  3. 先用 head()describe() 看一下資料的基本資訊:

  1. 建造新的特徵來訓練模型:

  1. 把用不到的特徵捨棄掉:

  1. 給定特徵的型態如數值或是種類:

  1. 接著就是將資料切分成訓練和評估:

  1. 先訓練一個普通的線性迴歸模型來和等一下的神經網路做比較,訓練結果 RMSE 是 74,731 元:

  1. 再來就是這次實作的重點,訓練神經網路迴歸模型,訓練完後模型有更低的 RMSE 約是 63,431 元:


今天介紹了神經網路,明天我們將介紹什麼是 “嵌入(Embedding)”。


上一篇
鐵人賽Day25 - Art and Science of Machine Learning (3/6)
下一篇
鐵人賽Day27 - Art and Science of Machine Learning (5/6)
系列文
Machine Learning with TensorFlow on Google Cloud Platform30

尚未有邦友留言

立即登入留言