深度學習-無監督


原:http://www.cnblogs.com/DjangoBlog/p/6476332.html

綜述

如果已經有一個足夠強大的機器學習算法,為了獲得更好的性能,最靠譜的方法之一是給這個算法以更多的數據。機器學習界甚至有個說法:“有時候勝出者並非有最好的算法,而是有更多的數據。”


人們總是可以嘗試獲取更多的已標注數據,但是這樣做成本往往很高。例如研究人員已經花了相當的精力在使用類似 AMT(Amazon Mechanical Turk) 這樣的工具上,以期獲取更大的訓練數據集。相比大量研究人員通過手工方式構建特征,用眾包的方式讓多人手工標數據是一個進步,但是我們可以做得更好。具體的說,如果算法能夠從未標注數據中學習,那么我們就可以輕易地獲取大量無標注數據,並從中學習。自學習和無監督特征學習就是這種的算法。盡管一個單一的未標注樣本蘊含的信息比一個已標注的樣本要少,但是如果能獲取大量無標注數據(比如從互聯網上下載隨機的、無標注的圖像、音頻剪輯或者是文本),並且算法能夠有效的利用它們,那么相比大規模的手工構建特征和標數據,算法將會取得更好的性能。


在自學習和無監督特征學習問題上,可以給算法以大量的未標注數據,學習出較好的特征描述。在嘗試解決一個具體的分類問題時,可以基於這些學習出的特征描述和任意的(可能比較少的)已標注數據,使用有監督學習方法完成分類。


在一些擁有大量未標注數據和少量的已標注數據的場景中,上述思想可能是最有效的。即使在只有已標注數據的情況下(這時我們通常忽略訓練數據的類標號進行特征學習),以上想法也能得到很好的結果。

 

特征學習

我們已經了解到如何使用一個自編碼器(autoencoder)從無標注數據中學習特征。具體來說,假定有一個無標注的訓練數據集 \textstyle \{ x_u^{(1)}, x_u^{(2)}, \ldots, x_u^{(m_u)}\}(下標 \textstyle u 代表“不帶類標”)。現在用它們訓練一個稀疏自編碼器(可能需要首先對這些數據做白化或其它適當的預處理)。

STL SparseAE.png


利用訓練得到的模型參數 \textstyle W^{(1)}, b^{(1)}, W^{(2)}, b^{(2)},給定任意的輸入數據 \textstyle x,可以計算隱藏單元的激活量(activations) \textstyle a。如前所述,相比原始輸入 \textstyle x 來說,\textstyle a 可能是一個更好的特征描述。下圖的神經網絡描述了特征(激活量 \textstyle a)的計算。

STL SparseAE Features.png


這實際上就是之前得到的稀疏自編碼器,在這里去掉了最后一層。


假定有大小為 \textstyle m_l 的已標注訓練集 \textstyle \{ (x_l^{(1)}, y^{(1)}),(x_l^{(2)}, y^{(2)}), \ldots (x_l^{(m_l)}, y^{(m_l)}) \}(下標 \textstyle l 表示“帶類標”),我們可以為輸入數據找到更好的特征描述。例如,可以將 \textstyle x_l^{(1)} 輸入到稀疏自編碼器,得到隱藏單元激活量 \textstyle a_l^{(1)}。接下來,可以直接使用 \textstyle a_l^{(1)} 來代替原始數據 \textstyle x_l^{(1)} (“替代表示”,Replacement Representation)。也可以合二為一,使用新的向量 \textstyle (x_l^{(1)}, a_l^{(1)}) 來代替原始數據 \textstyle x_l^{(1)} (“級聯表示”,Concatenation Representation)。


經過變換后,訓練集就變成 \textstyle \{ (a_l^{(1)}, y^{(1)}), (a_l^{(2)}, y^{(2)}), \ldots (a_l^{(m_l)}, y^{(m_l)})\}或者是\textstyle \{((x_l^{(1)}, a_l^{(1)}), y^{(1)}), ((x_l^{(2)}, a_l^{(1)}), y^{(2)}), \ldots, ((x_l^{(m_l)}, a_l^{(1)}), y^{(m_l)}) \}(取決於使用 \textstyle a_l^{(1)} 替換 \textstyle x_l^{(1)} 還是將二者合並)。在實踐中,將 \textstyle a_l^{(1)} 和 \textstyle x_l^{(1)} 合並通常表現的更好。但是考慮到內存和計算的成本,也可以使用替換操作。


