自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

無需深度學習框架,如何從零開始用Python構建神經(jīng)網(wǎng)絡

開發(fā) 開發(fā)工具 深度學習
作者根據(jù)自己從零開始學習用 Python 構建神經(jīng)網(wǎng)絡的經(jīng)驗,編寫了一份攻略。內(nèi)容涵蓋神經(jīng)網(wǎng)絡定義、損失函數(shù)、前向傳播、反向傳播、梯度下降算法,對于想要了解深度學習運作原理的各位來說,內(nèi)容精彩不可錯過。

動機:為了深入了解深度學習,我決定從零開始構建神經(jīng)網(wǎng)絡,并且不使用類似 Tensorflow 的深度學習庫。我相信,對于任何有理想的數(shù)據(jù)科學家而言,理解神經(jīng)網(wǎng)絡內(nèi)部的運作方式都非常重要。

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

一、什么是神經(jīng)網(wǎng)絡?

許多有關神經(jīng)網(wǎng)絡的介紹資料會將神經(jīng)網(wǎng)絡與大腦進行類比。但我發(fā)現(xiàn),將神經(jīng)網(wǎng)絡簡單地描述為一個從輸入映射到輸出的數(shù)學函數(shù)理解起來更容易。

神經(jīng)網(wǎng)絡由以下部分組成:

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

下圖展示了 2 層神經(jīng)網(wǎng)絡的結(jié)構(請注意,在計算神經(jīng)網(wǎng)絡層數(shù)的時候,通常不計入輸入層)。

二層神經(jīng)網(wǎng)絡的結(jié)構

利用 Python 建立神經(jīng)網(wǎng)絡非常容易。

  1. class NeuralNetwork: 
  2.     def __init__(self, x, y): 
  3.         self.input      = x 
  4.         self.weights1   = np.random.rand(self.input.shape[1],4)  
  5.         self.weights2   = np.random.rand(4,1)                  
  6.         self.y          = y 
  7.         self.output     = np.zeros(y.shape) 

1. 訓練神經(jīng)網(wǎng)絡

一個簡單 2 層神經(jīng)網(wǎng)絡的輸出 ŷ 可以表示為:

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

自然,權重和偏差的正確值決定了預測的強度。根據(jù)輸入數(shù)據(jù)微調(diào)權重和偏置的過程稱為神經(jīng)網(wǎng)絡訓練。

訓練過程的每一次迭代包含以下步驟:

  • 計算預測的輸出 ŷ,稱為前向傳播
  • 更新權重和偏置,稱為反向傳播

以下流程圖說明了這個過程:

2. 前向傳播

正如我們在上圖中所看到的,前向傳播只是一個簡單的計算。對于一個基本的 2 層神經(jīng)網(wǎng)絡,神經(jīng)網(wǎng)絡的輸出計算如下:

我們可以在 Python 代碼中添加一個前向傳播函數(shù)來做到這一點。簡單起見,我們假設偏置為 0。

  1. class NeuralNetwork: 
  2.     def __init__(self, x, y): 
  3.         self.input      = x 
  4.         self.weights1   = np.random.rand(self.input.shape[1],4)  
  5.         self.weights2   = np.random.rand(4,1)                  
  6.         self.y          = y 
  7.         self.output     = np.zeros(self.y.shape) 
  8.  
  9.     def feedforward(self): 
  10.         self.layer1 = sigmoid(np.dot(self.input, self.weights1)) 
  11.         self.output = sigmoid(np.dot(self.layer1, self.weights2)) 

然而,我們?nèi)匀恍枰环N方法來評估我們的預測的「優(yōu)秀程度」(即,我們的預測與真實值相差多少?)這就需要用到損失函數(shù)了。

3. 損失函數(shù)

損失函數(shù)有很多種,而我們問題的性質(zhì)會決定我們使用哪種損失函數(shù)。在本文中,我們將采用簡單的誤差平方和。

誤差平方和,即每個預測值和真實值之間差值的平均值。這個差值是取了平方項的,所以我們測量的是差值的絕對值。

在訓練過程中,我們的目標是找到一組***的權重和偏置,使損失函數(shù)最小化。

4. 反向傳播

現(xiàn)在,我們已經(jīng)找到了預測誤差的方法(損失函數(shù)),那么我們需要一種方法將錯誤「傳播」回去,從而更新權重和偏置。

為了確定權重和偏置調(diào)整的適當值,我們需要知道損失函數(shù)對權重和偏置的偏導數(shù)。

從微積分的角度來看,函數(shù)的偏導數(shù)也就是函數(shù)的斜率。

梯度下降算法

如果我們知道了偏導數(shù),我們可以通過簡單增加或減少偏導數(shù)(如上圖所示)的方式來更新權重和偏置。這就是所謂的梯度下降。

然而,由于損失函數(shù)的方程不包含權重和偏置,所以我們不能直接計算損失函數(shù)對權重和偏置的偏導數(shù)。因此,我們需要鏈式法則來幫助計算。

以上是用于計算損失函數(shù)對權重偏導數(shù)的鏈式法則。簡單起見,我們只展示了一層神經(jīng)網(wǎng)絡的偏導數(shù)。

