向量化編程實現
Vectorized implementation
一向量化編程 Vectorization
1.1 基本術語
向量化 vectorization
1.2 向量化編程(Vectorization)
向量化編程是提高算法速度的一種有效方法。為了提升特定數值運算操作(如矩陣相乘、矩陣相加、矩陣-向量乘法等)的速度,數值計算和並行計算的研究人員已經努力了幾十年。矢量化編程的思想就是盡量使用這些被高度優化的數值運算操作來實現我們的學習算法。
代碼中盡可能避免顯式的for循環。
剛開始編寫程序的時候,你可能會選擇不使用太多矢量化技巧來實現你的算法,並驗證它是否正確(可能只在一個小問題上驗證)。在確定它正確后,你可以每次只矢量化一小段代碼,並在這段代碼之后暫停,以驗證矢量化后的代碼計算結果和之前是否相同。最后,你會有望得到一份正確的、經過調試的、矢量化且有效率的代碼。
二邏輯回歸的向量化實例 Logistic Regression Vectorization Example
2.1 基本術語
邏輯回歸 Logistic Regression
批量梯度上升法 batch gradient ascent
對數似然函數 the log likelihood
2.2邏輯回歸向量化實現
對logistic回歸分析模型進行訓練,其模型如下:
其中,我們需要如下計算梯度:
我們用Matlab/Octave風格變量表示輸入數據構成的樣本矩陣,
代表第
個訓練樣本
,
就代表
(譯者注:第
個訓練樣本向量的第
個元素,
是一個矩陣)。同樣,用Matlab/Octave風格變量
表示由訓練樣本集合的全體類別標號所構成的行向量,則該向量的第
個元素
就代表上式中的
。
最容易寫出來的梯度運算代碼:
兩層循環,速度極慢。對算法進行部分向量化,去掉嵌套的循環。
還可以使效率更高,假定b是一個列向量,A是一個矩陣,我們用以下兩種方式來計算A*b:
將b(i)看成(y(i) - sigmoid(theta'*x(:,i))),A看成x,我們就可以使用以下高效率的代碼:
三神經網絡向量化 Neural Network Vectorization
3.1 基本術語
訓練樣本 training examples
稀疏自編碼網絡 sparse autoencoder
稀疏懲罰 sparsity penalty
平均激活率 average firing rate
3.2 正向傳播向量化版本(Forward propagation)
考慮一個三層網絡(一個輸入層、一個隱含層和一個輸出層),並且假定x是包含一個單一訓練樣本的列向量。則向量化的正向傳播步驟如下:
但是當我們需要處理m個訓練樣本時,我們可以利用並行化和高效矩陣運算的優勢,使用向量來處理多個訓練樣本。
repmat(b1,1,m)的運算效果是,它把列向量b1拷貝m份,然后堆疊成如下矩陣:
Sigmoid激活函數向量化實現:
3.3 反向傳播向量化版(Backpropagation)
對於監督學習,我們有一個包含m個帶類別標號樣本的訓練集。假定網絡的輸出有s3維,因而每個樣本的類別標號向量就記為
。
現在我們要計算梯度項和
。對於每個訓練樣本(x,y),我們可以這樣來計算:
在這里表示對兩個向量按對應元素相乘的運算(譯者注:其結果還是一個向量)。為了描述簡單起見,我們這里暫時忽略對參數b(l)的求導,不過在你真正實現反向傳播時,還是需要計算關於它們的導數的。
反向傳播的非向量化版本可如下實現:
我們還要實現一個函數fprime(z),該函數接受矩陣形式的輸入z,並且對矩陣的按元素分別執行。
3.4 稀疏自編碼網絡(Sparse autoencoder)
稀疏自編碼網絡中包含一個額外的稀疏懲罰項,目的是限制神經元的平均激活率,使其接近某個(預設的)目標激活率ρ。其實在對單個訓練樣本上執行反向傳播時,我們已經考慮了如何計算這個稀疏懲罰項,如下所示:
在非向量化的實現中,計算代碼如下: