導航:首頁 > 網路安全 > 如何從頭開始構建神經網路

如何從頭開始構建神經網路

發布時間:2025-02-21 19:08:00

『壹』 如何用9行Python代碼編寫一個簡易神經網路

學習人工智慧時,我給自己定了一個目標--用Python寫一個簡單的神經網路。為了確保真得理解它,我要求自己不使用任何神經網路庫,從頭寫起。多虧了Andrew Trask寫得一篇精彩的博客,我做到了!下面貼出那九行代碼:在這篇文章中,我將解釋我是如何做得,以便你可以寫出你自己的。我將會提供一個長點的但是更完美的源代碼。

首先,神經網路是什麼?人腦由幾千億由突觸相互連接的細胞(神經元)組成。突觸傳入足夠的興奮就會引起神經元的興奮。這個過程被稱為「思考」。我們可以在計算機上寫一個神經網路來模擬這個過程。不需要在生物分子水平模擬人腦,只需模擬更高層級的規則。我們使用矩陣(二維數據表格)這一數學工具,並且為了簡單明了,只模擬一個有3個輸入和一個輸出的神經元。

我們將訓練神經元解決下面的問題。前四個例子被稱作訓練集。你發現規律了嗎?『?』是0還是1?你可能發現了,輸出總是等於輸入中最左列的值。所以『?』應該是1。

訓練過程

但是如何使我們的神經元回答正確呢?賦予每個輸入一個權重,可以是一個正的或負的數字。擁有較大正(或負)權重的輸入將決定神經元的輸出。首先設置每個權重的初始值為一個隨機數字,然後開始訓練過程:

取一個訓練樣本的輸入,使用權重調整它們,通過一個特殊的公式計算神經元的輸出。

計算誤差,即神經元的輸出與訓練樣本中的期待輸出之間的差值。

根據誤差略微地調整權重。

重復這個過程1萬次。最終權重將會變為符合訓練集的一個最優解。如果使用神經元考慮這種規律的一個新情形,它將會給出一個很棒的預測。

這個過程就是back propagation。

計算神經元輸出的公式

你可能會想,計算神經元輸出的公式是什麼?首先,計算神經元輸入的加權和,即接著使之規范化,結果在0,1之間。為此使用一個數學函數--Sigmoid函數:Sigmoid函數的圖形是一條「S」狀的曲線。把第一個方程代入第二個,計算神經元輸出的最終公式為:你可能注意到了,為了簡單,我們沒有引入最低興奮閾值。

調整權重的公式

我們在訓練時不斷調整權重。但是怎麼調整呢?可以使用「Error Weighted Derivative」公式:為什麼使用這個公式?首先,我們想使調整和誤差的大小成比例。其次,乘以輸入(0或1),如果輸入是0,權重就不會調整。最後,乘以Sigmoid曲線的斜率(圖4)。為了理解最後一條,考慮這些:

我們使用Sigmoid曲線計算神經元的輸出

如果輸出是一個大的正(或負)數,這意味著神經元採用這種(或另一種)方式

從圖四可以看出,在較大數值處,Sigmoid曲線斜率小

如果神經元認為當前權重是正確的,就不會對它進行很大調整。乘以Sigmoid曲線斜率便可以實現這一點

Sigmoid曲線的斜率可以通過求導得到:把第二個等式代入第一個等式里,得到調整權重的最終公式:當然有其他公式,它們可以使神經元學習得更快,但是這個公式的優點是非常簡單。

構造Python代碼

雖然我們沒有使用神經網路庫,但是將導入Python數學庫numpy里的4個方法。分別是:

exp--自然指數

array--創建矩陣

dot--進行矩陣乘法

random--產生隨機數

比如, 我們可以使用array()方法表示前面展示的訓練集:「.T」方法用於矩陣轉置(行變列)。所以,計算機這樣存儲數字:我覺得我們可以開始構建更優美的源代碼了。給出這個源代碼後,我會做一個總結。

我對每一行源代碼都添加了注釋來解釋所有內容。注意在每次迭代時,我們同時處理所有訓練集數據。所以變數都是矩陣(二維數據表格)。下面是一個用Python寫地完整的示例代碼。

我們做到了!我們用Python構建了一個簡單的神經網路!

首先神經網路對自己賦予隨機權重,然後使用訓練集訓練自己。接著,它考慮一種新的情形[1, 0, 0]並且預測了0.99993704。正確答案是1。非常接近!

傳統計算機程序通常不會學習。而神經網路卻能自己學習,適應並對新情形做出反應,這是多麼神奇,就像人類一樣。

『貳』 從零開始用Python構建神經網路

