第五周筆記:神經網路分類問題應用

分類問題是什麼?

簡單來說,假設nxn矩陣K,K的每列表示對一個特徵的分類,一共n個特徵。

當n為1時,K就是[0]或者[1],意思就是這個特徵有還是沒有。這時候輸出的單元(向量)是一個。

當n>=2時,K可以寫成

[n1,0...0,0n0,1...0,0n. .n. .n. .n0,0...1,0n0,0...0,1n]n[n1,0...0,0n0,0...1,0n. .n. .n. .n0,1...0,0n0,0...0,1n]n這類的矩陣形式n

這樣,這個矩陣是n個單元(向量)湊到一起的,每個向量當作一個特徵的分類,單個向量里,1的位置在哪兒,表示該特徵分到那一類。那麼,神經網路分類問題,就是算出這樣一個矩陣來。

怎麼算呢?既然分類問題是一個單元推衍到多個單元,計算方式也可以理解為,計算單元分類問題,推衍到多元分類問題。

單元分類問題,我們的邏輯回歸演算法的代價函數長這樣:

J=1/2m*(sum_{i=1}^{m}(-y_i*log(h(x_i))+(y_i-1)log(1-h(x_i)))+lambda sum_{j=1}^{n}{theta_j^2} )

推衍到多元,就是簡單地多加一個緯度,然後加起來而已。公式和上面那個長得很像,如下:

J=1/2m*(sum_{i=1}^{m}sum_{k=1}^{K}(-y_{k,i}*log(h(x_{i}))_k+(y_{k,i})log(1-h(x_{i})))_k+lambda sum_{l=1}^{L-1}sum_{i=1}^{sl}sum_{j=1}^{sl+1}{theta_{l,ji}} )

之前筆記里有說過,機器學習問題,就是要計算J(theta) frac{d}{dtheta_j}J(theta) ,這裡也一樣。只不過這裡的theta變成了一堆theta湊在一起 ,我們把符號寫為大寫Theta 表示這是一堆小theta向量湊在一起合體變成的矩陣,原公式就變成了要計算J(Theta) frac{d}{dTheta_{i,j}}J(Theta)

所以,神經網路分類演算法變成了兩個具體問題。第一個,計算J(Theta) 第二個,計算frac{d}{dTheta_{i,j}}J(Theta)

J(Theta) 的公式我們已經有了,就是上面那個,因為我們theta的符號由小寫變大寫了,稍微改一下就是了:

J(Theta)=1/2m*(sum_{i=1}^{m}sum_{k=1}^{K}(-y_{k,i}*log(h(x_{i}))_k+(y_{k,i})log(1-h(x_{i})))_k+lambda sum_{l=1}^{L-1}sum_{i=1}^{sl}sum_{j=1}^{sl+1}{Theta_{l,ji}} )

這樣就OK了。那麼問題來了,如何計算frac{d}{dTheta_{i,j}}J(Theta) 呢?

用反向傳播演算法。

那什麼是反向傳播演算法呢?

理解這個問題,首先要理解什麼是正向的傳播。

上一周筆記裡面,我們記了,每一層的數據是上一層數據處理的結果,用數學語言表示出來如下:

a^{(1)}=x

z^{(2)}=Theta^{(1)}*a{(1)},a^{(2)}=g(z^{(2)})+a_0^{(2)}(a_0^{(2)}就是1啦。之所以寫成這樣是表示它插入位置)

z^{(3)}=Theta^{(2)}*a{(2)},a^{(3)}=g(z^{(3)})+a_0^{(3)}

z^{(4)}=Theta^{(3)}*a{(3)},a^{(4)}=g(z^{(4)})+a_0^{(4)}

……依此類推.

可以看到,我們計算i層的玩意是基於i-1層的東西。

那麼反向傳播演算法,簡單理解的話,就是把這個過程「倒過來」,計算i層的東西,基於i+1層就可以了。