唷!這看起來不大好看,但這能讓我們獲得所需——損失函數(shù)對權重的偏導數(shù)(斜率),以便相應調(diào)整權重。

既然我們已經(jīng)有了鏈式法則公式,接下來我們把反向傳播函數(shù)添加到 Python 代碼中。

  1. class NeuralNetwork: 
  2.     def __init__(self, x, y): 
  3.         self.input      = x 
  4.         self.weights1   = np.random.rand(self.input.shape[1],4)  
  5.         self.weights2   = np.random.rand(4,1)                  
  6.         self.y          = y 
  7.         self.output     = np.zeros(self.y.shape) 
  8.  
  9.     def feedforward(self): 
  10.         self.layer1 = sigmoid(np.dot(self.input, self.weights1)) 
  11.         self.output = sigmoid(np.dot(self.layer1, self.weights2)) 
  12.  
  13.     def backprop(self): 
  14.         # application of the chain rule to find derivative of the loss function with respect to weights2 and weights1 
  15.         d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) * sigmoid_derivative(self.output))) 
  16.         d_weights1 = np.dot(self.input.T,  (np.dot(2*(self.y - self.output) * sigmoid_derivative(self.output), self.weights2.T) * sigmoid_derivative(self.layer1))) 
  17.  
  18.         # update the weights with the derivative (slope) of the loss function 
  19.         self.weights1 += d_weights1 
  20.         self.weights2 += d_weights2 

二、整合

既然我們已經(jīng)有了做前向傳播和反向傳播的完整 Python 代碼,我們可以將神經(jīng)網(wǎng)絡應用到一個示例中,看看它的效果。

我們的神經(jīng)網(wǎng)絡應該能夠習得理想的權重集合以表示這個函數(shù)。請注意,對于我們來說,僅通過檢查來計算權重并非一件小事。

如果我們將神經(jīng)網(wǎng)絡進行 1500 次迭代,看看會發(fā)生什么。下圖展示了每次迭代的損失函數(shù)值,我們可以清晰地發(fā)現(xiàn)損失函數(shù)單調(diào)下降到最小值。這與我們前面討論的梯度下降算法是一致的。

讓我們看看神經(jīng)網(wǎng)絡在進行 1500 次迭代后的最終預測(輸出):

進行 1500 次迭代后的預測值

我們成功了!我們的前向傳播和反向傳播算法成功訓練了神經(jīng)網(wǎng)絡,且預測值收斂到了真實值。

請注意,預測值和真實值之間還是有一些輕微差異的。這是可取的,因為它防止了過度擬合,并且使得神經(jīng)網(wǎng)絡具有更強的泛化能力。

三、下一步

幸運的是,我們的探索還沒有結(jié)束。關于神經(jīng)網(wǎng)絡和深度學習還有很多需要學習的地方。例如:

  • 除了 Sigmoid 函數(shù)之外,我們還可以使用哪些激活函數(shù)?
  • 在訓練神經(jīng)網(wǎng)絡時使用學習率
  • 使用卷積進行圖像分類任務

四、***一點想法

在撰寫此文的過程中,我已經(jīng)學到了很多,希望本文也能對你有所幫助。

在沒有完全了解神經(jīng)網(wǎng)絡內(nèi)部工作原理的情況下,雖然使用諸如 TensorFlow 和 Keras 之類的深度學習庫可以讓我們很容易地建立深度網(wǎng)絡,但我認為對于有抱負的數(shù)據(jù)科學家而言,深入理解神經(jīng)網(wǎng)絡還是大有裨益的。

原文鏈接:

https://towardsdatascience.com/how-to-build-your-own-neural-network-from-scratch-in-python-68998a08e4f6

【本文是51CTO專欄機構“機器之心”的原創(chuàng)譯文,微信公眾號“機器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2020-03-26 09:00:00

神經(jīng)網(wǎng)絡AI人工智能

2020-12-27 21:09:50

神經(jīng)網(wǎng)絡AI

2018-05-09 20:08:09

人工智能深度學習Python

2018-01-09 10:05:55

神經(jīng)網(wǎng)絡ClojureCortex

2024-03-01 19:53:37

PyBuilderPython開發(fā)

2020-03-25 09:00:00

神經(jīng)網(wǎng)絡AI人工智能

2024-05-17 17:29:00

CurdlingPython開發(fā)

2018-04-19 14:42:48

深度學習DL數(shù)據(jù)集

2025-01-26 16:57:02

2021-03-31 14:10:27

機器學習人工智能計算機

2018-01-16 11:00:25

2017-12-12 12:24:39

Python決策樹

2018-03-22 13:34:59

TensorFlow神經(jīng)網(wǎng)絡

2018-04-16 16:31:56

前端開發(fā)從零開始

2015-05-06 09:36:05

Java語言從零開始學習

2017-02-10 09:30:33

數(shù)據(jù)化運營流量

2010-02-22 09:39:52

HTML 5Web

2024-07-31 08:14:17

2016-12-27 14:24:57

課程筆記神經(jīng)網(wǎng)絡

2020-08-06 10:11:13

神經(jīng)網(wǎng)絡機器學習算法
點贊
收藏

51CTO技術棧公眾號