0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度:了解訓練神經(jīng)網(wǎng)絡(luò)時所用到的數(shù)學過程

智能感知與物聯(lián)網(wǎng)技術(shù)研究所 ? 來源:YXQ ? 2019-07-15 15:22 ? 次閱讀

模型的訓練、調(diào)參是一項非常費時費力的工作,了解神經(jīng)網(wǎng)絡(luò)內(nèi)部的數(shù)學原理有利于快速找出問題所在。本文作者從零開始,一步一步講解了訓練神經(jīng)網(wǎng)絡(luò)時所用到的數(shù)學過程。

神經(jīng)網(wǎng)絡(luò)是線性模塊和非線性模塊的巧妙排列。當聰明地選擇并連接這些模塊時,我們就得到了一個強大的工具來逼近任何一個數(shù)學函數(shù),如一個能夠借助非線性決策邊界進行分類的神經(jīng)網(wǎng)絡(luò)。

運行代碼的步驟如下:

git clone https://github.com/omar-florez/scratch_mlp/python scratch_mlp/scratch_mlp.py

盡管反向傳播技術(shù)具有直觀、模塊化的特質(zhì),但是它負責更新可訓練的參數(shù),這是一個一直未被深入解釋的主題。讓我們以樂高積木為喻,一次增加一塊,從零構(gòu)建一個神經(jīng)網(wǎng)絡(luò)來一探其內(nèi)部功能。

神經(jīng)網(wǎng)絡(luò)就像是由樂高積木組成的

上圖描述了訓練一個神經(jīng)網(wǎng)絡(luò)時所用到的部分數(shù)學過程。我們將在本文中解釋這個。讀者可能感到有趣的一點是:一個神經(jīng)網(wǎng)絡(luò)就是很多模塊以不同的目標堆疊起來。

輸入變量 X 向神經(jīng)網(wǎng)絡(luò)饋送原始數(shù)據(jù),它被存儲在一個矩陣中,矩陣的行是觀察值,列是維度。

權(quán)重 W_1 將輸入 X 映射到第一個隱藏層 h_1。然后權(quán)重 W_1 充當一個線性核。

Sigmoid 函數(shù)防止隱藏層中的數(shù)字落到 0-1 的范圍之外。結(jié)果就是一個神經(jīng)激活的數(shù)組,h_1 = Sigmoid(WX)。

此時,這些運算只是組成了一個一般線性系統(tǒng),無法對非線性交互建模。當我們再疊加一層,給模塊的結(jié)構(gòu)增加深度的時候這一點就會改變。網(wǎng)絡(luò)越深,我們就會學到越多微妙的非線性交互,能解決的問題也就越復雜,或許這也是深度神經(jīng)模型興起的原因之一。

為什么我要讀這篇文章?

如果你理解一個神經(jīng)網(wǎng)絡(luò)的內(nèi)部部分,你就能夠在遇到問題的時候快速知道先去改變哪里,并且能夠制定策略來測試你所知道的這個算法的部分不變量和預期的行為。

因為調(diào)試機器學習模型是一項復雜的任務(wù)。根據(jù)經(jīng)驗,數(shù)學模型在首次嘗試的時候不會奏效。它們可能會對新數(shù)據(jù)給出較低的準確率,會耗費很長的訓練時間或者太多的內(nèi)存,返回一個很大的錯誤負數(shù)值或者 NAN 的預測……在有些情況下,了解算法的運行機制可以讓我們的任務(wù)變得更加便利:

如果訓練花費了太多的時間,那增加 minibatch 的大小或許是一個好主意,這能夠減小觀察值的方差,從而有助于算法收斂。

如果你看到了 NAN 的預測值,算法可能接收到了大梯度,產(chǎn)生了內(nèi)存溢出。可以將這個視為在很多次迭代之后發(fā)生爆炸的矩陣乘法。減小學習率可以縮小這些數(shù)值。減少層數(shù)能夠減少乘法的數(shù)量。剪切梯度也能夠明顯地控制這個問題。

具體的例子:學習異或函數(shù)

讓我們打開黑盒子。我們現(xiàn)在要從零開始構(gòu)建一個學習異或函數(shù)的神經(jīng)網(wǎng)絡(luò)。選擇這個非線性函數(shù)可絕對不是隨機的。沒有反向傳播的話,就很難學會用一條直線分類。

為了描述這個重要的概念,請注意下圖中,一條直線是為何不能對異或函數(shù)輸出中的 0 和 1 進行分類。現(xiàn)實生活中的問題也是非線性可分的。

這個網(wǎng)絡(luò)的拓撲結(jié)構(gòu)非常簡單:

輸入變量 X 是二維向量

權(quán)重 W_1 是具有隨機初始化數(shù)值的 2x3 的矩陣

隱藏層 h_1 包含 3 個神經(jīng)元。每個神經(jīng)元接受觀察值的加權(quán)和作為輸入,這就是下圖中綠色高亮的內(nèi)積:z_1 = [x_1, x_2][w_1, w_2]

權(quán)重 W_2 是具有隨機初始化值的 3x2 的矩陣

輸出層 h_2 包含兩個神經(jīng)元,因為異或函數(shù)的輸出要么是 0(y_1=[0,1]),要么是 1(y_2 = [1,0])

下圖更加直觀:

我們現(xiàn)在來訓練這個模型。在我們這個簡單的例子中,可訓練的參數(shù)就是權(quán)重,但是應(yīng)該知道的是,目前的研究正在探索更多可以被優(yōu)化的參數(shù)類型。例如層之間的快捷連接、正則化分布、拓撲結(jié)構(gòu)、殘差、學習率等等。

反向傳播是這樣的一種方法:在給定的一批具有標簽的觀察值上,朝著將預定義的錯誤指標(就是損失函數(shù))最小化的方向(梯度)更新權(quán)重。該算法已經(jīng)多次被重復發(fā)現(xiàn),這是另一種更通用的被稱為自動微分的技術(shù)在反向積累模式下的特例。

網(wǎng)絡(luò)初始化

讓我們用隨機數(shù)來初始化網(wǎng)絡(luò)權(quán)重

前向步驟:

這一步的目標就是把輸入變量 X 向前傳遞到網(wǎng)絡(luò)的每一層,直至計算出輸出層 h_2 的向量。

這就是其中發(fā)生的計算過程:

以權(quán)重 W_1 為線性核對輸入數(shù)據(jù) X 做線性變換:

使用 Sigmoid 激活函數(shù)對加權(quán)和進行縮放,得到了第一個隱藏層 h_1 的值。請注意,原始的 2D 向量現(xiàn)在映射到了 3D 空間。

第 2 層 h_2 中發(fā)生了類似的過程。讓我們首先來計算第一個隱藏層的加權(quán)和 z_2,它現(xiàn)在是輸入數(shù)據(jù)。

然后計算它們的 Sigmoid 激活函數(shù)。向量 [0.37166596 0.45414264] 代表的是網(wǎng)絡(luò)對給定的輸入 X 計算出的對數(shù)概率或者預測向量。

計算整體損失

也被稱為「實際值減去預測值」,這個損失函數(shù)的目標就是量化預測向量 h_2 和人工標簽 y 之間的距離。

請注意,這個損失函數(shù)包括一個正則項,它以嶺回歸的形式懲罰較大的權(quán)重。換言之,平方值比較大的權(quán)重會增大損失函數(shù),而這正是我們希望最小化的指標。

反向步驟:

這一步的目標就是沿著最小化損失函數(shù)的方向更新神經(jīng)網(wǎng)絡(luò)的權(quán)重。正如我們將要看到的,這是一個遞歸算法,它可以重用之前計算出來的梯度,而且嚴重依賴微分函數(shù)。因為這些更新減小了損失函數(shù),所以一個神經(jīng)網(wǎng)絡(luò)便「學會了」去逼近具有已知類別的觀察值的標簽。這就是被稱作泛化的一種屬性。

與前向步驟不同的是,這個步驟沿著反向的順序進行。它首先計算出輸出層中損失函數(shù)對每個權(quán)重的偏導數(shù) (dLoss/dW_2),然后計算隱藏層的偏導數(shù) (dLoss/dW1)。讓我們詳細地解釋每個導數(shù)吧。