以前我們計算frac{d}{dTheta_{i,j}}J(Theta) 用的是什麼公式呢?(frac{d}{dtheta_j}J(theta) =1/m*sum_{i=1}^{m}{(h(x_i)-y_i)} *x_{i,j}

我們可以看到,其中有一個{(h(x_i)-y_i)}對吧,這是什麼玩意呢?這是計算我們的假定函數和真實函數之間的偏差。

那麼,我們反向傳播演算法,定義一個這樣的,計算第n層j列的元素偏差的值,假設這個符號是delta _j^{(n)},稱之為「代價函數偏差」

以總共4層,第四層就是最後一層為例,這個delta _j^{(n)}就變成了:delta _j^{(4)}=a_j^{(4)}-y_jn這最後一層沒問題,就按照定義來而已。

那麼倒數第二層(正數第3層)呢?

delta _j^{(3)}=((Theta^{(3)})^T*delta _j^{(4)}).*g(z^{(3)})n其實就是用我們正向傳播的函數,拿delta _j^{(4)}作為參數,導過來而已……理解不了請往上看看正向傳播的這一層的函數,然後自己用結果倒推參數,你會得到一樣的公式。

同理,第二層就是:delta _j^{(2)}=((Theta^{(2)})^T*delta _j^{(3)}).*g(z^{(2)})n

第一層就是……第一次不需要計算偏差啦……因為這是我們輸入的特徵量的層。第一層就是輸入層特徵量x。

然後說如何應用這個偏差計算我們需要的frac{d}{dTheta_{i,j}}J(Theta)

為了寫起來方便,先定義一個偏差總量DeltaDelta_{i,j}^{(l)}=0。

然後,計算出這一層總偏差Delta_{i,j}^{(l)}=Delta_{i,j}^{(l)}+a_j^{(l)}*delta ^{(l+1)}(這裡等號是賦值符號。)

然後用我們對於代價函數偏差的定義,照搬之前的公式,frac{d}{dTheta_{i,j}}J(Theta) 就等於:

frac{d}{dTheta_{i,j}}J(Theta) =1/m*Delta_{i,j}^{(l)}+lambda *Theta_{i,j}^{(l)}(j!=0時,這裡等號依然是賦值符號。)

frac{d}{dTheta_{i,j}}J(Theta) =frac{d}{dTheta_{i,j}}J(Theta) =1/m*Delta_{i,j}^{(l)}(j=0時。原因和以前一樣,第一層不需要正則化)

到這裡,你就從數學上理解了神經網路演算法的分類問題了。如果你實在搞不懂反向傳播演算法,無所謂。照貓畫虎寫出代碼就可以了。如果你搞懂了,恭喜你,你理解了整套ng的機器學習課程里最難的一個玩意。means 其他玩意你都能很輕鬆的搞懂了。

編程注意事項:

注意,這裡由於每次處理都是一層一層的,所以這時候你要麼得用很多循環,要麼就用向量。當然,在octave,matlab之類的玩意里,推薦用向量而不是一堆循環。

用向量的話,一般而言,thetanfrac{d}{dTheta_{i,j}}J(Theta) 得到的值都是一個n+1階的向量。而問題在於,Theta是一個矩陣,所以在應用時,要先把矩陣向量化。計算完之後,要矩陣化。

向量化和反向量化的方法,依然是可以寫循環……這裡說一下octave里做。以thetan舉例:

theta_vec=[Theta1(:);Theta2(:);Theta3(:)...]n

由你所見,向量化就是很單純的把一個矩陣一列一列堆到一起……

所以反向量化也就是很簡單地拆分開然後排排坐……:

Theta1=reshape(theta_vec(1:100),10,11)nTheta1=reshape(theta_vec(111:220),10,11)nTheta1=reshape(theta_vec(221:330),10,11)n

依此類推……就把向量里每110行,拆成一堆11x10的矩陣了。很好理解。

梯度檢查

這玩意對數據分析並沒有實際用處,目的是為了讓你確認自己的演算法無誤,(因為反向傳播演算法你可能搞不懂就編出來了,因為搞不懂,無法確定對不對)

理論上來說,frac{d}{dtheta_{i}}J(theta) approx frac{J(theta+xi )-J(theta-xi )}{2xi }

所以我們就計算一下對於每個theta,都大約能符合上面那個公式就行了。

所以這裡就是,寫個循環,對於theta_1theta_n,檢查一下是否都符合當theta等於theta_i時:frac{d}{dtheta_{i}}J(theta) approx frac{J(theta+xi )-J(theta-xi )}{2xi }

(由於是大約,所以如果正在使用的編程語言沒有大約符號,可以設定一個可容忍誤差判斷,小於可容忍誤差,記錄,彈出具體誤差多少。)

當然……由於是挨個檢查,又是寫循環,所以梯度檢查很占內存(土豪請無視)所以檢查無誤後須要關閉梯度檢查。

(注意:在神經網路演算法中,初始的theta選取不能選擇0,因為會導致隱藏層相同,解決方案可以選個近似於0的隨機值)

第五周筆記結束。

總結一下神經網路演算法應用:n>> 先隨機選取初始值 n→ 正向算出是什麼 n→ 算出代價函數是什麼n→ 反向傳播演算法算出是什麼n→ 梯度檢查確認,無誤後關閉梯度檢查n→ 用優選演算法選出令J最小時的thetan

推薦閱讀:

Tensorflow新手通過PlayGround可視化初識神經網路
你說說激活函數?
一文看懂各種神經網路優化演算法:從梯度下降到Adam方法
用深度學習(DNN)構建推薦系統 - Deep Neural Networks for YouTube Recommendations論文精讀

TAG:机器学习 | 神经网络 | 分类算法 |