【轉載】Deep Learning(深度學習)學習筆記整理

http://blog.csdn.net/zouxy09/article/details/8775360php

1、概述html

       Artificial Intelligence,也就是人工智能,就像長生不老和星際漫遊同樣,是人類最美好的夢想之一。雖然計算機技術已經取得了長足的進步,可是到目前爲止,尚未一臺電腦能產生「自我」的意識。是的,在人類和大量現成數據的幫助下,電腦能夠表現的十分強大,可是離開了這二者,它甚至都不能分辨一個喵星人和一個汪星人。git

       圖靈(圖靈,你們都知道吧。計算機和人工智能的鼻祖,分別對應於其著名的「圖靈機」和「圖靈測試」)在 1950 年的論文裏,提出圖靈試驗的設想,即,隔牆對話,你將不知道與你談話的,是人仍是電腦。這無疑給計算機,尤爲是人工智能,預設了一個很高的指望值。可是半個世紀過去了,人工智能的進展,遠遠沒有達到圖靈試驗的標準。這不只讓多年翹首以待的人們,心灰意冷,認爲人工智能是忽悠,相關領域是「僞科學」。web

        可是自 2006 年以來,機器學習領域,取得了突破性的進展。圖靈試驗,至少不是那麼可望而不可及了。至於技術手段,不只僅依賴於雲計算對大數據的並行處理能力,並且依賴於算法。這個算法就是,Deep Learning。藉助於 Deep Learning 算法,人類終於找到了如何處理「抽象概念」這個亙古難題的方法。算法

 

       2012年6月,《紐約時報》披露了Google Brain項目,吸引了公衆的普遍關注。這個項目是由著名的斯坦福大學的機器學習教授Andrew Ng和在大規模計算機系統方面的世界頂尖專家JeffDean共同主導,用16000個CPU Core的並行計算平臺訓練一種稱爲「深度神經網絡」(DNN,Deep Neural Networks)的機器學習模型(內部共有10億個節點。這一網絡天然是不能跟人類的神經網絡相提並論的。要知道,人腦中但是有150多億個神經元,互相鏈接的節點也就是突觸數更是如銀河沙數。曾經有人估算過,若是將一我的的大腦中全部神經細胞的軸突和樹突依次鏈接起來,並拉成一根直線,可從地球連到月亮,再從月亮返回地球),在語音識別和圖像識別等領域得到了巨大的成功。數據庫

       項目負責人之一Andrew稱:「咱們沒有像一般作的那樣本身框定邊界,而是直接把海量數據投放到算法中,讓數據本身說話,系統會自動從數據中學習。」另一名負責人Jeff則說:「咱們在訓練的時候歷來不會告訴機器說:‘這是一隻貓。’系統實際上是本身發明或者領悟了「貓」的概念。」編程

  

       2012年11月,微軟在中國天津的一次活動上公開演示了一個全自動的同聲傳譯系統,講演者用英文演講,後臺的計算機一鼓作氣自動完成語音識別、英中機器翻譯和中文語音合成,效果很是流暢。據報道,後面支撐的關鍵技術也是DNN,或者深度學習(DL,DeepLearning)。網絡

       2013年1月,在百度年會上,創始人兼CEO李彥宏高調宣佈要成立百度研究院,其中第一個成立的就是「深度學習研究所」(IDL,Institue of Deep Learning)。架構

 

       爲何擁有大數據的互聯網公司爭相投入大量資源研發深度學習技術。聽起來感受deeplearning很牛那樣。那什麼是deep learning?爲何有deep learning?它是怎麼來的?又能幹什麼呢?目前存在哪些困難呢?這些問題的簡答都須要慢慢來。我們先來了解下機器學習(人工智能的核心)的背景。app

 

2、背景

      機器學習(Machine Learning)是一門專門研究計算機怎樣模擬或實現人類的學習行爲,以獲取新的知識或技能,從新組織已有的知識結構使之不斷改善自身的性能的學科。機器可否像人類同樣能具備學習能力呢?1959年美國的塞繆爾(Samuel)設計了一個下棋程序,這個程序具備學習能力,它能夠在不斷的對弈中改善本身的棋藝。4年後,這個程序打敗了設計者本人。又過了3年,這個程序打敗了美國一個保持8年之久的常勝不敗的冠軍。這個程序向人們展現了機器學習的能力,提出了許多使人深思的社會問題與哲學問題(呵呵,人工智能正常的軌道沒有很大的發展,這些什麼哲學倫理啊倒發展的挺快。什麼將來機器愈來愈像人,人愈來愈像機器啊。什麼機器會反人類啊,ATM是開第一槍的啊等等。人類的思惟無窮啊)。

        機器學習雖然發展了幾十年,但仍是存在不少沒有良好解決的問題:

 

        例如圖像識別、語音識別、天然語言理解、天氣預測、基因表達、內容推薦等等。目前咱們經過機器學習去解決這些問題的思路都是這樣的(以視覺感知爲例子):

 

        從開始的經過傳感器(例如CMOS)來得到數據。而後通過預處理、特徵提取、特徵選擇,再到推理、預測或者識別。最後一個部分,也就是機器學習的部分,絕大部分的工做是在這方面作的,也存在不少的paper和研究。

        而中間的三部分,歸納起來就是特徵表達。良好的特徵表達,對最終算法的準確性起了很是關鍵的做用,並且系統主要的計算和測試工做都耗在這一大部分。但,這塊實際中通常都是人工完成的。靠人工提取特徵。

 

       截止如今,也出現了很多NB的特徵(好的特徵應具備不變性(大小、尺度和旋轉等)和可區分性):例如Sift的出現,是局部圖像特徵描述子研究領域一項里程碑式的工做。因爲SIFT對尺度、旋轉以及必定視角和光照變化等圖像變化都具備不變性,而且SIFT具備很強的可區分性,的確讓不少問題的解決變爲可能。但它也不是萬能的。

 

       然而,手工地選取特徵是一件很是費力、啓發式(須要專業知識)的方法,能不能選取好很大程度上靠經驗和運氣,並且它的調節須要大量的時間。既然手工選取特徵不太好,那麼能不能自動地學習一些特徵呢?答案是能!Deep Learning就是用來幹這個事情的,看它的一個別名UnsupervisedFeature Learning,就能夠顧名思義了,Unsupervised的意思就是不要人蔘與特徵的選取過程。

       那它是怎麼學習的呢?怎麼知道哪些特徵好哪些很差呢?咱們說機器學習是一門專門研究計算機怎樣模擬或實現人類的學習行爲的學科。好,那咱們人的視覺系統是怎麼工做的呢?爲何在茫茫人海,芸芸衆生,滾滾紅塵中咱們均可以找到另外一個她(由於,你存在我深深的腦海裏,個人夢裏 個人內心 個人歌聲裏……)。人腦那麼NB,咱們能不能參考人腦,模擬人腦呢?(好像和人腦扯上點關係的特徵啊,算法啊,都不錯,但不知道是否是人爲強加的,爲了使本身的做品變得神聖和高雅。)

        近幾十年以來,認知神經科學、生物學等等學科的發展,讓咱們對本身這個神祕的而又神奇的大腦再也不那麼的陌生。也給人工智能的發展推波助瀾。

 

3、人腦視覺機理

       1981 年的諾貝爾醫學獎,頒發給了 David Hubel(出生於加拿大的美國神經生物學家) 和TorstenWiesel,以及 Roger Sperry。前兩位的主要貢獻,是「發現了視覺系統的信息處理」:可視皮層是分級的:

 

        咱們看看他們作了什麼。1958 年,DavidHubel 和Torsten Wiesel 在 JohnHopkins University,研究瞳孔區域與大腦皮層神經元的對應關係。他們在貓的後腦頭骨上,開了一個3 毫米的小洞,向洞裏插入電極,測量神經元的活躍程度。

      而後,他們在小貓的眼前,展示各類形狀、各類亮度的物體。而且,在展示每一件物體時,還改變物體放置的位置和角度。他們指望經過這個辦法,讓小貓瞳孔感覺不一樣類型、不一樣強弱的刺激。

       之因此作這個試驗,目的是去證實一個猜想。位於後腦皮層的不一樣視覺神經元,與瞳孔所受刺激之間,存在某種對應關係。一旦瞳孔受到某一種刺激,後腦皮層的某一部分神經元就會活躍。經歷了數日反覆的枯燥的試驗,同時犧牲了若干只可憐的小貓,David Hubel 和Torsten Wiesel 發現了一種被稱爲「方向選擇性細胞(Orientation Selective Cell)」的神經元細胞。當瞳孔發現了眼前的物體的邊緣,並且這個邊緣指向某個方向時,這種神經元細胞就會活躍。

       這個發現激發了人們對於神經系統的進一步思考。神經-中樞-大腦的工做過程,或許是一個不斷迭代、不斷抽象的過程。

       這裏的關鍵詞有兩個,一個是抽象,一個是迭代。從原始信號,作低級抽象,逐漸向高級抽象迭代。人類的邏輯思惟,常用高度抽象的概念。

        例如,從原始信號攝入開始(瞳孔攝入像素 Pixels),接着作初步處理(大腦皮層某些細胞發現邊緣和方向),而後抽象(大腦斷定,眼前的物體的形狀,是圓形的),而後進一步抽象(大腦進一步斷定該物體是隻氣球)。

 

      這個生理學的發現,促成了計算機人工智能,在四十年後的突破性發展。

      總的來講,人的視覺系統的信息處理是分級的。從低級的V1區提取邊緣特徵,再到V2區的形狀或者目標的部分等,再到更高層,整個目標、目標的行爲等。也就是說高層的特徵是低層特徵的組合,從低層到高層的特徵表示愈來愈抽象,愈來愈能表現語義或者意圖。而抽象層面越高,存在的可能猜想就越少,就越利於分類。例如,單詞集合和句子的對應是多對一的,句子和語義的對應又是多對一的,語義和意圖的對應仍是多對一的,這是個層級體系。

      敏感的人注意到關鍵詞了:分層。而Deep learning的deep是否是就表示我存在多少層,也就是多深呢?沒錯。那Deep learning是如何借鑑這個過程的呢?畢竟是歸於計算機來處理,面對的一個問題就是怎麼對這個過程建模?

       由於咱們要學習的是特徵的表達,那麼關於特徵,或者說關於這個層級特徵,咱們須要瞭解地更深刻點。因此在說Deep Learning以前,咱們有必要再囉嗦下特徵(呵呵,其實是看到那麼好的對特徵的解釋,不放在這裏有點惋惜,因此就塞到這了)。

       由於咱們要學習的是特徵的表達,那麼關於特徵,或者說關於這個層級特徵,咱們須要瞭解地更深刻點。因此在說Deep Learning以前,咱們有必要再囉嗦下特徵(呵呵,其實是看到那麼好的對特徵的解釋,不放在這裏有點惋惜,因此就塞到這了)。

 

