1. 程式人生 > >5.神經網路演算法

5.神經網路演算法

1.背景

1.1以人腦的神經網路為啟發,歷史上出現過很多不同的版本

1.2最著名的演算法是1980年的是backpropagation

2.多層向前神經網路(Multilayer Feed-Forward Neural Network)

2.1 Backpropagation被使用在多層向前神經網路上

2.2多層向前神經網路由以下部分組成:

輸入層(input layer),隱藏層(hidden layers),輸入層(output layers)

2.3每一層由單元(untis)組成

2.4輸入層(input layer)是由訓練集的例項特徵向量傳入

2.5 經過連線結點的權重(weight)傳入下一層,一層的輸出是下一層的輸入

2.6 隱藏層的個數可以是任意的,輸入層有一層,輸出層有一層

2.7 每個單元(unit)也可以被稱作神經結點,根據生物學來源定義

2.8 以上成為2層的神經網路(輸入層不算)

2.9 一層中加權的求和,加一個bias偏移量,然後根據非線性方程轉化輸出

2.10 作為多層向前神經網路,理論上,如果有足夠多的隱藏層(hidden layers) 和足夠大的訓練集, 可以模擬出任何方程

3.設計神經網路結構

3.1使用神經網路訓練資料之前,必須確定神經網路的層數,以及每層單元的個數。

3.2特徵向量在被傳入輸入層時通常被先標準化(normalize)到0和1之間(為了加快學習過程)

3.3 離散型變數可以被編碼成每一個輸入單元對應一個特徵值可能賦的值
          比如:特徵值A可能取三個值(a0, a1, a2), 可以使用3個輸入單元來代表A。
                    如果A=a0, 那麼代表a0的單元值就取1, 其他取0;
                    如果A=a1, 那麼代表a1的單元值就取1,其他取0,以此類推

3.4 神經網路即可以用來做分類(classification)問題,也可以解決迴歸(regression)問題
       3.4.1 對於分類問題,如果是2類,可以用一個輸出單元表示(0和1分別代表2類)
                                         如果多餘2類,每一個類別用一個輸出單元表示
         所以輸出層的單元數量通常等於類別的數量

       3.4.2 沒有明確的規則來設計最好有多少個隱藏層,一般是先確定一個層數,根據實驗測試和誤差,以及準確度來實驗,慢  慢改進。
              3.4.2.1 根據實驗測試和誤差,以及準確度來實驗並改進

4.交叉驗證方法(Cross-Validation)

對於準確度怎麼來算呢?前面幾篇實踐中的做法都是把一組資料分成訓練集和測試集兩部分。訓練集來訓練模型。測試集輸入進去看結果是不是對的,根據正確率得到一個準確度。 
不過機器學習中有一種更常用和科學的方法,交叉驗證方法(cross-validation)。下面來介紹一下這種方法。如下圖:

前面我們用的方法是把資料分成2份,一份測試集一份資料集。交叉驗證方法就是把資料分成更多份,比如10份,9份訓練1份測試得到一個準確度。這樣10份中每一份都當一次測試集,其它9份當訓練集,繼續下去可以得到10個準確度,做一個均值就得到最終的準確度。這就是交叉驗證方法,這樣可以更充分的利用資料集。這個10份只是舉個例子,實際上可以分成任意的K份,所以這個方法也被稱為K-fold cross validation。

5.Backpropagation演算法(重點)
     5.1 通過迭代性的來處理訓練集中的例項
     5.2 對比經過神經網路後輸入層預測值(predicted value)與真實值(target value)之間
     5.3 反方向(從輸出層=>隱藏層=>輸入層)來以最小化誤差(error)來更新每個連線的權重(weight)
     5.4 演算法詳細介紹
           輸入:D:資料集,l 學習率(learning rate), 一個多層前向神經網路
           輸出:一個訓練好的神經網路(a trained neural network)
          5.4.1 初始化權重(weights)和偏向(bias): 隨機初始化在-1到1之間,或者-0.5到0.5之間,每個單元有          
                    一個偏向
          5.4.2 對於每一個訓練例項X,執行以下步驟:
                    5.4.2.1: 由輸入層向前傳送

6.Backpropagation演算法舉例

補充:

S 曲線函式可以將一個數值轉為值域在 0 到 1 之間,廣義上S 函式是滿足y值在某個值域範圍,漸變的一個曲線就可以了。通常情況下使用什麼樣的 Sigmoid 函式呢?有兩種。

雙曲函式( tanh ) 雙曲函式是一類與常見的三角函式(也叫圓函式)類似的函式。詳情看https://baike.baidu.com/item/%E5%8F%8C%E6%9B%B2%E5%87%BD%E6%95%B0/8704306?fr=aladdin

邏輯函式(logistic function ) 邏輯函式或邏輯曲線是一種常見的S函式,百科:https://baike.baidu.com/item/%E9%80%BB%E8%BE%91%E5%87%BD%E6%95%B0/1759697?fr=aladdin