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