4、關於特徵

        特徵是機器學習系統的原材料,對最終模型的影響是毋庸置疑的。若是數據被很好的表達成了特徵,一般線性模型就能達到滿意的精度。那對於特徵,咱們須要考慮什麼呢?

4.一、特徵表示的粒度

        學習算法在一個什麼粒度上的特徵表示,纔有能發揮做用?就一個圖片來講,像素級的特徵根本沒有價值。例以下面的摩托車,從像素級別,根本得不到任何信息,其沒法進行摩托車和非摩托車的區分。而若是特徵是一個具備結構性(或者說有含義)的時候,好比是否具備車把手(handle),是否具備車輪(wheel),就很容易把摩托車和非摩托車區分,學習算法才能發揮做用。

 

 

 

4.二、初級(淺層)特徵表示

        既然像素級的特徵表示方法沒有做用,那怎樣的表示纔有用呢?

        1995 年先後,Bruno Olshausen和 David Field 兩位學者任職 Cornell University,他們試圖同時用生理學和計算機的手段,左右開弓,研究視覺問題。

        他們收集了不少黑白風景照片,從這些照片中,提取出400個小碎片,每一個照片碎片的尺寸均爲 16x16 像素,不妨把這400個碎片標記爲 S[i], i = 0,.. 399。接下來,再從這些黑白風景照片中,隨機提取另外一個碎片,尺寸也是 16x16 像素,不妨把這個碎片標記爲 T。

        他們提出的問題是,如何從這400個碎片中,選取一組碎片,S[k], 經過疊加的辦法,合成出一個新的碎片,而這個新的碎片,應當與隨機選擇的目標碎片 T,儘量類似,同時,S[k] 的數量儘量少。用數學的語言來描述,就是:

        Sum_k (a[k] * S[k]) --> T,     其中 a[k] 是在疊加碎片 S[k] 時的權重係數。

        爲解決這個問題,Bruno Olshausen和 David Field 發明了一個算法,稀疏編碼(Sparse Coding)。

        稀疏編碼是一個重複迭代的過程,每次迭代分兩步:

1)選擇一組 S[k],而後調整 a[k],使得Sum_k (a[k] * S[k]) 最接近 T。

2)固定住 a[k],在 400 個碎片中,選擇其它更合適的碎片S’[k],替代原先的 S[k],使得Sum_k (a[k] * S’[k]) 最接近 T。

        通過幾回迭代後,最佳的 S[k] 組合,被遴選出來了。使人驚奇的是,被選中的 S[k],基本上都是照片上不一樣物體的邊緣線,這些線段形狀類似,區別在於方向。

        Bruno Olshausen和 David Field 的算法結果,與 David Hubel 和Torsten Wiesel 的生理髮現,不謀而合!

        也就是說,複雜圖形,每每由一些基本結構組成。好比下圖:一個圖能夠經過用64種正交的edges(能夠理解成正交的基本結構)來線性表示。好比樣例的x能夠用1-64個edges中的三個按照0.8,0.3,0.5的權重調和而成。而其餘基本edge沒有貢獻,所以均爲0 。

 

        另外,大牛們還發現,不只圖像存在這個規律,聲音也存在。他們從未標註的聲音中發現了20種基本的聲音結構,其他的聲音能夠由這20種基本結構合成。

 

 

 

4.三、結構性特徵表示

        小塊的圖形能夠由基本edge構成,更結構化,更復雜的,具備概念性的圖形如何表示呢?這就須要更高層次的特徵表示,好比V2,V4。所以V1看像素級是像素級。V2看V1是像素級,這個是層次遞進的,高層表達由底層表達的組合而成。專業點說就是基basis。V1取提出的basis是邊緣,而後V2層是V1層這些basis的組合,這時候V2區獲得的又是高一層的basis。即上一層的basis組合的結果,上上層又是上一層的組合basis……(因此有大牛說Deep learning就是「搞基」,由於難聽,因此美其名曰Deep learning或者Unsupervised Feature Learning)

 

        直觀上說,就是找到make sense的小patch再將其進行combine,就獲得了上一層的feature,遞歸地向上learning feature。

        在不一樣object上作training是,所得的edge basis 是很是類似的,但object parts和models 就會completely different了(那我們分辨car或者face是否是容易多了):

 

        從文原本說,一個doc表示什麼意思?咱們描述一件事情,用什麼來表示比較合適?用一個一個字嘛,我看不是,字就是像素級別了,起碼應該是term,換句話說每一個doc都由term構成,但這樣表示概念的能力就夠了嘛,可能也不夠,須要再上一步,達到topic級,有了topic,再到doc就合理。但每一個層次的數量差距很大,好比doc表示的概念->topic(千-萬量級)->term(10萬量級)->word(百萬量級)。

        一我的在看一個doc的時候,眼睛看到的是word,由這些word在大腦裏自動切詞造成term,在按照概念組織的方式,先驗的學習,獲得topic,而後再進行高層次的learning。

 

4.四、須要有多少個特徵?

       咱們知道須要層次的特徵構建,由淺入深,但每一層該有多少個特徵呢?

任何一種方法,特徵越多,給出的參考信息就越多,準確性會獲得提高。但特徵多意味着計算複雜,探索的空間大,能夠用來訓練的數據在每一個特徵上就會稀疏,都會帶來各類問題,並不必定特徵越多越好。

 

 

       好了,到了這一步,終於能夠聊到Deep learning了。上面咱們聊到爲何會有Deep learning(讓機器自動學習良好的特徵,而免去人工選取過程。還有參考人的分層視覺處理系統),咱們獲得一個結論就是Deep learning須要多層來得到更抽象的特徵表達。那麼多少層才合適呢?用什麼架構來建模呢?怎麼進行非監督訓練呢?

 

5、Deep Learning的基本思想

       假設咱們有一個系統S,它有n層(S1,…Sn),它的輸入是I,輸出是O,形象地表示爲: I =>S1=>S2=>…..=>Sn => O,若是輸出O等於輸入I,即輸入I通過這個系統變化以後沒有任何的信息損失(呵呵,大牛說,這是不可能的。信息論中有個「信息逐層丟失」的說法(信息處理不等式),設處理a信息獲得b,再對b處理獲得c,那麼能夠證實:a和c的互信息不會超過a和b的互信息。這代表信息處理不會增長信息,大部分處理會丟失信息。固然了,若是丟掉的是沒用的信息那多好啊),保持了不變,這意味着輸入I通過每一層Si都沒有任何的信息損失,即在任何一層Si,它都是原有信息(即輸入I)的另一種表示。如今回到咱們的主題Deep Learning,咱們須要自動地學習特徵,假設咱們有一堆輸入I(如一堆圖像或者文本),假設咱們設計了一個系統S(有n層),咱們經過調整系統中參數,使得它的輸出仍然是輸入I,那麼咱們就能夠自動地獲取獲得輸入I的一系列層次特徵,即S1,…, Sn。

       對於深度學習來講,其思想就是對堆疊多個層,也就是說這一層的輸出做爲下一層的輸入。經過這種方式,就能夠實現對輸入信息進行分級表達了。

       另外,前面是假設輸出嚴格地等於輸入,這個限制太嚴格,咱們能夠略微地放鬆這個限制,例如咱們只要使得輸入與輸出的差異儘量地小便可,這個放鬆會致使另一類不一樣的Deep Learning方法。上述就是Deep Learning的基本思想。

 

