最近把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對比,即得到錯誤率
整個過程結束。