dLoss/dW_2:

鏈式法則表明,我們可以將一個神經(jīng)網(wǎng)絡(luò)的梯度計算分解成好多個微分部分:

為了幫助記憶,下表列出了上面用到的一些函數(shù)定義以及它們的一階導數(shù):

更直觀地,我們在下圖中要更新權(quán)重 W_2(藍色部分)。為了做到這件事,我們需要沿著導數(shù)鏈計算三個偏導數(shù)。

將數(shù)值代入到這些偏導數(shù)中,我們就能夠計算出 W_2 的偏導數(shù),如下所示:

結(jié)果是一個 3x2 的矩陣 dLoss/dW_2,它將會沿著最小化損失函數(shù)的方向更新 W_2 的數(shù)值。

dLoss/dW_1:

計算用于更新第一個隱藏層 W_1 權(quán)重的鏈式規(guī)則就展現(xiàn)了重復使用已有計算結(jié)果的可能。

更直觀地,從輸出層到權(quán)重 W_1 的路徑會碰到在后面層中早已計算出來的偏導數(shù)。

例如,偏導數(shù) dLoss/dh_2 和 dh_2/dz_2 在上一節(jié)中已經(jīng)被計算為輸出層 dLoss/dW_2 學習權(quán)值的依賴項。

將所有的導數(shù)放在一起,我們就能夠再一次執(zhí)行鏈式法則,來為隱藏層的 W_1 更新權(quán)重。

最后,我們給權(quán)重賦予新的數(shù)值,完成了對神經(jīng)網(wǎng)絡(luò)的一步訓練。

實現(xiàn)

讓我們僅使用 numpy 作為線性代數(shù)引擎來將上面的數(shù)學方程轉(zhuǎn)換成代碼。神經(jīng)網(wǎng)絡(luò)在一個循環(huán)中進行訓練,其中每次迭代會給神經(jīng)網(wǎng)絡(luò)展示標準的輸入數(shù)據(jù)。在這個小例子中,我們只考慮每次迭代中的整個數(shù)據(jù)集。前向步驟、損失函數(shù)和反向步驟的計算會得到比較好的泛化,因為我們在每一次循環(huán)中都用它們對應(yīng)的梯度(矩陣 dL_dw1 和 dL_dw2)來更新可訓練的參數(shù)。

代碼保存在這個 repo 中:https://github.com/omar-florez/scratch_mlp

讓我們來運行這份代碼!

下面可以看到一些進行了好多次迭代訓練得到的能夠近似異或函數(shù)的神經(jīng)網(wǎng)絡(luò)。

左圖:準確率;中間的圖:學習到的決策邊界;右圖:損失函數(shù)

首先,我們來看一下隱藏層具有 3 個神經(jīng)元的神經(jīng)網(wǎng)絡(luò)為何能力較弱。這個模型學會了用一個簡單的決策邊界來進行二分類,這個邊界開始是一條直線,但是隨后就表現(xiàn)出了非線性的行為。隨著訓練的持續(xù),右圖中的損失函數(shù)也明顯地減小。

隱藏層擁有 50 個神經(jīng)元的神經(jīng)網(wǎng)絡(luò)明顯地增加了模型學習復雜決策邊界的能力。這不僅僅能夠得到更準確的結(jié)果,而且也使梯度發(fā)生了爆炸,這是訓練神經(jīng)網(wǎng)絡(luò)時的一個顯著問題。當梯度非常大的時候,反向傳播中的連乘會產(chǎn)生很大的更新權(quán)重。這就是最后幾步訓練時損失函數(shù)突然增大的原因(step>90)。損失函數(shù)的正則項計算出了已經(jīng)變得很大的權(quán)重的平方值(sum(W2)/2N)。

正如你所看到的一樣,這個問題可以通過減小學習率來避免??梢酝ㄟ^實現(xiàn)一個能夠隨著時間減小學習率的策略來實現(xiàn)。或者通過強制執(zhí)行一個更強的正則化來實現(xiàn),可能是 L1 或者 L2。梯度消失和梯度爆炸是很有趣的現(xiàn)象,我們后續(xù)會做完整的分析。