6、淺層學習(Shallow Learning)和深度學習(Deep Learning)

       淺層學習是機器學習的第一次浪潮。

       20世紀80年代末期,用於人工神經網絡的反向傳播算法(也叫Back Propagation算法或者BP算法)的發明,給機器學習帶來了但願,掀起了基於統計模型的機器學習熱潮。這個熱潮一直持續到今天。人們發現,利用BP算法可讓一我的工神經網絡模型從大量訓練樣本中學習統計規律,從而對未知事件作預測。這種基於統計的機器學習方法比起過去基於人工規則的系統,在不少方面顯出優越性。這個時候的人工神經網絡,雖也被稱做多層感知機(Multi-layer Perceptron),但實際是種只含有一層隱層節點的淺層模型。

        20世紀90年代,各類各樣的淺層機器學習模型相繼被提出,例如支撐向量機(SVM,Support Vector Machines)、 Boosting、最大熵方法(如LR,Logistic Regression)等。這些模型的結構基本上能夠當作帶有一層隱層節點(如SVM、Boosting),或沒有隱層節點(如LR)。這些模型不管是在理論分析仍是應用中都得到了巨大的成功。相比之下,因爲理論分析的難度大,訓練方法又須要不少經驗和技巧,這個時期淺層人工神經網絡反而相對沉寂。

        深度學習是機器學習的第二次浪潮。

        2006年,加拿大多倫多大學教授、機器學習領域的泰斗Geoffrey Hinton和他的學生RuslanSalakhutdinov在《科學》上發表了一篇文章,開啓了深度學習在學術界和工業界的浪潮。這篇文章有兩個主要觀點:1)多隱層的人工神經網絡具備優異的特徵學習能力,學習獲得的特徵對數據有更本質的刻畫,從而有利於可視化或分類;2)深度神經網絡在訓練上的難度,能夠經過「逐層初始化」(layer-wise pre-training)來有效克服,在這篇文章中,逐層初始化是經過無監督學習實現的。

        當前多數分類、迴歸等學習方法爲淺層結構算法,其侷限性在於有限樣本和計算單元狀況下對複雜函數的表示能力有限,針對複雜分類問題其泛化能力受到必定製約。深度學習可經過學習一種深層非線性網絡結構,實現複雜函數逼近,表徵輸入數據分佈式表示,並展示了強大的從少數樣本集中學習數據集本質特徵的能力。(多層的好處是能夠用較少的參數表示複雜的函數)

 

        深度學習的實質,是經過構建具備不少隱層的機器學習模型和海量的訓練數據,來學習更有用的特徵,從而最終提高分類或預測的準確性。所以,「深度模型」是手段,「特徵學習」是目的。區別於傳統的淺層學習,深度學習的不一樣在於:1)強調了模型結構的深度,一般有5層、6層,甚至10多層的隱層節點;2)明確突出了特徵學習的重要性,也就是說,經過逐層特徵變換,將樣本在原空間的特徵表示變換到一個新特徵空間,從而使分類或預測更加容易。與人工規則構造特徵的方法相比,利用大數據來學習特徵,更可以刻畫數據的豐富內在信息。

 

7、Deep learning與Neural Network

        深度學習是機器學習研究中的一個新的領域,其動機在於創建、模擬人腦進行分析學習的神經網絡,它模仿人腦的機制來解釋數據,例如圖像,聲音和文本。深度學習是無監督學習的一種。

        深度學習的概念源於人工神經網絡的研究。含多隱層的多層感知器就是一種深度學習結構。深度學習經過組合低層特徵造成更加抽象的高層表示屬性類別或特徵,以發現數據的分佈式特徵表示。

       Deep learning自己算是machine learning的一個分支,簡單能夠理解爲neural network的發展。大約二三十年前,neural network曾經是ML領域特別火熱的一個方向,可是後來確慢慢淡出了,緣由包括如下幾個方面:

1)比較容易過擬合,參數比較難tune,並且須要很多trick;

2)訓練速度比較慢,在層次比較少(小於等於3)的狀況下效果並不比其它方法更優;

       因此中間有大約20多年的時間,神經網絡被關注不多,這段時間基本上是SVM和boosting算法的天下。可是,一個癡心的老先生Hinton,他堅持了下來,並最終(和其它人一塊兒Bengio、Yann.lecun等)提成了一個實際可行的deep learning框架。

        Deep learning與傳統的神經網絡之間有相同的地方也有不少不一樣。

        兩者的相同在於deep learning採用了神經網絡類似的分層結構,系統由包括輸入層、隱層(多層)、輸出層組成的多層網絡,只有相鄰層節點之間有鏈接,同一層以及跨層節點之間相互無鏈接,每一層能夠看做是一個logistic regression模型;這種分層結構,是比較接近人類大腦的結構的。

 

        而爲了克服神經網絡訓練中的問題,DL採用了與神經網絡很不一樣的訓練機制。傳統神經網絡中,採用的是back propagation的方式進行,簡單來說就是採用迭代的算法來訓練整個網絡,隨機設定初值,計算當前網絡的輸出,而後根據當前輸出和label之間的差去改變前面各層的參數,直到收斂(總體是一個梯度降低法)。而deep learning總體上是一個layer-wise的訓練機制。這樣作的緣由是由於,若是採用back propagation的機制,對於一個deep network(7層以上),殘差傳播到最前面的層已經變得過小,出現所謂的gradient diffusion(梯度擴散)。這個問題咱們接下來討論。

 

8、Deep learning訓練過程

8.一、傳統神經網絡的訓練方法爲何不能用在深度神經網絡

       BP算法做爲傳統訓練多層網絡的典型算法,實際上對僅含幾層網絡,該訓練方法就已經很不理想。深度結構(涉及多個非線性處理單元層)非凸目標代價函數中廣泛存在的局部最小是訓練困難的主要來源。

BP算法存在的問題:

(1)梯度愈來愈稀疏:從頂層越往下,偏差校訂信號愈來愈小;

(2)收斂到局部最小值:尤爲是從遠離最優區域開始的時候(隨機值初始化會致使這種狀況的發生);

(3)通常,咱們只能用有標籤的數據來訓練:但大部分的數據是沒標籤的,而大腦能夠從沒有標籤的的數據中學習;

 

8.二、deep learning訓練過程

       若是對全部層同時訓練,時間複雜度會過高;若是每次訓練一層,誤差就會逐層傳遞。這會面臨跟上面監督學習中相反的問題,會嚴重欠擬合(由於深度網絡的神經元和參數太多了)。

       2006年,hinton提出了在非監督數據上創建多層神經網絡的一個有效方法,簡單的說,分爲兩步,一是每次訓練一層網絡,二是調優,使原始表示x向上生成的高級表示r和該高級表示r向下生成的x'儘量一致。方法是:

1)首先逐層構建單層神經元,這樣每次都是訓練一個單層網絡。

2)當全部層訓練完後,Hinton使用wake-sleep算法進行調優。

       將除最頂層的其它層間的權重變爲雙向的,這樣最頂層仍然是一個單層神經網絡,而其它層則變爲了圖模型。向上的權重用於「認知」,向下的權重用於「生成」。而後使用Wake-Sleep算法調整全部的權重。讓認知和生成達成一致,也就是保證生成的最頂層表示可以儘量正確的復原底層的結點。好比頂層的一個結點表示人臉,那麼全部人臉的圖像應該激活這個結點,而且這個結果向下生成的圖像應該可以表現爲一個大概的人臉圖像。Wake-Sleep算法分爲醒(wake)和睡(sleep)兩個部分。

1)wake階段:認知過程,經過外界的特徵和向上的權重(認知權重)產生每一層的抽象表示(結點狀態),而且使用梯度降低修改層間的下行權重(生成權重)。也就是「若是現實跟我想象的不同,改變個人權重使得我想象的東西就是這樣的」。

2)sleep階段:生成過程,經過頂層表示(醒時學得的概念)和向下權重,生成底層的狀態,同時修改層間向上的權重。也就是「若是夢中的景象不是我腦中的相應概念,改變個人認知權重使得這種景象在我看來就是這個概念」。

 

deep learning訓練過程具體以下:

1)使用自下上升非監督學習(就是從底層開始,一層一層的往頂層訓練):

       採用無標定數據(有標定數據也可)分層訓練各層參數,這一步能夠看做是一個無監督訓練過程,是和傳統神經網絡區別最大的部分(這個過程能夠看做是feature learning過程):

       具體的,先用無標定數據訓練第一層,訓練時先學習第一層的參數(這一層能夠看做是獲得一個使得輸出和輸入差異最小的三層神經網絡的隱層),因爲模型capacity的限制以及稀疏性約束,使得獲得的模型可以學習到數據自己的結構,從而獲得比輸入更具備表示能力的特徵;在學習獲得第n-1層後,將n-1層的輸出做爲第n層的輸入,訓練第n層,由此分別獲得各層的參數;

2)自頂向下的監督學習(就是經過帶標籤的數據去訓練,偏差自頂向下傳輸,對網絡進行微調):

       基於第一步獲得的各層參數進一步fine-tune整個多層模型的參數,這一步是一個有監督訓練過程;第一步相似神經網絡的隨機初始化初值過程,因爲DL的第一步不是隨機初始化,而是經過學習輸入數據的結構獲得的,於是這個初值更接近全局最優,從而可以取得更好的效果;因此deep learning效果好很大程度上歸功於第一步的feature learning過程。

9、Deep Learning的經常使用模型或者方法

9.一、AutoEncoder自動編碼器

        Deep Learning最簡單的一種方法是利用人工神經網絡的特色,人工神經網絡(ANN)自己就是具備層次結構的系統,若是給定一個神經網絡,咱們假設其輸出與輸入是相同的,而後訓練調整其參數,獲得每一層中的權重。天然地,咱們就獲得了輸入I的幾種不一樣表示(每一層表明一種表示),這些表示就是特徵。自動編碼器就是一種儘量復現輸入信號的神經網絡。爲了實現這種復現,自動編碼器就必須捕捉能夠表明輸入數據的最重要的因素,就像PCA那樣,找到能夠表明原信息的主要成分。

       具體過程簡單的說明以下:

1)給定無標籤數據,用非監督學習學習特徵:

 

       在咱們以前的神經網絡中,如第一個圖,咱們輸入的樣本是有標籤的,即(input, target),這樣咱們根據當前輸出和target(label)之間的差去改變前面各層的參數,直到收斂。但如今咱們只有無標籤數據,也就是右邊的圖。那麼這個偏差怎麼獲得呢?

        如上圖,咱們將input輸入一個encoder編碼器,就會獲得一個code,這個code也就是輸入的一個表示,那麼咱們怎麼知道這個code表示的就是input呢?咱們加一個decoder解碼器,這時候decoder就會輸出一個信息,那麼若是輸出的這個信息和一開始的輸入信號input是很像的(理想狀況下就是同樣的),那很明顯,咱們就有理由相信這個code是靠譜的。因此,咱們就經過調整encoder和decoder的參數,使得重構偏差最小,這時候咱們就獲得了輸入input信號的第一個表示了,也就是編碼code了。由於是無標籤數據,因此偏差的來源就是直接重構後與原輸入相比獲得。

2)經過編碼器產生特徵,而後訓練下一層。這樣逐層訓練:

       那上面咱們就獲得第一層的code,咱們的重構偏差最小讓咱們相信這個code就是原輸入信號的良好表達了,或者牽強點說,它和原信號是如出一轍的(表達不同,反映的是一個東西)。那第二層和第一層的訓練方式就沒有差異了,咱們將第一層輸出的code當成第二層的輸入信號,一樣最小化重構偏差,就會獲得第二層的參數,而且獲得第二層輸入的code,也就是原輸入信息的第二個表達了。其餘層就一樣的方法炮製就好了(訓練這一層,前面層的參數都是固定的,而且他們的decoder已經沒用了,都不須要了)。

3)有監督微調:

      通過上面的方法,咱們就能夠獲得不少層了。至於須要多少層(或者深度須要多少,這個目前自己就沒有一個科學的評價方法)須要本身試驗調了。每一層都會獲得原始輸入的不一樣的表達。固然了,咱們以爲它是越抽象越好了,就像人的視覺系統同樣。

       到這裏,這個AutoEncoder還不能用來分類數據,由於它尚未學習如何去連結一個輸入和一個類。它只是學會了如何去重構或者復現它的輸入而已。或者說,它只是學習得到了一個能夠良好表明輸入的特徵,這個特徵能夠最大程度上表明原輸入信號。那麼,爲了實現分類,咱們就能夠在AutoEncoder的最頂的編碼層添加一個分類器(例如羅傑斯特迴歸、SVM等),而後經過標準的多層神經網絡的監督訓練方法(梯度降低法)去訓練。

        也就是說,這時候,咱們須要將最後層的特徵code輸入到最後的分類器,經過有標籤樣本,經過監督學習進行微調,這也分兩種,一個是隻調整分類器(黑色部分):

       另外一種:經過有標籤樣本,微調整個系統:(若是有足夠多的數據,這個是最好的。end-to-end learning端對端學習)

       一旦監督訓練完成,這個網絡就能夠用來分類了。神經網絡的最頂層能夠做爲一個線性分類器,而後咱們能夠用一個更好性能的分類器去取代它。

       在研究中能夠發現,若是在原有的特徵中加入這些自動學習獲得的特徵能夠大大提升精確度,甚至在分類問題中比目前最好的分類算法效果還要好!

        AutoEncoder存在一些變體,這裏簡要介紹下兩個:

Sparse AutoEncoder稀疏自動編碼器:

      固然,咱們還能夠繼續加上一些約束條件獲得新的Deep Learning方法,如:若是在AutoEncoder的基礎上加上L1的Regularity限制(L1主要是約束每一層中的節點中大部分都要爲0,只有少數不爲0,這就是Sparse名字的來源),咱們就能夠獲得Sparse AutoEncoder法。

       如上圖,其實就是限制每次獲得的表達code儘可能稀疏。由於稀疏的表達每每比其餘的表達要有效(人腦好像也是這樣的,某個輸入只是刺激某些神經元,其餘的大部分的神經元是受到抑制的)。

Denoising AutoEncoders降噪自動編碼器:

        降噪自動編碼器DA是在自動編碼器的基礎上,訓練數據加入噪聲,因此自動編碼器必須學習去去除這種噪聲而得到真正的沒有被噪聲污染過的輸入。所以,這就迫使編碼器去學習輸入信號的更加魯棒的表達,這也是它的泛化能力比通常編碼器強的緣由。DA能夠經過梯度降低算法去訓練。

9.二、Sparse Coding稀疏編碼

       若是咱們把輸出必須和輸入相等的限制放鬆,同時利用線性代數中基的概念,即O = a11 + a22+….+ ann, Φi是基,ai是係數,咱們能夠獲得這樣一個優化問題:

Min |I – O|,其中I表示輸入,O表示輸出。

       經過求解這個最優化式子,咱們能夠求得係數ai和基Φi,這些係數和基就是輸入的另一種近似表達。

       所以,它們能夠用來表達輸入I,這個過程也是自動學習獲得的。若是咱們在上述式子上加上L1的Regularity限制,獲得:

Min |I – O| + u*(|a1| + |a2| + … + |an |)

        這種方法被稱爲Sparse Coding。通俗的說,就是將一個信號表示爲一組基的線性組合,並且要求只須要較少的幾個基就能夠將信號表示出來。「稀疏性」定義爲:只有不多的幾個非零元素或只有不多的幾個遠大於零的元素。要求係數 ai 是稀疏的意思就是說:對於一組輸入向量,咱們只想有儘量少的幾個係數遠大於零。選擇使用具備稀疏性的份量來表示咱們的輸入數據是有緣由的,由於絕大多數的感官數據,好比天然圖像,能夠被表示成少許基本元素的疊加,在圖像中這些基本元素能夠是面或者線。同時,好比與初級視覺皮層的類比過程也所以獲得了提高(人腦有大量的神經元,但對於某些圖像或者邊緣只有不多的神經元興奮,其餘都處於抑制狀態)。

         稀疏編碼算法是一種無監督學習方法,它用來尋找一組「超完備」基向量來更高效地表示樣本數據。雖然形如主成分分析技術(PCA)能使咱們方便地找到一組「完備」基向量,可是這裏咱們想要作的是找到一組「超完備」基向量來表示輸入向量(也就是說,基向量的個數比輸入向量的維數要大)。超完備基的好處是它們能更有效地找出隱含在輸入數據內部的結構與模式。然而,對於超完備基來講,係數ai再也不由輸入向量惟一肯定。所以,在稀疏編碼算法中,咱們另加了一個評判標準「稀疏性」來解決因超完備而致使的退化(degeneracy)問題。(詳細過程請參考:UFLDL Tutorial稀疏編碼

       好比在圖像的Feature Extraction的最底層要作Edge Detector的生成,那麼這裏的工做就是從Natural Images中randomly選取一些小patch,經過這些patch生成可以描述他們的「基」,也就是右邊的8*8=64個basis組成的basis,而後給定一個test patch, 咱們能夠按照上面的式子經過basis的線性組合獲得,而sparse matrix就是a,下圖中的a中有64個維度,其中非零項只有3個,故稱「sparse」。

       這裏可能你們會有疑問,爲何把底層做爲Edge Detector呢?上層又是什麼呢?這裏作個簡單解釋你們就會明白,之因此是Edge Detector是由於不一樣方向的Edge就可以描述出整幅圖像,因此不一樣方向的Edge天然就是圖像的basis了……而上一層的basis組合的結果,上上層又是上一層的組合basis……(就是上面第四部分的時候我們說的那樣)

       Sparse coding分爲兩個部分:

1)Training階段:給定一系列的樣本圖片[x1, x 2, …],咱們須要學習獲得一組基[Φ1, Φ2, …],也就是字典。

       稀疏編碼是k-means算法的變體,其訓練過程也差很少(EM算法的思想:若是要優化的目標函數包含兩個變量,如L(W, B),那麼咱們能夠先固定W,調整B使得L最小,而後再固定B,調整W使L最小,這樣迭代交替,不斷將L推向最小值。EM算法能夠見個人博客:「從最大似然到EM算法淺解」)。

       訓練過程就是一個重複迭代的過程,按上面所說,咱們交替的更改a和Φ使得下面這個目標函數最小。

      每次迭代分兩步:

a)固定字典Φ[k],而後調整a[k],使得上式,即目標函數最小(即解LASSO問題)。

b)而後固定住a [k],調整Φ [k],使得上式,即目標函數最小(即解凸QP問題)。

      不斷迭代,直至收斂。這樣就能夠獲得一組能夠良好表示這一系列x的基,也就是字典。

2)Coding階段:給定一個新的圖片x,由上面獲得的字典,經過解一個LASSO問題獲得稀疏向量a。這個稀疏向量就是這個輸入向量x的一個稀疏表達了。

例如:

9.三、Restricted Boltzmann Machine (RBM)限制波爾茲曼機

       假設有一個二部圖,每一層的節點之間沒有連接,一層是可視層,即輸入數據層(v),一層是隱藏層(h),若是假設全部的節點都是隨機二值變量節點(只能取0或者1值),同時假設全機率分佈p(v,h)知足Boltzmann 分佈,咱們稱這個模型是Restricted BoltzmannMachine (RBM)。

       下面咱們來看看爲何它是Deep Learning方法。首先,這個模型由於是二部圖,因此在已知v的狀況下,全部的隱藏節點之間是條件獨立的(由於節點之間不存在鏈接),即p(h|v)=p(h1|v)…p(hn|v)。同理,在已知隱藏層h的狀況下,全部的可視節點都是條件獨立的。同時又因爲全部的v和h知足Boltzmann 分佈,所以,當輸入v的時候,經過p(h|v) 能夠獲得隱藏層h,而獲得隱藏層h以後,經過p(v|h)又能獲得可視層,經過調整參數,咱們就是要使得從隱藏層獲得的可視層v1與原來的可視層v若是同樣,那麼獲得的隱藏層就是可視層另一種表達,所以隱藏層能夠做爲可視層輸入數據的特徵,因此它就是一種Deep Learning方法。

       如何訓練呢?也就是可視層節點和隱節點間的權值怎麼肯定呢?咱們須要作一些數學分析。也就是模型了。

        聯合組態(jointconfiguration)的能量能夠表示爲:

        而某個組態的聯合機率分佈能夠經過Boltzmann 分佈(和這個組態的能量)來肯定:

      由於隱藏節點之間是條件獨立的(由於節點之間不存在鏈接),即:

      而後咱們能夠比較容易(對上式進行因子分解Factorizes)獲得在給定可視層v的基礎上,隱層第j個節點爲1或者爲0的機率:

       同理,在給定隱層h的基礎上,可視層第i個節點爲1或者爲0的機率也能夠容易獲得:

       給定一個知足獨立同分布的樣本集:D={v(1), v(2),…, v(N)},咱們須要學習參數θ={W,a,b}。

       咱們最大化如下對數似然函數(最大似然估計:對於某個機率模型,咱們須要選擇一個參數,讓咱們當前的觀測樣本的機率最大):

        也就是對最大對數似然函數求導,就能夠獲得L最大時對應的參數W了。

 

       若是,咱們把隱藏層的層數增長,咱們能夠獲得Deep Boltzmann Machine(DBM);若是咱們在靠近可視層的部分使用貝葉斯信念網絡(即有向圖模型,固然這裏依然限制層中節點之間沒有連接),而在最遠離可視層的部分使用Restricted Boltzmann Machine,咱們能夠獲得DeepBelief Net(DBN)。

 

9.四、Deep Belief Networks深信度網絡

        DBNs是一個機率生成模型,與傳統的判別模型的神經網絡相對,生成模型是創建一個觀察數據和標籤之間的聯合分佈,對P(Observation|Label)和 P(Label|Observation)都作了評估,而判別模型僅僅而已評估了後者,也就是P(Label|Observation)。對於在深度神經網絡應用傳統的BP算法的時候,DBNs遇到了如下問題:

(1)須要爲訓練提供一個有標籤的樣本集;

(2)學習過程較慢;

(3)不適當的參數選擇會致使學習收斂於局部最優解。

       DBNs由多個限制玻爾茲曼機(Restricted Boltzmann Machines)層組成,一個典型的神經網絡類型如圖三所示。這些網絡被「限制」爲一個可視層和一個隱層,層間存在鏈接,但層內的單元間不存在鏈接。隱層單元被訓練去捕捉在可視層表現出來的高階數據的相關性。

       首先,先不考慮最頂構成一個聯想記憶(associative memory)的兩層,一個DBN的鏈接是經過自頂向下的生成權值來指導肯定的,RBMs就像一個建築塊同樣,相比傳統和深度分層的sigmoid信念網絡,它能易於鏈接權值的學習。

       最開始的時候,經過一個非監督貪婪逐層方法去預訓練得到生成模型的權值,非監督貪婪逐層方法被Hinton證實是有效的,並被其稱爲對比分歧(contrastive divergence)。

       在這個訓練階段,在可視層會產生一個向量v,經過它將值傳遞到隱層。反過來,可視層的輸入會被隨機的選擇,以嘗試去重構原始的輸入信號。最後,這些新的可視的神經元激活單元將前向傳遞重構隱層激活單元,得到h(在訓練過程當中,首先將可視向量值映射給隱單元;而後可視單元由隱層單元重建;這些新可視單元再次映射給隱單元,這樣就獲取新的隱單元。執行這種反覆步驟叫作吉布斯採樣)。這些後退和前進的步驟就是咱們熟悉的Gibbs採樣,而隱層激活單元和可視層輸入之間的相關性差異就做爲權值更新的主要依據。

       訓練時間會顯著的減小,由於只須要單個步驟就能夠接近最大似然學習。增長進網絡的每一層都會改進訓練數據的對數機率,咱們能夠理解爲愈來愈接近能量的真實表達。這個有意義的拓展,和無標籤數據的使用,是任何一個深度學習應用的決定性的因素。

       在最高兩層,權值被鏈接到一塊兒,這樣更低層的輸出將會提供一個參考的線索或者關聯給頂層,這樣頂層就會將其聯繫到它的記憶內容。而咱們最關心的,最後想獲得的就是判別性能,例如分類任務裏面。

       在預訓練後,DBN能夠經過利用帶標籤數據用BP算法去對判別性能作調整。在這裏,一個標籤集將被附加到頂層(推廣聯想記憶),經過一個自下向上的,學習到的識別權值得到一個網絡的分類面。這個性能會比單純的BP算法訓練的網絡好。這能夠很直觀的解釋,DBNs的BP算法只須要對權值參數空間進行一個局部的搜索,這相比前向神經網絡來講,訓練是要快的,並且收斂的時間也少。

       DBNs的靈活性使得它的拓展比較容易。一個拓展就是卷積DBNs(Convolutional Deep Belief Networks(CDBNs))。DBNs並無考慮到圖像的2維結構信息,由於輸入是簡單的從一個圖像矩陣一維向量化的。而CDBNs就是考慮到了這個問題,它利用鄰域像素的空域關係,經過一個稱爲卷積RBMs的模型區達到生成模型的變換不變性,並且能夠容易得變換到高維圖像。DBNs並無明確地處理對觀察變量的時間聯繫的學習上,雖然目前已經有這方面的研究,例如堆疊時間RBMs,以此爲推廣,有序列學習的dubbed temporal convolutionmachines,這種序列學習的應用,給語音信號處理問題帶來了一個讓人激動的將來研究方向。

       目前,和DBNs有關的研究包括堆疊自動編碼器,它是經過用堆疊自動編碼器來替換傳統DBNs裏面的RBMs。這就使得能夠經過一樣的規則來訓練產生深度多層神經網絡架構,但它缺乏層的參數化的嚴格要求。與DBNs不一樣,自動編碼器使用判別模型,這樣這個結構就很難採樣輸入採樣空間,這就使得網絡更難捕捉它的內部表達。可是,降噪自動編碼器卻能很好的避免這個問題,而且比傳統的DBNs更優。它經過在訓練過程添加隨機的污染並堆疊產生場泛化性能。訓練單一的降噪自動編碼器的過程和RBMs訓練生成模型的過程同樣。

9.五、Convolutional Neural Networks卷積神經網絡

       卷積神經網絡是人工神經網絡的一種,已成爲當前語音分析和圖像識別領域的研究熱點。它的權值共享網絡結構使之更相似於生物神經網絡,下降了網絡模型的複雜度,減小了權值的數量。該優勢在網絡的輸入是多維圖像時表現的更爲明顯,使圖像能夠直接做爲網絡的輸入,避免了傳統識別算法中複雜的特徵提取和數據重建過程。卷積網絡是爲識別二維形狀而特殊設計的一個多層感知器,這種網絡結構對平移、比例縮放、傾斜或者共他形式的變形具備高度不變性。

       CNNs是受早期的延時神經網絡(TDNN)的影響。延時神經網絡經過在時間維度上共享權值下降學習複雜度,適用於語音和時間序列信號的處理。

       CNNs是第一個真正成功訓練多層網絡結構的學習算法。它利用空間關係減小須要學習的參數數目以提升通常前向BP算法的訓練性能。CNNs做爲一個深度學習架構提出是爲了最小化數據的預處理要求。在CNN中,圖像的一小部分(局部感覺區域)做爲層級結構的最低層的輸入,信息再依次傳輸到不一樣的層,每層經過一個數字濾波器去得到觀測數據的最顯著的特徵。這個方法可以獲取對平移、縮放和旋轉不變的觀測數據的顯著特徵,由於圖像的局部感覺區域容許神經元或者處理單元能夠訪問到最基礎的特徵,例如定向邊緣或者角點。

