1 深度神經(jīng)網(wǎng)絡(luò)(DNN)以下內(nèi)容來自劉建平Pinard-博客園的學(xué)習(xí)筆記,總結(jié)如下: 深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Netwoeks,以下簡(jiǎn)稱DNN)是深度學(xué)習(xí)的基礎(chǔ),而要理解DNN,首先我們要理解DNN模型,下面我們就對(duì)DNN的模型與前相傳播算法做一個(gè)總結(jié)。 1.1從感知機(jī)到神經(jīng)網(wǎng)絡(luò)感知機(jī)的模型是一個(gè)由若干輸入和一個(gè)輸出的模型,如下圖 輸入和輸出之間學(xué)習(xí)到一個(gè)線性關(guān)系,得到中間輸出結(jié)果 (1) 接著是一個(gè)神經(jīng)元激活函數(shù): (2) 從而得到我們需要的輸出結(jié)果1或者-1 這個(gè)模型只能用于一個(gè)二分類,且無法學(xué)習(xí)比較復(fù)雜的非線性模型,因此在工業(yè)界無法使用。而神經(jīng)網(wǎng)絡(luò)模型則在感知機(jī)的基礎(chǔ)上做了擴(kuò)展,總結(jié)下主要有三點(diǎn):
(3)
1.2 DNN基本結(jié)構(gòu)上一節(jié)我們了解了神經(jīng)網(wǎng)絡(luò)基于感知機(jī)的擴(kuò)展,而DNN可以理解為有很多隱藏層的神經(jīng)網(wǎng)絡(luò)。這個(gè)很多其實(shí)也沒有什么度量標(biāo)準(zhǔn), 多層神經(jīng)網(wǎng)絡(luò)和深度神經(jīng)網(wǎng)絡(luò)DNN其實(shí)也是指的一個(gè)東西,當(dāng)然,DNN有時(shí)也叫做多層感知機(jī)(Multi-Layer perceptron,MLP), 名字實(shí)在是多。后面我們講到的神經(jīng)網(wǎng)絡(luò)都默認(rèn)為DNN。 從DNN按不同層的位置劃分,DNN內(nèi)部的神經(jīng)網(wǎng)絡(luò)層可以分為三類,輸入層,隱藏層和輸出層,如下圖示例,一般來說第一層是輸入層,最后一層是輸出層,而中間的層數(shù)都是隱藏層。 層與層之間是全連接的,也就是說,第 i 層的任意一個(gè)神經(jīng)元一定與第i + 1層的任意一個(gè)神經(jīng)元相連。雖然DNN看起來很復(fù)雜,但是從小的局部模型來說,還是和感知機(jī)一樣,即一個(gè)線性關(guān)系加上一個(gè)激活函數(shù)σ ( z ) 。 由于DNN層數(shù)多,則我們的線性關(guān)系系數(shù)w和偏倚b的數(shù)量也就是很多了。具體的參數(shù)在DNN是如何定義的呢? 首先我們來看看線性關(guān)系系數(shù)w的定義。以下圖一個(gè)三層的DNN為例,第二層的第4個(gè)神經(jīng)元到第三層的第2個(gè)神經(jīng)元的線性系數(shù)定義為。上標(biāo)3代表線性系數(shù)w所在的層數(shù),而下標(biāo)對(duì)應(yīng)的是輸出的第三層索引2和輸入的第二層索引4。你也許會(huì)問,為什么不是, 而是呢?這主要是為了便于模型用于矩陣表示運(yùn)算,如果是每次進(jìn)行矩陣運(yùn)算是,需要進(jìn)行轉(zhuǎn)置。將輸出的索引放在前面的話,則線性運(yùn)算不用轉(zhuǎn)置,即直接為wx+b??偨Y(jié)下,第L-1層的第k個(gè)神經(jīng)元到第L層的第j個(gè)神經(jīng)元的線性系數(shù)定義為。,需要注意,輸入層是沒有w參數(shù)的。 再來看看偏倚b的定義。還是以這個(gè)三層的DNN為例,第二層的第3個(gè)神經(jīng)元對(duì)應(yīng)的偏倚定義為。其中,上標(biāo)2代表所在的層數(shù),下標(biāo)3代表偏倚所在的神經(jīng)元的索引。輸出層是沒有偏倚參數(shù)b的。 同樣的道理,對(duì)于神經(jīng)元的激活值而言,第3層的第1個(gè)神經(jīng)元的激活值應(yīng)該表示為 2. DNN前向傳播算法2.1 DNN前向傳播算法數(shù)學(xué)原理在上一節(jié),我們已經(jīng)介紹了DNN各層線性關(guān)系系數(shù)w和偏倚b的定義。假設(shè)我們選擇的激活函數(shù)是σ ( z ) ,隱藏層和輸出層的輸出值為a,則對(duì)于下圖的三層DNN,利用和感知機(jī)一樣的思路,我們可以利用上一層的輸出計(jì)算下一層的輸出,也就是所謂的DNN前向傳播算法。 對(duì)于第二層的輸出,我們有: (4) 對(duì)于第三層的輸出,我們有:
將上面的例子一般化,假設(shè)第l-1層共有m個(gè)神經(jīng)元,則對(duì)于第l層層的第j個(gè)神經(jīng)元,我們有: (8) 其中,如果L = 2,那么一般化式子中的就為輸入 從上面可以看出,使用代數(shù)法一個(gè)個(gè)地表示輸出比較復(fù)雜,而如果使用矩陣法則比較的簡(jiǎn)潔。假設(shè)第l - 1層共有m個(gè)神經(jīng)元,而第l層共有n個(gè)神經(jīng)元,則第l層的線性系數(shù)w組成了一個(gè)n × m的矩陣,第l層的偏倚b組成了一個(gè)n × 1的向量,第l? 1層的輸出a組成了一個(gè)m × 1的向量,第L層的未激活前線性輸出z組成了一個(gè)n × 1的向量,第l層的的輸出a組成了一個(gè)n × 1的向量。則用矩陣法表示,第l層的輸出為: (9) 這個(gè)表示方法簡(jiǎn)潔漂亮,后面我們的討論都會(huì)基于上面的這個(gè)矩陣法表示來。所以,應(yīng)該時(shí)刻記住我們符號(hào)的含義,否則在后面推導(dǎo)反向傳播公式時(shí)會(huì)比較懵。 2.2 DNN前向傳播算法有了上一節(jié)的數(shù)學(xué)推導(dǎo),DNN的前向傳播算法也就不難了。所謂的DNN的前向傳播算法也就是利用我們的若干個(gè)權(quán)重系數(shù)矩陣W和偏倚向量b來和輸入值向量x進(jìn)行一系列線性運(yùn)算和激活運(yùn)算,從輸入層開始,一層層的向后計(jì)算,一直到運(yùn)算到輸出層,得到輸出結(jié)果為止 。 輸入:總層數(shù)L,所有隱藏層和輸出層對(duì)應(yīng)的矩陣W,偏倚向量b,輸入值向量x 輸出:輸出層的
(10) 最后的結(jié)果即為輸出 2.3 DNN前向傳播算法小結(jié)單獨(dú)看DNN前向傳播算法,似乎沒有什么大用處,而且這一大堆的矩陣W,偏倚向量b對(duì)應(yīng)的參數(shù)怎么獲得呢?怎么得到最優(yōu)的矩陣W,偏倚向量b呢?這個(gè)我們?cè)谙乱徽轮vDNN的反向傳播算法時(shí)再講。而理解反向傳播算法的前提就是理解DNN的模型與前向傳播算法。這也是我們先講前向傳播算法的原因。 3. DNN反向傳播算法3.1 DNN 反向傳播算法要解決的問題在了解DNN的反向傳播算法(Back Propagation,BP)前,我們先要知道DNN反向傳播算法要解決的問題,也就是說,什么時(shí)候我們需要這個(gè)反向傳播算法? 回到我們監(jiān)督學(xué)習(xí)的一般問題,假設(shè)我們有m個(gè)訓(xùn)練樣本:,其中x為輸入向量,特征維度為,而y為輸出向量,特征維度為。我們需要利用這m個(gè)樣本訓(xùn)練出一個(gè)模型,當(dāng)有一個(gè)新的測(cè)試樣本來到時(shí), 我們可以預(yù)測(cè)向量的輸出。 如果我們采用DNN的模型,即我們使輸入層有個(gè)神經(jīng)元,而輸出層有個(gè)神經(jīng)元。再加上一些含有若干神經(jīng)元的隱藏層。此時(shí)我們需要找到合適的所有隱藏層和輸出層對(duì)應(yīng)的線性系數(shù)矩陣W和偏倚向量b,讓所有的訓(xùn)練樣本輸入計(jì)算出的輸出盡可能的等于或很接近樣本輸出。怎么找到合適的參數(shù)呢? 如果大家對(duì)傳統(tǒng)的機(jī)器學(xué)習(xí)的算法優(yōu)化過程熟悉的話,這里就很容易聯(lián)想到我們可以用一個(gè)合適的損失函數(shù)來度量訓(xùn)練樣本的輸出損失,接著對(duì)這個(gè)損失函數(shù)進(jìn)行優(yōu)化求最小化的極值,對(duì)應(yīng)的一系列線性系數(shù)矩陣W和偏倚向量b即為我們的最終結(jié)果。在DNN中,損失函數(shù)優(yōu)化極值求解的過程最常見的一般是通過梯度下降法來一步步迭代完成的,當(dāng)然也可以是其他的迭代方法比如牛頓法與擬牛頓法。 對(duì)DNN的損失函數(shù)用梯度下降法進(jìn)行迭代優(yōu)化求極小值的過程即為我們的反向傳播算法。 3.2 DNN反向傳播算法的基本思路在進(jìn)行DNN反向傳播算法前,我們需要選擇一個(gè)損失函數(shù),來度量訓(xùn)練樣本計(jì)算出的輸出和真實(shí)的訓(xùn)練樣本輸出之間的損失。你也許會(huì)問:訓(xùn)練樣本計(jì)算出的輸出是怎么得來的?這個(gè)輸出是隨機(jī)選擇一系列W,b,用前向傳播算法計(jì)算出來的。即通過一系列的計(jì)算:。計(jì)算到輸出層第L層對(duì)應(yīng)的a^L即為前向傳播算法計(jì)算出來的輸出。 回到損失函數(shù),DNN可選擇的損失函數(shù)有不少,為了專注算法,這里我們使用最常見的均方差來度量損失。當(dāng)然,針對(duì)不同的任務(wù),可以選擇不同的損失函數(shù)。即對(duì)于每個(gè)樣本,我們期望最小化下式: (11) 其中,和y為特征維度為的向量,而為S的L2范數(shù) 損失函數(shù)有了,現(xiàn)在我們開始用梯度下降法迭代求解每一層的W, b 注:以下是BP算法推導(dǎo)的過程,是本文最核心,也是神經(jīng)網(wǎng)絡(luò)最基本的公式推導(dǎo)。 思路第一步: 首先是輸出層第L層。主要到輸出層的W,b滿足下式: (12) 這樣對(duì)于輸出層的參數(shù),我們的損失函數(shù)就變?yōu)椋?/span> (13) 這樣求解W,b的梯度就很簡(jiǎn)單了 (14) (15) 注意上式中有一個(gè)符號(hào),它代表Hadamard積,對(duì)于兩個(gè)維度相同的向量和,則。 對(duì)于公式(14)和(15),我在這里多解釋一下為什么是這樣: 對(duì)于公式(14):前兩項(xiàng)之所以是Hadamard積的形式,是因?yàn)?span data-content='{"url":"http://image109.360doc.com/DownloadImg/2022/08/1111/250126533_54_20220811113417288.png","uri":"","width":166,"height":47,"darkImgUrl":"https://p3.toutiaoimg.com/origin/tos-cn-i-qvj2lq49k0/d88e62a262bc43d0983f80c834e108b6","darkImgUri":"","formulaImgStatus":"succeed"}' data-formula='\frac{\partial J(W,b,x,y)}{\partial a^L} \frac{\partial a^L}{\partial z^L}'>都是針對(duì)同一層的神經(jīng)元。如果我們考慮對(duì)于L層的第j個(gè)神經(jīng)元,即,那么整合這一層的神經(jīng)元,自然是這樣Hadamard積的形式。那么為什么在(14)中的最后呢?這涉及到矩陣求導(dǎo)的知識(shí),不是我們本文的重點(diǎn)。在這里,用到的知識(shí)是:如果
那么, (17) 這樣就可以推出公式(14),公式(15)與公式(14)類似 思路第二步: 我們注意到在求解輸出層的W,b的時(shí)候,有公共的部分,因此我們可以把公共部分即對(duì)先計(jì)算出來,記為: (18) 根據(jù)公式(14)(15),我們可以把輸出層的梯度算出來,那么如何計(jì)算上一層L ? 1層的梯度,上上層L ? 2層的梯度呢?這里我們需要一步步的遞推,注意到對(duì)于第l層的未激活輸出,它的梯度可以表示為: (19) 如果我們可以依次計(jì)算出第l層的,則該層的很容易計(jì)算?為什么呢?注意到根據(jù)前向傳播算法,我們有: (20) 所以根據(jù)上式我們可以很方便的計(jì)算出第l層的W^l,b^l的梯度如下: (21) (22) 思路第三步: 那么現(xiàn)在問題的關(guān)鍵就是要求出了。這里我們用數(shù)學(xué)歸納法,第L層的上面我們已經(jīng)求出, 假設(shè)第l + 1層的已經(jīng)求出來了,那么我們?nèi)绾吻蟪龅趌層的\delta^l呢?我們注意到: (23) 可見,用歸納法求和的關(guān)鍵在于求解 而和的關(guān)系很好找出: (24) 這樣就很容易求出: (25) 公式(25)的意識(shí)是說,的每一列都Hadamard積 將公式(25)帶入到公式(23)里面,我們得到: (26) 總結(jié): 其實(shí),對(duì)于更新每一層的W^l,b^l的對(duì)應(yīng)梯度,我們仔細(xì)觀察整個(gè)過程,發(fā)現(xiàn)只需要四個(gè)公式就可以完整地進(jìn)行更新。這就是著名的反向傳播的四個(gè)公式,即公式(18)、(26)、(21)、(22)。我們稍加改動(dòng),使其可以應(yīng)用到多種損失函數(shù),即: (27) 3.3 DNN反向傳播算法過程現(xiàn)在我們總結(jié)下DNN反向傳播算法的過程。由于梯度下降法有批量(Batch),小批量(mini-Batch),隨機(jī)三個(gè)變種,為了簡(jiǎn)化描述,這里我們以最基本的批量梯度下降法為例來描述反向傳播算法。實(shí)際上在業(yè)界使用最多的是mini-Batch的梯度下降法。不過區(qū)別僅僅在于迭代時(shí)訓(xùn)練樣本的選擇而已。 輸入: 總層數(shù)L,以及各隱藏層與輸出層的神經(jīng)元個(gè)數(shù),激活函數(shù),損失函數(shù),迭代步長(zhǎng)α ,最大迭代次數(shù)MAX與停止迭代閾值?,輸入的m個(gè)訓(xùn)練樣本 輸出:各隱藏層與輸出層的線性關(guān)系系數(shù)矩陣W和偏倚向量b
(28)
注:上述的算法其實(shí)看起來有些復(fù)雜了,而實(shí)際上根據(jù)機(jī)器學(xué)習(xí)里普通的批梯度下降算法,我們?cè)谇蟪鰉個(gè)樣本的后,求平均得到,然后反向繼續(xù)更新。 3.4 DNN反向傳播算法小結(jié)有了DNN反向傳播算法,我們就可以很方便的用DNN的模型去解決各種監(jiān)督學(xué)習(xí)的分類回歸問題。當(dāng)然DNN的參數(shù)眾多,矩陣運(yùn)算量也很大,直接使用會(huì)有各種各樣的問題。有哪些問題我們候選在進(jìn)行優(yōu)化。 |
|