深度神經網絡學習:AutoEncoder之Sparse Coding(稀疏編碼)
這個是一個讓人感覺很神異的技術,給一堆圖片,然後用軟件掃描,軟件就能把圖片中的特徵找出來,這對人來說是很輕易的事,對軟件來說,最大的問題就是,怎麼應該進行才可以?
寫軟件的技術也不是多麼高科技,最終需要用到的還是人的思想,然後把思想轉化成代碼,從而解決現實問題,編程可以說是一個驗證思路的一個絕佳途徑,在下甚至以為,新時期的道士,應該個個都掌握編程的技能。
說遠了。
這個給了一堆圖片,然後能提取出特徵,應該怎麼實現?
一般的問題想要智能解決,思路是這樣的:給一組輸入,再給一組輸出,比如天氣預報,輸入的就是時間,輸出就是天氣,然後給神經網絡任意賦上一堆值,再通過數學運算,看目標結果與需要的輸出數據相差有多大,然後轉化成微積分的方向,計算出運算路徑中應該怎麼反向調整數據才能拼湊出目標結果來,然後不斷重複這個計算並再拼湊的過程,最後接近目標結果,得到滿意答案而確定出來的神經網絡中的參數,就可以理解為特性。
但是如果是一堆圖片,這個怎麼處理?如何提取圖片中的特徵,這裡不得不說,有一個很有意思的解決方案。
它是這樣進行的:
1、把圖片切成各種小塊,並把這些小塊換成數據表達
2、用神經網絡去運算這些數據
但問題來了,運算的數據的輸出結果是什麼?
這裡就是極其聰慧的一點啊,輸出的結果再進行一次神經網絡運算,讓它能輸出為輸入值。
輸入-》運算(編碼)-》運算(解碼)-》輸出
然後比較輸入與輸出,根據差值,去調整中間的編碼運算與解碼運算,而至於編碼與解碼到底在幹什麼是不用管的。
反正最後輸入與輸出結果精度達到滿意要求時,所保留的就是特徵了。
為什麼會這樣?其實原理很簡單,中間的編碼層的神經網絡處理,相當於去將原圖進行任意的干擾,而解碼層的神經網絡處理,相當於將干擾後的圖像進行了恢復。
而這個過程有一個有意思的地方是,因為中間出現了干擾與解干擾的過程,輸出等於了輸入,多次變換後,保留下來能識別到原輸入的就是特徵。
同樣的,可以在這種思路中,多加入一個混淆器,即隨機添加大量的噪音,然後再消除掉,同樣可以增強神經網絡的搞干擾能力,而進行了干擾處理後的這種手法得到的編碼器稱為Denoising AutoEncoders降噪自動編碼器。
這真是一個令人驚歎的想法,而且只能在計算機上實現,傳統的其它計算工具是無法實現這個的,因為它依賴大密度的運算。
那麼這樣就夠了麼?
於是這裡出現一種信念,這種特性的抽象是否可以儘量的簡單再簡單?
損之又損,以至於無為,無為而無所不為?
這個可能嗎?
於是,如果堅持相信,再複雜的東西背後都有簡單的規則的話,這裡就可以基於這種信念再幹一件事:稀疏化
怎麼做呢?因為複雜的背後總有簡單的規則是不是?那麼簡單的規則是不是就意味著可以刪減很多東西后,還只保留最核心的一些東西,就能復原絕大部分原來的信息?
既然是這樣,那麼就意味著,如果能找到一種,讓神經網絡裡大部分神經元不起作用也能進行成功由輸入得到輸出結果時,那麼就能得到這個。
所以,可以對神經元進行限制,每個神經元有一個激活值,然後規定所有的神經元的總激活值,不得超過一個數值,比如0.05,那麼這樣就會導致大部分神經元變成0值,而極少數神經元需要更加精準的計算出自己的權值。
那這個怎麼實現?
先從源頭說起,稀疏化,實際上就是尋找一組“超完備”基向量來更高效地表示樣本數據。稀疏編碼算法的目的就是找到一組基向量 ,使得我們能將輸入向量表示為這些基向量的線性組合。
首先,輸入與輸出必須要滿足:Min |I – O|,其中I表示輸入,O表示輸出,即輸入與輸出相差小值。
如果用圖片來說,就是能找到少量的、微小的圖片來組合成這個大圖,然後這堆微小的圖片,稱它為字典Φ,而任意抽一個小圖片出來(比最微小的圖片要大),那麼這個小圖片,就全塞進去,因為還可以比如是Φ1的20%與Φ2的50%與Φ3的50%共同構成了這個圖(因為比最小圖片大,所以加起來會超過100%)。
那麼因為“要找到最小圖片”所以就等於是加上了一個多的條件限制,因為O為輸出,O就是那個抽出來的那個圖需要求的目標圖,而輸入為I,所以就可以表達為:
I=x1+x2+x3+x3.....xi
O = a1Φ1 + a2Φ2 + … +anΦn
然後考慮加入一個懲罰係數,這個用於調節網絡裡的值用。
那麼實際上解決問題就是要把a和Φ拼湊出來,使得計算結果變成一個最小值。
右邊加號後的就是加入的稀疏代價函數,這個函數也可以用對數代價函數(利用柯西先驗概率),即log(1+ai2),它是用來對於遠大於零的值進行限制用的,以避免出現網絡中的值相差太大並集中,從而失去了稀疏化的目的。
因為目標最小值是穩定的,如果Φ或a中的值太大了的話,右邊的代價函數就沒什麼意義了---會變得非常小。所以要對||Φ||2的值進行限制,讓它小於某個值。
在實現中,每次迭代分兩步:
a)固定字典Φ[k],然後調整a[k],使得上式,即目標函數最小(即解LASSO問題)。
b)然後固定住a [k],調整Φ [k],使得上式,即目標函數最小(即解凸QP問題)。
然後就這樣反覆計算就可以了。

