1. 程式人生 > >從零開始用Python打造自己的神經網路 !

從零開始用Python打造自己的神經網路 !

這是一份用於理解深度學習內部運作方式的初學者指南。作者根據自己從零開始學習用 Python 構建神經網路的經驗,編寫了一份攻略。內容涵蓋神經網路定義、損失函式、前向傳播、反向傳播、梯度下降演算法,對於想要了解深度學習運作原理的各位來說,內容精彩不可錯過。

 

動機:為了深入瞭解深度學習,我決定從零開始構建神經網路,並且不使用類似 Tensorflow 的深度學習庫。我相信,對於任何有理想的資料科學家而言,理解神經網路內部的運作方式都非常重要。

本文涵蓋了我學到的所有東西,希望你也能從中獲益!

什麼是神經網路?

大多數介紹神經網路的文章在描述它們時都會提出大腦類比。在不深入研究大腦類比的情況下,我發現簡單地將神經網路描述為將給定輸入對映到輸出的數學函式更容易。

神經網路由以下幾個元件組成

  • 一個輸入層,x
  • 任意數量的隱藏層
  • 一個輸出層,ŷ
  • 每兩層之間都有一組權重和偏置,W 和 b
  • 每個隱藏層都要選擇一個啟用函式 σ。在本文中,我們選用 Sigmoid 啟用函式。

 

下圖顯示了2層神經網路的架構(請注意,在計算神經網路中的層數時,通常會排除輸入層)

從零開始用Python打造自己的神經網路 !

 

進群:960410445  即可獲取數十套!

 

 

2層神經網路的體系結構

在Python中建立神經網路類很容易。

 

從零開始用Python打造自己的神經網路 !

 

 

訓練神經網路

簡單的2層神經網路的輸出是:

從零開始用Python打造自己的神經網路 !

 

 

你可能會注意到,在上面的等式中,權重W和偏差b是影響輸出的唯一變數ŷ。

當然,權重和偏差的正確值決定了預測的強度。 從輸入資料微調權重和偏差的過程稱為訓練神經網路。

培訓過程的每次迭代都包含以下步驟:

計算預測輸出ŷ,稱為前饋

更新權重和偏差,稱為反向傳播

下面的順序圖說明了該過程。

從零開始用Python打造自己的神經網路 !

 

 

前饋

正如我們在上面的順序圖中看到的,前饋只是簡單的計算,對於一個基本的2層神經網路,神經網路的輸出是:

從零開始用Python打造自己的神經網路 !

 

 

讓我們在python程式碼中新增一個前饋函式來做到這一點。 請注意,為簡單起見,我們假設偏差為0。

 

從零開始用Python打造自己的神經網路 !

 

 

但是,我們仍然需要一種方法來評估我們預測的“好的程度”(即我們的預測有多好)? 而損失函式能讓我們做到這一點。

損失函式

有許多可用的損失函式,我們的問題的性質應該決定了我們選擇的損失函式。 在本教程中,我們將使用簡單的平方和誤差作為我們的損失函式。

從零開始用Python打造自己的神經網路 !

 

 

也就是說,平方和誤差僅僅是每個預測值與實際值之差的總和。 差值是平方的,因此我們測量的是差值的絕對值。

我們的訓練目標是找到最佳的權重和偏差集,以最大限度地減少損失函式。

反向傳播

既然我們已經測量了預測的誤差(損失),我們需要找到一種方法來傳播誤差,並更新權重和偏差。

為了知道調整權重和偏差的合適數量,我們需要知道損失函式相對於權重和偏差的導數。

回想一下微積分函式的導數就是函式的斜率。

從零開始用Python打造自己的神經網路 !

 

 

梯度下降演算法

如果我們有導數,我們可以通過簡單地增加/減少導數來更新權重和偏差(參見上圖)。 這就是所謂的梯度下降。

但是,我們不能直接計算損失函式相對於權重和偏差的導數,因為損失函式的方程不包含權重和偏差。 因此,我們需要鏈規則來幫助我們計算它。

從零開始用Python打造自己的神經網路 !

 

 

用於計算損失函式相對於權重的導數的鏈式法則。注意,為了簡單起見,我們只顯示了假設1層神經網路的偏導數。

唷!這真難看,但它允許我們得到我們需要的東西——損失函式相對於權重的導數(斜率),以便我們可以相應地調整權重。

現在我們已經有了這個,讓我們將反向傳播函式新增到python程式碼中。

 

從零開始用Python打造自己的神經網路 !

 

 

為了更深入地理解微積分和鏈式法則在反向傳播中的應用,我強烈推薦3 blue 1 brown的本教程。

 

把它們放在一起

現在我們已經有了完整的python程式碼來進行前饋和反向傳播,讓我們將神經網路應用到一個例子中,看看它表現如何。

 

從零開始用Python打造自己的神經網路 !

 

 

我們的神經網路應該學習理想的權重集來表示這個函式。請注意,僅僅通過檢查來計算權重對我們來說並不是微不足道的。

讓我們訓練神經網路進行1500次迭代,看看會發生什麼。觀察下面的每次迭代損失圖,我們可以清楚地看到損失單調遞減到最小值。這與我們前面討論的梯度下降演算法是一致的。

從零開始用Python打造自己的神經網路 !

 

 

讓我們看一下1500次迭代後神經網路的最終預測(輸出)。

 

從零開始用Python打造自己的神經網路 !

 

 

1500次訓練迭代後的預測

我們做到了!我們的前饋和反向傳播演算法成功地訓練了神經網路,預測結果收斂於真實值。

請注意,預測值和實際值略有不同。這是可取的,因為它可以防止過度擬合,並允許神經網路更好地推廣到看不見的資料。

 

下一步是什麼?

幸運的是,我們的旅程還沒有結束。關於神經網路和深度學習還有很多要學習的。例如:

除了Sigmoid函式,我們還能使用什麼其他啟用功能?

在訓練神經網路時使用學習率

使用卷積用於影象分類任務

我很快就會在這些主題上寫更多內容,所以請關注我的媒體並留意他們!

 

最後的想法

我從寫自己的神經網路中學到了很多東西。

雖然如TensorFlow和Keras的深度學習庫可以在不完全瞭解神經網路內部工作的情況下構建深度網路,但我發現,對於有抱負的資料科學家來說,加深對神經網路的理解是有益的。

這個練習對我來說是一次很大的投入,我希望它對你也有用!