神经网络向量化
神經(jīng)網(wǎng)絡(luò)向量化
From Ufldl
Jump to: navigation, search在本節(jié),我們將引入神經(jīng)網(wǎng)絡(luò)的向量化版本。在前面關(guān)于神經(jīng)網(wǎng)絡(luò)介紹的章節(jié)中,我們已經(jīng)給出了一個(gè)部分向量化的實(shí)現(xiàn),它在一次輸入一個(gè)訓(xùn)練樣本時(shí)是非常有效率的。下邊我們看看如何實(shí)現(xiàn)同時(shí)處理多個(gè)訓(xùn)練樣本的算法。具體來講,我們將把正向傳播、反向傳播這兩個(gè)步驟以及稀疏特征集學(xué)習(xí)擴(kuò)展為多訓(xùn)練樣本版本。
Contents[hide]
|
正向傳播
考慮一個(gè)三層網(wǎng)絡(luò)(一個(gè)輸入層、一個(gè)隱含層、以及一個(gè)輸出層),并且假定x是包含一個(gè)單一訓(xùn)練樣本 的列向量。則向量化的正向傳播步驟如下:
這對(duì)于單一訓(xùn)練樣本而言是非常有效的一種實(shí)現(xiàn),但是當(dāng)我們需要處理m個(gè)訓(xùn)練樣本時(shí),則需要把如上步驟放入一個(gè)for循環(huán)中。
更具體點(diǎn)來說,參照邏輯回歸向量化的例子,我們用Matlab/Octave風(fēng)格變量x表示包含輸入訓(xùn)練樣本的矩陣,x(:,i)代表第個(gè)訓(xùn)練樣本。則x正向傳播步驟可如下實(shí)現(xiàn):
這個(gè)for循環(huán)能否去掉呢?對(duì)于很多算法而言,我們使用向量來表示計(jì)算過程中的中間結(jié)果。例如在前面的非向量化實(shí)現(xiàn)中,z2,a2,z3都是列向量,分別用來計(jì)算隱層和輸出層的激勵(lì)結(jié)果。為了充分利用并行化和高效矩陣運(yùn)算的優(yōu)勢(shì),我們希望算法能同時(shí)處理多個(gè)訓(xùn)練樣本。讓我們先暫時(shí)忽略前面公式中的b1和b2(把它們?cè)O(shè)置為0),那么可以實(shí)現(xiàn)如下:
在這個(gè)實(shí)現(xiàn)中,z2,a2,z3都是矩陣,每個(gè)訓(xùn)練樣本對(duì)應(yīng)矩陣的一列。在對(duì)多個(gè)訓(xùn)練樣本實(shí)現(xiàn)向量化時(shí)常用的設(shè)計(jì)模式是,雖然前面每個(gè)樣本對(duì)應(yīng)一個(gè)列向量(比如z2),但我們可把這些列向量堆疊成一個(gè)矩陣以充分享受矩陣運(yùn)算帶來的好處。這樣,在這個(gè)例子中,a2就成了一個(gè)s2 X m的矩陣(s2是網(wǎng)絡(luò)第二層中的神經(jīng)元數(shù),m是訓(xùn)練樣本個(gè)數(shù))。矩陣a2的物理含義是,當(dāng)?shù)?span id="ozvdkddzhkzd" class="texhtml">i個(gè)訓(xùn)練樣本x(:i)輸入到網(wǎng)絡(luò)中時(shí),它的第i列就表示這個(gè)輸入信號(hào)對(duì)隱神經(jīng)元 (網(wǎng)絡(luò)第二層)的激勵(lì)結(jié)果。
在上面的實(shí)現(xiàn)中,我們假定激活函數(shù)f(z)接受矩陣形式的輸入z,并對(duì)輸入矩陣按列分別施以激活函數(shù)。需要注意的是,你在實(shí)現(xiàn)f(z)的時(shí)候要盡量多用Matlab/Octave的矩陣操作,并盡量避免使用for循環(huán)。假定激活函數(shù)采用Sigmoid函數(shù),則實(shí)現(xiàn)代碼如下所示:
最后,我們上面的正向傳播向量化實(shí)現(xiàn)中忽略了b1和b2,現(xiàn)在要把他們包含進(jìn)來,為此我們需要用到Matlab/Octave的內(nèi)建函數(shù)repmat:
repmat(b1,1,m)的運(yùn)算效果是,它把列向量b1拷貝m份,然后堆疊成如下矩陣:
這就構(gòu)成一個(gè)s2 X m的矩陣。它和W1 * x相加,就等于是把W1 * x矩陣(譯者注:這里x是訓(xùn)練矩陣而非向量, 所以W1 * x代表兩個(gè)矩陣相乘,結(jié)果還是一個(gè)矩陣)的每一列加上b1。如果不熟悉的話,可以參考Matlab/Octave的幫助文檔獲取更多信息(輸入“help repmat”)。rampat作為Matlab/Octave的內(nèi)建函數(shù),運(yùn)行起來是相當(dāng)高效的,遠(yuǎn)遠(yuǎn)快過我們自己用for循環(huán)實(shí)現(xiàn)的效果。
反向傳播
現(xiàn)在我們來描述反向傳播向量化的思路。在閱讀這一節(jié)之前,強(qiáng)烈建議各位仔細(xì)閱讀前面介紹的正向傳播的例子代碼,確保你已經(jīng)完全理解。下邊我們只會(huì)給出反向傳播向量化實(shí)現(xiàn)的大致綱要,而由你來完成具體細(xì)節(jié)的推導(dǎo)(見向量化練習(xí))。
對(duì)于監(jiān)督學(xué)習(xí),我們有一個(gè)包含m個(gè)帶類別標(biāo)號(hào)樣本的訓(xùn)練集。 (對(duì)于自編碼網(wǎng)絡(luò),我們只需令y(i) = x(i)即可, 但這里考慮的是更一般的情況。)
假定網(wǎng)絡(luò)的輸出有s3維,因而每個(gè)樣本的類別標(biāo)號(hào)向量就記為。在我們的Matlab/Octave數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)中,把這些輸出按列合在一起形成一個(gè)Matlab/Octave風(fēng)格變量y,其中第i列y(:,i)就是y(i)。
現(xiàn)在我們要計(jì)算梯度項(xiàng)和。對(duì)于梯度中的第一項(xiàng),就像過去在反向傳播算法中所描述的那樣,對(duì)于每個(gè)訓(xùn)練樣本(x,y),我們可以這樣來計(jì)算:
在這里表示對(duì)兩個(gè)向量按對(duì)應(yīng)元素相乘的運(yùn)算(譯者注:其結(jié)果還是一個(gè)向量)。為了描述簡(jiǎn)單起見,我們這里暫時(shí)忽略對(duì)參數(shù)b(l)的求導(dǎo),不過在你真正實(shí)現(xiàn)反向傳播時(shí),還是需要計(jì)算關(guān)于它們的導(dǎo)數(shù)的。
假定我們已經(jīng)實(shí)現(xiàn)了向量化的正向傳播方法,如前面那樣計(jì)算了矩陣形式的變量z2, a2, z3和h,那么反向傳播的非向量化版本可如下實(shí)現(xiàn):
在這個(gè)實(shí)現(xiàn)中,有一個(gè)for循環(huán)。而我們想要一個(gè)能同時(shí)處理所有樣本、且去除這個(gè)for循環(huán)的向量化版本。
為做到這一點(diǎn),我們先把向量delta3和delta2替換為矩陣,其中每列對(duì)應(yīng)一個(gè)訓(xùn)練樣本。我們還要實(shí)現(xiàn)一個(gè)函數(shù)fprime(z),該函數(shù)接受矩陣形式的輸入z,并且對(duì)矩陣的按元素分別執(zhí)行。這樣,上面for循環(huán)中的4行Matlab代碼中每行都可單獨(dú)向量化,以一行新的(向量化的)Matlab代碼替換它(不再需要外層的for循環(huán))。
在向量化練習(xí)中,我們要求你自己去推導(dǎo)出這個(gè)算法的向量化版本。如果你已經(jīng)能從上面的描述中了解如何去做,那么我們強(qiáng)烈建議你去實(shí)踐一下。雖然我們已經(jīng)為你準(zhǔn)備了反向傳播的向量化實(shí)現(xiàn)提示,但還是鼓勵(lì)你在不看提示的情況下自己去推導(dǎo)一下。
稀疏自編碼網(wǎng)絡(luò)
稀疏自編碼網(wǎng)絡(luò)中包含一個(gè)額外的稀疏懲罰項(xiàng),目的是限制神經(jīng)元的平均激活率,使其接近某個(gè)(預(yù)設(shè)的)目標(biāo)激活率ρ。其實(shí)在對(duì)單個(gè)訓(xùn)練樣本上執(zhí)行反向傳播時(shí),我們已經(jīng)考慮了如何計(jì)算這個(gè)稀疏懲罰項(xiàng),如下所示:
在非向量化的實(shí)現(xiàn)中,計(jì)算代碼如下:
但在上面的代碼中,仍舊含有一個(gè)需要在整個(gè)訓(xùn)練集上運(yùn)行的for循環(huán),這里delta2是一個(gè)列向量。
作為對(duì)照,回想一下在向量化的情況下,delta2現(xiàn)在應(yīng)該是一個(gè)有m列的矩陣,分別對(duì)應(yīng)著m個(gè)訓(xùn)練樣本。還要注意,稀疏懲罰項(xiàng)sparsity_delta對(duì)所有的訓(xùn)練樣本一視同仁。這意味著要向量化實(shí)現(xiàn)上面的計(jì)算,只需在構(gòu)造delta2時(shí),往矩陣的每一列上分別加上相同的值即可。因此,要向量化上面的代碼,我們只需簡(jiǎn)單的用repmat命令把sparsity_delta加到delta2的每一列上即可(譯者注:這里原文描述得不是很清楚,看似應(yīng)加到上面代碼中delta2行等號(hào)右邊第一項(xiàng),即W2'*delta3上)。
中英文對(duì)照
總結(jié)
- 上一篇: 逻辑回归的向量化实现样例
- 下一篇: 从自我学习到深层网络