動機(jī):為了更好的理解深度學(xué)習(xí),,作者決定從零開始建立一個神經(jīng)網(wǎng)絡(luò),而不是像TensorFlow這樣的深度學(xué)習(xí)庫,。相信理解神經(jīng)網(wǎng)絡(luò)的內(nèi)部工作對于任何有抱負(fù)的數(shù)據(jù)科學(xué)家來說都是很重要的,。 什么是神經(jīng)網(wǎng)絡(luò),? 大多數(shù)介紹神經(jīng)網(wǎng)絡(luò)的文章在描述它們時會涉及到大腦類比,,在不深入研究大腦類比的情況下,將神經(jīng)網(wǎng)絡(luò)簡單描述為將固定數(shù)值映射到期望輸出的數(shù)學(xué)函數(shù)理解起來更容易,。 神經(jīng)網(wǎng)絡(luò)由以下部分組成:
為每個隱藏層選擇激活函數(shù)σ,。在本教程中,,我們將使用Sigmoid激活函數(shù)。 下圖顯示了2層神經(jīng)網(wǎng)絡(luò)的體系結(jié)構(gòu)(請注意,,在計算神經(jīng)網(wǎng)絡(luò)中的層數(shù)時通常會排除輸入層) 2層神經(jīng)網(wǎng)絡(luò)的體系結(jié)構(gòu) 用Python創(chuàng)建一個神經(jīng)網(wǎng)絡(luò)類很容易。 神經(jīng)網(wǎng)絡(luò)訓(xùn)練 簡單的2層神經(jīng)網(wǎng)絡(luò)的輸出是: 您可能會注意到,,在上面的等式中,權(quán)重W和偏差b是影響?的唯一變量。 當(dāng)然,,權(quán)重和偏差的正確度決定了預(yù)測的準(zhǔn)確性,。從輸入數(shù)據(jù)中微調(diào)權(quán)重和偏差的過程稱為神經(jīng)網(wǎng)絡(luò)訓(xùn)練。 訓(xùn)練過程的每次迭代包含以下步驟: 計算預(yù)測輸出?,,稱為前饋 更新權(quán)重和偏差,,稱為反向傳播 下圖為過程順序圖。 前饋 正如我們在上面的順序圖中看到的,,前饋只是一個簡單的演算,對于基本的2層神經(jīng)網(wǎng)絡(luò),,神經(jīng)網(wǎng)絡(luò)的輸出是: 可以在python代碼中添加一個前饋函數(shù)來做到這一點(diǎn),。簡單起見,,使假設(shè)偏差為0。 然而,,仍然需要一種方法來評估我們預(yù)測達(dá)到什么程度,,損失函數(shù)可以做到這一點(diǎn)。 損失函數(shù) 損失函數(shù)有很多種,,問題的性質(zhì)決定該選擇哪種損失函數(shù),。在本教程中,作者將使用一個簡單的sqaures偏差作為損失函數(shù),。 也就是說,平方和誤差僅僅是每個預(yù)測值和實際值之差的平均值,。因為差值被平方,,所以要測量差值的絕對值。 作者的訓(xùn)練目標(biāo)是找到最佳的權(quán)重和偏差集合,,以最大限度地減少損失函數(shù),。 反向傳播 現(xiàn)在作者已經(jīng)測量了預(yù)測誤差,需要找到一種方法來傳播誤差,,并更新權(quán)重和偏差,。 為了適當(dāng)?shù)恼{(diào)整權(quán)重和偏差,需要知道損失函數(shù)關(guān)于權(quán)重和偏差的導(dǎo)數(shù),。 可以從演算中得知,,函數(shù)的導(dǎo)數(shù)就是函數(shù)的斜率。 梯度下降算法 如果有導(dǎo)數(shù),,可以簡單地通過增加/減少更新權(quán)重和偏差(參見上圖)。這被稱為梯度下降。 然而,,我們不能直接計算損失函數(shù)的權(quán)重和偏差,,因為損失函數(shù)的方程不包含權(quán)重和偏差。因此,,我們需要鏈?zhǔn)揭?guī)則來計算它,。 鏈?zhǔn)揭?guī)則用于計算損失函數(shù)相對于權(quán)重的導(dǎo)數(shù),。簡單起見,,只顯示了假設(shè)1層神經(jīng)網(wǎng)絡(luò)的偏導(dǎo)數(shù) 得到相對于權(quán)重的損失函數(shù)的導(dǎo)數(shù)(斜率),以便適當(dāng)調(diào)整權(quán)重,。 現(xiàn)在,,將反向傳播函數(shù)添加到Python代碼中。 為了深入理解演算的應(yīng)用和反向傳播中的鏈?zhǔn)揭?guī)則,,作者強(qiáng)烈推薦3Blue1Brown撰寫教程,。 結(jié)合在一起 現(xiàn)在已經(jīng)有了完整的python代碼來做前饋和反向傳播,將神經(jīng)網(wǎng)絡(luò)應(yīng)用于一個例子上,,來看看它的完成度,。 神經(jīng)網(wǎng)絡(luò)應(yīng)該學(xué)習(xí)理想的權(quán)重集合來表示這個函數(shù),。注意,,通過檢查來計算權(quán)重并不是不重要的。 來看看訓(xùn)練神經(jīng)網(wǎng)絡(luò)進(jìn)行1500次迭代后會發(fā)生什么,。查看下面每個迭代圖的損失,,可以清楚地看到損耗單調(diào)遞減到最小。這與之前的梯度下降算法一致,。 1500次迭代后神經(jīng)網(wǎng)絡(luò)的最終預(yù)測(輸出)。 從上圖可以看出前饋和后向傳播算法成功地訓(xùn)練了神經(jīng)網(wǎng)絡(luò),,并且預(yù)測與實際值相差不大。 請注意,,預(yù)測和實際值之間可以存在細(xì)微的差異,。因為它可以防止過擬合,使神經(jīng)網(wǎng)絡(luò)更好地歸納看不見的數(shù)據(jù),。 下一步是什么,? 幸運(yùn)的是,關(guān)于神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)還有很多需要了解的內(nèi)容,。例如: 除了Sigmoid函數(shù),,還可以使用哪些激活函數(shù)? 訓(xùn)練神經(jīng)網(wǎng)絡(luò)時的學(xué)習(xí)率 利用卷積進(jìn)行圖像分類任務(wù) 最后的想法 作者從頭開始學(xué)習(xí)了神經(jīng)網(wǎng)絡(luò)。 盡管TensorFlow和Keras等深度學(xué)習(xí)庫可以在不完全了解神經(jīng)網(wǎng)絡(luò)的內(nèi)部工作的情況下輕松構(gòu)建深度網(wǎng)絡(luò),,但有抱負(fù)的數(shù)據(jù)科學(xué)家可以更深入地了解神經(jīng)網(wǎng)絡(luò),。 這次練習(xí)對作者來說收獲巨大,希望它對您也有用,! |
|