1)卷積神經網絡的歷史

       1962年Hubel和Wiesel經過對貓視覺皮層細胞的研究,提出了感覺野(receptive field)的概念,1984年日本學者Fukushima基於感覺野概念提出的神經認知機(neocognitron)能夠看做是卷積神經網絡的第一個實現網絡,也是感覺野概念在人工神經網絡領域的首次應用。神經認知機將一個視覺模式分解成許多子模式(特徵),而後進入分層遞階式相連的特徵平面進行處理,它試圖將視覺系統模型化,使其可以在即便物體有位移或輕微變形的時候,也能完成識別。

       一般神經認知機包含兩類神經元,即承擔特徵抽取的S-元和抗變形的C-元。S-元中涉及兩個重要參數,即感覺野與閾值參數,前者肯定輸入鏈接的數目,後者則控制對特徵子模式的反應程度。許多學者一直致力於提升神經認知機的性能的研究:在傳統的神經認知機中,每一個S-元的感光區中由C-元帶來的視覺模糊量呈正態分佈。若是感光區的邊緣所產生的模糊效果要比中央來得大,S-元將會接受這種非正態模糊所致使的更大的變形容忍性。咱們但願獲得的是,訓練模式與變形刺激模式在感覺野的邊緣與其中心所產生的效果之間的差別變得愈來愈大。爲了有效地造成這種非正態模糊,Fukushima提出了帶雙C-元層的改進型神經認知機。

       Van Ooyen和Niehuis爲提升神經認知機的區別能力引入了一個新的參數。事實上,該參數做爲一種抑制信號,抑制了神經元對重複激勵特徵的激勵。多數神經網絡在權值中記憶訓練信息。根據Hebb學習規則,某種特徵訓練的次數越多,在之後的識別過程當中就越容易被檢測。也有學者將進化計算理論與神經認知機結合,經過減弱對重複性激勵特徵的訓練學習,而使得網絡注意那些不一樣的特徵以助於提升區分能力。上述都是神經認知機的發展過程,而卷積神經網絡可看做是神經認知機的推廣形式,神經認知機是卷積神經網絡的一種特例。

2)卷積神經網絡的網絡結構

      卷積神經網絡是一個多層的神經網絡,每層由多個二維平面組成,而每一個平面由多個獨立神經元組成。

       圖:卷積神經網絡的概念示範:輸入圖像經過和三個可訓練的濾波器和可加偏置進行卷積,濾波過程如圖一,卷積後在C1層產生三個特徵映射圖,而後特徵映射圖中每組的四個像素再進行求和,加權值,加偏置,經過一個Sigmoid函數獲得三個S2層的特徵映射圖。這些映射圖再進過濾波獲得C3層。這個層級結構再和S2同樣產生S4。最終,這些像素值被光柵化,並鏈接成一個向量輸入到傳統的神經網絡,獲得輸出。

       通常地,C層爲特徵提取層,每一個神經元的輸入與前一層的局部感覺野相連,並提取該局部的特徵,一旦該局部特徵被提取後,它與其餘特徵間的位置關係也隨之肯定下來;S層是特徵映射層,網絡的每一個計算層由多個特徵映射組成,每一個特徵映射爲一個平面,平面上全部神經元的權值相等。特徵映射結構採用影響函數核小的sigmoid函數做爲卷積網絡的激活函數,使得特徵映射具備位移不變性。

       此外,因爲一個映射面上的神經元共享權值,於是減小了網絡自由參數的個數,下降了網絡參數選擇的複雜度。卷積神經網絡中的每個特徵提取層(C-層)都緊跟着一個用來求局部平均與二次提取的計算層(S-層),這種特有的兩次特徵提取結構使網絡在識別時對輸入樣本有較高的畸變容忍能力。

3)關於參數減小與權值共享

      上面聊到,好像CNN一個牛逼的地方就在於經過感覺野和權值共享減小了神經網絡須要訓練的參數的個數。那到底是啥的呢?

       下圖左:若是咱們有1000x1000像素的圖像,有1百萬個隱層神經元,那麼他們全鏈接的話(每一個隱層神經元都鏈接圖像的每個像素點),就有1000x1000x1000000=10^12個鏈接,也就是10^12個權值參數。然而圖像的空間聯繫是局部的,就像人是經過一個局部的感覺野去感覺外界圖像同樣,每個神經元都不須要對全局圖像作感覺,每一個神經元只感覺局部的圖像區域,而後在更高層,將這些感覺不一樣局部的神經元綜合起來就能夠獲得全局的信息了。這樣,咱們就能夠減小鏈接的數目,也就是減小神經網絡須要訓練的權值參數的個數了。以下圖右:假如局部感覺野是10x10,隱層每一個感覺野只須要和這10x10的局部圖像相鏈接,因此1百萬個隱層神經元就只有一億個鏈接,即10^8個參數。比原來減小了四個0(數量級),這樣訓練起來就沒那麼費力了,但仍是感受不少的啊,那還有啥辦法沒?

 

       咱們知道,隱含層的每個神經元都鏈接10x10個圖像區域,也就是說每個神經元存在10x10=100個鏈接權值參數。那若是咱們每一個神經元這100個參數是相同的呢?也就是說每一個神經元用的是同一個卷積核去卷積圖像。這樣咱們就只有多少個參數??只有100個參數啊!!!親!無論你隱層的神經元個數有多少,兩層間的鏈接我只有100個參數啊!親!這就是權值共享啊!親!這就是卷積神經網絡的主打賣點啊!親!(有點煩了,呵呵)也許你會問,這樣作靠譜嗎?爲何可行呢?這個……共同窗習。

       好了,你就會想,這樣提取特徵也忒不靠譜吧,這樣你只提取了一種特徵啊?對了,真聰明,咱們須要提取多種特徵對不?假如一種濾波器,也就是一種卷積核就是提出圖像的一種特徵,例如某個方向的邊緣。那麼咱們須要提取不一樣的特徵,怎麼辦,加多幾種濾波器不就好了嗎?對了。因此假設咱們加到100種濾波器,每種濾波器的參數不同,表示它提出輸入圖像的不一樣特徵,例如不一樣的邊緣。這樣每種濾波器去卷積圖像就獲得對圖像的不一樣特徵的放映,咱們稱之爲Feature Map。因此100種卷積核就有100個Feature Map。這100個Feature Map就組成了一層神經元。到這個時候明瞭了吧。咱們這一層有多少個參數了?100種卷積核x每種卷積核共享100個參數=100x100=10K,也就是1萬個參數。才1萬個參數啊!親!(又來了,受不了了!)見下圖右:不一樣的顏色表達不一樣的濾波器。

 

       嘿喲,遺漏一個問題了。剛纔說隱層的參數個數和隱層的神經元個數無關,只和濾波器的大小和濾波器種類的多少有關。那麼隱層的神經元個數怎麼肯定呢?它和原圖像,也就是輸入的大小(神經元個數)、濾波器的大小和濾波器在圖像中的滑動步長都有關!例如,個人圖像是1000x1000像素,而濾波器大小是10x10,假設濾波器沒有重疊,也就是步長爲10,這樣隱層的神經元個數就是(1000x1000 )/ (10x10)=100x100個神經元了,假設步長是8,也就是卷積核會重疊兩個像素,那麼……我就不算了,思想懂了就好。注意了,這只是一種濾波器,也就是一個Feature Map的神經元個數哦,若是100個Feature Map就是100倍了。因而可知,圖像越大,神經元個數和須要訓練的權值參數個數的貧富差距就越大。

 

      須要注意的一點是,上面的討論都沒有考慮每一個神經元的偏置部分。因此權值個數須要加1 。這個也是同一種濾波器共享的。

      總之,卷積網絡的核心思想是將:局部感覺野、權值共享(或者權值複製)以及時間或空間亞採樣這三種結構思想結合起來得到了某種程度的位移、尺度、形變不變性。

4)一個典型的例子說明

       一種典型的用來識別數字的卷積網絡是LeNet-5(效果和paper等見這)。當年美國大多數銀行就是用它來識別支票上面的手寫數字的。可以達到這種商用的地步,它的準確性可想而知。畢竟目前學術界和工業界的結合是最受爭議的。

      那下面我們也用這個例子來講明下。

        LeNet-5共有7層,不包含輸入,每層都包含可訓練參數(鏈接權重)。輸入圖像爲32*32大小。這要比Mnist數據庫(一個公認的手寫數據庫)中最大的字母還大。這樣作的緣由是但願潛在的明顯特徵如筆畫斷電或角點可以出如今最高層特徵監測子感覺野的中心。

        咱們先要明確一點:每一個層有多個Feature Map,每一個Feature Map經過一種卷積濾波器提取輸入的一種特徵,而後每一個Feature Map有多個神經元。

        C1層是一個卷積層(爲何是卷積?卷積運算一個重要的特色就是,經過卷積運算,能夠使原信號特徵加強,而且下降噪音),由6個特徵圖Feature Map構成。特徵圖中每一個神經元與輸入中5*5的鄰域相連。特徵圖的大小爲28*28,這樣能防止輸入的鏈接掉到邊界以外(是爲了BP反饋時的計算,不致梯度損失,我的看法)。C1有156個可訓練參數(每一個濾波器5*5=25個unit參數和一個bias參數,一共6個濾波器,共(5*5+1)*6=156個參數),共156*(28*28)=122,304個鏈接。

       S2層是一個下采樣層(爲何是下采樣?利用圖像局部相關性的原理,對圖像進行子抽樣,能夠減小數據處理量同時保留有用信息),有6個14*14的特徵圖。特徵圖中的每一個單元與C1中相對應特徵圖的2*2鄰域相鏈接。S2層每一個單元的4個輸入相加,乘以一個可訓練參數,再加上一個可訓練偏置。結果經過sigmoid函數計算。可訓練係數和偏置控制着sigmoid函數的非線性程度。若是係數比較小,那麼運算近似於線性運算,亞採樣至關於模糊圖像。若是係數比較大,根據偏置的大小亞採樣能夠被當作是有噪聲的「或」運算或者有噪聲的「與」運算。每一個單元的2*2感覺野並不重疊,所以S2中每一個特徵圖的大小是C1中特徵圖大小的1/4(行和列各1/2)。S2層有12個可訓練參數和5880個鏈接。

