神經網絡,學生時,特意修了這門課,但完全找不到感覺,內容基本不理解,實驗無頭緒。經歷了一些項目實踐,現在回頭再理解NN,一些概念自然就理解了。
1.
單層神經網絡:2.
一個重要概念: 梯度下降算法 --> 批量梯度下降算法cost function: 代價函數,即 計算值與真實值的差異。一般用均方差表示。
代價函數的概念極其重要,因為它是進行分類和回歸的中心。代價函數就是衡量 參數w和b依據。 代價函數越小,那么計算出的參數w,b就越好。
我們的目標: 針對w,b;求代價函數的最小值。
3.
如何求w,b,讓代價函數cost function有一個最小值?
采用訓練的方式,重復計算,并保證w,b能收斂。這就是機器學習。
1). w,b初始化為一個值。一般初始化為一個很小的、接近為0的隨機值,如正態分布N(0, 0.01)。(為什么?)
如果將所有系數都初始化為0,則對于隱藏層,所有的輸入值都相同。隨機,就是使對稱失效。(這個就是那么個意思,解釋起來太拗口)。初始化系數都為0.任何輸入 相乘后,激活函數的輸入都等于b,偏置項。
2). 取輸入,輸出對(x,y)
3). 然后利用梯度下降算法。計算最優的w,b。
相同的輸入、輸出,只需要不停的更新w,b即可。
4). 最后考慮局部解與全局最優解的問題。
4.
概念: 梯度下降算法。 最優化中的基本算法之一。又稱最速下降法。 沿負梯度方向下降最快。一種簡單的形式:x(k 1)=x(k)-a*g(k),g(k)為梯度方向,a是一個學習系數。
求cost function的負梯度方向。求各方向的偏導,相加,求模,相除。
帶入此點系數w,b,x,y。即可求出此點的具體的梯度方向。
最后,如何求偏導。神經網絡的cost function只是個概念,只有象形的公式,沒有具體的公式。所以,無法利用直接的公式進行求導。
1) 前向傳播,計算所有節點的激活值
2)反向傳播,計算所有節點的殘差
3)利用殘差,更新偏導數dw, db
這里又推出一種算法: 反向傳播算法。用于計算偏導d(w,b)/ d(w), d(w, b) / d(b)。
兩個關鍵的概念: 殘差、反向求殘差
5.
這里又提出一個概念:殘差。
殘差:每個節點都有殘差值,其表明了每個節點對最終輸出值(即 代價函數、最終方差值)的影響。
最終輸出節點的殘差是 代價函數 在此節點的求導,獲取其對 代價函數的影響值 。
經推導,此殘差就是 激活函數的輸出值 與 實際值之差,再乘以 激活函數的導數值。
對二階函數的求導,就是一階函數,乘以此激活函數的導數。
對于輸出值與實際值之間的差值,可以理解為偏差,
對于隱藏單元的殘差: 即隱藏單元 對 總的代價函數的影響。
求導,推導出 前后兩個單元間的影響。
前后兩個單元的影響,就是權值,加上激活函數的影響。
一次計算時, 權值是常數。 激活函數的一階導數。
利用反向傳播的形式,由最后一層,逐步向第一層的方向推導。
不僅要求出 當前層的 激活值的導數,還要計算出一個加權平均值,是第l 1層所有殘差對上一層第i個節點的殘差的影響。這個需要好好理解,多看看推導是有好處的。
計算出殘差后,就能計算所謂的偏導數了。
第l層,第i個節點,j的含義是第l 1的數據。。。 這個要好好理解。
就是所謂的反向傳播算法了。實際上是,反向求偏導數的一種算法。
以上是前饋神經網絡在有監督學習中的應用。
7.
opencv中提供了CvANN_MLP類來實現 NN 算法。
CvANN_MLP首先會指定 MLP的拓撲結構和激活函數:
層數:包括輸入、隱藏、輸出各層的數目。一般是一個一維矩陣。
激活函數: 默認是雙曲正切函數
訓練:
拿到輸入和結果數據后,就能進行訓練參數的設置了。
CvANN_MLP_TrainParameter包括了算法的種類選擇,反向傳播算法back_prop,還是rprop算法,及其他們的主要參數。
而且,需要設定算法運行的最大迭代次數,和誤差截止值(相鄰兩次迭代誤差之差)
執行訓練函數。MLP相對收斂較慢,不過結果較好。結束后,MLP就訓練好了。
剩下的就是分類了。predict函數,就能拿到結果了。
8.
對于神經網絡,有監督學習是首先拿到訓練數據的分類標簽的。而對于無監督學習,是無法拿到分類標簽的。
只能自學習,進行聚類。自編碼神經網絡就是滿足這種需求。
目的:發現輸入數據的自身的一些特征,或一些結構,或一些相關性。
輸入數據的壓縮表示:相當于降維表示;與PCA有點類似。
稀疏性限制:假設sigmoid函數是激活函數,那么輸出結果接近1,表示被激活,輸出結果接近0,表示被抑制。當神經元大部分處于抑制狀態,就稱為對神經元的稀疏性限制。 ps: 使用tanh作為激活函數,當神經元輸出接近-1的時候,神經元是被抑制的。
所以,神經元的激活度的表示很重要。
9.
一般會求出神經元 的 平均活躍度。
稀疏性參數,就是專門指定 神經元的平均活躍度的標準值。一般是一個比較小的值,如0.05.為了達到這一目標,需要對優化函數加入一個懲罰因子。
這個懲罰因子會隨著,平均活躍度和稀疏參數的差值變大而單調遞增。當兩者相等時,懲罰因子也為0。一般懲罰因子選擇用以下函數
而 總體代價函數就可以表示為:
直接跳到這一步,很難理解。 因為J 值如何計算? 因為選用的是恒等式 f = x,那么目標值與輸入值相等,代價函數應該是與w, b密切相關,KL函數也是間接與w,b相關的。
仍然是,反向傳播算法,只不過增加了一個 相對熵的 求導運算。
到
更一步學習的概念:
稀疏編碼。
理論概念過了一遍,其效果如何哪?
這個無監督的神經網絡,學習了一番之后,有什么能力那?
可視化每個訓練好的隱藏單元。每個隱藏單元對應一幅圖像。
10.
這里涉及到概念:
范數:一種實值函數。有1, 2, 無窮階的形式。 1階對應 絕對值,二階對應 模,無窮 對應最大值。
最大激勵:輸出值比較大
平凡解:無意義的解,如線性Ax = 0,解是x=0.即0解
以上的概念都來自:
http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B
以及opencv手冊
對應的概念: 極大似然估計。
激活函數選擇,線性,還是非線性函數?
如果是線性,等于連續的向量/矩陣相乘,得出的結果仍然是一個矩陣/向量。而其他表達,如一些二元結構的東西,用線性是無法直接表達的。這是線性的缺陷。
對于二元結構的表達,應用非線性函數,如雙曲正切函數,就能較好的表達二元結構。