【转】自编码算法与稀疏性(AutoEncoder and Sparsity)
目前為止,我們已經討論了神經網絡在有監督學習中的應用。在有監督學習中,訓練樣本時有類別標簽的。現在假設我們只有一個沒帶類別標簽的訓練樣本集合,其中。自編碼神經網絡是一種無監督學習算法,它使用了反向傳播算法,并讓目標值等于輸入值,比如。下圖是一個自編碼神經網絡的示例。
自編碼神經網絡嘗試學習一個的函數。換句話說,它嘗試逼近一個恒等函數,從而使得接近于輸入。恒等函數雖然看上去不太有學習的意義,但是當我們為自編碼神經網絡加入某些限制,比如限定隱藏神經元的數量,我們就可以從輸入數據中發現一些有趣的結構。舉例來說,假設某個自編碼神經網絡的輸入是一張圖像(共100個像素)的像素灰度值,于是,其隱藏層中有50個隱藏神經元。注意,輸出也是100維的。由于只有50個隱藏神經元,我們迫使自編碼神經網絡去學習輸入數據的壓縮表示,也就是說,它必須從50維的隱藏神經元激活度向量中重構出100維的像素灰度值輸入。如果網絡的輸入數據是完全隨機的,比如每一個輸入都是一個跟其它特征完全無關的獨立同分布高斯隨機變量,那么這一壓縮表示將會非常難學習。但是如果輸入數據中隱含著一些特定的結構,比如某些輸入特征是彼此相關的,那么這一算法就可以發現輸入數據中的這些相關性。事實上,這一簡單的自編碼神經網絡通常可以學習出一個跟主元分析(PCA)結果非常相似的輸入數據的低維表示。
我們剛才的論述是基于隱藏神經元數量較小的假設。但是即使隱藏神經元的數量較大(可能比輸入像素的個數還要多),我們仍然通過給自編碼神經網絡施加一些其他的限制條件來發現輸入數據中的結構。具體來說,如果我們給隱藏神經元加入稀疏性限制,那么自編碼神經網絡即使在隱藏神經元數量較多的情況下仍然可以發現輸入數據中一些有趣的結構。
稀疏性可以被簡單地解釋如下。如果當神經元的輸出接近于1的時候我們認為它被激活,而輸出接近于0的時候認為它被抑制,那么使得神經元大部分的時間都是被抑制的限制則被稱作稀疏性限制。這里我們假設的神經元的激活函數是sigmoid函數。如果你使用tanh作為激活函數的話,當神經元輸出為-1的時候,我們認為神經元是被抑制的。
注意到表示隱藏神經元的激活度,但是這一表示方法中并未明確指出哪一個輸入帶來了這一激活度。所以我們將使用來表示在給定輸入為情況下,自編碼神經網絡隱藏神經元的激活度。進一步,讓
表示隱藏神經元的平均活躍度(在訓練集上取平均)。我們可以近似的加入一條限制
其中,是稀疏性參數,通常是一個接近于0的較小的值(比如)。換句話說,我們想要讓隱藏神經元的平均活躍度接近0.05。為了滿足這一條件,隱藏神經元的活躍度必須接近于0。
為了實現這一限制,我們將會在我們的優化目標函數中加入一個額外的懲罰因子,而這一懲罰因子將懲罰那些和有顯著不同的情況從而使得隱藏神經元的平均活躍度保持在較小范圍內。懲罰因子的具體形式有很多種合理的選擇,我們將會選擇以下這一種:
這里,是隱藏層中隱藏神經元的數量,而索引依次代表隱藏層中的每一個神經元。如果你對相對熵(KL divergence)比較熟悉,這一懲罰因子實際上是基于它的。于是懲罰因子也可以被表示為
其中是一個以為均值和一個以為均值的兩個伯努利隨機變量之間的相對熵。相對熵是一種標準的用來測量兩個分布之間差異的方法。
這一懲罰因子有如下性質,當時,并且隨著與之間的差異增大而單調遞增。舉例來說,在下圖中,我們設定并且畫出了相對熵值隨著變化的變化。
我們可以看出,相對熵在時達到它的最小值0,而當靠近0或者1的時候,相對熵則變得非常大(其實是趨向于)。所以,最小化這一懲罰因子具有使得靠近的效果。 現在,我們的總體代價函數可以表示為
其中如之前所定義,而控制稀疏性懲罰因子的權重。項則也(間接地)取決于,因為它是隱藏神經元的平均激活度,而隱藏層神經元的激活度取決于。
為了對相對熵進行導數計算,我們可以使用一個易于實現的技巧,這只需要在你的程序中稍作改動即可。具體來說,前面在后向傳播算法中計算第二層()更新的時候我們已經計算了
現在我們將其換成
就可以了。
有一個需要注意的地方就是我們需要知道來計算這一更新項。所以在計算任何神經元的后向傳播之前,你需要對所有的訓練樣本計算一遍前向傳播,從而獲取平均激活度。然后你就可以使用事先計算好的激活度來對所有的訓練樣本進行后向傳播的計算。如果你的數據量太大,無法全部存入內存,你就可以掃過你的訓練樣本并計算一次前向傳播,然后將獲得的結果累積起來并計算平均激活度(當某一個前向傳播的結果中的激活度被用于計算平均激活度之后就可以將此結果刪除)。然后當你完成平均激活度的計算之后,你需要重新對每一個訓練樣本做一次前向傳播從而可以對其進行后向傳播的計算。對于后一種情況,你對每一個訓練樣本需要計算兩次前向傳播,所以在計算上的效率會稍低一些。
可視化自編碼器訓練結果
訓練完(稀疏)自編碼器,我們還想把這自編碼器學到的函數可視化出來,好弄明白它到底學到了什么。我們以在10×10圖像(即n=100)上訓練自編碼器為例。在該自編碼器中,每個隱藏單元i對如下關于輸入的函數進行計算:
我們將要可視化的函數,就是上面這個以2D圖像為輸入、并由隱藏單元i計算出來的函數。它是依賴于參數的(暫時忽略偏置項bi)。需要注意的是,可以看作輸入x的非線性特征。不過還有個問題:什么樣的輸入圖像x可讓得到最大程度的激勵(自己理解:也就是說對于什么樣的輸入的這種特征最好,相應的特征值達到最大)?(通俗一點說,隱藏單元要找個什么樣的特征?)。這里我們必須給x加約束,否則會得到平凡解。
若假設輸入有范數約束,則可證(請讀者自行推導)令隱藏單元得到最大激勵的輸入應由下面公式計算的像素給出(共需計算100個像素,j=1,…,100):
當我們用上式算出各像素的值、把它們組成一幅圖像、并將圖像呈現在我們的面前之時,隱藏單元i所追尋特征的真正含義也就明朗起來。
假如我們訓練的自編碼器有100個隱藏單元,可視化結果就會包含100幅這樣的圖像——每個隱藏單元都對應一幅圖像。審視這100幅圖像,我們可以試著體會這些隱藏單元學出來的整體效果是什么樣的。(自己注意:可視化圖像是怎么得出來的)
當我們對稀疏自編碼器(100個隱藏單元,在10×10像素輸入上訓練)進行上述可視化處理之后,結果如下所示:
每個小方塊都給出了一個(帶有有界范數的)輸入圖像x,它可使這100個隱藏單元中的某一個獲得最大激勵。我們可以看到,不同的隱藏單元學會了在圖像的不同位置和方向進行邊緣檢測。
顯而易見,這些特征對物體識別等計算機視覺任務是十分有用的。若將其用于其他輸入域(如音頻),該算法也可學到對這些輸入域有用的表示或特征。
總結
以上是生活随笔為你收集整理的【转】自编码算法与稀疏性(AutoEncoder and Sparsity)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为FusionSphere概述——计算
- 下一篇: go mod 安装依赖 unkown r