動機:為了更深入地理解深度學習,我們將使用python語言從頭構建壹個神經網絡,而不是使用Tensorflow這樣的打包框架。我認為對於數據科學家來說,了解神經網絡的內部工作原理是非常重要的。
這篇文章的內容是我所了解到的,希望也能對妳有所幫助。
什麽是神經網絡?
大部分介紹神經網絡的文章都會把它和大腦做比較。如果妳沒有深入研究過大腦和神經網絡的類比,會更容易理解神經網絡是將給定輸入映射到期望輸出的數學關系。
神經網絡包括以下組件
輸入層x
任意數量的隱藏層
輸出層?
每層W和b之間有壹組權重和偏移。
為隱藏層選擇激活函數σ。在教程中,我們使用Sigmoid來激活該功能。
下圖是壹個2層神經網絡的結構(註:我們在計算網絡層數時通常不包括輸入層)。
雙層神經網絡的結構
用Python可以很容易地構造神經網絡類。
訓練神經網絡
這個網絡的輸出?用於:
您可能會註意到,在上面的等式中,輸出?它是w和b的函數。
所以W和B的取值影響預測的準確性,所以根據輸入數據調整W和B的過程稱為訓練神經網絡。
每個訓練叠代由以下兩部分組成:
計算預測結果?這壹步稱為正向傳播。
更新w和b,這壹步就變成了反向傳播。
下面的序列圖顯示了這個過程:
正向傳播
從上圖可以看出,正向傳播只是壹個簡單的計算。對於基本的兩層網絡,其輸出如下:
我們在NeuralNetwork類中添加了壹個函數來計算前向傳播。為簡單起見,我們假設偏移量b為0:
但是我們仍然需要壹種方法來評價預測結果的好壞(即預測值與真實值的誤差)。這將使用損失函數。
損失函數
常用的損失函數有很多,根據模型的要求來選擇。在本教程中,我們使用誤差平方和作為損失函數。
誤差平方和就是把每個預測值和真實值的誤差相加,這個誤差就是它們的差的平方這樣我們就可以觀察到誤差的絕對值了。
訓練的目標是找到壹組w和b,使損失函數最小,即預測值與真實值的距離最小。
反向傳播
我們已經測量了預測的誤差(損失),現在我們需要找到壹種方法來傳播誤差,並相應地更新權重和偏差。
為了知道如何適當地調整權重和偏移量,我們需要知道損失函數對權重w和偏移量b的導數。
回想壹下微積分中的概念,函數的導數就是函數的斜率。
梯度下降法
如果我們已經找到了導數,我們可以通過增加或減少導數值來更新權重w和偏移量b(參考上圖)。這種方法稱為梯度下降法。
但是,我們不能直接計算損失函數對權重和偏差的導數,因為它們沒有明確包含在損失函數的方程中。因此,我們需要使用鏈導數來幫助計算導數。
用鏈式法則計算損失函數對w和b的導數,註意為了簡單起見。我們只給出網絡只有1層偏導數的假設。
雖然這很簡單,但是我們還是可以得到想要的結果——損失函數對權重w的導數(斜率),因此我們可以相應地調整權重。
現在我們將反向傳播算法的功能添加到Python代碼中。
為了更深入的理解微積分原理和反向傳播中的鏈導數法則,我強烈推薦3Blue1Brown的以下課程:
YouTube:https://youtu.be/tIeHLnjs5U8
整合並完成壹個例子。
現在我們已經有了完整的Python代碼,包括前向傳播和後向傳播,讓我們將它應用到壹個示例中,看看它是如何工作的。
神經網絡可以通過學習得到函數的權重。而且我們也不可能只通過觀察就得到函數的權重。
讓我們訓練神經網絡1500次叠代,看看會發生什麽。註意下面每次叠代的損失函數,我們可以清楚的看到損失函數單調遞減到最小值。這和我們之前介紹的梯度下降法是壹致的。
我們來看看神經網絡經過1500次叠代後的最終預測結果:
訓練1500次叠代後的預測結果。
我們做到了!我們使用正向和定向傳播算法成功地訓練了神經網絡,預測結果收斂到真實值。
註意,預測值和真實值之間有微小的誤差。這樣可以防止模型過擬合,使神經網絡對未知數據有更強的泛化能力。
下壹步是什麽?
幸運的是,我們的學習之旅還沒有結束,關於神經網絡和深度學習還有很多要學的。例如:
除了Sigmoid,還有哪些激活函數可以用?
訓練網絡時應用學習率
當面對圖像分類的任務時,使用卷積神經網絡。
關於這個話題我很快會寫更多,敬請期待!
最後的想法
我自己也是從零開始寫了很多神經網絡代碼。
雖然Tensorflow和Keras等深度學習框架可以在不完全理解其內部工作原理的情況下輕松構建深度網絡。但我覺得對於有追求的數據科學家來說,了解其中的內在原理是非常有益的。
這種鍛煉已經成為我自己重要的時間投入,希望也能幫助到妳。