原文鏈接:https://medium.com/towards-artificial-intelligence/one-lego-at-a-time-explaining-the-math-of-how-neural-networks-learn-with-implementation-from-scratch-39144a1cf80

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 神經(jīng)網(wǎng)絡(luò)

    關(guān)注

    42

    文章

    4717

    瀏覽量

    100018
  • GitHub
    +關(guān)注

    關(guān)注

    3

    文章

    461

    瀏覽量

    16237

原文標題:像堆樂高一樣:從零開始解釋神經(jīng)網(wǎng)絡(luò)的數(shù)學過程

文章出處:【微信號:tyutcsplab,微信公眾號:智能感知與物聯(lián)網(wǎng)技術(shù)研究所】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    matlab 神經(jīng)網(wǎng)絡(luò) 數(shù)學建模數(shù)值分析

    matlab神經(jīng)網(wǎng)絡(luò) 數(shù)學建模數(shù)值分析 精通的可以討論下
    發(fā)表于 09-18 15:14

    脈沖神經(jīng)網(wǎng)絡(luò)怎么訓練

    脈沖神經(jīng)網(wǎng)絡(luò)(SNN, Spiking Neural Network)的訓練是一個復雜但充滿挑戰(zhàn)的過程,它模擬了生物神經(jīng)元通過脈沖(或稱為尖峰)進行信息傳遞的方式。以下是對脈沖
    的頭像 發(fā)表于 07-12 10:13 ?289次閱讀

    怎么對神經(jīng)網(wǎng)絡(luò)重新訓練

    重新訓練神經(jīng)網(wǎng)絡(luò)是一個復雜的過程,涉及到多個步驟和考慮因素。 引言 神經(jīng)網(wǎng)絡(luò)是一種強大的機器學習模型,廣泛應(yīng)用于圖像識別、自然語言處理、語音識別等領(lǐng)域。然而,隨著時間的推移,數(shù)據(jù)分布可
    的頭像 發(fā)表于 07-11 10:25 ?312次閱讀

    BP神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu)和訓練過程

    網(wǎng)絡(luò)結(jié)構(gòu),通過誤差反向傳播算法(Error Backpropagation Algorithm)來訓練網(wǎng)絡(luò),實現(xiàn)對復雜問題的學習和解決。以下將詳細闡述BP神經(jīng)網(wǎng)絡(luò)的工作方式,涵蓋其基本
    的頭像 發(fā)表于 07-10 15:07 ?1465次閱讀
    BP<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>的基本結(jié)構(gòu)和<b class='flag-5'>訓練過程</b>

    PyTorch神經(jīng)網(wǎng)絡(luò)模型構(gòu)建過程

    PyTorch,作為一個廣泛使用的開源深度學習庫,提供了豐富的工具和模塊,幫助開發(fā)者構(gòu)建、訓練和部署神經(jīng)網(wǎng)絡(luò)模型。在神經(jīng)網(wǎng)絡(luò)模型中,輸出層是尤為關(guān)鍵的部分,它負責將模型的預測結(jié)果以合適
    的頭像 發(fā)表于 07-10 14:57 ?304次閱讀

    如何利用Matlab進行神經(jīng)網(wǎng)絡(luò)訓練

    ,使得神經(jīng)網(wǎng)絡(luò)的創(chuàng)建、訓練和仿真變得更加便捷。本文將詳細介紹如何利用Matlab進行神經(jīng)網(wǎng)絡(luò)訓練,包括網(wǎng)絡(luò)創(chuàng)建、數(shù)據(jù)預處理、
    的頭像 發(fā)表于 07-08 18:26 ?858次閱讀

    人工神經(jīng)網(wǎng)絡(luò)模型訓練的基本原理

    人工神經(jīng)網(wǎng)絡(luò)(Artificial Neural Networks,簡稱ANNs)是一種受生物神經(jīng)網(wǎng)絡(luò)啟發(fā)而構(gòu)建的數(shù)學模型,用于模擬人腦處理信息的方式。它在機器學習和深度學習領(lǐng)域具有廣
    的頭像 發(fā)表于 07-05 09:16 ?334次閱讀

    深度神經(jīng)網(wǎng)絡(luò)與基本神經(jīng)網(wǎng)絡(luò)的區(qū)別

    在探討深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Networks, DNNs)與基本神經(jīng)網(wǎng)絡(luò)(通常指傳統(tǒng)神經(jīng)網(wǎng)絡(luò)或前向神經(jīng)網(wǎng)絡(luò))的區(qū)別時,我們需
    的頭像 發(fā)表于 07-04 13:20 ?338次閱讀

    神經(jīng)網(wǎng)絡(luò)反向傳播算法的原理、數(shù)學推導及實現(xiàn)步驟

    傳播算法的原理、數(shù)學推導、實現(xiàn)步驟以及在深度學習中的應(yīng)用。 神經(jīng)網(wǎng)絡(luò)概述 神經(jīng)網(wǎng)絡(luò)是一種受人腦啟發(fā)的計算模型,由大量的神經(jīng)元(或稱為節(jié)點)組
    的頭像 發(fā)表于 07-03 11:16 ?412次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)訓練的是什么

    、訓練過程以及應(yīng)用場景。 1. 卷積神經(jīng)網(wǎng)絡(luò)的基本概念 1.1 卷積神經(jīng)網(wǎng)絡(luò)的定義 卷積神經(jīng)網(wǎng)絡(luò)是一種前饋深度學習模型,其核心思想是利用卷積
    的頭像 發(fā)表于 07-03 09:15 ?221次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的原理是什么

    基本概念、結(jié)構(gòu)、訓練過程以及應(yīng)用場景。 卷積神經(jīng)網(wǎng)絡(luò)的基本概念 1.1 神經(jīng)網(wǎng)絡(luò) 神經(jīng)網(wǎng)絡(luò)是一種受人腦神經(jīng)元結(jié)構(gòu)啟發(fā)的
    的頭像 發(fā)表于 07-02 14:44 ?354次閱讀

    卷積神經(jīng)網(wǎng)絡(luò)的基本原理、結(jié)構(gòu)及訓練過程

    訓練過程以及應(yīng)用場景。 一、卷積神經(jīng)網(wǎng)絡(luò)的基本原理 卷積運算 卷積運算是卷積神經(jīng)網(wǎng)絡(luò)的核心,它是一種數(shù)學運算,用于提取圖像中的局部特征。卷積運算的
    的頭像 發(fā)表于 07-02 14:21 ?1068次閱讀

    神經(jīng)網(wǎng)絡(luò)數(shù)學建模中的應(yīng)用

    數(shù)學建模是一種利用數(shù)學方法和工具來描述和分析現(xiàn)實世界問題的過程神經(jīng)網(wǎng)絡(luò)是一種模擬人腦神經(jīng)元結(jié)構(gòu)和功能的計算模型,可以用于解決各種復雜問題。
    的頭像 發(fā)表于 07-02 11:29 ?539次閱讀

    如何訓練和優(yōu)化神經(jīng)網(wǎng)絡(luò)

    神經(jīng)網(wǎng)絡(luò)是人工智能領(lǐng)域的重要分支,廣泛應(yīng)用于圖像識別、自然語言處理、語音識別等多個領(lǐng)域。然而,要使神經(jīng)網(wǎng)絡(luò)在實際應(yīng)用中取得良好效果,必須進行有效的訓練和優(yōu)化。本文將從神經(jīng)網(wǎng)絡(luò)
    的頭像 發(fā)表于 07-01 14:14 ?270次閱讀

    利用深度循環(huán)神經(jīng)網(wǎng)絡(luò)對心電圖降噪

    進行訓練。我們還研究了使用合成數(shù)據(jù) 集如何影響網(wǎng)絡(luò)性能。 我們建議使用深度循環(huán)去噪神經(jīng)網(wǎng)絡(luò)(DRDNN) 對心電圖信號進行去噪。它們是一種深度
    發(fā)表于 05-15 14:42