從零開始用Python構建神經網路
動機:為了更加深入的理解深度學習,我們將使用 python 語言從頭搭建一個神經網路,而不是使用像 Tensorflow 那樣的封裝好的框架。我認為理解神經網路的內部工作原理,對數據科學家來說至關重要。
這篇文章的內容是我的所學,希望也能對你有所幫助。
神經網路是什麼?
介紹神經網路的文章大多數都會將它和大腦進行類比。如果你沒有深入研究過大腦與神經網路的類比,那麼將神經網路解釋為一種將給定輸入映射為期望輸出的數學關系會更容易理解。
神經網路包括以下組成部分
? 一個輸入層,x
? 任意數量的隱藏層
? 一個輸出層,?
? 每層之間有一組權值和偏置,W and b
? 為隱藏層選擇一種激活函數,σ。在教程中我們使用 Sigmoid 激活函數
下圖展示了 2 層神經網路的結構(注意:我們在計算網路層數時通常排除輸入層)

2 層神經網路的結構
用 Python 可以很容易的構建神經網路類

訓練神經網路
這個網路的輸出 ? 為:

你可能會注意到,在上面的等式中,輸出 ? 是 W 和 b 函數。
因此 W 和 b 的值影響預測的准確率. 所以根據輸入數據對 W 和 b 調優的過程就被成為訓練神經網路。
每步訓練迭代包含以下兩個部分:
? 計算預測結果 ?,這一步稱為前向傳播
? 更新 W 和 b,,這一步成為反向傳播
下面的順序圖展示了這個過程:

前向傳播
正如我們在上圖中看到的,前向傳播只是簡單的計算。對於一個基本的 2 層網路來說,它的輸出是這樣的:

我們在 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 這樣的深度學習框架方便的搭建深層網路而不需要完全理解其內部工作原理。但是我覺得對於有追求的數據科學家來說,理解內部原理是非常有益的。
這種練習對我自己來說已成成為重要的時間投入,希望也能對你有所幫助

『叄』 如何在Python中從零開始構建自己的神經網路——深度學習內部工作原理初學者指南

開始探索深度學習之旅,我決定從頭構建一個神經網路,避開像TensorFlow這樣的工具,以增進理解。理解神經網路的工作原理對任何數據科學初學者來說至關重要。

神經網路本質上是數學函數,將輸入映射到期望輸出,無需過多依賴大腦類比。它由幾個關鍵組件構成,如2層網路的簡單示例所示。

在Python中,我們輕松創建一個神經網路類。訓練過程涉及調整權重和偏置以優化預測准確性,通過迭代步驟調整,包括前向傳播和反向傳播。

前向傳播簡單地計算輸出,如在2層網路中所示。在我們的Python代碼中,我們添加了一個函數來實現。評估預測精度則依賴於損失函數,如平方和誤差,目標是找到最小化損失的權重和偏置。

反向傳播通過微積分的鏈式法則來計算損失函數對權重的導數,從而調整它們。這個過程在梯度下降演算法中運用,幫助我們優化網路性能。

通過實例訓練,神經網路會學習理想權重,盡管預測與實際值可能存在微小差異,這是為了防止過擬合和提高泛化能力。深度學習的領域仍有許多值得深入學習,如優化演算法、更復雜的網路結構等。

盡管使用深度學習庫能快速構建網路,但親手搭建神經網路的過程無疑加強了我對深度學習核心原理的理解,對成為數據科學家是一次寶貴的經歷。

閱讀全文

與如何從頭開始構建神經網路相關的資料

熱點內容
電腦開通網路大概多少錢 瀏覽:967
為什麼手機登不進去游戲還一直說網路問題 瀏覽:100
網路劇如何拍攝 瀏覽:746
蘋果13的本地網路是什麼 瀏覽:33
怎麼模擬無線網路負載 瀏覽:274
網路聊天最新軟體 瀏覽:267
網路視頻介面是什麼意思 瀏覽:622
電信網路電視設置定時觀看 瀏覽:88
公園網路的通用密碼是什麼 瀏覽:407
無wifi無網路的游戲 瀏覽:196
我的聯通卡怎麼沒網路 瀏覽:454
網路聊天室由哪些部分組成 瀏覽:589
電視連了網路wifi怎麼連接 瀏覽:791
蘋果手機吐槽網路卡 瀏覽:705
液晶電視連接網路顯示有異常 瀏覽:660
網路兼職如何避坑 瀏覽:802
醫療保障網路安全方案 瀏覽:921
怎麼更改家庭網路的無線密碼 瀏覽:929
家用網路電視需要多少兆網路 瀏覽:11
飛歌gs2車機無法連接網路 瀏覽:661

友情鏈接