當前位置:
首頁 > 最新 > 帶你走進神經網路的「前世今生」

帶你走進神經網路的「前世今生」

雲棲君導讀:提起神經網路,你會想到什麼?關於深度學習,你又是否思考過其中的原理呢?從上個世紀四十年代神經網路誕生開始,到今天已經歷經70多年的發展,這中間它又經歷了什麼?本文將帶領大家走進神經網路的「前世今生」一探究竟。

演講嘉賓簡介:

孫飛(花名:丹豐),阿里巴巴搜索事業部高級演算法工程師。中科院計算所博士,博士期間主要研究方向為文本分散式表示,在SIGIR、ACL、EMNLP以及IJCAI等會議發表論文多篇。目前主要從事推薦系統以及文本生成相關方面研發工作。

以下內容根據演講嘉賓視頻分享以及PPT整理而成。

本次的分享主要圍繞以下五個方面:

神經網路的發展歷史

感知器模型

前饋神經網路

後向傳播

深度學習入門

一.神經網路的發展歷史

在介紹神經網路的發展歷史之前,首先介紹一下神經網路的概念。神經網路主要是指一種仿造人腦設計的簡化的計算模型,這種模型中包含了大量的用於計算的神經元,這些神經元之間會通過一些帶有權重的連邊以一種層次化的方式組織在一起。每一層的神經元之間可以進行大規模的並行計算,層與層之間進行消息的傳遞。

下圖展示了整個神經網路的發展歷程:

神經網路的發展歷史甚至要早於計算機的發展,早在上個世紀四十年代就已經出現了最早的神經網路模型。接下來本文將以神經網路的發展歷程為主線帶領大家對神經網路的基本知識作初步了解。

第一代的神經元模型是驗證型的,當時的設計者只是為了驗證神經元模型可以進行計算,這種神經元模型既不能訓練也沒有學習能力,可以簡單的把它看成是一個定義好的邏輯門電路,因為它的輸入和輸出都是二進位的,而中間層的權重都是提前定義好的。

神經網路的第二個發展時代是十九世紀五六十年代,以Rosenblatt提出的感知器模型和赫伯特學習原則等一些工作為代表。

二.感知器模型

感知器模型與之前提到的神經元模型幾乎是相同的,但是二者之間存在著一些關鍵的區別。感知器模型的激活函數可以選擇間斷函數和sigmoid函數,且其輸入可以選擇使用實數向量,而不是神經元模型的二進位向量。與神經元模型不同,感知器模型是一個可以學習的模型,下面介紹一下感知器模型的一個優良特性——幾何解釋。我們可以把輸入值(x1, . . . , xn)看作是N維空間中的一個點的坐標,w?x?w0 = 0 可以認為是N維空間中的一個超平面,顯然,當w?x?w00時,此時的點落在超平面的上方。感知器模型對應的就是一個分類器的超平面,它可以將不同類別的點在N維空間中分離開。從下圖中可以發現,感知器模型是一個線性的分類器。

對於一些基本的邏輯運算,例如與、或、非,感知器模型可以非常容易地作出判斷分類。那麼是不是所有的邏輯運算都可以通過感知器進行分類呢?答案當然是否定的。比如異或運算通過一個單獨的線性感知器模型就很難作出分類,這同樣也是神經網路的發展在第一次高潮之後很快進入低谷的主要原因。這個問題最早在Minsky等人在關於感知器的著作中提出,但其實很多人對這本著作存在誤區,實際上Minsky等人在提出這個問題的同時也指出異或運算可以通過多層感知器實現,但是由於當時學術界沒有有效的學習方式去學習多層感知器模型,所以神經網路的發展迎來了第一次低谷。關於多層感知器模型實現異或操作的直觀幾何體現如下圖所示:

三.前饋神經網路

進入十九世紀八十年代之後,由於單層的感知器神經網路的表達能力非常有限,只能做一些線性分類器的任務,神經網路的發展進入了多層感知器時代。一個典型的多層神經網路就是前饋神經網路,如下圖所示,它包括輸入層、節點數目不定的隱層和輸出層。任何一個邏輯運算都可以通過多層感知器模型表示,但這就涉及到三層之間交互的權重學習問題。將輸入層節點xk乘以輸入層到隱層之間的權重vkj,然後經過一個如sigmoid此類的激活函數就可以得到其對應的隱層節點數值hj,同理,經過類似的運算可以由hj得出輸出節點值yi。需要學習的權重信息就是w和v兩個矩陣,最終得到的信息是樣本的輸出y和真實輸出d。具體過程如下圖所示:

