十個(gè)常用深度學(xué)習(xí)算法
來源:未知 時(shí)間:2018-12-18 瀏覽次數(shù):193次
十個(gè)常用深度學(xué)習(xí)算法,羲和時(shí)代,過去十年里,人們對(duì)機(jī)器學(xué)習(xí)的興趣經(jīng)歷了爆炸式的整長。我們幾乎每天都可以在計(jì)算機(jī)程序、行業(yè)會(huì)議和媒體上看到機(jī)器學(xué)習(xí)的身影。很多關(guān)于機(jī)器學(xué)習(xí)的討論都混淆了“機(jī)器學(xué)習(xí)能做什么”和“人類希望機(jī)器學(xué)習(xí)能做什么”。從根本上講,機(jī)器學(xué)習(xí)是運(yùn)用算法從原始數(shù)據(jù)中提取信息,并用某種類型的模型進(jìn)行表示,然后使用該模型對(duì)一些尚未用模型表示的其他數(shù)據(jù)來進(jìn)行推斷。
神經(jīng)網(wǎng)絡(luò)就是機(jī)器學(xué)習(xí)各類模型中的其中一類,并且已經(jīng)存在了至少50年。神經(jīng)網(wǎng)絡(luò)的基本單位是節(jié)點(diǎn),它的想法大致來源于哺乳動(dòng)物大腦中的生物神經(jīng)元。生物大腦中的神經(jīng)元節(jié)點(diǎn)之間的鏈接是隨著時(shí)間推移不斷演化的,而神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元節(jié)點(diǎn)鏈接也借鑒了這一點(diǎn),會(huì)不斷演化(通過“訓(xùn)練”的方式)。
神經(jīng)網(wǎng)絡(luò)中很多重要框架的建立和改進(jìn)都完成于二十世紀(jì)八十年代中期和九十年代初期。然而,要想獲得較好結(jié)果需要大量的時(shí)間和數(shù)據(jù),由于當(dāng)時(shí)計(jì)算機(jī)的能力有限,神經(jīng)網(wǎng)絡(luò)的發(fā)展受到了一定的阻礙,人們的關(guān)注度也隨之下降。二十一世紀(jì)初期,計(jì)算機(jī)的運(yùn)算能力呈指數(shù)級(jí)增長,業(yè)界也見證了計(jì)算機(jī)技術(shù)發(fā)展的“寒武紀(jì)爆炸”——這在之前都是無法想象的。深度學(xué)習(xí)以一個(gè)競爭者的姿態(tài)出現(xiàn),在計(jì)算能力爆炸式增長的十年里脫穎而出,并且贏得了許多重要的機(jī)器學(xué)習(xí)競賽。其熱度在2017年仍然不減。如今,在機(jī)器學(xué)習(xí)的出現(xiàn)的地方我們都能看到深度學(xué)習(xí)的身影。
這是柳貓自己做的一個(gè)小例子,詞向量的 t-SNE 投影,通過相似性進(jìn)行聚類。
最近,我開始閱讀關(guān)于深度學(xué)習(xí)的學(xué)術(shù)論文。根據(jù)我的個(gè)人研究,以下文章對(duì)這個(gè)領(lǐng)域的發(fā)展產(chǎn)生了巨大的影響:
-
1998年NYU的文章《基于梯度學(xué)習(xí)的文檔識(shí)別》(Gradient-Based Learning Applied to Document Recognition) 介紹了卷積神經(jīng)網(wǎng)絡(luò)在機(jī)器學(xué)習(xí)中的應(yīng)用。
-
Toronto 2009年的文章《深度波茲曼機(jī)器》(Deep Boltzmann Machines) 針對(duì)波茲曼機(jī)提出了一種新的學(xué)習(xí)算法,其中包含許多隱藏層。
-
Stanford 和 Google 2012年聯(lián)合發(fā)表的文章《使用大規(guī)模非監(jiān)督學(xué)習(xí)構(gòu)建高層特征》(Building High-Level Features Using Large-Scale Unsupervised Learning) 解決了僅利用未標(biāo)記的數(shù)據(jù)構(gòu)建高級(jí)、特定類的特征檢測器的問題。
-
Berkeley 2013年的文章《用于一般視覺識(shí)別的深層卷積激活特征》(DeCAF——A Deep Convolutional Activation Feature for Generic Visual Recognition) 發(fā)布了名為 DeCAF 的算法,這是深度卷積激活特征的一個(gè)開源實(shí)現(xiàn),使用相關(guān)的網(wǎng)絡(luò)參數(shù),視覺研究人員能夠利用一系列視覺概念學(xué)習(xí)范例進(jìn)行深入實(shí)驗(yàn)。
-
DeepMind 2016年的文章《用深度強(qiáng)化學(xué)習(xí)玩Atari》(Playing Atari with Deep Reinforcement Learning) 提出了第一個(gè)可以成功地通過強(qiáng)化學(xué)習(xí)從高維感官輸入中直接學(xué)習(xí)控制策略的深度學(xué)習(xí)模型。
柳貓整理了人工智能工程師 10 個(gè)用于解決機(jī)器學(xué)習(xí)問題的強(qiáng)大的深度學(xué)習(xí)方法。但是,我們首先需要定義什么是深度學(xué)習(xí)。
如何定義深度學(xué)習(xí)是很多人面臨的一個(gè)挑戰(zhàn),因?yàn)樗男问皆谶^去的十年中已經(jīng)慢慢地發(fā)生了改變。下圖直觀地展示了人工智能,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)之間的關(guān)系。
人工智能領(lǐng)域廣泛,存在時(shí)間較長。深度學(xué)習(xí)是機(jī)器學(xué)習(xí)領(lǐng)域的一個(gè)子集,而機(jī)器學(xué)習(xí)是人工智能領(lǐng)域的一個(gè)子集。一般將深度學(xué)習(xí)網(wǎng)絡(luò)與“典型”前饋多層網(wǎng)絡(luò)從如下方面進(jìn)行區(qū)分:
-
深度學(xué)習(xí)網(wǎng)絡(luò)具有比前饋網(wǎng)絡(luò)更多的神經(jīng)元
-
深度學(xué)習(xí)網(wǎng)絡(luò)連接層之間的方式更復(fù)雜
-
深度學(xué)習(xí)網(wǎng)絡(luò)需要有像“寒武紀(jì)大爆發(fā)”式的計(jì)算能力進(jìn)行訓(xùn)練
-
深度學(xué)習(xí)網(wǎng)絡(luò)能夠自動(dòng)提取特征
上文提到的“更多的神經(jīng)元”是指近年來神經(jīng)元的數(shù)量不斷增加,就可以用更復(fù)雜的模型來表示。層也從多層網(wǎng)絡(luò)中每一層完全連接,發(fā)展到卷積神經(jīng)網(wǎng)絡(luò)中神經(jīng)元片段的局部連接,以及與遞歸神經(jīng)網(wǎng)絡(luò)中的同一神經(jīng)元的循環(huán)連接(與前一層的連接除外)。
因此,深度學(xué)習(xí)可以被定義為以下四個(gè)基本網(wǎng)絡(luò)框架中具有大量參數(shù)和層數(shù)的神經(jīng)網(wǎng)絡(luò):
-
無監(jiān)督預(yù)訓(xùn)練網(wǎng)絡(luò)
-
卷積神經(jīng)網(wǎng)絡(luò)
-
循環(huán)神經(jīng)網(wǎng)絡(luò)
-
遞歸神經(jīng)網(wǎng)絡(luò)
在這篇文章中,我主要討論三個(gè)框架:
-
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network)基本上就是用共享權(quán)重在空間中進(jìn)行擴(kuò)展的標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)。卷積神經(jīng)網(wǎng)絡(luò)主要是通過內(nèi)部卷積來識(shí)別圖片,內(nèi)部卷積可以看到圖像上識(shí)別對(duì)象的邊緣。
-
循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network)基本上就是在時(shí)間上進(jìn)行擴(kuò)展的標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò),它提取進(jìn)入下一時(shí)間步的邊沿,而不是在同一時(shí)間進(jìn)入下一層。循環(huán)神經(jīng)網(wǎng)絡(luò)主要是為了識(shí)別序列,例如語音信號(hào)或者文本。其內(nèi)部的循環(huán)意味著網(wǎng)絡(luò)中存在短期記憶。
-
遞歸神經(jīng)網(wǎng)絡(luò)(Recursive Neural Network)更類似于分層網(wǎng)絡(luò),其中輸入序列沒有真正的時(shí)間面,但是必須以樹狀方式分層處理。以下10種方法均可應(yīng)用于這些框架。
1、反向傳播
反向傳播是一種計(jì)算函數(shù)偏導(dǎo)數(shù)(或梯度)的簡單方法,它的形式是函數(shù)組合(如神經(jīng)網(wǎng)絡(luò))。在使用基于梯度的方法求解最優(yōu)化問題(梯度下降只是其中之一)時(shí),需要在每次迭代中計(jì)算函數(shù)梯度。
對(duì)于一個(gè)神經(jīng)網(wǎng)絡(luò),其目標(biāo)函數(shù)是組合形式。那么應(yīng)該如何計(jì)算梯度呢?有2種常規(guī)方法:
-
(1)微分解析法。函數(shù)形式已知的情況下,只需要用鏈?zhǔn)椒▌t(基礎(chǔ)微積分)計(jì)算導(dǎo)數(shù)。
-
(2)有限差分法近似微分。這種方法運(yùn)算量很大,因?yàn)楹瘮?shù)評(píng)估的數(shù)量級(jí)是 O(N),其中 N 是參數(shù)的個(gè)數(shù)。與微分解析法相比,這種方法運(yùn)算量更大,但是在調(diào)試時(shí),通常會(huì)使用有限差分驗(yàn)證反向傳播的效果。
2、隨機(jī)梯度下降
梯度下降的一個(gè)直觀理解就是想象一條源自山頂?shù)暮恿?。這條河流會(huì)沿著山勢的方向流向山麓的最低點(diǎn),而這也正是梯度下降法的目標(biāo)。
我們所期望的最理想的情況就是河流在到達(dá)最終目的地(最低點(diǎn))之前不會(huì)停下。在機(jī)器學(xué)習(xí)中,這等價(jià)于我們已經(jīng)找到了從初始點(diǎn)(山頂)開始行走的全局最小值(或最優(yōu)值)。然而,可能由于地形原因,河流的路徑中會(huì)出現(xiàn)很多坑洼,而這會(huì)使得河流停滯不前。在機(jī)器學(xué)習(xí)術(shù)語中,這種坑洼稱為局部最優(yōu)解,而這不是我們想要的結(jié)果。有很多方法可以解決局部最優(yōu)問題。
因此,由于地形(即函數(shù)性質(zhì))的限制,梯度下降算法很容易卡在局部最小值。但是,如果能夠找到一個(gè)特殊的山地形狀(比如碗狀,術(shù)語稱作凸函數(shù)),那么算法總是能夠找到最優(yōu)點(diǎn)。在進(jìn)行最優(yōu)化時(shí),遇到這些特殊的地形(凸函數(shù))自然是最好的。另外,山頂初始位置(即函數(shù)的初始值)不同,最終到達(dá)山底的路徑也完全不同。同樣,不同的流速(即梯度下降算法的學(xué)習(xí)速率或步長)也會(huì)導(dǎo)致到達(dá)目的地的方式有差異。是否會(huì)陷入或避開一個(gè)坑洼(局部最小值),都會(huì)受到這兩個(gè)因素的影響。
3、學(xué)習(xí)率衰減
調(diào)整隨機(jī)梯度下降優(yōu)化算法的學(xué)習(xí)速率可以提升性能并減少訓(xùn)練時(shí)間。這被稱作學(xué)習(xí)率退火或自適應(yīng)學(xué)習(xí)率。訓(xùn)練中最簡單也最常用的學(xué)習(xí)率自適應(yīng)方法就是逐漸降低學(xué)習(xí)率。在訓(xùn)練初期使用較大的學(xué)習(xí)率,可以對(duì)學(xué)習(xí)率進(jìn)行大幅調(diào)整;在訓(xùn)練后期,降低學(xué)習(xí)率,以一個(gè)較小的速率更新權(quán)重。這種方法在早期可以快速學(xué)習(xí)獲得較好的權(quán)重,并在后期對(duì)權(quán)重進(jìn)行微調(diào)。
兩個(gè)流行而簡單的學(xué)習(xí)率衰減方法如下:
-
線性地逐步降低學(xué)習(xí)率
-
在特定時(shí)點(diǎn)大幅降低學(xué)習(xí)率
4、Dropout
擁有大量參數(shù)的深度神經(jīng)網(wǎng)絡(luò)是非常強(qiáng)大的機(jī)器學(xué)習(xí)系統(tǒng)。然而,在這樣的網(wǎng)絡(luò)中,過擬合是一個(gè)很嚴(yán)重的問題。而且大型網(wǎng)絡(luò)的運(yùn)行速度很慢,這就使得在測試階段通過結(jié)合多個(gè)不同的大型神經(jīng)網(wǎng)絡(luò)的預(yù)測來解決過擬合問題是很困難的。Dropout 方法可以解決這個(gè)問題。
其主要思想是,在訓(xùn)練過程中隨機(jī)地從神經(jīng)網(wǎng)絡(luò)中刪除單元(以及相應(yīng)的連接),這樣可以防止單元間的過度適應(yīng)。訓(xùn)練過程中,在指數(shù)級(jí)不同“稀疏度”的網(wǎng)絡(luò)中剔除樣本。在測試階段,很容易通過使用具有較小權(quán)重的單解開網(wǎng)絡(luò)(single untwined network),將這些稀疏網(wǎng)絡(luò)的預(yù)測結(jié)果求平均來進(jìn)行近似。這能有效地避免過擬合,并且相對(duì)于其他正則化方法能得到更大的性能提升。Dropout 技術(shù)已經(jīng)被證明在計(jì)算機(jī)視覺、語音識(shí)別、文本分類和計(jì)算生物學(xué)等領(lǐng)域的有監(jiān)督學(xué)習(xí)任務(wù)中能提升神經(jīng)網(wǎng)絡(luò)的性能,并在多個(gè)基準(zhǔn)數(shù)據(jù)集中達(dá)到最優(yōu)秀的效果。
5、最大池
最大池是一種基于樣本的離散化方法。目標(biāo)是對(duì)輸入表征(圖像、隱藏層輸出矩陣等)進(jìn)行下采樣,降低維度并且允許對(duì)子區(qū)域中的特征進(jìn)行假設(shè)。
通過提供表征的抽象形式,這種方法可以在某種程度上解決過擬合問題。同樣,它也通過減少學(xué)習(xí)參數(shù)的數(shù)目以及提供基本的內(nèi)部表征轉(zhuǎn)換不變性來減少計(jì)算量。最大池是通過將最大過濾器應(yīng)用于通常不重疊的初始表征子區(qū)域來完成的。
6、批量標(biāo)準(zhǔn)化
當(dāng)然,包括深度網(wǎng)絡(luò)在內(nèi)的神經(jīng)網(wǎng)絡(luò)需要仔細(xì)調(diào)整權(quán)重初始值和學(xué)習(xí)參數(shù)。批量標(biāo)準(zhǔn)化能夠使這個(gè)過程更加簡單。
權(quán)重問題:
-
無論怎么設(shè)置權(quán)重初始值,比如隨機(jī)或按經(jīng)驗(yàn)選擇,初始權(quán)重和學(xué)習(xí)后的權(quán)重差別都很大??紤]一小批權(quán)重,在最初時(shí),對(duì)于所需的特征激活可能會(huì)有很多異常值。
-
深度神經(jīng)網(wǎng)絡(luò)本身就具有病態(tài)性,即初始層的微小變化就會(huì)導(dǎo)致后一層的巨大變化。
在反向傳播過程中,這些現(xiàn)象會(huì)導(dǎo)致梯度的偏移,這就意味著在學(xué)習(xí)權(quán)重以產(chǎn)生所需要的輸出之前,梯度必須補(bǔ)償異常值。而這將導(dǎo)致需要額外的時(shí)間才能收斂。
批量標(biāo)準(zhǔn)化將這些梯度從異常值調(diào)整為正常值,并在小批量范圍內(nèi)(通過標(biāo)準(zhǔn)化)使其向共同的目標(biāo)收斂。
學(xué)習(xí)率問題:
-
通常來說,學(xué)習(xí)率都比較小,這樣只有一小部分的梯度用來校正權(quán)重,因?yàn)楫惓<せ畹奶荻炔粦?yīng)該影響已經(jīng)學(xué)習(xí)好的權(quán)重。
-
通過批量標(biāo)準(zhǔn)化,這些異常激活的可能性會(huì)被降低,就可以使用更大的學(xué)習(xí)率加速學(xué)習(xí)過程。
7、長短期記憶
長短期記憶網(wǎng)絡(luò)(LSTM)和其他遞歸神經(jīng)網(wǎng)絡(luò)中的神經(jīng)元有以下三個(gè)不同點(diǎn):
-
它可以決定何時(shí)讓輸入進(jìn)入神經(jīng)元
-
它可以決定何時(shí)記住上一個(gè)時(shí)間步中計(jì)算的內(nèi)容
-
它可以決定何時(shí)讓輸出傳遞到下一個(gè)時(shí)間戳 LSTM的強(qiáng)大之處在于它可以只基于當(dāng)前的輸入就決定上述所有。請(qǐng)看下方的圖表:
當(dāng)前時(shí)間戳的輸入信號(hào) x(t) 決定了上述三點(diǎn)。
-
輸入門(input gate)決定了第一點(diǎn),
-
遺忘門(forget gate)決定了第二點(diǎn),
-
輸出門(output gate)決定了第三點(diǎn)。 只依賴輸入就可以完成這三項(xiàng)決定。這是受到大腦工作機(jī)制的啟發(fā),大腦可以基于輸入來處理突然的上下文語境切換。
8、Skip-gram
詞嵌入模型的目的是針對(duì)每個(gè)詞學(xué)習(xí)一個(gè)高維密集表征,其中嵌入向量之間的相似性顯示了相應(yīng)詞語之間語義或句法的相似性。Skip-gram 是一種學(xué)習(xí)詞嵌入算法的模型。 skip-gram 模型(包括很多其它詞嵌入模型)背后的主要思想是:如果兩個(gè)詞匯項(xiàng)有相似的上下文,則它們是相似的。
換句話說,假設(shè)有一個(gè)句子,比如“cats are mammals”,如果用“dogs”替換“cats”,該句子仍然是有意義的。因此在這個(gè)例子中,“dogs”和“cats”有相似的上下文(即“are mammals”)。
基于以上假設(shè),我們可以考慮一個(gè)上下文窗口(包含 K 個(gè)連續(xù)項(xiàng))。然后跳過其中一個(gè)詞,試著學(xué)習(xí)一個(gè)可以得到除了跳過的這個(gè)詞以外所有詞項(xiàng),并且可以預(yù)測跳過的詞的神經(jīng)網(wǎng)絡(luò)。因此,如果兩個(gè)詞在一個(gè)大語料庫中多次具有相似的上下文,那么這些詞的嵌入向量將會(huì)是相似的。
9、連續(xù)詞袋模型
在自然語言處理中,我們希望將文檔中的每一個(gè)單詞表示為一個(gè)數(shù)值向量,使得出現(xiàn)在相似上下文中的單詞具有相似或相近的向量表示。在連續(xù)詞袋模型中,我們的目標(biāo)是利用一個(gè)特定單詞的上下文,預(yù)測該詞。
首先在一個(gè)大的語料庫中抽取大量的句子,每看到一個(gè)單詞,同時(shí)抽取它的上下文。然后我們將上下文單詞輸入到一個(gè)神經(jīng)網(wǎng)絡(luò),并預(yù)測在這個(gè)上下文中心的單詞。
當(dāng)我們有成千上萬個(gè)這樣的上下文詞匯和中心詞時(shí),我們就得到了一個(gè)神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)集的實(shí)例。然后訓(xùn)練這個(gè)神經(jīng)網(wǎng)絡(luò),在經(jīng)過編碼的隱藏層的最終輸出中,我們得到了特定單詞的嵌入式表達(dá)。當(dāng)我們對(duì)大量的句子進(jìn)行訓(xùn)練時(shí)也能發(fā)現(xiàn),類似上下文中的單詞都可以得到相似的向量。
10、遷移學(xué)習(xí)
我們來考慮一下卷積神經(jīng)網(wǎng)絡(luò)是如何處理圖像的。假設(shè)有一張圖像,對(duì)其應(yīng)用卷積,并得到像素的組合作為輸出。假設(shè)這些輸出是邊緣,再次應(yīng)用卷積,那么現(xiàn)在的輸出將是邊緣或線的組合。然后再次應(yīng)用卷積,此時(shí)的輸出將是線的組合,以此類推。可以把它想象成是在每一層尋找一個(gè)特定的模式。神經(jīng)網(wǎng)絡(luò)的最后一層通常會(huì)變得非常特別。
如果基于 ImageNet 進(jìn)行訓(xùn)練,那么神經(jīng)網(wǎng)絡(luò)的最后一層或許就是在尋找兒童、狗或者飛機(jī)之類的完整圖像。再往后倒退幾層,可能會(huì)看到神經(jīng)網(wǎng)絡(luò)在尋找眼睛、耳朵、嘴巴或者輪子等組成部分。
深度卷積神經(jīng)網(wǎng)絡(luò)中的每一層逐步建立起越來越高層次的特征表征,最后幾層通常是專門針對(duì)輸入數(shù)據(jù)。另一方面,前面的層則更為通用,主要用來在一大類圖片中有找到許多簡單的模式。
遷移學(xué)習(xí)就是在一個(gè)數(shù)據(jù)集上訓(xùn)練卷積神經(jīng)網(wǎng)絡(luò)時(shí),去掉最后一層,在不同的數(shù)據(jù)集上重新訓(xùn)練模型的最后一層。直觀來講,就是重新訓(xùn)練模型以識(shí)別不同的高級(jí)特征。因此,訓(xùn)練時(shí)間會(huì)減少很多,所以在沒有足夠的數(shù)據(jù)或者需要太多的資源時(shí),遷移學(xué)習(xí)是一個(gè)很有用的工具。