圖:卷積和子採樣過程:卷積過程包括:用一個可訓練的濾波器fx去卷積一個輸入的圖像(第一階段是輸入的圖像,後面的階段就是卷積特徵map了),而後加一個偏置bx,獲得卷積層Cx。子採樣過程包括:每鄰域四個像素求和變爲一個像素,而後經過標量Wx+1加權,再增長偏置bx+1,而後經過一個sigmoid激活函數,產生一個大概縮小四倍的特徵映射圖Sx+1

       因此從一個平面到下一個平面的映射能夠看做是做卷積運算,S-層可看做是模糊濾波器,起到二次特徵提取的做用。隱層與隱層之間空間分辨率遞減,而每層所含的平面數遞增,這樣可用於檢測更多的特徵信息。

       C3層也是一個卷積層,它一樣經過5x5的卷積核去卷積層S2,而後獲得的特徵map就只有10x10個神經元,可是它有16種不一樣的卷積核,因此就存在16個特徵map了。這裏須要注意的一點是:C3中的每一個特徵map是鏈接到S2中的全部6個或者幾個特徵map的,表示本層的特徵map是上一層提取到的特徵map的不一樣組合(這個作法也並非惟一的)。(看到沒有,這裏是組合,就像以前聊到的人的視覺系統同樣,底層的結構構成上層更抽象的結構,例如邊緣構成形狀或者目標的部分)。

       剛纔說C3中每一個特徵圖由S2中全部6個或者幾個特徵map組合而成。爲何不把S2中的每一個特徵圖鏈接到每一個C3的特徵圖呢?緣由有2點。第一,不徹底的鏈接機制將鏈接的數量保持在合理的範圍內。第二,也是最重要的,其破壞了網絡的對稱性。因爲不一樣的特徵圖有不一樣的輸入,因此迫使他們抽取不一樣的特徵(但願是互補的)。

      例如,存在的一個方式是:C3的前6個特徵圖以S2中3個相鄰的特徵圖子集爲輸入。接下來6個特徵圖以S2中4個相鄰特徵圖子集爲輸入。而後的3個以不相鄰的4個特徵圖子集爲輸入。最後一個將S2中全部特徵圖爲輸入。這樣C3層有1516個可訓練參數和151600個鏈接。

       S4層是一個下采樣層,由16個5*5大小的特徵圖構成。特徵圖中的每一個單元與C3中相應特徵圖的2*2鄰域相鏈接,跟C1和S2之間的鏈接同樣。S4層有32個可訓練參數(每一個特徵圖1個因子和一個偏置)和2000個鏈接。

       C5層是一個卷積層,有120個特徵圖。每一個單元與S4層的所有16個單元的5*5鄰域相連。因爲S4層特徵圖的大小也爲5*5(同濾波器同樣),故C5特徵圖的大小爲1*1:這構成了S4和C5之間的全鏈接。之因此仍將C5標示爲卷積層而非全相聯層,是由於若是LeNet-5的輸入變大,而其餘的保持不變,那麼此時特徵圖的維數就會比1*1大。C5層有48120個可訓練鏈接。

        F6層有84個單元(之因此選這個數字的緣由來自於輸出層的設計),與C5層全相連。有10164個可訓練參數。如同經典神經網絡,F6層計算輸入向量和權重向量之間的點積,再加上一個偏置。而後將其傳遞給sigmoid函數產生單元i的一個狀態。

      最後,輸出層由歐式徑向基函數(Euclidean Radial Basis Function)單元組成,每類一個單元,每一個有84個輸入。換句話說,每一個輸出RBF單元計算輸入向量和參數向量之間的歐式距離。輸入離參數向量越遠,RBF輸出的越大。一個RBF輸出能夠被理解爲衡量輸入模式和與RBF相關聯類的一個模型的匹配程度的懲罰項。用機率術語來講,RBF輸出能夠被理解爲F6層配置空間的高斯分佈的負log-likelihood。給定一個輸入模式,損失函數應能使得F6的配置與RBF參數向量(即模式的指望分類)足夠接近。這些單元的參數是人工選取並保持固定的(至少初始時候如此)。這些參數向量的成分被設爲-1或1。雖然這些參數能夠以-1和1等機率的方式任選,或者構成一個糾錯碼,可是被設計成一個相應字符類的7*12大小(即84)的格式化圖片。這種表示對識別單獨的數字不是頗有用,可是對識別可打印ASCII集中的字符串頗有用。

      使用這種分佈編碼而非更經常使用的「1 of N」編碼用於產生輸出的另外一個緣由是,當類別比較大的時候,非分佈編碼的效果比較差。緣由是大多數時間非分佈編碼的輸出必須爲0。這使得用sigmoid單元很難實現。另外一個緣由是分類器不只用於識別字母,也用於拒絕非字母。使用分佈編碼的RBF更適合該目標。由於與sigmoid不一樣,他們在輸入空間的較好限制的區域內興奮,而非典型模式更容易落到外邊。

        RBF參數向量起着F6層目標向量的角色。須要指出這些向量的成分是+1或-1,這正好在F6 sigmoid的範圍內,所以能夠防止sigmoid函數飽和。實際上,+1和-1是sigmoid函數的最大彎曲的點處。這使得F6單元運行在最大非線性範圍內。必須避免sigmoid函數的飽和,由於這將會致使損失函數較慢的收斂和病態問題。

5)訓練過程

        神經網絡用於模式識別的主流是有指導學習網絡,無指導學習網絡更多的是用於聚類分析。對於有指導的模式識別,因爲任同樣本的類別是已知的,樣本在空間的分佈再也不是依據其天然分佈傾向來劃分,而是要根據同類樣本在空間的分佈及不一樣類樣本之間的分離程度找一種適當的空間劃分方法,或者找到一個分類邊界,使得不一樣類樣本分別位於不一樣的區域內。這就須要一個長時間且複雜的學習過程,不斷調整用以劃分樣本空間的分類邊界的位置,使盡量少的樣本被劃分到非同類區域中。

       卷積網絡在本質上是一種輸入到輸出的映射,它可以學習大量的輸入與輸出之間的映射關係,而不須要任何輸入和輸出之間的精確的數學表達式,只要用已知的模式對卷積網絡加以訓練,網絡就具備輸入輸出對之間的映射能力。卷積網絡執行的是有導師訓練,因此其樣本集是由形如:(輸入向量,理想輸出向量)的向量對構成的。全部這些向量對,都應該是來源於網絡即將模擬的系統的實際「運行」結果。它們能夠是從實際運行系統中採集來的。在開始訓練前,全部的權都應該用一些不一樣的小隨機數進行初始化。「小隨機數」用來保證網絡不會因權值過大而進入飽和狀態,從而致使訓練失敗;「不一樣」用來保證網絡能夠正常地學習。實際上,若是用相同的數去初始化權矩陣,則網絡無能力學習。

       訓練算法與傳統的BP算法差很少。主要包括4步,這4步被分爲兩個階段:

第一階段,向前傳播階段:

a)從樣本集中取一個樣本(X,Yp),將X輸入網絡;

b)計算相應的實際輸出Op

      在此階段,信息從輸入層通過逐級的變換,傳送到輸出層。這個過程也是網絡在完成訓練後正常運行時執行的過程。在此過程當中,網絡執行的是計算(實際上就是輸入與每層的權值矩陣相點乘,獲得最後的輸出結果):

          Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n)

第二階段,向後傳播階段

a)算實際輸出Op與相應的理想輸出Yp的差;

b)按極小化偏差的方法反向傳播調整權矩陣。

6)卷積神經網絡的優勢

        卷積神經網絡CNN主要用來識別位移、縮放及其餘形式扭曲不變性的二維圖形。因爲CNN的特徵檢測層經過訓練數據進行學習,因此在使用CNN時,避免了顯式的特徵抽取,而隱式地從訓練數據中進行學習;再者因爲同一特徵映射面上的神經元權值相同,因此網絡能夠並行學習,這也是卷積網絡相對於神經元彼此相連網絡的一大優點。卷積神經網絡以其局部權值共享的特殊結構在語音識別和圖像處理方面有着獨特的優越性,其佈局更接近於實際的生物神經網絡,權值共享下降了網絡的複雜性,特別是多維輸入向量的圖像能夠直接輸入網絡這一特色避免了特徵提取和分類過程當中數據重建的複雜度。

        流的分類方式幾乎都是基於統計特徵的,這就意味着在進行分辨前必須提取某些特徵。然而,顯式的特徵提取並不容易,在一些應用問題中也並不是老是可靠的。卷積神經網絡,它避免了顯式的特徵取樣,隱式地從訓練數據中進行學習。這使得卷積神經網絡明顯有別於其餘基於神經網絡的分類器,經過結構重組和減小權值將特徵提取功能融合進多層感知器。它能夠直接處理灰度圖片,可以直接用於處理基於圖像的分類。

       卷積網絡較通常神經網絡在圖像處理方面有以下優勢: a)輸入圖像和網絡的拓撲結構能很好的吻合;b)特徵提取和模式分類同時進行,並同時在訓練中產生;c)權重共享能夠減小網絡的訓練參數,使神經網絡結構變得更簡單,適應性更強。