如果讀者有簡單的機器學習知識基礎的話,就會知道一般情況下會根據梯度下降的原則去學習一個模型。在感知器模型中採用梯度下降的原則是較為容易的,以下圖為例,首先確定模型的loss,例子中採用了平方根loss,即求出樣本的真實輸出d與模型給出的輸出y之間的差異,為了計算方便,通常情況下採用了平方關係E= 1/2 (d?y)^2 = 1/2 (d?f(x))^2 ,根據梯度下降的原則,權重的更新遵循如下規律:wj wi + α(d ? f(x))f′(x)xi ,其中α為學習率,可以作人工調整。

四.後向傳播

對於一個多層的前饋神經網路,我們該如何學習其中所有的參數呢?首先對於最上層的參數是非常容易獲得的,可以根據之前提到的計算模型輸出和真實輸出之間的差異,根據梯度下降的原則來得出參數結果,但問題是對於隱層來說,雖然我們可以計算出其模型輸出,但是卻不知道它的期望輸出是什麼,也就沒有辦法去高效訓練一個多層神經網路。這也是困擾了當時學術界很長時間的一個問題,進而導致了上個世紀六十年代之後神經網路一直沒有得到更多發展。後來到了十九世紀七十年代,有很多科學家獨立的提出了一個名為後向傳播的演算法。這個演算法的基本思想其實非常簡單,雖然在當時無法根據隱層的期望輸出去更新它的狀態,但是卻可以根據隱層對於Error的梯度來更新隱層到其他層之間的權重。計算梯度時,由於每個隱層節點與輸出層多個節點之間均有關聯,所以會對其上一層所有的Error作累加處理。

後向傳播的另一個優勢是計算同層節點的梯度和權重更新時可以並行進行,因為它們之間不存在關聯關係。整個BP演算法的過程可以用如下的偽碼錶示:

接下來介紹一些BP神經網路的其他性質。BP演算法其實就是一個鏈式法則,它可以非常容易地泛化到任意一個有向圖的計算上去。根據梯度函數,在大多數情況下BP神經網路給出的只是一個局部的最優解,而不是全局的最優解。但是從整體來看,一般情況下BP演算法能夠計算出一個比較優秀的解。下圖是BP演算法的直觀演示:

在大多數情況下,BP神經網路模型會找到範圍內的一個極小值點,但是跳出這個範圍我們可能會發現一個更優的極小值點。在實際應用中針對這樣的問題我們有很多簡單但是非常有效的解決辦法,比如可以嘗試不同的隨機初始化的方式。而實際上在深度學習領域當今比較常用的一些模型上,初始化的方式對於最終的結果是有非常大的影響的。另外一種使模型跳出局部最優解範圍的方式是在訓練的時候加入一些隨機干擾(Random noises),或者用一些遺傳演算法去避免訓練模型停留在不理想的局部最優解位置。

BP神經網路是機器學習的一個優秀的模型,而提到機器學習就不得不提到一個在整個機器學習過程中經常遇到的基本問題——過擬合(Overfitting)問題。過擬合的常見現象是模型在訓練集上面雖然loss一直在下降,但是實際上在test集上它的loss和error可能早已經開始上升了。避免出現過擬合問題有兩種常見的方式:

1.提前停止(Early Stopping):我們可以預先劃分一個驗證集(Validation),在訓練模型的同時也在驗證集之中運行這個模型,然後觀察該模型的loss,如果在驗證集中它的loss已經停止下降,這時候即使訓練集上該模型的loss仍在下降,我們依然可以提前將其停止來防止出現過擬合問題。

2.正則(Regularization):我們可以在神經網路中邊的權重上加一些正則。最近幾年經常用到的dropout方式——隨機丟一些點或者隨機丟一些邊,也可以看作是正則的一種方式,正則也是一種很有效的防止過擬合的應用方式。

十九世紀八十年代神經網路一度非常流行,但很不幸的是進入九十年代,神經網路的發展又陷入了第二次低谷。造成這次低谷的原因有很多,比如支持向量機(SVM)的崛起,支持向量機在九十年代是一個非常流行的模型,它在各大會議均佔有一席之地,同時也在各大應用領域都取得了非常好的成績。支持向量機有一個非常完善的統計學習理論,也有非常好的直觀解釋,並且效率也很高,結果又很理想。所以在此消彼長的情況下,支持向量機相關的統計學習理論的崛起一定程度上壓制了神經網路的發展熱度。另一方面,從神經網路自身的角度來看,雖然理論上可以用BP去訓練任意程度的神經網路,但是在實際應用中我們會發現,隨著神經網路層數的增加,神經網路的訓練難度成幾何式增長。比如在九十年代早期,人們就已經發現在層次比較多的一個神經網路當中可能會出現梯度消失或者梯度爆炸的一個現象。

