反向傳播是神經(jīng)網(wǎng)絡(luò)訓(xùn)練中常用的一種方法,它是通過對每一層的權(quán)值進(jìn)行調(diào)優(yōu)來實(shí)現(xiàn)輸出誤差的反向傳播,從而使損失函數(shù)最小化。 在本文中,我將用小批量表示反向傳播的矩陣方法,以及它如何加強(qiáng)神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí);我還將把這種方法與在小批上循環(huán)進(jìn)行比較,然后解釋小批處理大小如何影響學(xué)習(xí)速度和準(zhǔn)確性。 簡介:實(shí)際上,小批量梯度下降是梯度下降的一種變體,它在處理(feed-forwarding/back- propagation)一系列訓(xùn)練數(shù)據(jù)后更新權(quán)重。所處理的示例數(shù)量稱為“mini-batch size”,是需要優(yōu)化的神經(jīng)網(wǎng)絡(luò)的超參數(shù)之一,因?yàn)槲覀儗⒖吹?,這個(gè)大小的值會影響學(xué)習(xí)的速度和準(zhǔn)確性。 給定一個(gè)具有多個(gè)示例(n)的mini-batch,循環(huán)方法包括循環(huán)該小批量,通過feed-forwarding然后一次back propagating 一個(gè)示例。因此,我們需要(n)次迭代來處理mini-batch的所有示例。 對于矩陣方法,我們將同時(shí)對所有示例進(jìn)行 feed-forward/back-propagate。因此,只有一次迭代就足以處理所有的小批處理示例。 符號:在進(jìn)一步討論之前,我們將指定一個(gè)符號來幫助我們引用神經(jīng)網(wǎng)絡(luò)的組件。我們以這個(gè)包含4個(gè)神經(jīng)元的隱藏層、3個(gè)神經(jīng)元的輸入層和2個(gè)神經(jīng)元的輸出層的網(wǎng)絡(luò)為例: 我們通過以下方式表示權(quán)重,偏差和激活: 因此,屬于層(1)的神經(jīng)元(j)的激活可以用以下方式寫入(其中σ是激活函數(shù)): 方程-1 基于矩陣的Feed-Forwarding:如果我們指定每層的權(quán)重矩陣(W l ),則等式-1可以以矩陣形式重寫,其中(w jk )是矩陣的行號(j)和列號(k)上的元素。給定層(l)的權(quán)重矩陣乘以前一層(l-1)的激活的向量(A),乘法的結(jié)果被加到屬于該層的偏差(B)的向量中。(l)最后,激活函數(shù)應(yīng)用于結(jié)果向量的每個(gè)元素。通過在我們的神經(jīng)網(wǎng)絡(luò)上應(yīng)用這個(gè)等式(1)等于3的等式,我們得到: 方程-2 為了簡化方程式,我將插入向量(B)作為權(quán)重矩陣的第一列,并將(1)作為向量(A)的第一個(gè)元素插入,就像偏差正在扮演權(quán)重的角色一樣相應(yīng)的激活總是等于1: 方程-3 實(shí)際上,我所展示的是前饋傳播,但一次只有一個(gè)例子。我們想要做的是同時(shí)提供大量的例子,以加快學(xué)習(xí)速度。為此,不是將權(quán)重矩陣乘以一個(gè)激活矢量,而是將其乘以矩陣(X),其中每列表示對應(yīng)于一個(gè)示例的激活矢量。后一個(gè)矩陣的列數(shù)是我們想要一次輸入的示例數(shù),換句話說,就是mini-batch size。如果我們選擇一個(gè)等于4的小批量大小作為示例,該方程-3成為: 基于矩陣的反向傳播:現(xiàn)在我們已經(jīng)了解矩陣方法如何用于前饋傳播,我們可以以相同的方式攻擊反向傳播:我們通過乘以權(quán)重矩陣一次前饋多個(gè)示例,然后返回 - 傳播誤差,始終遵循矩陣方法。為此,我們必須以矩陣形式重寫反向傳播的四個(gè)基本方程(見下圖): 對于所表示的輸出層(L) ,我們寫出方程BP1中,如下圖,其中該矩陣的每個(gè)元素(G)是成本函數(shù)的導(dǎo)數(shù)(C)相對于所述激活(a)中,在這里我們正利用二次代價(jià)函數(shù),因此導(dǎo)數(shù)等于(aji-yji),其中(yji)是對應(yīng)于輸出神經(jīng)元(j)和示例(i)的標(biāo)簽。 對于矩陣(S),每個(gè)元素是相對于(Zij)的激活函數(shù)的導(dǎo)數(shù)。 得到的矩陣(D)的每個(gè)元素對應(yīng)于 輸出神經(jīng)元(j)和示例(i)的Δ 。 BP1:矩陣形式 現(xiàn)在,對于表示為(l)的隱藏層,我們將來自于層(l + 1)的加權(quán)矩陣的轉(zhuǎn)數(shù)乘以來自相同層的矩陣(D),得到的結(jié)果是使用Hadamard乘積乘以層(l)的矩陣(S)。BP2的方程是 BP2 考慮到所有這些,方程式BP3和BP4很容易導(dǎo)出 Matrix VS Loop方法:為了測試循環(huán)方法,我將運(yùn)行數(shù)字識別程序,并 計(jì)算程序完成每個(gè)epoch所經(jīng)過的秒數(shù),以及測試的準(zhǔn)確性數(shù)據(jù)。至于矩陣方法,我將運(yùn)行相同代碼的修改版本,其中我已經(jīng)實(shí)現(xiàn)了矩陣形式(https://github.com/hindkls/Matrix-Based-Backpropagation/blob/master/Network1.py)。 神經(jīng)網(wǎng)絡(luò)從MNIST的訓(xùn)練數(shù)據(jù)中學(xué)習(xí),它有784個(gè)輸入神經(jīng)元,10個(gè)輸出神經(jīng)元和30個(gè)神經(jīng)元的隱藏層。通過將我們的程序設(shè)置為運(yùn)行超過30個(gè)epochs,學(xué)習(xí)率為η= 3.0且小批量大小為10,我們得到以下結(jié)果: 循環(huán)方法:
矩陣方法:
通過比較結(jié)果,我們可以看到,使用矩陣方法處理每個(gè)epoch所經(jīng)過的平均秒數(shù)遠(yuǎn)小于使用循環(huán)方法所花費(fèi)的時(shí)間。這是因?yàn)榫仃嚪椒ɡ肅PU和GPU中的并行性來加速計(jì)算。實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的庫使用相同的方法,因?yàn)榫€性代數(shù)庫現(xiàn)在針對快速硬件進(jìn)行了優(yōu)化。 Mini-batch size在本節(jié)中,我們將使用不同的Mini-batch size的值來看一下,看看它如何影響學(xué)習(xí)。為此,我們運(yùn)行我們的程序(具有矩陣形式的程序)進(jìn)行兩次試驗(yàn),第一次使用Mini-batch size等于1,第二次使用Mini-batch size等于600。 第一次:
第二次:
正如我們在這里看到的,當(dāng)我們運(yùn)行一個(gè)小批量大小為600的程序時(shí),學(xué)習(xí)速度要比當(dāng)大小為1時(shí)快一些,但是準(zhǔn)確度較低。這種行為背后的原因是,在第一次試驗(yàn)中,權(quán)重的更新比第二次試驗(yàn)要頻繁得多,因?yàn)樗鼈兪窃谔幚硗昝總€(gè)例子之后更新的,而在第二個(gè)試驗(yàn)中,直到所有600個(gè)例子都被處理后,權(quán)重才會更新。那么我們該怎么做呢?我們是否應(yīng)該選擇一個(gè)小的小批量尺寸并贏得準(zhǔn)確性?還是用一個(gè)大的小批量生產(chǎn),贏得速度卻失去精度? 我們需要做的,是找到一個(gè)速度和精度之間的折中的mini-batch size值,太小,我們不利用快速矩陣乘法,太大,我們不經(jīng)常更新我們的權(quán)重。 現(xiàn)在,您可能認(rèn)為學(xué)習(xí)速度與準(zhǔn)確性并不重要,因?yàn)樽罱K我們將達(dá)到良好的準(zhǔn)確度,但請看一下我們運(yùn)行的程序的結(jié)果是mini-batch size為10,你可以看到只要在第一個(gè)epoch,精度達(dá)到了90%,即權(quán)重沒有比大小等于1時(shí)更新很多。這與我們早先得出的結(jié)論并不矛盾。原因在于,當(dāng)我們選擇一個(gè)小型批次大小等于1時(shí),由于它對每個(gè)示例的影響都作出了響應(yīng),因此這種學(xué)習(xí)是最不明顯的。這就是為什么選擇一個(gè)優(yōu)化良好的mini-batch size,一方面可以幫助我們快速地收斂到一個(gè)好的最小值,因?yàn)槲覀兇_信權(quán)重是經(jīng)常更新的,但是是以一種合理的方式更新的,另一方面可以利用快速矩陣庫。 |
|