雷鋒網AI科技評論按:不管是AI也好,其他學科也好,學習、研究的過程中不斷反思學科的歷史,總結學科的發(fā)展現(xiàn)狀,找出最重要的理念,總能讓人能“吾道一以貫之”。軟件工程師James Le近期根據他研究的經驗總結出了AI研究必須要知道的十種深度學習方法,非常具有啟發(fā)性。雷鋒網AI科技評論編譯如下。
The 10 Deep Learning Methods AI Practitioners Need to Apply人們對機器學習的興趣在過去十年經歷了爆炸式的發(fā)展。計算機科學項目中、業(yè)界會議中、媒體報道中,你都能夠看到機器學習的影子。但是似乎所有關于機器學習的討論中,人們常常會把AI能做什么和他們希望AI能做什么混為一談。
從根本上來講,機器學習其實就是使用算法從原始數(shù)據中提取信息,并以某種類型的模型表示出來;然后我們使用這個模型來推斷我們尚未建模的其他數(shù)據。
神經網絡作為機器學習的一類模型,它們已經存在了至少50年。神經網絡的基本單元是節(jié)點,大致上模仿了哺乳動物大腦中的生物神經元的節(jié)點;節(jié)點之間的鏈接(也是模仿生物大腦)隨著時間的推移(訓練)而演化。
在上世紀八十年代中期和九十年代早期,許多重要的神經網絡構架都已經做出了,不過要想獲得好的結果還需要足夠強大的計算能力和大體量的數(shù)據集,這些當時在當時很不理想,所以也導致人們對機器學習的熱情逐漸冷淡了下來。在21世紀初,計算機的計算能力呈現(xiàn)了指數(shù)級的增長——業(yè)界見證了計算機技術的“寒武紀大爆發(fā)”,這在之前幾乎是不可想象的。深度學習作為這個領域中一個重要的架構,在計算能力爆發(fā)式增長的十年中,贏得了許多重要的機器學習競賽。這個紅利的熱度直到今年仍未降溫;今天,我們看到在機器學習的每個角落里都會提到深度學習。
為了更深入地了解這些,我參加了一門“深度學習”課程,并開發(fā)了一個圖像識別的神經網絡以及基于循環(huán)神經網絡(RNN)和長短項記憶(LSTM)的自然語言處理??梢匀ノ业腉ithub倉庫中查看這些代碼:
https://github.com/khanhnamle1994/deep-learning
最近,我也開始閱讀一些深度學習方面的學術論文。下面這些是我收集到的幾篇對深度學習領域的發(fā)展有重大影響的幾篇論文:
1、Gradient-Based Learning Applied to Document Recognition (1998)
意義:向機器學習世界引進了卷積神經網絡
作者:Yann LeCun, Leon Bottou, Yoshua Bengio, and Patrick Haffner
2、Deep Boltzmann Machines (2009)
意義:為玻爾茲曼機提出了一種新的學習算法,其中包含許多隱藏變量層。
作者:Ruslan Salakhutdinov, Geoffrey Hinton
3、Building High-Level Features Using Large-Scale Unsupervised Learning (2012)
意義:解決了僅從未標記的數(shù)據構建高層次、特定類別的特征檢測器的問題。
作者:Quoc V. Le,Marc’Aurelio Ranzato,Rajat Monga,Matthieu Devin,Kai Chen,Greg S. Corrado,Jeff Dean,Andrew Y. Ng
4、DeCAF — A Deep Convolutional Activation Feature for Generic Visual Recognition (2013)
意義:釋放了一個深度卷積激活特征的開源實現(xiàn)——DeCAF,以及所有相關的網絡參數(shù),使視覺研究人員能夠深入地在一系列視覺概念學習范例中進行實驗。
作者:Jeff Donahue,Yangqing Jia,Oriol Vinyals,Judy Hoffman,Ning Zhang,Eric Tzeng,Trevor Darrell
5、Playing Atari with Deep Reinforcement Learning (2016)
意義:提供了第一個可以使用強化學習從高維感官輸入中直接學習控制策略的深度學習模型。
作者:Volodymyr Mnih,Koray Kavukcuoglu,David Silver,Alex Graves,Ioannis Antonoglou,Daan Wierstra,Martin Riedmiller(DeepMind 團隊)
在這些學習和研究中,我發(fā)現(xiàn)大量非常有意思的知識點。在這里我將分享十個深度學習的方法,AI工程師可能會將這些應用到他們的機器學習問題當中。
不過,首先先讓我們來定義一下什么是“深度學習”。對很多人來說,給“深度學習”下一個定義確實很有挑戰(zhàn),因為在過去的十年中,它的形式已經慢慢地發(fā)生了很大的變化。
先來在視覺上感受一下“深度學習”的地位。下圖是AI、機器學習和深度學習三個概念的一個關系圖。
AI的領域要相對較廣泛,機器學習是AI的一個子領域,而深度學習是機器學習領域中的一個子集。
深度學習網絡與“典型”的前饋多層網絡之間是有一些區(qū)別的,如下:
深度學習網絡比之前的網絡有更多的神經元
深度學習網絡具有更復雜的連接層的方式
深度學習網絡需要用強大的計算能力來訓練
深度學習網絡能夠進行自動特征提取
因此深度學習可以被定義為在以下四個基本網絡框架中擁有大量參數(shù)和層的神經網絡:
無監(jiān)督預訓練網絡(Unsupervised Pre-trained Networks)
卷積神經網絡(Convolutional Neural Networks)
循環(huán)神經網絡(Recurrent Neural Networks)
遞歸神經網絡 (Recursive Neural Networks)
在這篇文章中,我主要對后三個框架比較感興趣。
卷積神經網絡基本上就是用共享權重在空間中進行擴展的標準神經網絡。設計CNN主要是為了通過內部卷積來識別圖片,內部卷積可以看到待識別物體的邊。
循環(huán)神經網絡基本上是在時間上進行擴展的標準神經網絡,因為邊進入下一個時間步,而不是在同一時間步進入下一個層。設計RNN主要是為了識別序列,例如語音信號或者文本。它里面的循環(huán)意味著網絡中存在短暫的記憶。
遞歸神經網絡更類似于分層網絡,其中輸入序列沒有真正的時間面,而是輸入必須以樹狀方式分層處理。
以下10種方法可以應用于所有這些體系結構。
1、反向傳播反向傳播是“誤差反向傳播”的簡稱,它是一種計算函數(shù)(在神經網絡中以函數(shù)形式存在)偏微分的方法。當你要用一個基于梯度的方法來解決一個最優(yōu)問題時(注意梯度下降只是解決這類問題的一種方法),你希望在每一次迭代中計算函數(shù)梯度。
對于神經網絡而言,目標函數(shù)具有合成的形式。那么如何計算梯度呢?一般情況下有兩種常見的方法:
1)微分分析法。當你知道這個函數(shù)的形式時,你只需要用鏈式法則計算導數(shù)即可;
2)用有限差分方法來近似微分。這種方法的計算量很大,因為函數(shù)評估的數(shù)量是O(N),其中N是參數(shù)的數(shù)量。與微分分析法相比,這是比較昂貴的。不過,有限差分通常在調試時驗證后端實現(xiàn)。
2、隨機梯度下降一個直觀理解梯度下降的方法是去想象一條溯源山頂?shù)暮恿鳌_@條河流會沿著山勢梯度的方向流向山麓下的最低點。
如果讓人來走,可能就不一樣了,你可能會先隨便選一個方向,然后沿著這個方向的梯度向下走;過一會兒再隨機換一個方向向下走;最后你發(fā)現(xiàn)自己差不多也到了谷底了。
數(shù)學化的理解就是:
隨機梯度下降主要用來求解類似于如下求和形式的優(yōu)化問題:
梯度下降法:
當n很大時,每次迭代計算所有的梯度會非常耗時。隨機梯度下降的想法就是每次在Delta f_i 中隨機選取一個計算代替上面的Delta f_i,以這個隨機選取的方向作為下降的方向。這樣的方法反而比梯度下降能夠更快地到達(局部)最優(yōu)解。
3、學習率衰減在訓練模型的時候,通常會遇到這種情況:我們平衡模型的訓練速度和損失(loss)后選擇了相對合適的學習率(learning rate),但是訓練集的損失下降到一定的程度后就不在下降了,比如training loss一直在0.7和0.9之間來回震蕩,不能進一步下降。如下圖所示:
遇到這種情況通??梢酝ㄟ^適當降低學習率(learning rate)來實現(xiàn)。但是,降低學習率又會延長訓練所需的時間。
學習率衰減(learning rate decay)就是一種可以平衡這兩者之間矛盾的解決方案。學習率衰減的基本思想是:學習率隨著訓練的進行逐漸衰減。
學習率衰減基本有兩種實現(xiàn)方法:
線性衰減。例如:每過5個epochs學習率減半;
指數(shù)衰減。例如:每過5個epochs將學習率乘以0.1。
在當前的大規(guī)模神經網絡中有兩個缺點:
費時;
容易過擬合
Dropout 可以很好地解決這個問題。Dropout說的簡單一點就是在前向傳導的時候,讓某個神經元的激活值以一定的概率p停止工作,示意圖如下:
每次做完dropout,相當于從原始的網絡中找到一個更瘦的網絡。
Hinton在其論文中做了這樣的類比,無性繁殖可以保留大段的優(yōu)秀基因,而有性繁殖則將基因隨機拆了又拆,破壞了大段基因的聯(lián)合適應性;但是自然選擇了有性繁殖,物競天擇,適者生存,可見有性繁殖的強大。dropout 也能達到同樣的效果,它強迫一個神經單元,和隨機挑選出來的其他神經單元共同工作,消除減弱了神經元節(jié)點間的聯(lián)合適應性,增強了泛化能力。
5、max pooling池化(Pooling)是卷積神經網絡中另一個重要的概念,它實際上是一種形式的向下采樣。有多種不同形式的非線性池化函數(shù),而其中“最大池化(Max pooling)”是最為常見的。它是將輸入的圖像劃分為若干個矩形區(qū)域,對每個子區(qū)域輸出最大值。
直覺上,這種機制能夠有效地原因在于,在發(fā)現(xiàn)一個特征之后,它的精確位置遠不及它和其他特征的相對位置的關系重要。池化層會不斷地減小數(shù)據的空間大小,因此參數(shù)的數(shù)量和計算量也會下降,這在一定程度上也控制了過擬合。通常來說,CNN的卷積層之間都會周期性地插入池化層。
6、批標準化包括深度網絡在內的神經網絡需要仔細調整權重初始化和學習參數(shù)。批標準化使這些變得輕松許多。
權重問題:
無論權重的初始化如何,是隨機的還是經驗性的選擇,它們離學習權重都會很遠??紤]一個小批量,初期在所需的特征激活方面會有很多異常值。
深層神經網絡本身是病態(tài)的,初始層中的微小擾動都會導致后面層的非常大的變化。
在反向傳播過程中,這些現(xiàn)象會導致梯度彌散。這就意味著在學習權重產生所需要的輸出前,必須對梯度的異常值進行補償,這將導致需要額外的時段來收斂。
批量歸一化使這些梯度從分散到正常值并在小批量范圍內流向共同目標(通過歸一化)。
學習率問題:一般來說,學習率需要保持較低的值,使得只有一小部分的梯度來校正權重,原因是要使異常激活的梯度不影響已學習到的激活。通過批量標準化,可以減少這些異常激活,因此也就可以使用更高的學習率來加速學習過程。
7、long short-term memoryLSTM網絡具有以下三個方面,使其與循環(huán)神經網絡中的常見神經元不同:
1)它能夠決定何時讓輸入進入神經元;
2)它能夠決定何時記住上一個時間步中計算的內容;
3)它決定何時讓輸出傳遞到下一個時間步。
LSTM的美妙之處在于它能夠根據當前的輸入本身來決定所有這些。 所以你看下面的圖表:
當前時間的輸入信號x(t)決定所有上述3個點。 輸入門決定點1,遺忘門決定點2,輸出門決定點3。任何一條輸入都能夠采取所有這三個決定。這種設計其實是受到了我們大腦如何工作的啟發(fā),并且可以基于輸入來處理突然的上下文切換。
8、skip-gram詞嵌入模型的目標是為每個詞項學習一個高維密集表示,其中嵌入向量之間的相似性顯示了相應詞之間的語義或句法相似性。 Skip-gram是一個學習詞嵌入算法的模型。
skip-gram模型(以及許多其他的詞語嵌入模型)背后的主要思想如下:兩個詞項相似,如果它們共享相似的上下文。
換句話說,假設你有一個句子,例如“貓是哺乳動物”;如果你用“狗”而不是“貓”,這個句子還是一個有意義的句子。因此在這個例子中,“狗”和“貓”可以共享相同的上下文(即“是哺乳動物”)。
基于上述假設,你可以考慮一個上下文窗口(一個包含k個連續(xù)項的窗口),然后你跳過其中一個單詞,試著去學習一個能夠得到除跳過項外的所有項的神經網絡,并預測跳過的這個項。如果兩個詞在一個大語料庫中反復共享相似的語境,則這些詞的嵌入向量將具有相近的向量。
9、連續(xù)詞袋在自然語言處理問題中,我們希望學習將文檔中的每個單詞表示為一個數(shù)字的向量,使得出現(xiàn)在相似的上下文中的單詞具有彼此接近的向量。在連續(xù)的單詞模型中,目標是能夠使用圍繞特定單詞的上下文并預測特定單詞。
我們通過在一個大的語料庫中采取大量的句子來做到這一點,每當我們看到一個單詞時,我們就提取周圍的單詞。 然后,我們將上下文單詞輸入到一個神經網絡,并預測在這個上下文中間的單詞。
當我們有成千上萬個這樣的上下文單詞和中間詞時,我們就有一個神經網絡數(shù)據集的實例。 我們訓練神經網絡,最后編碼的隱藏層輸出表示了特定單詞的嵌入。 恰巧,當我們對大量的句子進行訓練時,類似語境中的單詞得到相似的向量。
10、遷移學習讓我們想一下如何在CNN中處理一張圖片。假設有一張圖片,你對它進行卷積處理,然后你得到的輸出是像素的組合,我們姑且稱之為“邊”吧。我們再次使用卷積,這時候你得到的輸出將是邊的組合,我們稱之為“線”。如果再次使用卷積,那么你將得到線的組合,等等。
每一層都是在尋找相應的特定模式。你的神經網絡最后一層一般會給出非常特定的模式。也許你在處理ImageNet,你的網絡最后一層可能是在找孩子、狗或飛機或別的任何東西。如果你向前兩層看,網絡可能是在找眼睛、耳朵、嘴巴或者輪子。
深度卷積神經網絡中的每一層的深入都是在構建越來越高層次的特征表示。最后兩層會產生你輸入模型的數(shù)據中的特定模式。換句話說,早期的層提取的特征則廣泛得多,在提取的大量的類中有很多簡單的模式。
遷移學習就是當你用一個數(shù)據集訓練CNN時,砍掉最后的一(些)層,再用另一個不同的數(shù)據集重新訓練最后一(些)層的模型。直觀地說,你在重新訓練模型來識別不同的高級層次特征。作為結果,訓練時間大幅減少。所以當你沒有足夠的數(shù)據或者訓練的資源時,遷移學習是非常有用的一個工具。
這篇文章只是展示了這些方法的一般概述。我建議閱讀下面這些文章以獲得對這些概念更詳細的解釋:
Andrew Beam's “Deep Learning 101”
Andrey Kurenkov's “A Brief History of Neural Nets and Deep Learning”
Adit Deshpande's “A Beginner’s Guide to Understanding Convolutional Neural Networks”
Chris Olah's “Understanding LSTM Networks”
Algobean's “Artificial Neural Networks”
Andrej Karpathy's “The Unreasonable Effectiveness of Recurrent Neural Networks”
深度學習非常注重技術,而對每一個新的想法卻沒有太多具體的解釋。大多數(shù)新的idea只是用實驗結果來證明它們的工作。深度學習就像玩樂高,掌握它有一定的挑戰(zhàn)性,但是入門還是很容易的。
via towardsdatascience,雷鋒網編譯
聯(lián)系客服