① 一文看懂四種基本的神經網路架構
原文鏈接:
http://blackblog.tech/2018/02/23/Eight-Neural-Network/
更多干貨就在我的個人博客 http://blackblog.tech 歡迎關注
剛剛入門神經網路,往往會對眾多的神經網路架構感到困惑,神經網路看起來復雜多樣,但是這么多架構無非也就是三類,前饋神經網路,循環網路,對稱連接網路,本文將介紹四種常見的神經網路,分別是CNN,RNN,DBN,GAN。通過這四種基本的神經網路架構,我們來對神經網路進行一定的了解。
神經網路是機器學習中的一種模型,是一種模仿動物神經網路行為特徵,進行分布式並行信息處理的演算法數學模型。這種網路依靠系統的復雜程度,通過調整內部大量節點之間相互連接的關系,從而達到處理信息的目的。
一般來說,神經網路的架構可以分為三類:
前饋神經網路:
這是實際應用中最常見的神經網路類型。第一層是輸入,最後一層是輸出。如果有多個隱藏層,我們稱之為「深度」神經網路。他們計算出一系列改變樣本相似性的變換。各層神經元的活動是前一層活動的非線性函數。
循環網路:
循環網路在他們的連接圖中定向了循環,這意味著你可以按照箭頭回到你開始的地方。他們可以有復雜的動態,使其很難訓練。他們更具有生物真實性。
循環網路的目的使用來處理序列數據。在傳統的神經網路模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連接的,每層之間的節點是無連接的。但是這種普通的神經網路對於很多問題卻無能無力。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。
循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。
對稱連接網路:
對稱連接網路有點像循環網路,但是單元之間的連接是對稱的(它們在兩個方向上權重相同)。比起循環網路,對稱連接網路更容易分析。這個網路中有更多的限制,因為它們遵守能量函數定律。沒有隱藏單元的對稱連接網路被稱為「Hopfield 網路」。有隱藏單元的對稱連接的網路被稱為玻爾茲曼機。
其實之前的帖子講過一些關於感知機的內容,這里再復述一下。
首先還是這張圖
這是一個M-P神經元
一個神經元有n個輸入,每一個輸入對應一個權值w,神經元內會對輸入與權重做乘法後求和,求和的結果與偏置做差,最終將結果放入激活函數中,由激活函數給出最後的輸出,輸出往往是二進制的,0 狀態代表抑制,1 狀態代表激活。
可以把感知機看作是 n 維實例空間中的超平面決策面,對於超平面一側的樣本,感知器輸出 1,對於另一側的實例輸出 0,這個決策超平面方程是 w⋅x=0。 那些可以被某一個超平面分割的正反樣例集合稱為線性可分(linearly separable)樣例集合,它們就可以使用圖中的感知機表示。
與、或、非問題都是線性可分的問題,使用一個有兩輸入的感知機能容易地表示,而異或並不是一個線性可分的問題,所以使用單層感知機是不行的,這時候就要使用多層感知機來解決疑惑問題了。
如果我們要訓練一個感知機,應該怎麼辦呢?
我們會從隨機的權值開始,反復地應用這個感知機到每個訓練樣例,只要它誤分類樣例就修改感知機的權值。重復這個過程,直到感知機正確分類所有的樣例。每一步根據感知機訓練法則來修改權值,也就是修改與輸入 xi 對應的權 wi,法則如下:
這里 t 是當前訓練樣例的目標輸出,o 是感知機的輸出,η 是一個正的常數稱為學習速率。學習速率的作用是緩和每一步調整權的程度,它通常被設為一個小的數值(例如 0.1),而且有時會使其隨著權調整次數的增加而衰減。
多層感知機,或者說是多層神經網路無非就是在輸入層與輸出層之間加了多個隱藏層而已,後續的CNN,DBN等神經網路只不過是將重新設計了每一層的類型。感知機可以說是神經網路的基礎,後續更為復雜的神經網路都離不開最簡單的感知機的模型,
談到機器學習,我們往往還會跟上一個詞語,叫做模式識別,但是真實環境中的模式識別往往會出現各種問題。比如:
圖像分割:真實場景中總是摻雜著其它物體。很難判斷哪些部分屬於同一個對象。對象的某些部分可以隱藏在其他對象的後面。
物體光照:像素的強度被光照強烈影響。
圖像變形:物體可以以各種非仿射方式變形。例如,手寫也可以有一個大的圓圈或只是一個尖頭。
情景支持:物體所屬類別通常由它們的使用方式來定義。例如,椅子是為了讓人們坐在上面而設計的,因此它們具有各種各樣的物理形狀。
卷積神經網路與普通神經網路的區別在於,卷積神經網路包含了一個由卷積層和子采樣層構成的特徵抽取器。在卷積神經網路的卷積層中,一個神經元只與部分鄰層神經元連接。在CNN的一個卷積層中,通常包含若干個特徵平面(featureMap),每個特徵平面由一些矩形排列的的神經元組成,同一特徵平面的神經元共享權值,這里共享的權值就是卷積核。卷積核一般以隨機小數矩陣的形式初始化,在網路的訓練過程中卷積核將學習得到合理的權值。共享權值(卷積核)帶來的直接好處是減少網路各層之間的連接,同時又降低了過擬合的風險。子采樣也叫做池化(pooling),通常有均值子采樣(mean pooling)和最大值子采樣(max pooling)兩種形式。子采樣可以看作一種特殊的卷積過程。卷積和子采樣大大簡化了模型復雜度,減少了模型的參數。
卷積神經網路由三部分構成。第一部分是輸入層。第二部分由n個卷積層和池化層的組合組成。第三部分由一個全連結的多層感知機分類器構成。
這里舉AlexNet為例:
·輸入:224×224大小的圖片,3通道
·第一層卷積:11×11大小的卷積核96個,每個GPU上48個。
·第一層max-pooling:2×2的核。
·第二層卷積:5×5卷積核256個,每個GPU上128個。
·第二層max-pooling:2×2的核。
·第三層卷積:與上一層是全連接,3*3的卷積核384個。分到兩個GPU上個192個。
·第四層卷積:3×3的卷積核384個,兩個GPU各192個。該層與上一層連接沒有經過pooling層。
·第五層卷積:3×3的卷積核256個,兩個GPU上個128個。
·第五層max-pooling:2×2的核。
·第一層全連接:4096維,將第五層max-pooling的輸出連接成為一個一維向量,作為該層的輸入。
·第二層全連接:4096維
·Softmax層:輸出為1000,輸出的每一維都是圖片屬於該類別的概率。
卷積神經網路在模式識別領域有著重要應用,當然這里只是對卷積神經網路做了最簡單的講解,卷積神經網路中仍然有很多知識,比如局部感受野,權值共享,多卷積核等內容,後續有機會再進行講解。
傳統的神經網路對於很多問題難以處理,比如你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。RNN之所以稱為循環神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的信息進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNN能夠對任何長度的序列數據進行處理。
這是一個簡單的RNN的結構,可以看到隱藏層自己是可以跟自己進行連接的。
那麼RNN為什麼隱藏層能夠看到上一刻的隱藏層的輸出呢,其實我們把這個網路展開來開就很清晰了。
從上面的公式我們可以看出,循環層和全連接層的區別就是循環層多了一個權重矩陣 W。
如果反復把式2帶入到式1,我們將得到:
在講DBN之前,我們需要對DBN的基本組成單位有一定的了解,那就是RBM,受限玻爾茲曼機。
首先什麼是玻爾茲曼機?
[圖片上傳失敗...(image-d36b31-1519636788074)]
如圖所示為一個玻爾茲曼機,其藍色節點為隱層,白色節點為輸入層。
玻爾茲曼機和遞歸神經網路相比,區別體現在以下幾點:
1、遞歸神經網路本質是學習一個函數,因此有輸入和輸出層的概念,而玻爾茲曼機的用處在於學習一組數據的「內在表示」,因此其沒有輸出層的概念。
2、遞歸神經網路各節點鏈接為有向環,而玻爾茲曼機各節點連接成無向完全圖。
而受限玻爾茲曼機是什麼呢?
最簡單的來說就是加入了限制,這個限制就是將完全圖變成了二分圖。即由一個顯層和一個隱層構成,顯層與隱層的神經元之間為雙向全連接。
h表示隱藏層,v表示顯層
在RBM中,任意兩個相連的神經元之間有一個權值w表示其連接強度,每個神經元自身有一個偏置系數b(對顯層神經元)和c(對隱層神經元)來表示其自身權重。
具體的公式推導在這里就不展示了
DBN是一個概率生成模型,與傳統的判別模型的神經網路相對,生成模型是建立一個觀察數據和標簽之間的聯合分布,對P(Observation|Label)和 P(Label|Observation)都做了評估,而判別模型僅僅而已評估了後者,也就是P(Label|Observation)。
DBN由多個限制玻爾茲曼機(Restricted Boltzmann Machines)層組成,一個典型的神經網路類型如圖所示。這些網路被「限制」為一個可視層和一個隱層,層間存在連接,但層內的單元間不存在連接。隱層單元被訓練去捕捉在可視層表現出來的高階數據的相關性。
生成對抗網路其實在之前的帖子中做過講解,這里在說明一下。
生成對抗網路的目標在於生成,我們傳統的網路結構往往都是判別模型,即判斷一個樣本的真實性。而生成模型能夠根據所提供的樣本生成類似的新樣本,注意這些樣本是由計算機學習而來的。
GAN一般由兩個網路組成,生成模型網路,判別模型網路。
生成模型 G 捕捉樣本數據的分布,用服從某一分布(均勻分布,高斯分布等)的雜訊 z 生成一個類似真實訓練數據的樣本,追求效果是越像真實樣本越好;判別模型 D 是一個二分類器,估計一個樣本來自於訓練數據(而非生成數據)的概率,如果樣本來自於真實的訓練數據,D 輸出大概率,否則,D 輸出小概率。
舉個例子:生成網路 G 好比假幣製造團伙,專門製造假幣,判別網路 D 好比警察,專門檢測使用的貨幣是真幣還是假幣,G 的目標是想方設法生成和真幣一樣的貨幣,使得 D 判別不出來,D 的目標是想方設法檢測出來 G 生成的假幣。
傳統的判別網路:
生成對抗網路:
下面展示一個cDCGAN的例子(前面帖子中寫過的)
生成網路
判別網路
最終結果,使用MNIST作為初始樣本,通過學習後生成的數字,可以看到學習的效果還是不錯的。
本文非常簡單的介紹了四種神經網路的架構,CNN,RNN,DBN,GAN。當然也僅僅是簡單的介紹,並沒有深層次講解其內涵。這四種神經網路的架構十分常見,應用也十分廣泛。當然關於神經網路的知識,不可能幾篇帖子就講解完,這里知識講解一些基礎知識,幫助大家快速入(zhuang)門(bi)。後面的帖子將對深度自動編碼器,Hopfield 網路長短期記憶網路(LSTM)進行講解。
② 神經網路淺談
人工智慧技術是當前炙手可熱的話題,而基於神經網路的深度學習技術更是熱點中的熱點。去年穀歌的Alpha Go 以4:1大比分的優勢戰勝韓國的李世石九段,展現了深度學習的強大威力,後續強化版的Alpha Master和無師自通的Alpha Zero更是在表現上完全碾壓前者。不論你怎麼看,以深度學習為代表的人工智慧技術正在塑造未來。
下圖為英偉達(NVIDIA)公司近年來的股價情況, 該公司的主要產品是「圖形處理器」(GPU),而GPU被證明能大大加快神經網路的訓練速度,是深度學習必不可少的計算組件。英偉達公司近年來股價的飛漲足以證明當前深度學習的井噴之勢。
好,話不多說,下面簡要介紹神經網路的基本原理、發展脈絡和優勢。
神經網路是一種人類由於受到生物神經細胞結構啟發而研究出的一種演算法體系,是機器學習演算法大類中的一種。首先讓我們來看人腦神經元細胞:
一個神經元通常具有多個樹突 ,主要用來接受傳入信息,而軸突只有一條,軸突尾端有許多軸突末梢,可以給其他多個神經元傳遞信息。軸突末梢跟其他神經元的樹突產生連接,從而傳遞信號。
下圖是一個經典的神經網路(Artificial Neural Network,ANN):
乍一看跟傳統互聯網的拓撲圖有點類似,這也是稱其為網路的原因,不同的是節點之間通過有向線段連接,並且節點被分成三層。我們稱圖中的圓圈為神經元,左邊三個神經元組成的一列為輸入層,中間神經元列為隱藏層,右邊神經元列為輸出層,神經元之間的箭頭為權重。
神經元是計算單元,相當於神經元細胞的細胞核,利用輸入的數據進行計算,然後輸出,一般由一個線性計算部分和一個非線性計算部分組成;輸入層和輸出層實現數據的輸入輸出,相當於細胞的樹突和軸突末梢;隱藏層指既不是輸入也不是輸出的神經元層,一個神經網路可以有很多個隱藏層。
神經網路的關鍵不是圓圈代表的神經元,而是每條連接線對應的權重。每條連接線對應一個權重,也就是一個參數。權重具體的值需要通過神經網路的訓練才能獲得。我們實際生活中的學習體現在大腦中就是一系列神經網路迴路的建立與強化,多次重復的學習能讓迴路變得更加粗壯,使得信號的傳遞速度加快,最後對外表現為「深刻」的記憶。人工神經網路的訓練也借鑒於此,如果某種映射關系出現很多次,那麼在訓練過程中就相應調高其權重。
1943年,心理學家McCulloch和數學家Pitts參考了生物神經元的結構,發表了抽象的神經元模型MP:
符號化後的模型如下:
Sum函數計算各權重與輸入乘積的線性組合,是神經元中的線性計算部分,而sgn是取符號函數,當輸入大於0時,輸出1,反之輸出0,是神經元中的非線性部分。向量化後的公式為z=sgn(w^T a)(w^T=(w_1,w_2,w_3),a=〖(a_1,a_2,a_3)〗^T)。
但是,MP模型中,權重的值都是預先設置的,因此不能學習。該模型雖然簡單,並且作用有限,但已經建立了神經網路大廈的地基
1958年,計算科學家Rosenblatt提出了由兩層神經元組成(一個輸入層,一個輸出層)的神經網路。他給它起了一個名字–「感知器」(Perceptron)
感知器是當時首個可以學習的人工神經網路。Rosenblatt現場演示了其學習識別簡單圖像的過程,在當時引起了轟動,掀起了第一波神經網路的研究熱潮。
但感知器只能做簡單的線性分類任務。1969年,人工智慧領域的巨擘Minsky指出這點,並同時指出感知器對XOR(異或,即兩個輸入相同時輸出0,不同時輸出1)這樣的簡單邏輯都無法解決。所以,明斯基認為神經網路是沒有價值的。
隨後,神經網路的研究進入低谷,又稱 AI Winter 。
Minsky說過單層神經網路無法解決異或問題,但是當增加一個計算層以後,兩層神經網路不僅可以解決異或問題,而且具有非常好的非線性分類效果。
下圖為兩層神經網路(輸入層一般不算在內):
上圖中,輸出層的輸入是上一層的輸出。
向量化後的公式為:
注意:
每個神經元節點默認都有偏置變數b,加上偏置變數後的計算公式為:
同時,兩層神經網路不再使用sgn函數作為激勵函數,而採用平滑的sigmoid函數:
σ(z)=1/(1+e^(-z) )
其圖像如下:
理論證明: 兩層及以上的神經網路可以無限逼近真實的對應函數,從而模擬數據之間的真實關系 ,這是神經網路強大預測能力的根本。但兩層神經網路的計算量太大,當時的計算機的計算能力完全跟不上,直到1986年,Rumelhar和Hinton等人提出了反向傳播(Backpropagation,BP)演算法,解決了兩層神經網路所需要的復雜計算量問題,帶動了業界使用兩層神經網路研究的熱潮。
但好景不長,演算法的改進僅使得神經網路風光了幾年,然而計算能力不夠,局部最優解,調參等一系列問題一直困擾研究人員。90年代中期,由Vapnik等人發明的SVM(Support Vector Machines,支持向量機)演算法誕生,很快就在若干個方面體現出了對比神經網路的優勢:無需調參;高效;全局最優解。
由於以上原因,SVM迅速打敗了神經網路演算法成為主流。神經網路的研究再一次進入低谷, AI Winter again 。
多層神經網路一般指兩層或兩層以上的神經網路(不包括輸入層),更多情況下指兩層以上的神經網路。
2006年,Hinton提出使用 預訓練 」(pre-training)和「微調」(fine-tuning)技術能優化神經網路訓練,大幅度減少訓練多層神經網路的時間
並且,他給多層神經網路相關的學習方法賦予了一個新名詞–「 深度學習 」,以此為起點,「深度學習」紀元開始了:)
「深度學習」一方面指神經網路的比較「深」,也就是層數較多;另一方面也可以指神經網路能學到很多深層次的東西。研究發現,在權重參數不變的情況下,增加神經網路的層數,能增強神經網路的表達能力。
但深度學習究竟有多強大呢?沒人知道。2012年,Hinton與他的學生在ImageNet競賽中,用多層的卷積神經網路成功地對包含一千類別的一百萬張圖片進行了訓練,取得了分類錯誤率15%的好成績,這個成績比第二名高了近11個百分點,充分證明了多層神經網路識別效果的優越性。
同時,科研人員發現GPU的大規模並行矩陣運算模式完美地契合神經網路訓練的需要,在同等情況下,GPU的速度要比CPU快50-200倍,這使得神經網路的訓練時間大大減少,最終再一次掀起了神經網路研究的熱潮,並且一直持續到現在。
2016年基於深度學習的Alpha Go在圍棋比賽中以4:1的大比分優勢戰勝了李世石,深度學習的威力再一次震驚了世界。
神經網路的發展歷史曲折盪漾,既有被捧上神壇的高潮,也有無人問津的低谷,中間經歷了數次大起大落,我們姑且稱之為「三起三落」吧,其背後則是演算法的改進和計算能力的持續發展。
下圖展示了神經網路自發明以來的發展情況及一些重大時間節點。
當然,對於神經網路我們也要保持清醒的頭腦。由上圖,每次神經網路研究的興盛期持續10年左右,從最近2012年算起,或許10年後的2022年,神經網路的發展將再次遇到瓶頸。
神經網路作為機器學習的一種,其模型訓練的目的,就是使得參數盡可能的與真實的模型逼近。理論證明,兩層及以上的神經網路可以無限逼近真實的映射函數。因此,給定足夠的訓練數據和訓練時間,總能通過神經網路找到無限逼近真實關系的模型。
具體做法:首先給所有權重參數賦上隨機值,然後使用這些隨機生成的參數值,來預測訓練數據中的樣本。假設樣本的預測目標為yp ,真實目標為y,定義值loss,計算公式如下:
loss = (yp -y) ^2
這個值稱之為 損失 (loss),我們的目標就是使對所有訓練數據的損失和盡可能的小,這就轉化為求loss函數極值的問題。
一個常用方法是高等數學中的求導,但由於參數不止一個,求導後計算導數等於0的運算量很大,所以常用梯度下降演算法來解決這樣的優化問題。梯度是一個向量,由函數的各自變數的偏導數組成。
比如對二元函數 f =(x,y),則梯度∇f=(∂f/∂x,∂f/∂y)。梯度的方向是函數值上升最快的方向。梯度下降演算法每次計算參數在當前的梯度,然後讓參數向著梯度的反方向前進一段距離,不斷重復,直到梯度接近零時截止。一般這個時候,所有的參數恰好達到使損失函數達到一個最低值的狀態。下圖為梯度下降的大致運行過程:
在神經網路模型中,由於結構復雜,每次計算梯度的代價很大。因此還需要使用 反向傳播 (Back Propagation)演算法。反向傳播演算法利用了神經網路的結構進行計算,不一次計算所有參數的梯度,而是從後往前。首先計算輸出層的梯度,然後是第二個參數矩陣的梯度,接著是中間層的梯度,再然後是第一個參數矩陣的梯度,最後是輸入層的梯度。計算結束以後,所要的兩個參數矩陣的梯度就都有了。當然,梯度下降只是其中一個優化演算法,其他的還有牛頓法、RMSprop等。
確定loss函數的最小值後,我們就確定了整個神經網路的權重,完成神經網路的訓練。
在神經網路中一樣的參數數量,可以用更深的層次去表達。
由上圖,不算上偏置參數的話,共有三層神經元,33個權重參數。
由下圖,保持權重參數不變,但增加了兩層神經元。
在多層神經網路中,每一層的輸入是前一層的輸出,相當於在前一層的基礎上學習,更深層次的神經網路意味著更深入的表示特徵,以及更強的函數模擬能力。更深入的表示特徵可以這樣理解,隨著網路的層數增加,每一層對於前一層次的抽象表示更深入。
如上圖,第一個隱藏層學習到「邊緣」的特徵,第二個隱藏層學習到「邊緣」組成的「形狀」的特徵,第三個隱藏層學習到由「形狀」組成的「圖案」的特徵,最後的隱藏層學習到由「圖案」組成的「目標」的特徵。通過抽取更抽象的特徵來對事物進行區分,從而獲得更好的區分與分類能力。
前面提到, 明斯基認為Rosenblatt提出的感知器模型不能處理最簡單的「異或」(XOR)非線性問題,所以神經網路的研究沒有前途,但當增加一層神經元後,異或問題得到了很好地解決,原因何在?原來從輸入層到隱藏層,數據發生了空間變換,坐標系發生了改變,因為矩陣運算本質上就是一種空間變換。
如下圖,紅色和藍色的分界線是最終的分類結果,可以看到,該分界線是一條非常平滑的曲線。
但是,改變坐標系後,分界線卻表現為直線,如下圖:
同時,非線性激勵函數的引入使得神經網路對非線性問題的表達能力大大加強。
對於傳統的樸素貝葉斯、決策樹、支持向量機SVM等分類器,提取特徵是一個非常重要的前置工作。在正式訓練之前,需要花費大量的時間在數據的清洗上,這樣分類器才能清楚地知道數據的維度,要不然基於概率和空間距離的線性分類器是沒辦法進行工作的。然而在神經網路中,由於巨量的線性分類器的堆疊(並行和串列)以及卷積神經網路的使用,它對雜訊的忍耐能力、對多通道數據上投射出來的不同特徵偏向的敏感程度會自動重視或忽略,這樣我們在處理的時候,就不需要使用太多的技巧用於數據的清洗了。有趣的是,業內大佬常感嘆,「你可能知道SVM等機器學習的所有細節,但是效果並不好,而神經網路更像是一個黑盒,很難知道它究竟在做什麼,但工作效果卻很好」。
人類對機器學習的環節干預越少,就意味著距離人工智慧的方向越近。神經網路的這個特性非常有吸引力。
1) 谷歌的TensorFlow開發了一個非常有意思的神經網路 入門教程 ,用戶可以非常方便地在網頁上更改神經網路的參數,並且能看到實時的學習效率和結果,非常適合初學者掌握神經網路的基本概念及神經網路的原理。網頁截圖如下:
2) 深度學習領域大佬吳恩達不久前發布的《 神經網路和深度學習 》MOOC,現在可以在網易雲課堂上免費觀看了,並且還有中文字幕。
3) 《神經網路於深度學習》(Michael Nielsen著)、《白話深度學習與TensorFlow》也是不錯的入門書籍。
③ 為什麼感知機(單層神經網路)不能解決異或問題
不僅僅復是感知機,制 所有的線性分類器都有這樣的問題,包括LDA(Linear discriminant analysis), linear-SVM, Logistic regression都不能做XOR。 但這些演算法還是十分流行,因為現實的機器學習問題中XOR的情況並不是很多。
④ 有人可以介紹一下什麼是"神經網路"嗎
由於神經網路是多學科交叉的產物,各個相關的學科領域對神經網路
都有各自的看法,因此,關於神經網路的定義,在科學界存在許多不同的
見解。目前使用得最廣泛的是T.Koholen的定義,即"神經網路是由具有適
應性的簡單單元組成的廣泛並行互連的網路,它的組織能夠模擬生物神經
系統對真實世界物體所作出的交互反應。"
如果我們將人腦神經信息活動的特點與現行馮·諾依曼計算機的工作方
式進行比較,就可以看出人腦具有以下鮮明特徵:
1. 巨量並行性。
在馮·諾依曼機中,信息處理的方式是集中、串列的,即所有的程序指
令都必須調到CPU中後再一條一條地執行。而人在識別一幅圖像或作出一項
決策時,存在於腦中的多方面的知識和經驗會同時並發作用以迅速作出解答。
據研究,人腦中約有多達10^(10)~10^(11)數量級的神經元,每一個神經元
具有103數量級的連接,這就提供了巨大的存儲容量,在需要時能以很高的
反應速度作出判斷。
2. 信息處理和存儲單元結合在一起。
在馮·諾依曼機中,存儲內容和存儲地址是分開的,必須先找出存儲器的
地址,然後才能查出所存儲的內容。一旦存儲器發生了硬體故障,存儲器中
存儲的所有信息就都將受到毀壞。而人腦神經元既有信息處理能力又有存儲
功能,所以它在進行回憶時不僅不用先找存儲地址再調出所存內容,而且可
以由一部分內容恢復全部內容。當發生"硬體"故障(例如頭部受傷)時,並
不是所有存儲的信息都失效,而是僅有被損壞得最嚴重的那部分信息丟失。
3. 自組織自學習功能。
馮·諾依曼機沒有主動學習能力和自適應能力,它只能不折不扣地按照
人們已經編制好的程序步驟來進行相應的數值計算或邏輯計算。而人腦能夠
通過內部自組織、自學習的能力,不斷地適應外界環境,從而可以有效地處
理各種模擬的、模糊的或隨機的問題。
神經網路研究的主要發展過程大致可分為四個階段:
1. 第一階段是在五十年代中期之前。
西班牙解剖學家Cajal於十九世紀末創立了神經元學說,該學說認為神經
元的形狀呈兩極,其細胞體和樹突從其他神經元接受沖動,而軸索則將信號
向遠離細胞體的方向傳遞。在他之後發明的各種染色技術和微電極技術不斷
提供了有關神經元的主要特徵及其電學性質。
1943年,美國的心理學家W.S.McCulloch和數學家W.A.Pitts在論文《神經
活動中所蘊含思想的邏輯活動》中,提出了一個非常簡單的神經元模型,即
M-P模型。該模型將神經元當作一個功能邏輯器件來對待,從而開創了神經
網路模型的理論研究。
1949年,心理學家D.O. Hebb寫了一本題為《行為的組織》的書,在這本
書中他提出了神經元之間連接強度變化的規則,即後來所謂的Hebb學習法則。
Hebb寫道:"當神經細胞A的軸突足夠靠近細胞B並能使之興奮時,如果A重
復或持續地激發B,那麼這兩個細胞或其中一個細胞上必然有某種生長或代
謝過程上的變化,這種變化使A激活B的效率有所增加。"簡單地說,就是
如果兩個神經元都處於興奮狀態,那麼它們之間的突觸連接強度將會得到增
強。
五十年代初,生理學家Hodykin和數學家Huxley在研究神經細胞膜等效電
路時,將膜上離子的遷移變化分別等效為可變的Na+電阻和K+電阻,從而建
立了著名的Hodykin-Huxley方程。
這些先驅者的工作激發了許多學者從事這一領域的研究,從而為神經計
算的出現打下了基礎。
2. 第二階段從五十年代中期到六十年代末。
1958年,F.Rosenblatt等人研製出了歷史上第一個具有學習型神經網路
特點的模式識別裝置,即代號為Mark I的感知機(Perceptron),這一重
大事件是神經網路研究進入第二階段的標志。對於最簡單的沒有中間層的
感知機,Rosenblatt證明了一種學習演算法的收斂性,這種學習演算法通過迭代
地改變連接權來使網路執行預期的計算。
稍後於Rosenblatt,B.Widrow等人創造出了一種不同類型的會學習的神經
網路處理單元,即自適應線性元件Adaline,並且還為Adaline找出了一種有
力的學習規則,這個規則至今仍被廣泛應用。Widrow還建立了第一家神經計
算機硬體公司,並在六十年代中期實際生產商用神經計算機和神經計算機軟
件。
除Rosenblatt和Widrow外,在這個階段還有許多人在神經計算的結構和
實現思想方面作出了很大的貢獻。例如,K.Steinbuch研究了稱為學習矩陣
的一種二進制聯想網路結構及其硬體實現。N.Nilsson於1965年出版的
《機器學習》一書對這一時期的活動作了總結。
3. 第三階段從六十年代末到八十年代初。
第三階段開始的標志是1969年M.Minsky和S.Papert所著的《感知機》一書
的出版。該書對單層神經網路進行了深入分析,並且從數學上證明了這種網
絡功能有限,甚至不能解決象"異或"這樣的簡單邏輯運算問題。同時,他們
還發現有許多模式是不能用單層網路訓練的,而多層網路是否可行還很值得
懷疑。
由於M.Minsky在人工智慧領域中的巨大威望,他在論著中作出的悲觀結論
給當時神經網路沿感知機方向的研究潑了一盆冷水。在《感知機》一書出版
後,美國聯邦基金有15年之久沒有資助神經網路方面的研究工作,前蘇聯也
取消了幾項有前途的研究計劃。
但是,即使在這個低潮期里,仍有一些研究者繼續從事神經網路的研究工
作,如美國波士頓大學的S.Grossberg、芬蘭赫爾辛基技術大學的T.Kohonen
以及日本東京大學的甘利俊一等人。他們堅持不懈的工作為神經網路研究的
復興開辟了道路。
4. 第四階段從八十年代初至今。
1982年,美國加州理工學院的生物物理學家J.J.Hopfield採用全互連型
神經網路模型,利用所定義的計算能量函數,成功地求解了計算復雜度為
NP完全型的旅行商問題(Travelling Salesman Problem,簡稱TSP)。這
項突破性進展標志著神經網路方面的研究進入了第四階段,也是蓬勃發展
的階段。
Hopfield模型提出後,許多研究者力圖擴展該模型,使之更接近人腦的
功能特性。1983年,T.Sejnowski和G.Hinton提出了"隱單元"的概念,並且
研製出了Boltzmann機。日本的福島邦房在Rosenblatt的感知機的基礎上,
增加隱層單元,構造出了可以實現聯想學習的"認知機"。Kohonen應用3000
個閾器件構造神經網路實現了二維網路的聯想式學習功能。1986年,
D.Rumelhart和J.McClelland出版了具有轟動性的著作《並行分布處理-認知
微結構的探索》,該書的問世宣告神經網路的研究進入了高潮。
1987年,首屆國際神經網路大會在聖地亞哥召開,國際神經網路聯合會
(INNS)成立。隨後INNS創辦了刊物《Journal Neural Networks》,其他
專業雜志如《Neural Computation》,《IEEE Transactions on Neural
Networks》,《International Journal of Neural Systems》等也紛紛
問世。世界上許多著名大學相繼宣布成立神經計算研究所並制訂有關教育
計劃,許多國家也陸續成立了神經網路學會,並召開了多種地區性、國際性
會議,優秀論著、重大成果不斷涌現。
今天,在經過多年的准備與探索之後,神經網路的研究工作已進入了決
定性的階段。日本、美國及西歐各國均制訂了有關的研究規劃。
日本制訂了一個"人類前沿科學計劃"。這項計劃為期15-20年,僅
初期投資就超過了1萬億日元。在該計劃中,神經網路和腦功能的研究佔有
重要地位,因為所謂"人類前沿科學"首先指的就是有關人類大腦以及通過
借鑒人腦而研製新一代計算機的科學領域。
在美國,神經網路的研究得到了軍方的強有力的支持。美國國防部投資
4億美元,由國防部高級研究計劃局(DAPRA)制訂了一個8年研究計劃,
並成立了相應的組織和指導委員會。同時,海軍研究辦公室(ONR)、空軍
科研辦公室(AFOSR)等也紛紛投入巨額資金進行神經網路的研究。DARPA認
為神經網路"看來是解決機器智能的唯一希望",並認為"這是一項比原子彈
工程更重要的技術"。美國國家科學基金會(NSF)、國家航空航天局(NASA)
等政府機構對神經網路的發展也都非常重視,它們以不同的形式支持了眾多
的研究課題。
歐共體也制訂了相應的研究計劃。在其ESPRIT計劃中,就有一個項目是
"神經網路在歐洲工業中的應用",除了英、德兩國的原子能機構外,還有多
個歐洲大公司卷進這個研究項目,如英國航天航空公司、德國西門子公司等。
此外,西歐一些國家還有自己的研究計劃,如德國從1988年就開始進行一個
叫作"神經資訊理論"的研究計劃。
我國從1986年開始,先後召開了多次非正式的神經網路研討會。1990年
12月,由中國計算機學會、電子學會、人工智慧學會、自動化學會、通信學
會、物理學會、生物物理學會和心理學會等八個學會聯合在北京召開了"中
國神經網路首屆學術會議",從而開創了我國神經網路研究的新紀元。
⑤ 如何用代碼編寫一個神經網路異或運算器
配置環境、安裝合適的庫、下載數據集……有時候學習深度學習的前期工作很讓人沮喪,如果只是為了試試現在人人都談的深度學習,做這些麻煩事似乎很不值當。但好在我們也有一些更簡單的方法可以體驗深度學習。近日,編程學習平台 Scrimba 聯合創始人 Per Harald Borgen 在 Medium 上發文介紹了一種僅用30行 JavaScript 代碼就創建出了一個神經網路的教程,而且使用的工具也只有 Node.js、Synaptic.js 和瀏覽器而已。另外,作者還做了一個互動式 Scrimba 教程,也許能幫你理解其中的復雜概念。
Synaptic.js:http://synaptic.juancazala.com
Node.js:http://nodejs.org
Scrimba 教程:http://scrimba.com/casts/cast-1980
Synaptic.js 讓你可以使用 Node.js 和瀏覽器做深度學習。在這篇文章中,我將介紹如何使用 Synaptic.js 創建和訓練神經網路。
//創建網路const { Layer, Network }= window.synaptic;var inputLayer = new Layer(2);var hiddenLayer = new Layer(3);var outputLayer = new Layer(1);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);var myNetwork = new Network({
input: inputLayer,
hidden:[hiddenLayer],
output: outputLayer
});//訓練網路——學習異或運算var learningRate =.3;for (var i =0; i <20000; i++)
{//0,0=>0
myNetwork.activate([0,0]);
myNetwork.propagate(learningRate,[0]);//0,1=>1
myNetwork.activate([0,1]);
myNetwork.propagate(learningRate,[1]);//1,0=>1
myNetwork.activate([1,0]);
myNetwork.propagate(learningRate,[1]);//1,1=>0
myNetwork.activate([1,1]);
myNetwork.propagate(learningRate,[0]);
}//測試網路console.log(myNetwork.activate([0,0]));//[0.0]console.log(myNetwork.activate([0,1]));//[0.]console.log(myNetwork.activate([1,0]));//[0.]console.log(myNetwork.activate([1,1]));//[0.0]
我們將創建一個最簡單的神經網路:一個可以執行異或運算的網路。上面就是這個網路的全部代碼,但在我們深入解讀這些代碼之前,首先我們先了解一下神經網路的基礎知識。
神經元和突觸
神經網路的基本構造模塊是神經元。神經元就像是一個函數,有幾個輸入,然後可以得到一個輸出。神經元的種類有很多。我們的網路將使用 sigmoid 神經元,它可以輸入任何數字並將其壓縮到0 到1 之間。下圖就是一個 sigmoid 神經元。它的輸入是5,輸出是1。箭頭被稱為突觸,可以將該神經元與網路中的其它層連接到一起。
現在訓練這個網路:
// train the network - learn XORvar learningRate =.3;for (var i =0; i <20000; i++){ //0,0=>0
myNetwork.activate([0,0]);
myNetwork.propagate(learningRate,[0]);//0,1=>1
myNetwork.activate([0,1]);
myNetwork.propagate(learningRate,[1]);//1,0=>1
myNetwork.activate([1,0]);
myNetwork.propagate(learningRate,[1]);//1,1=>0
myNetwork.activate([1,1]);
myNetwork.propagate(learningRate,[0]);
}
這里我們運行該網路20000次。每一次我們都前向和反向傳播4 次,為該網路輸入4 組可能的輸入:[0,0][0,1][1,0][1,1]。
首先我們執行 myNetwork.activate([0,0]),其中[0,0]是我們發送給該網路的數據點。這是前向傳播,也稱為激活這個網路。在每次前向傳播之後,我們需要執行反向傳播,這時候網路會更新自己的權重和偏置。
反向傳播是通過這行代碼完成的:myNetwork.propagate(learningRate,[0]),其中 learningRate 是一個常數,給出了網路每次應該調整的權重的量。第二個參數0 是給定輸入[0,0]對應的正確輸出。
然後,該網路將自己的預測與正確的標簽進行比較,從而了解自己的正確程度有多少。
然後網路使用這個比較為基礎來校正自己的權重和偏置值,這樣讓自己的下一次猜測更加正確一點。
這個過程如此反復20000次之後,我們可以使用所有四種可能的輸入來檢查網路的學習情況:
->[0.0]console.log(myNetwork.activate([0,1]));
->[0.]console.log(myNetwork.activate([1,0]));
->[0.]console.log(myNetwork.activate([1,1]));
->[0.0]
如果我們將這些值四捨五入到最近的整數,我們就得到了正確的異或運算結果。
這樣就完成了。盡管這僅僅只碰到了神經網路的表皮,但也足以幫助你進一步探索 Synaptic 和繼續學習了。http://github.com/cazala/synaptic/wiki 這里還包含了更多好教程。
⑥ 神經網路的來源
神經網路技術起源於上世紀五、六十年代,當時叫 感知機 (perceptron),包含有輸入層、輸出層和一個隱藏層。輸入的特徵向量通過隱藏層變換到達輸出層,由輸出層得到分類結果。但早期的單層感知機存在一個嚴重的問題——它對稍微復雜一些的函數都無能為力(如異或操作)。直到上世紀八十年代才被Hition、Rumelhart等人發明的多層感知機克服,就是具有多層隱藏層的感知機。
多層感知機可以擺脫早期離散傳輸函數的束縛,使用sigmoid或tanh等連續函數模擬神經元對激勵的響應,在訓練演算法上則使用Werbos發明的反向傳播BP演算法。這就是現在所說的神經網路NN。
神經網路的層數直接決定了它對現實的刻畫能力 ——利用每層更少的神經元擬合更加復雜的函數。但問題出現了——隨著神經網路層數的加深, 優化函數越來越容易陷入局部最優解 ,並且這個「陷阱」越來越偏離真正的全局最優。利用有限數據訓練的深層網路,性能還不如較淺層網路。同時,另一個不可忽略的問題是隨著網路層數增加, 「梯度消失」現象更加嚴重 。(具體來說,我們常常使用sigmoid作為神經元的輸入輸出函數。對於幅度為1的信號,在BP反向傳播梯度時,每傳遞一層,梯度衰減為原來的0.25。層數一多,梯度指數衰減後低層基本上接受不到有效的訓練信號。)
2006年,Hition提出了深度學習的概念,引發了深度學習的熱潮。具體是利用預訓練的方式緩解了局部最優解的問題,將隱藏層增加到了7層,實現了真正意義上的「深度」。
DNN形成
為了克服梯度消失,ReLU、maxout等傳輸函數代替了sigmoid,形成了如今DNN的基本形式。結構跟多層感知機一樣,如下圖所示:
我們看到 全連接DNN的結構里下層神經元和所有上層神經元都能夠形成連接,從而導致參數數量膨脹 。假設輸入的是一幅像素為1K*1K的圖像,隱含層有1M個節點,光這一層就有10^12個權重需要訓練,這不僅容易過擬合,而且極容易陷入局部最優。
CNN形成
由於圖像中存在固有的局部模式(如人臉中的眼睛、鼻子、嘴巴等),所以將圖像處理和神將網路結合引出卷積神經網路CNN。CNN是通過卷積核將上下層進行鏈接,同一個卷積核在所有圖像中是共享的,圖像通過卷積操作後仍然保留原先的位置關系。
通過一個例子簡單說明卷積神經網路的結構。假設我們需要識別一幅彩色圖像,這幅圖像具有四個通道ARGB(透明度和紅綠藍,對應了四幅相同大小的圖像),假設卷積核大小為100*100,共使用100個卷積核w1到w100(從直覺來看,每個卷積核應該學習到不同的結構特徵)。
用w1在ARGB圖像上進行卷積操作,可以得到隱含層的第一幅圖像;這幅隱含層圖像左上角第一個像素是四幅輸入圖像左上角100*100區域內像素的加權求和,以此類推。
同理,算上其他卷積核,隱含層對應100幅「圖像」。每幅圖像對是對原始圖像中不同特徵的響應。按照這樣的結構繼續傳遞下去。CNN中還有max-pooling等操作進一步提高魯棒性。
注意到最後一層實際上是一個全連接層,在這個例子里,我們注意到輸入層到隱藏層的參數瞬間降低到了100*100*100=10^6個!這使得我們能夠用已有的訓練數據得到良好的模型。題主所說的適用於圖像識別,正是由於CNN模型限制參數了個數並挖掘了局部結構的這個特點。順著同樣的思路,利用語音語譜結構中的局部信息,CNN照樣能應用在語音識別中。
RNN形成
DNN無法對時間序列上的變化進行建模。然而,樣本出現的時間順序對於自然語言處理、語音識別、手寫體識別等應用非常重要。為了適應這種需求,就出現了大家所說的另一種神經網路結構——循環神經網路RNN。
在普通的全連接網路或CNN中,每層神經元的信號只能向上一層傳播,樣本的處理在各個時刻獨立,因此又被成為前向神經網路(Feed-forward Neural Networks)。而在RNN中,神經元的輸出可以在下一個時間段直接作用到自身,即第i層神經元在m時刻的輸入,除了(i-1)層神經元在該時刻的輸出外,還包括其自身在(m-1)時刻的輸出!表示成圖就是這樣的:
為方便分析,按照時間段展開如下圖所示:
(t+1)時刻網路的最終結果O(t+1)是該時刻輸入和所有歷史共同作用的結果!這就達到了對時間序列建模的目的。RNN可以看成一個在時間上傳遞的神經網路,它的深度是時間的長度!正如我們上面所說,「梯度消失」現象又要出現了,只不過這次發生在時間軸上。
所以RNN存在無法解決長時依賴的問題。為解決上述問題,提出了LSTM(長短時記憶單元),通過cell門開關實現時間上的記憶功能,並防止梯度消失,LSTM單元結構如下圖所示:
除了DNN、CNN、RNN、ResNet(深度殘差)、LSTM之外,還有很多其他結構的神經網路。如因為在序列信號分析中,如果我能預知未來,對識別一定也是有所幫助的。因此就有了雙向RNN、雙向LSTM,同時利用歷史和未來的信息。
事實上,不論是哪種網路,他們在實際應用中常常都混合著使用,比如CNN和RNN在上層輸出之前往往會接上全連接層,很難說某個網路到底屬於哪個類別。不難想像隨著深度學習熱度的延續,更靈活的組合方式、更多的網路結構將被發展出來。
參考鏈接:https://www.leiphone.com/news/201702/ZwcjmiJ45aW27ULB.html