舉一個簡單的梯度消失的例子,假設神經網路的每一層都是一個sigmoid結構層,那麼BP向後傳播時它的loss每一次都會連成一個sigmoid的梯度。一系列的元素連接在一起,如果其中有一個梯度非常小的話,會導致傳播下去的梯度越來越小。實際上,在傳播一兩層之後,這個梯度已經消失了。梯度消失會導致深層次的參數幾乎靜止不動,很難得出有意義的參數結果。這也是為什麼多層神經網路非常難以訓練的一個原因所在。

學術界對於這個問題有比較多的研究,最簡單的處理方式就是修改激活函數。早期的嘗試就是使用Rectified這種激活函數,由於sigmoid這個函數是指數的形式,所以很容易導致梯度消失這種問題,而Rectified將sigmoid函數替換成max(0,x),從下圖我們可以發現,對於那些大於0的樣本點,它的梯度就是1,這樣就不會導致梯度消失這樣一個問題,但是當樣本點處於小於0的位置時,我們可以看到它的梯度又變成了0,所以ReLU這個函數是不完善的。後續又出現了包括Leaky ReLU和Parametric Rectifier(PReLU)在內的改良函數,當樣本點x小於0時,我們可以人為的將其乘以一個比如0.01或者α這樣的係數來阻止梯度為零。

隨著神經網路的發展,後續也出現了一些從結構上解決梯度難以傳遞問題的方法,比如元模型,LSTM模型或者現在圖像分析中用到非常多的使用跨層連接的方式來使其梯度更容易傳播。

五.深度學習入門

經過上個世紀九十年代神經網路的第二次低谷,到2006年,神經網路再一次回到了大眾的視野,而這一次回歸之後的熱度遠比之前的任何一次興起時都要高。神經網路再次興起的標誌性事件就是Hinton等人在Salahudinov等地方發表的兩篇關於多層次神經網路(現在稱作「深度學習」)的論文。其中一篇論文解決了之前提到的神經網路學習中初始值如何設置的問題,解決途徑簡單來說就是假設輸入值是x,那麼輸出則是解碼x,通過這種方式去學習出一個較好的初始化點。而另一篇論文提出了一個快速訓練深度神經網路的方法。其實造成現在神經網路熱度現狀的原因還有很多,比如當今的計算資源相比當年來說已經非常龐大,而數據也是如此。在十九世紀八十年代時期,由於缺乏大量的數據和計算資源,當時很難訓練出一個大規模的神經網路。

神經網路早期的崛起主要歸功於三個重要的標誌性人物Hinton、Bengio和LeCun。Hinton的主要成就在於布爾計算機(Restricted Boltzmann Machine)和深度自編碼機(Deep autoencoder);Bengio的主要貢獻在於元模型在深度學習上的使用取得了一系列突破,這也是深度學習最早在實際應用中取得突破的領域,基於元模型的language modeling在2003時已經可以打敗當時最好的概率模型;LeCun的主要成就代表則是關於CNN的研究。深度學習崛起最主要的表現是在各大技術峰會比如NIPS,ICML,CVPR,ACL上佔據了半壁江山,包括Google Brain,Deep Mind和FaceBook AI等在內的研究部門都把研究工作的中心放在了深度學習上面。

神經網路進入公眾視野後的第一個突破是在語音識別領域,在使用深度學習理論之前,人們都是通過使用定義好的統計庫來訓練一些模型。在2010年,微軟採用了深度學習的神經網路來進行語音識別,從圖中我們可以看到,兩個錯誤的指標均有將近三分之一的大幅度下降,效果顯著。而基於最新的ResNet技術,微軟公司已經把這個指標降到了6.9%,每一年都有一個明顯的提升。

到2012年,在圖片分類領域,CNN模型在ImageNet上取得了一個較大的突破。測試圖片分類的是一個很大的數據集,要將這些圖片分成1000類。在使用深度學習之前,當時最好的結果是錯誤率為25.8%(2011年的一個結果),在2012年Hinton和它的學生將CNN應用於這個圖片分類問題之後,這個指標下降了幾乎10%,自2012年之後,我們從圖表中可以觀察到每一年這個指標都有很大程度的突破,而這些結果的得出均使用了CNN模型。深度學習模型能取得如此大的成功,在現代人看來主要歸功於其層次化的結構,能夠自主學習並將數據通過層次化結構抽象地表述出來。而抽象出來的特徵可以應用於其他多種任務,這也是深度學習當前十分火熱的原因之一。

下面介紹兩個非常典型且常用的深度學習神經網路:一個是卷積神經網路(CNN),另外一個是循環神經網路。

