林軒田機器學習技法課程學習筆記13 — Deep Learning

红色石头發表於2018-07-29

上節課我們主要介紹了神經網路Neural Network。神經網路是由一層一層的神經元構成,其作用就是幫助提取原始資料中的模式即特徵,簡稱為pattern feature extraction。神經網路模型的關鍵是計算出每個神經元的權重,方法就是使用Backpropagation演算法,利用GD/SGD,得到每個權重的最優解。本節課我們將繼續對神經網路進行深入研究,並介紹層數更多、神經元個數更多、模型更復雜的神經網路模型,即深度學習模型。

1. Deep Neural Network

總的來說,根據神經網路模型的層數、神經元個數、模型複雜度不同,大致可分為兩類:Shallow Neural Networks和Deep Neural Networks。上節課介紹的神經網路模型層數較少,屬於Shallow Neural Networks,而本節課將著重介紹Deep Neural Networks。首先,比較一下二者之間的優缺點有哪些:

值得一提的是,近些年來,deep learning越來越火,尤其在電腦視覺和語音識別等領域都有非常廣泛的應用。原因在於一層一層的神經網路有助於提取影像或者語音的一些物理特徵,即pattern feature extraction,從而幫助人們掌握這些問題的本質,建立準確的模型。

下面舉個例子,來看一下深度學習是如何提取出問題潛在的特徵從而建立準確的模型的。如下圖所示,這是一個手寫識別的問題,簡單地識別數字1和數字5。

如何進行準確的手寫識別呢?我們可以將寫上數字的圖片分解提取出一塊一塊不同部位的特徵。例如左邊三幅圖每張圖代表了數字1的某個部位的特徵,三幅圖片組合起來就是完整的數字1。右邊四幅圖也是一樣,每張圖代表了數字5的某個部位的特徵,五幅圖組合起來就是完整的數字5。對計算機來說,圖片由許多畫素點組成。要達到識別的目的,每層神經網路從原始畫素中提取出更復雜的特徵,再由這些特徵對圖片內容進行匹配和識別。層數越多,提取特徵的個數和深度就越大,同時解決複雜問題的能量就越強,其中每一層都具有相應的物理意義。以上就是深度學習的作用和意義。

深度學習很強大,同時它也面臨很多挑戰和困難:

  • difficult structural decisions
  • high model complexity

  • hard optimization problem

  • huge computational complexity

面對以上深度學習的4個困難,有相應的技術和解決的辦法:

其中,最關鍵的技術就是regularization和initialization。

深度學習中,權重的初始化選擇很重要,好的初始值能夠幫助避免出現區域性最優解的出現。常用的方法就是pre-train,即先權重進行初始值的選擇,選擇之後再使用backprop演算法訓練模型,得到最佳的權重值。在接下來的部分,我們將重點研究pre-training的方法。

2. Autoencoder

我們已經介紹了深度學習的架構,那麼從演算法模型上來說,如何進行pre-training,得到較好的權重初始值呢?首先,我們來看看,權重是什麼?神經網路模型中,權重代表了特徵轉換(feature transform)。從另一個方面也可以說,權重表示一種編碼(encoding),就是把資料編碼成另外一些資料來表示。因為神經網路是一層一層進行的,有先後順序,所以就單一層來看,好的權重初始值應該是儘可能地包含了該層輸入資料的所有特徵,即類似於information-preserving encoding。也就是說,能夠把第i層的輸入資料的特徵傳輸到第i+1層,再把第i+1層的輸入資料的特徵傳輸到第i+2層,一層一層進行下去。這樣,每層的權重初始值起到了對該層輸入資料的編碼作用,能夠最大限度地保持其特徵。

舉個例子,上一小節我們講了簡單的手寫識別的例子。從原始的一張畫素圖片轉換到分解的不同筆畫特徵,那麼反過來,這幾個筆畫特徵也可以組合成原來的數字。這種可逆的轉換被稱為information-preserving,即轉換後的特徵保留了原輸入的特徵,而且轉換是可逆的。這正是pre-train希望做到的,通過encoding將輸入轉換為一些特徵,而這些特徵又可以復原原輸入x,實現information-preserving。所以,pre-training得到的權重初始值就應該滿足這樣的information-preserving特性。

如何在pre-training中得到這樣的權重初始值(即轉換特徵)呢?方法是建立一個簡單的三層神經網路(一個輸入層、一個隱藏層、一個輸出層),如下圖所示。

該神經網路中,輸入層是原始資料(即待pre-training的資料),經過權重W_{ij}^{(1)}得到隱藏層的輸出為原始資料新的表達方式(即轉換特徵)。這些轉換特徵再經過權重W_{ji}^{(2)}得到輸出層,輸出層的結果要求跟原始資料類似,即輸入層和輸出層是近似相等的。整個網路是d-\breve{d}-d NNet結構。其核心在於“重構性”,從輸入層到隱藏層實現特徵轉換,從隱藏層到輸出層實現重構,滿足上文所說的information-preserving的特性。這種結構的神經網路我們稱之為autoencoder,輸入層到隱藏層對應編碼,而隱藏層到輸出層對應解碼。其中,W_{ij}^{(1)}表示編碼權重,而W_{ji}^{(2)}表示解碼權重。整個過程類似於在學習如何近似逼近identity function。

那麼為什麼要使用這樣的結構來逼近identity function,有什麼好處呢?首先對於監督式學習(supervised learning),這種d-\breve{d}-d的NNet結構中含有隱藏層。隱藏層的輸出實際上就是對原始資料合理的特徵轉換\phi(x),例如手寫識別中隱藏層分解的各個筆畫,包含了有用的資訊。這樣就可以從資料中學習得到一些有用的具有代表性的資訊。然後,對於非監督式學習(unsupervised learning),autoencoder也可以用來做density estimation。如果網路最終的輸出g(x)\approx x,則表示密度較大;如果g(x)與x相差甚遠,則表示密度較小。也就是說可以根據g(x)與x的接近程度來估計測試資料是落在密度較大的地方還是密度較小的地方。這種方法同樣適用於outlier detection,異常檢測。這樣就可以從資料中學習得到一些典型的具有代表性的資訊,找出哪些是典型資料,哪些不是典型資料。所以說,通過autoencoder不斷逼近identity function,對監督式學習和非監督式學習都具有深刻的物理意義和非常廣泛的應用。

其實,對於autoencoder來說,我們更關心的是網路中間隱藏層,即原始資料的特徵轉換以及特徵轉換的編碼權重W_{ij}^{(1)}

Basic Autoencoder一般採用d-\breve{d}-d的NNet結構,對應的error function是squared error,即\sum_{i=1}^d(g_i(x)-x_i)^2

basic autoencoder在結構上比較簡單,只有三層網路,容易訓練和優化。各層之間的神經元數量上,通常限定\breve d,便於資料編碼。資料集可表示為:{(x_1,y_1=x_1),(x_2,y_2=x_2),\cdots,(x_N,y_N=x_N)},即輸入輸出都是x,可以看成是非監督式學習。一個重要的限制條件是W_{ij}^{(1)}=W_{ji}^{(2)},即編碼權重與解碼權重相同。這起到了regularization的作用,但是會讓計算複雜一些。

以上就是basic autoencoder的結構和一些限定條件。深度學習中,basic autoencoder的過程也就對應著pre-training的過程,使用這種方法,對無label的原始資料進行編碼和解碼,得到的編碼權重W_{ij}^{(1)}就可以作為pre-trained的比較不錯的初始化權重,也就是作為深度學習中層與層之間的初始化權重。

我們在本節課第一部分就說了深度學習中非常重要的一步就是pre-training,即權重初始化,而autoencoder可以作為pre-training的一個合理方法。Pre-training的整個過程是:首先,autoencoder會對深度學習網路第一層(即原始輸入)進行編碼和解碼,得到編碼權重W_{ij}^{(1)},作為網路第一層到第二層的的初始化權重;然後再對網路第二層進行編碼和解碼,得到編碼權重W_{ij}^{(1)},作為網路第二層到第三層的初始化權重,以此類推,直到深度學習網路中所有層與層之間都得到初始化權重。值得注意的是,對於l-1層的網路{x_n^{(l-1)}},autoencoder中的\breve d應與下一層(即l層)的神經元個數相同。

當然,除了basic autoencoder之外還有許多其它表現不錯的pre-training方法。這些方法大都採用不同的結構和正則化技巧來得到不同的’fancier’ autoencoders,這裡不再贅述。

3. Denoising Autoencoder

上一部分,我們使用autoencoder解決了deep learning中pre-training的問題。接下來,我們將討論deep learning中有什麼樣的regularization方式來控制模型的複雜度。

由於深度學習網路中神經元和權重的個數非常多,相應的模型複雜度就會很大,因此,regularization非常必要。之前我門也介紹過一些regularization的方法,包括:

  • structural decisions/constraints
  • weight decay or weight elimination regularizers

  • early stopping

下面我們將介紹另外一種regularization的方式,它在deep learning和autoencoder中都有很好的效果。

首先我們來複習一下之前介紹的overfitting產生的原因有哪些。如下圖所示,我們知道overfitting與樣本數量、噪聲大小都有關係,資料量減少或者noise增大都會造成overfitting。如果資料量是固定的,那麼noise的影響就非常大,此時,實現regularization的一個方法就是消除noise的影響。

去除noise的一個簡單方法就是對資料進行cleaning/pruning的操作。但是,這種方法通常比較麻煩,費時費力。此處,有一種比較“瘋狂”的方法,就是往資料中新增一些noise。注意是新增noise!下面我們來解釋這樣做到底有什麼作用。

這種做法的idea來自於如何建立一個健壯(robust)的autoencoder。在autoencoder中,編碼解碼後的輸出g(x)會非常接近真實樣本值x。此時,如果對原始輸入加入一些noise,對於健壯的autoencoder,編碼解碼後的輸出g(x)同樣會與真實樣本值x很接近。舉個例子,手寫識別中,通常情況下,寫的很規範的數字1經過autoencoder後能夠復原為數字1。如果原始圖片數字1歪斜或加入噪聲,經過autoencoder後應該仍然能夠解碼為數字1。這表明該autoencoder是robust的,一定程度上起到了抗噪聲和regularization的作用,這正是我們希望看到的。

所以,這就引出了denoising autoencoder的概念。denoising autoencoder不僅能實現編碼和解碼的功能,還能起到去噪聲、抗干擾的效果,即輸入一些混入noise的資料,經過autoencoder之後能夠得到較純淨的資料。這樣,autoencoder的樣本集為:

(\breve{x}_1,y_1=x_1),(\breve{x}_2,y_2=x_2),\cdots,(\breve{x}_N,y_N=x_N)

其中\breve{x}_n=x_n+noise,為混入噪聲的樣本,而x_n為純淨樣本。

autoencoder訓練的目的就是讓\breve{x}_n經過編碼解碼後能夠復原為純淨的樣本x_n。那麼,在deep learning的pre-training中,如果使用這種denoising autoencoder,不僅能從純淨的樣本中編解碼得到純淨的樣本,還能從混入noise的樣本中編解碼得到純淨的樣本。這樣得到的權重初始值更好,因為它具有更好的抗噪聲能力,即健壯性好。實際應用中,denoising autoencoder非常有用,在訓練過程中,輸入混入人工noise,輸出純淨訊號,讓模型本身具有抗噪聲的效果,讓模型健壯性更強,最關鍵的是起到了regularization的作用。

4. Principal Component Analysis

剛剛我們介紹的autoencoder是非線性的,因為其神經網路模型中包含了tanh()函式。這部分我們將介紹linear autoencoder。nonlinear autoencoder通常比較複雜,多應用於深度學習中;而linear autoencoder通常比較簡單,我們熟知的主成分分析(Principal Component Analysis,PCA),其實跟linear autoencoder有很大的關係。

對於一個linear autoencoder,它的第k層輸出不包含tanh()函式,可表示為:

h_k(x)=\sum_{j=0}^{\breve{d}}w_{jk}^{(2)}(\sum_{i=0}^dw_{ij}^{(1)}x_i)

其中,w_{ij}^{(1)}w_{jk}^{(2)}分別是編碼權重和解碼權重。而且,有三個限制條件,分別是:

  • 移除常數項x_0,讓輸入輸出維度一致
  • 編碼權重與解碼權重一致:w_{ij}^{(1)}=w_{jk}^{(2)}=w_{ij}

  • \breve{d}

這樣,編碼權重用W表示,維度是d x \breve{d},解碼權重用W^T表示。x的維度為d x 1。則linear autoencoder hypothesis可經過下式計算得到:

h(x)=WW^Tx

其實,linear autoencoder hypothesis就應該近似於原始輸入x的值,即h(x)=x。根據這個,我們可以寫出它的error function:

我們的目的是計算出E_{in}(h)最小化時對應的W。根據線性代數知識,首先進行特徵值分解:

WW^T=V\Gamma V^T

其中WW^T是半正定矩陣。V矩陣滿足VV^T=V^TV=I_d\Gamma是對角矩陣,對角線上有不超過\breve{d}個非零值(即為1),即對角線零值個數大於等於d-\breve(d)。根據特徵值分解的思想,我們可以把x_n進行類似分解:

x_n=VIV^Tx_n

其中,I是單位矩陣,維度為dxd。這樣,通過特徵值分解我們就把對W的優化問題轉換成對\Gamma和V的優化問題。

首先,我們來優化\Gamma值,表示式如下:

要求上式的最小化,可以轉化為(I-\Gamma)越小越好,其結果對角線上零值越多越好,即I與\Gamma越接近越好。因為\Gamma的秩是小於等於\breve{d}的,\Gamma最多有\breve{d}個1。所以,\Gamma的最優解是其對角線上有\breve{d}個1。

那麼,\Gamma的最優解已經得出,表示式變成:

這裡的最小化問題似乎有點複雜,我們可以做一些轉換,把它變成最大化問題求解,轉換後的表示式為:

\breve{d}=1時,V^T中只有第一行v^T有用,最大化問題轉化為:

max_v\sum_{n=1}^Nv^Tx_nx_n^Tv\ \ \ \ \ subject\ to\ v^Tv=1

引入拉格朗日因子\lambda,表示式的微分與條件微分應該是平行的,且由\lambda聯絡起來,即:

\sum_{n=1}^Nx_nx_n^Tv=\lambda v

根據線性代數的知識,很明顯能夠看出,v就是矩陣X^TX的特徵向量,而\lambda就是相對應的特徵值。我們要求的是最大值,所以最優解v就是矩陣X^TX最大特徵值對應的特徵向量。

\breve{d}>1時,求解方法是類似的,最優解{v_j}_{j=1}^{\breve d}就是矩陣X^TX\breve{d}大的特徵值對應的\breve{d}個特徵向量。

經過以上分析,我們得到了\Gamma和V的最優解。這就是linear autoencoder的編解碼推導過程。

值得一提的是,linear autoencoder與PCA推導過程十分相似。但有一點不同的是,一般情況下,PCA會對原始資料x進行處理,即減去其平均值。這是為了在推導過程中的便利。這兩種演算法的計算流程大致如下:

linear autoencoder與PCA也有差別,PCA是基於統計學分析得到的。一般我們認為,將高維資料投影(降維)到低維空間中,應該保證資料本身的方差越大越好,而噪聲方差越小越好,而PCA正是基於此原理推導的。linear autoencoder與PCA都可以用來進行資料壓縮,但是PCA應用更加廣泛一些。

以上關於PCA的推導基本上是從幾何的角度,而沒有從代數角度進行詳細的數學推導。網上關於PCA的資料很多,這裡附上一篇個人覺得講解得通俗易懂的PCA原理介紹:PCA的數學原理。有興趣的朋友可以看一看。

5. 總結

本節課主要介紹了深度學習(deep learning)的數學模型,也是上節課講的神經網路的延伸。由於深度學習網路的複雜性,其建模優化是比較困難的。通常,我們可以從pre-training和regularization的角度來解決這些困難。首先,autoencoder可以得到比較不錯的初始化權重,起到pre-training的效果。然後,denoising autoencoder通過引入人工噪聲,訓練得到初始化權重,從而使模型本身抗噪聲能力更強,更具有健壯性,起到了regularization的效果。最後,我們介紹了linear autoencoder並從幾何角度詳述了其推導過程。linear autoencoder與PCA十分類似,都可以用來進行資料壓縮和資料降維處理。

註明:

文章中所有的圖片均來自臺灣大學林軒田《機器學習技法》課程

更多AI資源請關注公眾號:AI有道(ID:redstonewill)

相關文章