第五周筆記:神經網路分類問題應用
分類問題是什麼?
簡單來說,假設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的位置在哪兒,表示該特徵分到那一類。那麼,神經網路分類問題,就是算出這樣一個矩陣來。
怎麼算呢?既然分類問題是一個單元推衍到多個單元,計算方式也可以理解為,計算單元分類問題,推衍到多元分類問題。
單元分類問題,我們的邏輯回歸演算法的代價函數長這樣:
推衍到多元,就是簡單地多加一個緯度,然後加起來而已。公式和上面那個長得很像,如下:
之前筆記里有說過,機器學習問題,就是要計算和,這裡也一樣。只不過這裡的變成了一堆湊在一起 ,我們把符號寫為大寫表示這是一堆小向量湊在一起合體變成的矩陣,原公式就變成了要計算和。
所以,神經網路分類演算法變成了兩個具體問題。第一個,計算第二個,計算
的公式我們已經有了,就是上面那個,因為我們theta的符號由小寫變大寫了,稍微改一下就是了:
這樣就OK了。那麼問題來了,如何計算呢?
用反向傳播演算法。
那什麼是反向傳播演算法呢?
理解這個問題,首先要理解什麼是正向的傳播。
上一周筆記裡面,我們記了,每一層的數據是上一層數據處理的結果,用數學語言表示出來如下:
,(就是1啦。之所以寫成這樣是表示它插入位置)
,
,
……依此類推.
可以看到,我們計算i層的玩意是基於i-1層的東西。
那麼反向傳播演算法,簡單理解的話,就是把這個過程「倒過來」,計算i層的東西,基於i+1層就可以了。
以前我們計算用的是什麼公式呢?()
我們可以看到,其中有一個對吧,這是什麼玩意呢?這是計算我們的假定函數和真實函數之間的偏差。
那麼,我們反向傳播演算法,定義一個這樣的,計算第n層j列的元素偏差的值,假設這個符號是,稱之為「代價函數偏差」
以總共4層,第四層就是最後一層為例,這個就變成了:這最後一層沒問題,就按照定義來而已。
那麼倒數第二層(正數第3層)呢?
其實就是用我們正向傳播的函數,拿作為參數,導過來而已……理解不了請往上看看正向傳播的這一層的函數,然後自己用結果倒推參數,你會得到一樣的公式。
同理,第二層就是:
第一層就是……第一次不需要計算偏差啦……因為這是我們輸入的特徵量的層。第一層就是輸入層特徵量x。
然後說如何應用這個偏差計算我們需要的
然後,計算出這一層總偏差(這裡等號是賦值符號。)
然後用我們對於代價函數偏差的定義,照搬之前的公式,就等於:
(j!=0時,這裡等號依然是賦值符號。)
=(j=0時。原因和以前一樣,第一層不需要正則化)
到這裡,你就從數學上理解了神經網路演算法的分類問題了。如果你實在搞不懂反向傳播演算法,無所謂。照貓畫虎寫出代碼就可以了。如果你搞懂了,恭喜你,你理解了整套ng的機器學習課程里最難的一個玩意。means 其他玩意你都能很輕鬆的搞懂了。
編程注意事項:
注意,這裡由於每次處理都是一層一層的,所以這時候你要麼得用很多循環,要麼就用向量。當然,在octave,matlab之類的玩意里,推薦用向量而不是一堆循環。
用向量的話,一般而言,和得到的值都是一個n+1階的向量。而問題在於,是一個矩陣,所以在應用時,要先把矩陣向量化。計算完之後,要矩陣化。
向量化和反向量化的方法,依然是可以寫循環……這裡說一下octave里做。以舉例:
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的矩陣了。很好理解。
梯度檢查
這玩意對數據分析並沒有實際用處,目的是為了讓你確認自己的演算法無誤,(因為反向傳播演算法你可能搞不懂就編出來了,因為搞不懂,無法確定對不對)
理論上來說,
所以我們就計算一下對於每個,都大約能符合上面那個公式就行了。
所以這裡就是,寫個循環,對於到,檢查一下是否都符合當等於時:
(由於是大約,所以如果正在使用的編程語言沒有大約符號,可以設定一個可容忍誤差判斷,小於可容忍誤差,記錄,彈出具體誤差多少。)
當然……由於是挨個檢查,又是寫循環,所以梯度檢查很占內存(土豪請無視)所以檢查無誤後須要關閉梯度檢查。(注意:在神經網路演算法中,初始的選取不能選擇0,因為會導致隱藏層相同,解決方案可以選個近似於0的隨機值)
第五周筆記結束。
總結一下神經網路演算法應用:n>> 先隨機選取初始值 n→ 正向算出是什麼 n→ 算出代價函數是什麼n→ 反向傳播演算法算出是什麼n→ 梯度檢查確認,無誤後關閉梯度檢查n→ 用優選演算法選出令J最小時的thetan
推薦閱讀:
※Tensorflow新手通過PlayGround可視化初識神經網路
※你說說激活函數?
※一文看懂各種神經網路優化演算法:從梯度下降到Adam方法
※用深度學習(DNN)構建推薦系統 - Deep Neural Networks for YouTube Recommendations論文精讀