1.卷積神經網路: 卷積神經網路有兩個基本核心概念,一個是卷積(Convolution),另一個是池化(Pooling)。講到這裡,可能有人會問,為什麼我們不簡單地直接使用前饋神經網路,而是採用了CNN模型?舉個例子,對於一個1000*1000的圖像,神經網路會有100萬個隱層節點,對於前饋神經網路則需要學習10^12這樣一個龐大數量級的參數,這幾乎是無法進行學習的,因為需要海量的樣本。但實際上對於圖像來說,其中很多部分具有相同的特徵,如果我們採用了CNN模型進行圖片的分類的話,由於CNN基於卷積這個數學概念,那麼每個隱層節點只會跟圖像中的一個局部進行連接並掃描其局部特徵。假設每個隱層節點連接的局部樣本點數為10*10的話,那麼最終參數的數量會降低到100M,而當多個隱層所連接的局部參數可以共享時,參數的數量級更會大幅下降。

從下圖中我們可以直觀的看出前饋神經網路和CNN之間的區別。圖中的模型從左到右依次是全連接的普通的前饋神經網路,局部連接的前饋神經網路和基於卷積的CNN模型網路。我們可以觀察到基於卷積的神經網路隱層節點之間的連接權重參數是可以共享的。

另一個操作則是池化(Pooling),在卷積生成隱層的基礎上CNN會形成一個中間隱層——Pooling層,其中最常見的池化方式是Max Pooling,即在所獲得的隱層節點中選擇一個最大值作為輸出,由於有多個kernel進行池化,所以我們會得到多個中間隱層節點。那麼這樣做的好處是什麼呢?首先,通過池化操作會是參數的數量級進一步縮小;其次就是具有一定的平移不變性,如圖所示,假設圖中的九個隱層節點中的其中一個發生平移,池化操作後形成的Pooling層節點仍舊不變。

CNN的這兩個特性使得它在圖像處理領域的應用非常廣泛,現在甚至已經成為了圖像處理系統的標配。像下面這個可視化的汽車的例子就很好地說明了CNN在圖像分類領域上的應用。將原始的汽車圖片輸入到CNN模型之中後,從起初最原始的一些簡單且粗糙的特徵例如邊和點等,經過一些convolution和RELU的激活層,我們可以直觀的看到,越接近最上層的輸出圖像,其特徵越接近一輛汽車的輪廓。該過程最終會得到一個隱層表示並將其接入一個全連接的分類層然後得出圖片的類別,如圖中的car,truck,airplane,ship,horse等。

下圖是早期LeCun等人提出的一個用於手寫識別的神經網路,這個網路在九十年代時期已經成功運用到美國的郵件系統之中。感興趣的讀者可以登錄LeCun的網站查看其識別手寫體的動態過程。

當CNN在圖像領域應用十分流行的同時,在近兩年CNN在文本領域也得到了大規模應用。例如對於文本分類這個問題,目前最好的模型是基於CNN模型提出來的。從文本分類的特點來看,對一個文本的類別加以鑒別實際上只需要對該文本中的一些關鍵詞信號加以識別,而這種工作非常適合CNN模型來完成。

實際上如今的CNN模型已經應用到人們生活中的各個領域,比如偵查探案,自動駕駛汽車的研發,Segmenttation還有Neural Style等方面。其中Neural Style是個非常有趣的應用,比如之前App Store中有個非常火的應用Prisma,可以將使用者上傳的照片轉換成其他的風格,比如轉換成梵高的星空一樣的畫風,在這其中就大量應用了CNN的技術。

2.循環神經網路:關於循環神經網路的基本原理如下圖所示,從圖中可以看循環神經網路的輸出不僅依賴於輸入x,而且依賴於當前的隱層狀態,而這個隱層狀態會根據前一個x進行更新。從展開圖中可以直觀的理解這個過程,第一次輸入的中間隱層狀態S(t-1)會影響到下一次的輸入X(t)。循環神經網路模型的優勢在於可以用於文本、語言或者語音等此類序列型的數據,即當前數據的狀態受到此前數據狀態的影響。對於此類數據,前饋神經網路是很難實現的。

提到RNN,那就不得不介紹一下之前提到的LSTM模型。實際上LSTM並不是一個完整的神經網路,它只是一個RNN網路中的節點經過複雜處理後的結果。LSTM中包含三個門:輸入門,遺忘門和輸出門。

這三個門均用於處理cell之中的數據內容,分別決定是否要將cell中的數據內容輸入、遺忘和輸出。

最後介紹一個目前非常流行的交叉領域的神經網路的應用——將一個圖片轉換成描述形式的文字或者該圖片的title。具體的實現過程可以簡單的解釋為首先通過一個CNN模型將圖片中的信息提取出來形成一個向量表示,然後將該向量作為輸入傳送到一個訓練好的RNN模型之中得出該圖片的描述。

end

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雲棲社區 的精彩文章:

AI系列免費講座:深度學習應用篇
高性能網路使DNS DDoS無損防護成為可能

TAG:雲棲社區 |