7)小結

       CNNs中這種層間聯繫和空域信息的緊密關係,使其適於圖像處理和理解。並且,其在自動提取圖像的顯著特徵方面還表現出了比較優的性能。在一些例子當中,Gabor濾波器已經被使用在一個初始化預處理的步驟中,以達到模擬人類視覺系統對視覺刺激的響應。在目前大部分的工做中,研究者將CNNs應用到了多種機器學習問題中,包括人臉識別,文檔分析和語言檢測等。爲了達到尋找視頻中幀與幀之間的相干性的目的,目前CNNs經過一個時間相干性去訓練,但這個不是CNNs特有的。

        呵呵,這部分講得太囉嗦了,又沒講到點上。沒辦法了,先這樣的,這樣這個過程我尚未走過,因此本身水平有限啊,望各位明察。須要後面再改了,呵呵。

10、總結與展望

1)Deep learning總結

      深度學習是關於自動學習要建模的數據的潛在(隱含)分佈的多層(複雜)表達的算法。換句話來講,深度學習算法自動的提取分類須要的低層次或者高層次特徵。高層次特徵,一是指該特徵能夠分級(層次)地依賴其餘特徵,例如:對於機器視覺,深度學習算法從原始圖像去學習獲得它的一個低層次表達,例如邊緣檢測器,小波濾波器等,而後在這些低層次表達的基礎上再創建表達,例如這些低層次表達的線性或者非線性組合,而後重複這個過程,最後獲得一個高層次的表達。

       Deep learning可以獲得更好地表示數據的feature,同時因爲模型的層次、參數不少,capacity足夠,所以,模型有能力表示大規模數據,因此對於圖像、語音這種特徵不明顯(須要手工設計且不少沒有直觀物理含義)的問題,可以在大規模訓練數據上取得更好的效果。此外,從模式識別特徵和分類器的角度,deep learning框架將feature和分類器結合到一個框架中,用數據去學習feature,在使用中減小了手工設計feature的巨大工做量(這是目前工業界工程師付出努力最多的方面),所以,不只僅效果能夠更好,並且,使用起來也有不少方便之處,所以,是十分值得關注的一套框架,每一個作ML的人都應該關注瞭解一下。

       固然,deep learning自己也不是完美的,也不是解決世間任何ML問題的利器,不該該被放大到一個無所不能的程度。

2)Deep learning將來

       深度學習目前仍有大量工做須要研究。目前的關注點仍是從機器學習的領域借鑑一些能夠在深度學習使用的方法,特別是降維領域。例如:目前一個工做就是稀疏編碼,經過壓縮感知理論對高維數據進行降維,使得很是少的元素的向量就能夠精確的表明原來的高維信號。另外一個例子就是半監督流行學習,經過測量訓練樣本的類似性,將高維數據的這種類似性投影到低維空間。另一個比較鼓舞人心的方向就是evolutionary programming approaches(遺傳編程方法),它能夠經過最小化工程能量去進行概念性自適應學習和改變核心架構。

Deep learning還有不少核心的問題須要解決:

(1)對於一個特定的框架,對於多少維的輸入它能夠表現得較優(若是是圖像,多是上百萬維)?

(2)對捕捉短時或者長時間的時間依賴,哪一種架構纔是有效的?

(3)如何對於一個給定的深度學習架構,融合多種感知的信息?

(4)有什麼正確的機理能夠去加強一個給定的深度學習架構,以改進其魯棒性和對扭曲和數據丟失的不變性?

(5)模型方面是否有其餘更爲有效且有理論依據的深度模型學習算法?

       探索新的特徵提取模型是值得深刻研究的內容。此外有效的可並行訓練算法也是值得研究的一個方向。當前基於最小批處理的隨機梯度優化算法很難在多計算機中進行並行訓練。一般辦法是利用圖形處理單元加速學習過程。然而單個機器GPU對大規模數據識別或類似任務數據集並不適用。在深度學習應用拓展方面,如何合理充分利用深度學習在加強傳統學習算法的性能還是目前各領域的研究重點。

 

11、參考文獻和Deep Learning學習資源(持續更新……)

       先是機器學習領域大牛的微博:@餘凱_西二旗民工;@老師木;@梁斌penny;@張棟_機器學習;@鄧侃;@大數據皮東;@djvu9……

(1)Deep Learning

http://deeplearning.net/

(2)Deep Learning Methods for Vision

http://cs.nyu.edu/~fergus/tutorials/deep_learning_cvpr12/

(3)Neural Network for Recognition of Handwritten Digits[Project]

http://www.codeproject.com/Articles/16650/Neural-Network-for-Recognition-of-Handwritten-Digi

(4)Training a deep autoencoder or a classifier on MNIST digits

http://www.cs.toronto.edu/~hinton/MatlabForSciencePaper.html

(5)Ersatz:deep neural networks in the cloud

http://www.ersatz1.com/

(6)Deep Learning

http://www.cs.nyu.edu/~yann/research/deep/

(7)Invited talk "A Tutorial on Deep Learning" by Dr. Kai Yu (餘凱)

http://vipl.ict.ac.cn/News/academic-report-tutorial-deep-learning-dr-kai-yu

(8)CNN - Convolutional neural network class

http://www.mathworks.cn/matlabcentral/fileexchange/24291

(9)Yann LeCun's Publications

http://yann.lecun.com/exdb/publis/index.html#lecun-98

(10) LeNet-5, convolutional neural networks

http://yann.lecun.com/exdb/lenet/index.html

(11) Deep Learning 大牛Geoffrey E. Hinton's HomePage

http://www.cs.toronto.edu/~hinton/

(12)Sparse coding simulation software[Project]

http://redwood.berkeley.edu/bruno/sparsenet/

(13)Andrew Ng's homepage

http://robotics.stanford.edu/~ang/

(14)stanford deep learning tutorial

http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial

(15)「深度神經網絡」(deep neural network)具體是怎樣工做的

http://www.zhihu.com/question/19833708?group_id=15019075#1657279

(16)A shallow understanding on deep learning

http://blog.sina.com.cn/s/blog_6ae183910101dw2z.html

(17)Bengio's Learning Deep Architectures for AI

 http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf

(18)andrew ng's talk video:

http://techtalks.tv/talks/machine-learning-and-ai-via-brain-simulations/57862/

(19)cvpr 2012 tutorial:

http://cs.nyu.edu/~fergus/tutorials/deep_learning_cvpr12/tutorial_p2_nnets_ranzato_short.pdf

(20)Andrew ng清華報告聽後感

http://blog.sina.com.cn/s/blog_593af2a70101bqyo.html

(21)Kai Yu:CVPR12 Tutorial on Deep Learning Sparse Coding

(22)Honglak Lee:Deep Learning Methods for Vision

(23)Andrew Ng :Machine Learning and AI via Brain simulations

(24)Deep Learning 【2,3】

http://blog.sina.com.cn/s/blog_46d0a3930101gs5h.html

(25)deep learning這件小事……

http://blog.sina.com.cn/s/blog_67fcf49e0101etab.html

(26)Yoshua Bengio, U. Montreal:Learning Deep Architectures

(27)Kai Yu:A Tutorial on Deep Learning

(28)Marc'Aurelio Ranzato:NEURAL NETS FOR VISION

(29)Unsupervised feature learning and deep learning

http://blog.csdn.net/abcjennifer/article/details/7804962

(30)機器學習前沿熱點–Deep Learning

http://elevencitys.com/?p=1854

(31)機器學習——深度學習(Deep Learning)

http://blog.csdn.net/abcjennifer/article/details/7826917

(32)卷積神經網絡

http://wenku.baidu.com/view/cd16fb8302d276a200292e22.html

(33)淺談Deep Learning的基本思想和方法

http://blog.csdn.net/xianlingmao/article/details/8478562

(34)深度神經網絡

http://blog.csdn.net/txdb/article/details/6766373

(35)Google的貓臉識別:人工智能的新突破

http://www.36kr.com/p/122132.html

(36)餘凱,深度學習-機器學習的新浪潮,Technical News程序天下事

http://blog.csdn.net/datoubo/article/details/8577366

(37)Geoffrey Hinton:UCLTutorial on: Deep Belief Nets

(38)Learning Deep Boltzmann Machines

http://web.mit.edu/~rsalakhu/www/DBM.html

(39)Efficient Sparse Coding Algorithm

http://blog.sina.com.cn/s/blog_62af19190100gux1.html

(40)Itamar Arel, Derek C. Rose, and Thomas P. Karnowski: Deep Machine Learning—A New Frontier in Artificial Intelligence Research

(41)Francis Quintal Lauzon:An introduction to deep learning

(42)Tutorial on Deep Learning and Applications

(43)Boltzmann神經網絡模型與學習算法

http://wenku.baidu.com/view/490dcf748e9951e79b892785.html

(44)Deep Learning 和 Knowledge Graph 引爆大數據革命

http://blog.sina.com.cn/s/blog_46d0a3930101fswl.html

(45)……

相關文章
相關標籤/搜索