論文筆記:Deep Learning [nature review by Lecun, Bengio, & Hinton]
如今,機器學習的技術在我們的生活中扮演着越來越重要的角色。從搜索引擎到推薦系統,從圖像識別到語音識別。而這些應用都開始逐漸使用一類叫做深度學習(Deep Learning)的技術。
傳統機器學習算法的局限性在於,它們往往很難處理那些未被加工過的自然數據(natural data),例如一張原始的RGB圖像。因此,構建一個傳統的機器學習系統,往往需要一些有經驗的工程師設計一個特征提取器,將原始數據轉化成機器能識別的feature representation。
有一類叫做representation learning的算法可以實現讓機器自發地從輸入的原始數據中發現那些有用的feature。Deep Learning正是這樣的一類算法。
下面是Lecun等人給出的Deep Learning的正式定義:
Deep-learning methods are representation-learning methods with multiple levels of representation, obtained by composing simple but non-linear modules that each transform the representation at one level (starting with the raw input) into a representation at a higher, slightly more abstract level.
從這段話中可以看出,Deep Learning有三個核心的要素:
- a kind of representation learning methods
深度學習的精髓在於,各個layer上的特征不是由人類工程師設計的,而是通過一類general-purpose的learning procedure從數據中主動地習得。 - with multiple levels of representation from raw to abstract
以圖片為例,原始數據只是一些毫無意義的像素點構成的矩陣。而深度學習學習到的第一層特征能夠檢測圖片中是否存在指向某個方向的線條;更高層的特征則通過組合低層級的特征,在更抽象的水平上——例如特定的花紋——進行檢測。 - non-linear transformation of representation
理論上,通過組合足夠數量的非線性變換,可以對任意函數進行擬合。
可見,Deep Learning非常擅長於挖掘高維數據中的內在結構,也因此在很多領域上取得了令人驚異的成果。
有監督學習
Supervised learning,有監督學習,是機器學習一種常見的形式。它的任務是訓練一個模型,使其能在給定的輸入下,輸出預期的value。為此,我們需要一個error function來計算輸出值與期望值的誤差,並通過調節模型內部的參數來減小這個誤差。梯度下降(Gradient Descent)和隨機梯度下降(SGD)是兩種常見的參數調節的算法。
目前,針對有監督學習問題,大部分機器學習系統都是在人工挑選的feature上運行一個線性分類器。然而,線性分類器的缺陷在於,它只能將輸入空間划分為一些簡單的region,因此在諸如圖像識別和語言識別的問題上往往無能為力(這些問題需要模型對一些特定特征的微小變化極其敏感,而對不相關特征的變化極不敏感)。例如,在像素層面上,同一只Samoyed在不同背景下的兩張圖片的差別很大,而相同背景下的Samoyed和Wolf的圖片差異卻很小。這對於傳統的線性分類器,或是任一個淺層(Shallow)分類器,想在區分后一組圖片中的Samoyed和Wolf的同時,把前一組圖片中的Samoyed放在同一個類別下,幾乎是一個impossible mission。這也被稱之為selectivity–invariance dilemma:我們需要一組特征,它們能夠選擇性地響應圖片中的重要部分,而對圖片中不重要部分的變化保持不變性。
這一問題傳統的解決方案是人工設計一些特征提取器。然而,借助Deep Learning,我們有希望從數據中自發地學習到這些特征。
反向傳播算法
我們可以用隨機梯度下降算法(SGD)來訓練一個multilayer networks的模型。這一算法也被稱之為反向傳播算法(Backpropagation)。該算法的背后不過是微積分第一堂課里就學到的鏈式求導法則。我們將誤差函數對layer中一個模塊的輸入的偏導,表示成該誤差函數對下一層layer的輸入的偏導的函數,並在此基礎上求出模型參數的梯度。
前向反饋神經網絡(feedforwrad neural network)正是這樣一個multilayer network。許多深度學習的模型都采用了與之類似的網絡結構。在前向傳播的過程中,每一層神經元都對上一層神經元的輸出進行加權求和,並通過一個非線性的變換傳遞給下一層神經元。目前在深度學習網絡中被廣泛使用的非線性變換是ReLU(rectified linear unit):\(f(z)=max(z,0)\)。與傳統的平滑非線性變換(\(tanh(z)\)或logistic函數)相比,ReLU的學習速度更快。通過每一個隱藏層上對輸入空間的非線性變換,我們最終得到了一個線性可分的特征空間。
然而,在上個世紀90年代末期,神經網絡的發展遇到了極大的阻礙。人們認為,梯度下降算法會使得模型很容易陷入一些遠離真實值的局部最優解。事實上,近期的一些研究表明,這些最優解大都是分布在誤差空間上的鞍點;它們有着相近的誤差函數值。因此,我們並不需要關心算法最終落到了哪個最優解上。
深度神經網絡的復興發生在2006年。CIFAR的一批研究者提出了一種逐層訓練的無監督學習算法;每一個隱藏層上的神經元都試圖去重構上一層神經元習得的特征,從而學習到更高級的特征表達。最終,通過一個輸出層的反向傳播過程來對模型的參數進行微調,得到一個有監督的學習模型。
卷積神經網絡
與全連接的前向反饋神經網絡相比,卷積神經網絡(Convolutional Neural Networks)更加易於訓練。事實上,當整個神經網絡的研究都處於低谷的時候,CNN卻獨樹一幟,在解決許多實際的問題中都有着不俗的表現。最近幾年,CNN更在計算機視覺(CV)領域中得到廣泛的應用。
CNN一般被用於處理multiple arrays形式的數據輸入。例如一段文本(1D array);一張圖像(2D array);或是一段視頻(3D array)。CNN之所以能夠有效的處理這些原生態的數據,離不開它的四個核心要素:
- 局部連接(local connections)
- 共享權重(shared weights)
- 池化(pooling)
- 多層網絡結構(multiple layers)
下圖是一個卷積神經網絡的典型結構,主要由兩種類型的layer構成:卷積層(convolutional layer)和池化層(pooling layer)。
卷積層由多個feature maps構成(類似原始輸入數據里的通道),每一個feature maps里的神經元都通過一組權重(filter bank)與前一層所有feature maps里的部分神經元相連(local connection),並對前一層相連神經元的輸出加權求和,傳遞給一個非線性的變換器(通常是ReLU)。值得注意的是,同一個feature map里的神經元共享同一個filter bank;不同feature maps之間的filter bank並不相同(shared weights)。這么做出於兩點考慮:1. 在列狀數據(array data)中,相鄰的數據點一般是高度相關的;局域的連接更有利於特征的檢測;2. 這種局域的統計特征往往與位置無關,從而使得不同位置的神經元可以通過共享權重檢測同一個特征。數學上,一個feature map對輸入特征的操作,等效於一個離散的卷積過程。這也是卷積神經網絡名字的由來。
卷積層的作用是組合上一層的局域特征並進行檢測;而池化層的作用是將檢測到的距離相近的特征合並為一,從而降低特征相對位置的變化對最終結果的影響。一種常見的池化操作是maximum pooling,它對一個local patch里的神經元的狀態取最大值並輸出。池化操作可以有效地降低特征的維度,並增強模型的泛化能力。
將2-3個由卷積層、非線性變換、和池化層構成的stage堆疊在一起,與一個全連接的輸出層相連,就組成了一個完整的卷積神經網絡。反向傳播算法依然可被用來訓練這個網絡中的連接權重。
同許多深度神經網絡一樣,卷積神經網絡成功地利用了自然信號中內在的層級結構屬性:高層級的特征由低層級的特征組成。例如,一張圖片中的物體可以拆分成各個組件;每個組件又可以進一步拆分成一些基本的圖案;而每個基本的圖案又是由更基本的線條組成。
Image Understanding與深度卷積網絡
雖然早在2000年,卷積神經網絡在圖像識別的領域中就已經取得了不錯的成績;然而直到2012年的ImageNet比賽后,CNN才被計算機視覺和機器學習的主流科學家們所接受。CNN的崛起依賴於四個因素:GPU的高性能計算;ReLU的提出;一種叫做dropout的正則化技術;和一種對已有數據進行變形以生成更多的訓練樣本的技術。一個深度卷積神經網絡通常有10-20個卷積層,數億的權重和連接。得益於計算硬件和並行計算的高速發展,使得深度卷積神經網絡的訓練成為了可能。如今,深度CNN帶來了計算機視覺領域的一場革命,被廣泛應用於幾乎所有與圖像識別有關的任務中(例如無人車的自動駕駛)。最近的一項研究表明,如果將深度CNN學習到的高維特征與RNN結合在一起,甚至可以教會計算機“理解”圖片里的內容。
Distributed Representation與自然語言處理
深度學習理論指出,與傳統的淺層學習模型相比,深度學習網絡有兩個指數級的優勢:
- 分布式的特征表達(distributed representation)使得模型的泛化空間成指數倍的增長(即便是訓練空間中未出現的樣本也可以通過分布式特征組合出來);
- 層級結構的特征表達在深度上加速了這種指數倍的增長。
下面以深度神經網絡在自然語言處理中的一個應用,來解釋distributed representation的概念。
假設我們需要訓練一個深度神經網絡來預測一段文本序列的下一個單詞。我們用一個one-of-N的0-1向量來表示上下文中出現的單詞。神經網絡將首先通過一個embedding層為每一個輸入的0-1向量生成一個word vector,並通過剩下的隱藏層將這些word vector轉化為目標單詞的word vector。這里的word vector就是一種distributed representation。向量中的每一個元素都對應着原始單詞的某一個語義特征。這些特征互不排斥,共同表達了原始文本里的單詞。要注意的是,這些語義特征即非顯式地存在於原始的輸入數據中,也非由專家事先指定,而是通過神經網絡從輸入輸出的結構聯系中自動挖掘出來。因此,對於我們的單詞預測問題,模型學習到的word vector可以很好地表示兩個單詞在語義上的相似度(例如,在這個問題下,Tuesday和Wednesday這兩個單詞給出的word vector相似度就很高)。而傳統的統計語言模型就很難做到這一點(它們通常是把單詞作為一個不可分的最小單元)。
如今,這種從文本中學習word vector的技術被廣泛應用於各種自然語言處理的問題中。
遞歸神經網絡
遞歸神經網絡(Recurrent Neural Network)通常用於處理一些序列的輸入(例如語音或文本)。它的基本思想是,一次只處理輸入序列中的一個元素,但在hidden units中維護一個狀態向量,隱式地編碼之前輸入的歷史信息。如果我們將不同時刻的隱藏單元在空間上展開,就得到了一個(時間)深度網絡。顯然,我們可以在這個深度網絡上運用反向傳播算法來訓練一個RNN模型。
在RNN模型中,每一個時刻的狀態向量\(s_t\)都由上一時刻的狀態向量\(s_{t-1}\)和當前時刻的輸入\(x_t\)所決定。通過這種遞歸的方式,RNN將每一時刻的輸入\(x_t\)都映射為一個依賴其歷史所有輸入的輸出\(o_t\)。注意,模型中的參數(\(U,V,W\))是與序列時刻無關的權重。
RNN在自然語言處理上有很多應用。例如,可以訓練一個RNN模型,將一段英文“編碼”成一個語義向量,再訓練另一個RNN模型,將語義向量“解碼”成一段法文。這就實現了一個基於深度學習的翻譯系統。除此之外,在“編碼”階段,我們還可以用一個深度卷積網絡將一張原始的圖片轉化為高級的語義特征,並在此基礎上訓練一個RNN“解碼器”,就可以實現“看圖說話”的功能。
盡管RNN設計的初衷是為了學習長記憶依賴,然而一些理論和實驗的研究表明,“it is difficult to learn to store information for very long”。為此,人們提出了long short-term memory(LSTM)模型。LSTM模型通過在RNN模型的基礎上引入一些特殊的中間神經元(門變量)來控制長短期記憶的均衡,被證明要比傳統的RNN模型更加高效和強大。
還有一類模型是通過引入一個記憶存儲單元來增強RNN模型的記憶能力。Neural Turing Machine和memory networks就是這一類模型。它們在處理一些知識問答的推斷系統中被證明十分有效。
Deep Learning的未來
-
無監督學習:可以說,正是對無監督學習的研究才催化了深度學習的復興。然而,如今無監督學習似乎已被有監督學習的巨大光芒所掩蓋。考慮到人和動物大部分是通過無監督的學習來了解這個世界,長期來看,對無監督學習的研究將會愈發的重要。
-
深度學習與強化學習的結合:在CNN和RNN的基礎上,結合Reinforcement Learning讓計算機學會進一步的決策。這方面的研究雖尚處於萌芽,但已有一些不俗的表現。例如前段時間的AlphaGo。
-
自然語言的理解。雖然RNN已被廣泛應用於自然語言處理,然而在教會機器理解自然語言的目標上,還有很長的一段路要走。
-
特征學習和特征推斷的結合。這或許會極大地推動人工智能的發展