最終,可以訓練出一個有監督學習算法(例如 svm, logistic regression 等),得到一個判別函數對 \textstyle y 值進行預測。預測過程如下:給定一個測試樣本 \textstyle x_{\rm test},重復之前的過程,將其送入稀疏自編碼器,得到 \textstyle a_{\rm test}。然后將 \textstyle a_{\rm test} (或者 \textstyle (x_{\rm test}, a_{\rm test}) )送入分類器中,得到預測值。

 

數據預處理

在特征學習階段,我們從未標注訓練集 \textstyle \{ x_u^{(1)}, x_u^{(2)}, \ldots, x_u^{(m_u)}\} 中學習,這一過程中可能計算了各種數據預處理參數。例如計算數據均值並且對數據做均值標准化(mean normalization);或者對原始數據做主成分分析(PCA),然后將原始數據表示為 \textstyle U^Tx (又或者使用 PCA 白化或 ZCA 白化)。這樣的話,有必要將這些參數保存起來,並且在后面的訓練和測試階段使用同樣的參數,以保證數據進入稀疏自編碼神經網絡之前經過了同樣的變換。例如,如果對未標注數據集進行PCA預處理,就必須將得到的矩陣 \textstyle U 保存起來,並且應用到有標注訓練集和測試集上;而不能使用有標注訓練集重新估計出一個不同的矩陣 \textstyle U (也不能重新計算均值並做均值標准化),否則的話可能得到一個完全不一致的數據預處理操作,導致進入自編碼器的數據分布迥異於訓練自編碼器時的數據分布。

 

無監督特征學習的術語

有兩種常見的無監督特征學習方式,區別在於你有什么樣的未標注數據。自學習(self-taught learning) 是其中更為一般的、更強大的學習方式,它不要求未標注數據 \textstyle x_u 和已標注數據 \textstyle x_l 來自同樣的分布。另外一種帶限制性的方式也被稱為半監督學習,它要求 \textstyle x_u\textstyle x_l 服從同樣的分布。下面通過例子解釋二者的區別。


假定有一個計算機視覺方面的任務,目標是區分汽車和摩托車圖像;也即訓練樣本里面要么是汽車的圖像,要么是摩托車的圖像。哪里可以獲取大量的未標注數據呢?最簡單的方式可能是從互聯網上下載一些隨機的圖像數據集,在這些數據上訓練出一個稀疏自編碼器,從中得到有用的特征。這個例子里,未標注數據完全來自於一個和已標注數據不同的分布(未標注數據集中,或許其中一些圖像包含汽車或者摩托車,但是不是所有的圖像都如此)。這種情形被稱為自學習。


相反,如果有大量的未標注圖像數據,要么是汽車圖像,要么是摩托車圖像,僅僅是缺失了類標號(沒有標注每張圖片到底是汽車還是摩托車)。也可以用這些未標注數據來學習特征。這種方式,即要求未標注樣本和帶標注樣本服從相同的分布,有時候被稱為半監督學習。在實踐中,常常無法找到滿足這種要求的未標注數據(到哪里找到一個每張圖像不是汽車就是摩托車,只是丟失了類標號的圖像數據庫?)因此,自學習在無標注數據集的特征學習中應用更廣。

 

 

中英文對照

自我學習/自學習 self-taught learning
無監督特征學習 unsupervised feature learning
自編碼器 autoencoder
白化 whitening
激活量 activation
稀疏自編碼器 sparse autoencoder
半監督學習 semi-supervised learning

 

中文譯者

張靈(lingzhang001@outlook.com),曉風(xiaofeng.zhb@alibaba-inc.com),王文中(wangwenzhong@ymail.com)

 

從自我學習到深層網絡

 

在前一節中,我們利用自編碼器來學習輸入至 softmax 或 logistic 回歸分類器的特征。這些特征僅利用未標注數據學習獲得。在本節中,我們描述如何利用已標注數據進行微調,從而進一步優化這些特征。如果有大量已標注數據,通過微調就可以顯著提升分類器的性能。


在自我學習中,我們首先利用未標注數據訓練一個稀疏自編碼器。隨后,給定一個新樣本 \textstyle x,我們通過隱含層提取出特征 \textstyle a。上述過程圖示如下:

