中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

從零開始用Python構(gòu)建神經(jīng)網(wǎng)絡(luò)

2018-07-04    來源:raincent

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

文章標(biāo)題為:How to build your own Neural Network from scratch in Python,作者 James Loy

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

動機(jī):為了更加深入的理解深度學(xué)習(xí),我們將使用 python 語言從頭搭建一個神經(jīng)網(wǎng)絡(luò),而不是使用像 Tensorflow 那樣的封裝好的框架。我認(rèn)為理解神經(jīng)網(wǎng)絡(luò)的內(nèi)部工作原理,對數(shù)據(jù)科學(xué)家來說至關(guān)重要。

這篇文章的內(nèi)容是我的所學(xué),希望也能對你有所幫助。

神經(jīng)網(wǎng)絡(luò)是什么?

介紹神經(jīng)網(wǎng)絡(luò)的文章大多數(shù)都會將它和大腦進(jìn)行類比。如果你沒有深入研究過大腦與神經(jīng)網(wǎng)絡(luò)的類比,那么將神經(jīng)網(wǎng)絡(luò)解釋為一種將給定輸入映射為期望輸出的數(shù)學(xué)關(guān)系會更容易理解。

神經(jīng)網(wǎng)絡(luò)包括以下組成部分

• 一個輸入層,x

• 任意數(shù)量的隱藏層

• 一個輸出層,?

• 每層之間有一組權(quán)值和偏置,W and b

• 為隱藏層選擇一種激活函數(shù),σ。在教程中我們使用 Sigmoid 激活函數(shù)

下圖展示了 2 層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)(注意:我們在計算網(wǎng)絡(luò)層數(shù)時通常排除輸入層)

 

 

2 層神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)

用 Python 可以很容易的構(gòu)建神經(jīng)網(wǎng)絡(luò)類

 

 

訓(xùn)練神經(jīng)網(wǎng)絡(luò)

這個網(wǎng)絡(luò)的輸出 ? 為:

 

 

你可能會注意到,在上面的等式中,輸出 ? 是 W 和 b 函數(shù)。

因此 W 和 b 的值影響預(yù)測的準(zhǔn)確率. 所以根據(jù)輸入數(shù)據(jù)對 W 和 b 調(diào)優(yōu)的過程就被成為訓(xùn)練神經(jīng)網(wǎng)絡(luò)。

每步訓(xùn)練迭代包含以下兩個部分:

• 計算預(yù)測結(jié)果 ?,這一步稱為前向傳播

• 更新 W 和 b,,這一步成為反向傳播

下面的順序圖展示了這個過程:

 

 

前向傳播

正如我們在上圖中看到的,前向傳播只是簡單的計算。對于一個基本的 2 層網(wǎng)絡(luò)來說,它的輸出是這樣的:

 

 

我們在 NeuralNetwork 類中增加一個計算前向傳播的函數(shù)。為了簡單起見我們假設(shè)偏置 b 為0:

 

 

但是我們還需要一個方法來評估預(yù)測結(jié)果的好壞(即預(yù)測值和真實(shí)值的誤差)。這就要用到損失函數(shù)。

損失函數(shù)

常用的損失函數(shù)有很多種,根據(jù)模型的需求來選擇。在本教程中,我們使用誤差平方和作為損失函數(shù)。

誤差平方和是求每個預(yù)測值和真實(shí)值之間的誤差再求和,這個誤差是他們的差值求平方以便我們觀察誤差的絕對值。

訓(xùn)練的目標(biāo)是找到一組 W 和 b,使得損失函數(shù)最好小,也即預(yù)測值和真實(shí)值之間的距離最小。

反向傳播

我們已經(jīng)度量出了預(yù)測的誤差(損失),現(xiàn)在需要找到一種方法來傳播誤差,并以此更新權(quán)值和偏置。

為了知道如何適當(dāng)?shù)恼{(diào)整權(quán)值和偏置,我們需要知道損失函數(shù)對權(quán)值 W 和偏置 b 的導(dǎo)數(shù)。

回想微積分中的概念,函數(shù)的導(dǎo)數(shù)就是函數(shù)的斜率。

 

 

梯度下降法

如果我們已經(jīng)求出了導(dǎo)數(shù),我們就可以通過增加或減少導(dǎo)數(shù)值來更新權(quán)值 W 和偏置 b(參考上圖)。這種方式被稱為梯度下降法。

但是我們不能直接計算損失函數(shù)對權(quán)值和偏置的導(dǎo)數(shù),因?yàn)樵趽p失函數(shù)的等式中并沒有顯式的包含他們。因此,我們需要運(yùn)用鏈?zhǔn)角髮?dǎo)發(fā)在來幫助計算導(dǎo)數(shù)。

 

 

鏈?zhǔn)椒▌t用于計算損失函數(shù)對 W 和 b 的導(dǎo)數(shù)。注意,為了簡單起見。我們只展示了假設(shè)網(wǎng)絡(luò)只有 1 層的偏導(dǎo)數(shù)。

這雖然很簡陋,但是我們依然能得到想要的結(jié)果—損失函數(shù)對權(quán)值 W 的導(dǎo)數(shù)(斜率),因此我們可以相應(yīng)的調(diào)整權(quán)值。

現(xiàn)在我們將反向傳播算法的函數(shù)添加到 Python 代碼中

 

 

為了更深入的理解微積分原理和反向傳播中的鏈?zhǔn)角髮?dǎo)法則,我強(qiáng)烈推薦 3Blue1Brown 的如下教程:

Youtube:https://youtu.be/tIeHLnjs5U8

整合并完成一個實(shí)例

既然我們已經(jīng)有了包括前向傳播和反向傳播的完整 Python 代碼,那么就將其應(yīng)用到一個例子上看看它是如何工作的吧。

 

 

神經(jīng)網(wǎng)絡(luò)可以通過學(xué)習(xí)得到函數(shù)的權(quán)重。而我們僅靠觀察是不太可能得到函數(shù)的權(quán)重的。

讓我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)進(jìn)行 1500 次迭代,看看會發(fā)生什么。 注意觀察下面每次迭代的損失函數(shù),我們可以清楚地看到損失函數(shù)單調(diào)遞減到最小值。這與我們之前介紹的梯度下降法一致。

 

 

讓我們看看經(jīng)過 1500 次迭代后的神經(jīng)網(wǎng)絡(luò)的最終預(yù)測結(jié)果:

 

 

經(jīng)過 1500 次迭代訓(xùn)練后的預(yù)測結(jié)果

我們成功了!我們應(yīng)用前向和方向傳播算法成功的訓(xùn)練了神經(jīng)網(wǎng)絡(luò)并且預(yù)測結(jié)果收斂于真實(shí)值。

注意預(yù)測值和真實(shí)值之間存在細(xì)微的誤差是允許的。這樣可以防止模型過擬合并且使得神經(jīng)網(wǎng)絡(luò)對于未知數(shù)據(jù)有著更強(qiáng)的泛化能力。

下一步是什么?

幸運(yùn)的是我們的學(xué)習(xí)之旅還沒有結(jié)束,仍然有很多關(guān)于神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)的內(nèi)容需要學(xué)習(xí)。例如:

• 除了 Sigmoid 以外,還可以用哪些激活函數(shù)

• 在訓(xùn)練網(wǎng)絡(luò)的時候應(yīng)用學(xué)習(xí)率

• 在面對圖像分類任務(wù)的時候使用卷積神經(jīng)網(wǎng)絡(luò)

我很快會寫更多關(guān)于這個主題的內(nèi)容,敬請期待!

最后的想法

我自己也從零開始寫了很多神經(jīng)網(wǎng)絡(luò)的代碼

雖然可以使用諸如 Tensorflow 和 Keras 這樣的深度學(xué)習(xí)框架方便的搭建深層網(wǎng)絡(luò)而不需要完全理解其內(nèi)部工作原理。但是我覺得對于有追求的數(shù)據(jù)科學(xué)家來說,理解內(nèi)部原理是非常有益的。

這種練習(xí)對我自己來說已成成為重要的時間投入,希望也能對你有所幫助。

標(biāo)簽: 代碼 網(wǎng)絡(luò)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:李彥宏與他的AI開放帝國布局

下一篇:從0到1:關(guān)于機(jī)器學(xué)習(xí),知道這些就夠了