天天看點

deep leaning toolbox學習使用1之NN

最近把hinton06年那篇經典文章又看了下,還是有不少不明白的,然後結合hinton的論文和UFLDL教程上來具體分析現在使用比較多的toolbox的實作過程,進而更好的了解deep leaning,今天主要總結一下最基礎的NN(neural network),這個可以當做deep learning的整體架構,先從簡單的入手吧。

1.資料預處理

使用的是mnist資料集,train 60000*784,test 10000*784

(1)x/255,歸到(0,1】範圍内

(2)對trainx進行标準化(zsore),即(x-均值)/标準差

Q:資料處理以後,很多元(784維)資料一樣或者大部分一樣,例如一列都是一樣的值,不清楚原因?

(3)對testx進行歸一化處理(normalize)

Q:和trainx效果一樣,而且很多和trainx值一樣,原因?

2.參數初始化

此處使用最簡單的三層網絡,784:100:10,隻整體訓練一遍,每次以batch塊(100個資料)為機關訓練,共訓練600次,hidden層的激活函數使用tanh_opt,即正切函數

f(z)=(e^z-e^-z)/(e^z+e^-z),學習率為2(用于bp中的梯度下降),當然激活函數也可以使用sigmoid函數,f(z)=1/(1+e^-z),即邏輯回歸

Q:在這裡hidden層和最後一層作者使用的不同激活函數,原因?

(1)初始化層間的weights和weights mometum

需要注意的是需要增加一列作為bias,是以W1為100*785,W2為10*101

初始化w時使用rand函數來生成均一分布的随機數,但代碼中增加了一些其他的數學運算,原理不清楚?

Q:mometum作用?

(2)定義層間激活率(用于sparity?)

P2=1*100,P3=1*10

3.訓練階段

首先對tranx做随機順序處理(randperm),以batchsize為機關train,即每次100*784

(1)feedforward pass階段

首先為x加入一列1,作為bias,是以每次bias都為1?

顯然第一層激活量a1=x,a2=tanh_opt(a1*w1^'T),代碼中具體函數使用的是f=1.71590*tanh(2/3A),是近似處理??

然後算各個輸入權重和,可參考ufldl,以及各層各個神經元的激活值

裡面涉及到dropout和稀疏懲罰的處理,暫不涉及,使用過程不清楚?

結束了前n-1層的ff之後,最後一層使用的是sigmoid函數,同時計算error和loss

(2)back propagation階段

首先計算輸出層的殘差,并依次計算直到第2層的殘差,公式可參考ufldl中,裡面注意的是對于f(z)的導數使用已知的激活值來計算,對于不同的激活函數,其導數的公式也不同,對于sigmoid是f(z)=a(1-a),對于tanh_opt,作者用的貌似是個近似公式,這個推倒不清楚?

Q:為什麼不适用一樣的激活函數?

需要注意的是,在計算時,應該把之前加入的bias那列去掉,也就是去除首列,最後一層無需

所有計算後,即可得到更新權值所需要的偏導值

Q:應該同時更新W和b,但作者隻更新了w,是不是也解釋了開始的b都設為1?

權值更新公式參考ufldl

同時,作者更新w時,其公式與ufldl中有一點差别,原因?

(3)最後對整個trainx作為整體重新跑了一遍ff,作為一個對比吧

4.test階段

這個簡單,對testx跑一遍ff,得到輸出層的激活值,根據激活值中最大的值所在列作為label與testy對比,即得到錯誤率

整個過程結束。

繼續閱讀