STL SparseAE Features.png


我們感興趣的是分類問題,目標是預測樣本的類別標號 \textstyle y。我們擁有標注數據集 \textstyle \{ (x_l^{(1)}, y^{(1)}), (x_l^{(2)}, y^{(2)}), \ldots (x_l^{(m_l)},y^{(m_l)}) \},包含 \textstyle m_l 個標注樣本。此前我們已經說明,可以利用稀疏自編碼器獲得的特征 \textstyle a^{(l)} 來替代原始特征。這樣就可獲得訓練數據集 \textstyle \{(a^{(1)},y^{(1)}), \ldots (a^{(m_l)}, y^{(m_l)}) \}。最終,我們訓練出一個從特征 \textstyle a^{(i)} 到類標號 \textstyle y^{(i)} 的 logistic 分類器。為說明這一過程,我們按照神經網絡一節中的方式,用下圖描述 logistic 回歸單元(橘黃色)。

STL Logistic Classifier.png


考慮利用這個方法所學到的分類器(輸入-輸出映射)。它描述了一個把測試樣本 \textstyle x 映射到預測值 \textstyle p(y=1|x) 的函數。將此前的兩張圖片結合起來,就得到該函數的圖形表示。也即,最終的分類器可以表示為:

STL CombinedAE.png


該模型的參數通過兩個步驟訓練獲得:在該網絡的第一層,將輸入 \textstyle x 映射至隱藏單元激活量 \textstyle a 的權值 \textstyle W^{(1)} 可以通過稀疏自編碼器訓練過程獲得。在第二層,將隱藏單元 \textstyle a 映射至輸出 \textstyle y 的權值 \textstyle W^{(2)} 可以通過 logistic 回歸或 softmax 回歸訓練獲得。

 

這個最終分類器整體上顯然是一個大的神經網絡。因此,在訓練獲得模型最初參數(利用自動編碼器訓練第一層,利用 logistic/softmax 回歸訓練第二層)之后,我們可以進一步修正模型參數,進而降低訓練誤差。具體來說,我們可以對參數進行微調,在現有參數的基礎上采用梯度下降或者 L-BFGS 來降低已標注樣本集 \textstyle \{ (x_l^{(1)}, y^{(1)}), (x_l^{(2)}, y^{(2)}), \ldots (x_l^{(m_l)}, y^{(m_l)}) \} 上的訓練誤差。


使用微調時,初始的非監督特征學習步驟(也就是自動編碼器和logistic分類器訓練)有時候被稱為預訓練。微調的作用在於,已標注數據集也可以用來修正權值 \textstyle W^{(1)},這樣可以對隱藏單元所提取的特征 \textstyle a 做進一步調整。


到現在為止,我們描述上述過程時,都假設采用了“替代 (Replacement)”表示而不是“級聯 (Concatenation)”表示。在替代表示中,logistic 分類器所看到的訓練樣本格式為 \textstyle (a^{(i)}, y^{(i)});而在級聯表示中,分類器所看到的訓練樣本格式為 \textstyle ((x^{(i)}, a^{(i)}), y^{(i)})。對級聯表示同樣可以進行微調(在級聯表示神經網絡中,輸入值 \textstyle x_i 也直接被輸入至 logistic 分類器。對此前的神經網絡示意圖稍加更改,即可獲得其示意圖。具體的說,第一層的輸入節點除了與隱層聯接之外,還將越過隱層,與第三層輸出節點直接相連)。但是對於微調來說,級聯表示相對於替代表示幾乎沒有優勢。因此,如果需要開展微調,我們通常使用替代表示的網絡(但是如果不開展微調,級聯表示的效果有時候會好得多)。


在什么時候應用微調?通常僅在有大量已標注訓練數據的情況下使用。在這樣的情況下,微調能顯著提升分類器性能。然而,如果有大量未標注數據集(用於非監督特征學習/預訓練),卻只有相對較少的已標注訓練集,微調的作用非常有限。

 

中英文對照

自我學習 self-taught learning
深層網絡 deep networks
微調 fine-tune
稀疏自編碼器 sparse autoencoder
梯度下降 gradient descent
非監督特征學習 unsupervised feature learning
預訓練 pre-training


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM