轉自:http://blog.csdn.net/qiao1245/article/details/50932519
談到神經網絡,就不得不提到最近非常火的深度學習。那么什么是深度學習?它與神經網絡的關系是什么?深度學習的基本原理和常用算法是什么?我將在這篇中詳細解答。
- 什么是深度學習
深度學習來源於人工神經網絡,它的思想是組合低層次的特征從而構建出更加抽象的深層次特征。深度學習的概念由Hinton等人於2006年提出,
它是一個新的機器學習領域,通過更“深”層次的訓練,它可以更加良好的模擬人腦運作,實現復雜的如圖像、語音識別。
深度機器學習方法也有監督學習與無監督學習之分,不同的學習框架下建立的學習模型很是不同。例如,卷積神經網絡(Convolutional neural networks,簡稱CNNs)就是一種深度的監督學習下的機器學習模型,而深度置信網(Deep Belief Nets,簡稱DBNs)就是一種無監督學習下的機器學習模型。
深度學習來源於神經網絡,神經網絡曾經在很長一段時間里停滯不前,主要原因是參數復雜難以最優化,此外在層次較少的情況下並沒有比其他算法有優勢,層數多了又導致訓練非常慢,因此應用不那么廣泛。
- 神經網絡與深度學習的異同
相同點
深度學習模型繼承了神經網絡的分層結構,將整個網絡分成輸入層、隱含層、輸出層三個部分,層與層之間有連接關系。
不同點
①因為深度不同導致特征處理思路不同
傳統的前饋神經網絡能夠被看做擁有等於層數的深度(比如對於輸出層為隱層數加1)。SVM的深度可以看做2(一個對應於核輸出或者特征空間,另一個對應於所產生輸出的線性混合)。和深度學習模型的層數比是比較少的。
神經網絡在有限樣本和計算單元情況下對復雜函數的表示能力有限,針對復雜分類問題其泛化能力受到一定的制約。而且由於層數較淺,必須人工的選取特征,由於缺乏特征選取的經驗,特征選擇就成了制約模型性能的關鍵因素。深度學習思想就是通過多層次模型,自動的學習數據的特征,這樣不僅能最大程度的保持原有的重要信息,也可以讓模型效果更好。
②網絡訓練方式不同
神經網絡的效果不好一個很重要的原因是采用了梯度下降的思路,如BP網絡,誤差隨着網絡向前傳播,層數越高,誤差會越小,難以對參數修改起到足夠作用。深度學習為了克服這個問題,采用層次化訓練的思路。首先逐層構建單層神經元,每次只訓練一個單層的網絡,然后最后使用wake-sleep算法進行調優。
深度學習將除最頂層的其它層間的權重變為雙向的,這樣最頂層仍然是一個單層神經網絡,而其它層則變為了圖模型。向上的權重用於“認知”,向下的權重用於“生成”。然后使用Wake-Sleep算法調整所有的權重。讓認知和生成達成一致,也就是保證生成的最頂層表示能夠盡可能正確的復原底層的結點。
准確地說,深度學習首先利用無監督學習對每一層網絡進行逐層預訓練(Layerwise Pre-Training);每次用無監督學習只訓練一層,並將訓練結果作為更高一層的輸入;最后用監督學習去調整所有層。
- 受限玻爾茲曼機
受限玻爾茲曼機(Restricted Boltzmann Machine,簡稱RBM)是由Hinton和Sejnowski於1986年提出的一種生成式隨機神經網絡(generative stochastic neural network)。RBM 只有兩層神經元,一層叫做顯層 (visible layer),由顯元 (visible units) 組成,用於輸入訓練數據。另一層叫做隱層 (Hidden layer),相應地,由隱元 (hidden units) 組成,用作特征檢測器 (feature detectors)。如下圖:
層與層之間的節點存在連接,但是同一層之間的神經元沒有連接。上面一層是隱含層,我們用h表示;下面一層是可視層,我們用V表示,如果假設所有的節點都是隨機二值變量節點(只能取0或者1值),同時假設全概率分布p(v,h)滿足Boltzmann 分布,我們稱這個模型是Restricted BoltzmannMachine (RBM)。
由於同一層之間沒有連接,因此,每個節點之間是獨立的。
我們可以得到上式,上式意思是,在給定所有顯元的值的情況下,每一個隱元取什么值是互不相關的。同樣,在給定隱層時,所有顯元的取值也互不相關。這個結論非常重要。
當我們輸入v的時候,通過p(h|v) 可以得到隱藏層h,而得到隱藏層h之后,通過p(v|h)又能得到可視層,通過調整參數,我們就是要使得從隱藏層得到的可視層v1與原來的可視層v一樣,那么得到的隱藏層可以視作與可視層等價,也就是說隱藏層可以作為可視層輸入數據的特征。因此隱層又叫做特征檢測器。
EBM的概率模型定義通過能量函數的概率分布,形式是:
其中,Z(θ)是歸一化因子,也稱為配分函數(partition function),形式是:
RBM是一種基於能量(Energy-based)的模型,其可見變量v和隱藏變量h的聯合配置(joint configuration)的能量為:
其中θ是RBM的參數{W, a, b}, W為可見單元和隱藏單元之間的邊的權重,b和a分別為可見單元和隱藏單元的偏置(bias)。
有了v和h的聯合配置的能量之后,我們就可以得到v和h的聯合概率:
其中Z(θ)是歸一化因子
聯立上面兩個式子:
得到了概率分布后,我們要學習參數{W,a,b},表示出概率分布的最大似然函數:
我們只要讓最大似然函數最大化就可以了,也就是求偏導,可以得到下面的表達式:
上面式子中的前者比較好計算,只需要求vihj在全部數據集上的平均值即可;而中間的式子涉及到v,h的全部2|v|+|h|種組合,計算量非常大(基本不可解)。
為了計算中間的表達式:Hinton等人提出了一種高效的學習算法-CD(Contrastive Divergence),使得這個問題可以被真正實現。
利用之前我們說到的獨立的性質,首先根據數據v得到h的狀態,然后通過h來重構(Reconstruct)可見向量v1,然后再根據v1來生成新的隱藏向量h1。因為RBM的特殊結構(層內無連接,層間有連接), 所以在給定v時,各個隱藏單元hj的激活狀態之間是相互獨立的,反之,在給定h時,各個可見單元的激活狀態vi也是相互獨立的,即:
這個算法就是對比散列算法,通過這個算法,可以通過迭代得到所有的參數:
上述算法比較抽象,通俗講就是:
①將可見變量狀態,設置為當前訓練的樣本狀態{0,1}
②利用上面第一個公式更新隱藏變量的狀態,計算P(hj=1|v)的概率決定。
③對於每個邊vihj,計算Pdata(vihj)=vi*hj
(注意,vi和hj的狀態都是取{0,1})。
④根據上面第二個公式重構v1
⑤根據v1上面的第一個公式再求得h1,計算Pmodel(v1ih1j)=v1i*h1j
⑥更新邊vihj的權重Wij為Wij=Wij+L*(Pdata(vihj)=Pmodel(v1ih1j))。
⑦取下一個數據樣本,重復這個過程。
- 使用受限玻爾茲曼機
現在玻爾茲曼機已經學習完畢,我們接下來怎么使用呢?現在假設有一條新的數據:
首先我們計算出每個隱元的激勵值 (activation) :
將每個隱元的激勵值都用 SigMod 函數進行標准化,變成它們處於開啟狀 (用 1 表示) 的概率值:
接下來就是與我們預設的閾值進行比較:
這樣我們就知道是否該開啟隱層。
深度學習雖然好,但是也是存在很多缺點的。優點是在圖像處理、語音識別和NLP方面可以達到很高的精度,此外,可以自動的提取特征,避免了特征工程。缺點也是顯而易見的,最大的缺點就是算法比較復雜,需要大量的計算資源,另外缺乏可解釋性。
最后,寫這篇博客參考了很多資料,其中
http://www.cnblogs.com/xiaokangzi/p/4492466.html
http://www.chawenti.com/articles/17243.html
http://blog.csdn.net/zouxy09/article/details/8781396
給了我很多啟發,也提供了很多公式,避免了我很多不嚴謹的表述,在此表示感謝。