「深度神經網路」(deep neural network)具體是怎樣工作的?

主要來自下面這條新聞:

微軟研究人員在深度神經網路(deep neural network)上取得突破,

使其在性能上能趕上目前最先進的語音識別技術。

http://software.solidot.org/article.pl?sid=11/08/29/0917205from=rss

我只記得關於@李開復 的介紹裡面說的很多用概率才能解決,包括語音識別,

那麼這一次是什麼原理,能深入淺出地講解嗎?求講課。。

Wiki 上沒寫那個 deep,不過我已經不大懂了,順帶鏈接:

http://en.wikipedia.org/wiki/Neural_network

還有 Solidot 給的微軟原文鏈接:

https://research.microsoft.com/en-us/news/features/speechrecognition-082911.aspx


深層學習為何要「Deep」(上)一、基本變換:層

神經網路是由一層一層構建的,那麼每究竟在做什麼?

  • 數學式子vec{y}= a(Wcdotvec{x} + {b}),其中vec{x}是輸入向量,vec{y}是輸出向量,vec{b}是偏移向量,W是權重矩陣,a()是激活函數。每一層僅僅是把輸入vec x經過如此簡單的操作得到vec y
  • 數學理解:通過如下5種對輸入空間(輸入向量的集合)的操作,完成 輸入空間 ——&> 輸出空間 的變換 (矩陣的行空間到列空間)。

    註:用「空間」二字的原因是被分類的並不是單個事物,而是一類事物。空間是指這類事物所有個體的集合。
    • 1. 升維/降維
    • 2. 放大/縮小
    • 3. 旋轉
    • 4. 平移
    • 5. 「彎曲」

      這5種操作中,1,2,3的操作由Wcdotvec{x}完成,4的操作是由+vec{b}完成,5的操作則是由a()來實現。 (此處有動態圖5種空間操作,幫助理解)

每層神經網路的數學理解:用線性變換跟隨著非線性變化,將輸入空間投向另一個空間

  • 物理理解:對 Wcdotvec{x} 的理解就是通過組合形成新物質
a()又符合了我們所處的世界都是非線性的特點。

    • 情景:vec{x}是二維向量,維度是碳原子和氧原子的數量 [C;O],數值且定為[1;1],若確定vec{y}是三維向量,就會形成如下網路的形狀 (神經網路的每個節點表示一個維度)。通過改變權重的值,可以獲得若干個不同物質。右側的節點數決定了想要獲得多少種不同的新物質。(矩陣的行數)

      1.如果權重W的數值如(1),那麼網路的輸出y? 就會是三個新物質,[二氧化碳,臭氧,一氧化碳]。

      left[
 egin{matrix}
   CO_{2}\
   O_{3}\
   CO
  end{matrix}
  
ight]=
 left[
 egin{matrix}
   1  2 \
   0  3\
   1  1
  end{matrix}
  
ight] cdot left[
 egin{matrix}
   C \
   O \
  end{matrix}
  
ight] (1)
    • 2.也可以減少右側的一個節點,並改變權重W至(2),那麼輸出vec{y} 就會是兩個新物質,[ O_{0.3};CO_{1.5}]

      left[
 egin{matrix}
    O_{0.3}\
   CO_{1.5}\
  end{matrix}
  
ight]=
 left[
 egin{matrix}
   0 0.3 \
   1  1.5\
  end{matrix}
  
ight] cdot left[
 egin{matrix}
   C \
   O \
  end{matrix}
  
ight](2)

      3.如果希望通過層網路能夠從[C, O]空間轉變到[CO_{2};O_{3};CO]空間的話,那麼網路的學習過程就是將W的數值變成儘可能接近(1)的過程 。如果再加一層,就是通過組合[CO_{2};O_{3};CO]這三種基礎物質,形成若干更高層的物質。

      4.重要的是這種組合思想,組合成的東西在神經網路中並不需要有物理意義。

每層神經網路的物理理解:通過現有的不同物質的組合形成新物質

二、理解視角:

現在我們知道了每一層的行為,但這種行為又是如何完成識別任務的呢?

數學視角:「線性可分」

  • 一維情景:以分類為例,當要分類正數、負數、零,三類的時候,一維空間的直線可以找到兩個超平面(比當前空間低一維的子空間。當前空間是直線的話,超平面就是點)分割這三類。但面對像分類奇數和偶數無法找到可以區分它們的點的時候,我們藉助 x % 2(取余)的轉變,把x變換到另一個空間下來比較,從而分割。

  • 二維情景:平面的四個象限也是線性可分。但下圖的紅藍兩條線就無法找到一超平面去分割。

    神經網路的解決方法依舊是轉換到另外一個空間下,用的是所說的5種空間變換操作。比如下圖就是經過放大、平移、旋轉、扭曲原二維空間後,在三維空間下就可以成功找到一個超平面分割紅藍兩線 (同SVM的思路一樣)。

    上面是一層神經網路可以做到的,如果把vec{y} 當做新的輸入再次用這5種操作進行第二遍空間變換的話,網路也就變為了二層。最終輸出是vec{y}= a_{2}(W_{2}cdot(a_{1}(W_{1}cdotvec{x} + {b}_{1})) + {b}_{2})

    設想網路擁有很多層時,對原始輸入空間的「扭曲力」會大幅增加,如下圖,最終我們可以輕鬆找到一個超平面分割空間。

    當然也有如下圖失敗的時候,關鍵在於「如何扭曲空間」。所謂監督學習就是給予神經網路網路大量的訓練例子,讓網路從訓練例子中學會如何變換空間。每一層的權重W就控制著如何變換空間,我們最終需要的也就是訓練好的神經網路的所有層的權重矩陣。。這裡有非常棒的可視化空間變換demo,一定要打開嘗試並感受這種扭曲過程。更多內容請看Neural Networks, Manifolds, and Topology。

上面的內容有三張動態圖,對於理解這種空間變化非常有幫助。由於知乎不支持動態圖,可以在gitbook 人工神經網路 · 超智能體上感受那三張圖。一定一定要感受

線性可分視角:神經網路的學習就是學習如何利用矩陣的線性變換加激活函數的非線性變換,將原始輸入空間投向線性可分/稀疏的空間去分類/回歸。

增加節點數:增加維度,即增加線性轉換能力。

增加層數:增加激活函數的次數,即增加非線性轉換次數。

物理視角:「物質組成」

  • 類比:回想上文由碳氧原子通過不同組合形成若干分子的例子。從分子層面繼續迭代這種組合思想,可以形成DNA,細胞,組織,器官,最終可以形成一個完整的人。繼續迭代還會有家庭,公司,國家等。這種現象在身邊隨處可見。並且原子的內部結構與太陽系又驚人的相似。不同層級之間都是以類似的幾種規則再不斷形成新物質。你也可能聽過分形學這三個字。可通過觀看從1米到150億光年來感受自然界這種層級現象的普遍性。

  • 人臉識別情景:我們可以模擬這種思想並應用在畫面識別上。由像素組成菱角再組成五官最後到不同的人臉。每一層代表不同的不同的物質層面 (如分子層)。而每層的W存儲著如何組合上一層的物質從而形成新物質

    如果我們完全掌握一架飛機是如何從分子開始一層一層形成的,拿到一堆分子後,我們就可以判斷他們是否可以以此形成方式,形成一架飛機。

    附:Tensorflow playground展示了數據是如何「流動」的。

物質組成視角:神經網路的學習過程就是學習物質組成方式的過程。

增加節點數:增加同一層物質的種類,比如118個元素的原子層就有118個節點。

增加層數:增加更多層級,比如分子層,原子層,器官層,並通過判斷更抽象的概念來識別物體。

按照上文在理解視角中所述的觀點,可以想出下面兩條理由關於為什麼更深的網路會更加容易識別,增加容納變異體(variation)(紅蘋果、綠蘋果)的能力、魯棒性(robust)。

數學視角:變異體(variation)很多的分類的任務需要高度非線性的分割曲線。不斷的利用那5種空間變換操作將原始輸入空間像「捏橡皮泥一樣」在高維空間下捏成更為線性可分/稀疏的形狀。

物理視角:通過對「抽象概念」的判斷來識別物體,而非細節。比如對「飛機」的判斷,即便人類自己也無法用語言或者若干條規則來解釋自己如何判斷一個飛機。因為人腦中真正判斷的不是是否「有機翼」、「能飛行」等細節現象,而是一個抽象概念。層數越深,這種概念就越抽象,所能涵蓋的變異體就越多,就可以容納戰鬥機,客機等很多種不同種類的飛機。

三、神經網路的訓練

知道了神經網路的學習過程就是學習控制著空間變換方式(物質組成方式)的權重矩陣後,接下來的問題就是如何學習每一層的權重矩陣W。

如何訓練:

既然我們希望網路的輸出儘可能的接近真正想要預測的值。那麼就可以通過比較當前網路的預測值和我們真正想要的目標值,再根據兩者的差異情況來更新每一層的權重矩陣(比如,如果網路的預測值高了,就調整權重讓它預測低一些,不斷調整,直到能夠預測出目標值)。因此就需要先定義「如何比較預測值和目標值的差異」,這便是損失函數或目標函數(loss function or objective function),用于衡量預測值和目標值的差異的方程。loss function的輸出值(loss)越高表示差異性越大。那神經網路的訓練就變成了儘可能的縮小loss的過程。

所用的方法是梯度下降(Gradient descent):通過使loss值向當前點對應梯度的反方向不斷移動,來降低loss。一次移動多少是由學習速率(learning rate)來控制的。

梯度下降的問題:

然而使用梯度下降訓練神經網路擁有兩個主要難題。

1、局部極小值

梯度下降尋找的是loss function的局部極小值,而我們想要全局最小值。如下圖所示,我們希望loss值可以降低到右側深藍色的最低點,但loss有可能「卡」在左側的局部極小值中。

試圖解決「卡在局部極小值」問題的方法分兩大類:

  • 調節步伐:調節學習速率,使每一次的更新「步伐」不同。常用方法有:

  • 隨機梯度下降(Stochastic Gradient Descent (SGD):每次只更新一個樣本所計算的梯度

  • 小批量梯度下降(Mini-batch gradient descent):每次更新若干樣本所計算的梯度的平均值
  • 動量(Momentum):不僅僅考慮當前樣本所計算的梯度;Nesterov動量(Nesterov Momentum):Momentum的改進
  • Adagrad、RMSProp、Adadelta、Adam:這些方法都是訓練過程中依照規則降低學習速率,部分也綜合動量

  • 優化起點:合理初始化權重(weights initialization)、預訓練網路(pre-train),使網路獲得一個較好的「起始點」,如最右側的起始點就比最左側的起始點要好。常用方法有:高斯分布初始權重(Gaussian distribution)、均勻分布初始權重(Uniform distribution)、Glorot 初始權重、He初始權、稀疏矩陣初始權重(sparse matrix)

2、梯度的計算

機器學習所處理的數據都是高維數據,該如何快速計算梯度、而不是以年來計算。

其次如何更新隱藏層的權重?

解決方法是:計算圖:反向傳播演算法

這裡的解釋留給非常棒的Computational Graphs: Backpropagation

需要知道的是,反向傳播演算法是求梯度的一種方法。如同快速傅里葉變換(FFT)的貢獻。

而計算圖的概念又使梯度的計算更加合理方便。

基本流程圖:

下面就結合圖簡單瀏覽一下訓練和識別過程,並描述各個部分的作用。要結合圖解閱讀以下內容。但手機顯示的圖過小,最好用電腦打開

  • 收集訓練集(train data):也就是同時有input以及對應label的數據。每個數據叫做訓練樣本(sample)。label也叫target,也是機器學習中最貴的部分。上圖表示的是我的資料庫。假設input本別是x的維度是39,label的維度是48。
  • 設計網路結構(architecture):確定層數、每一隱藏層的節點數和激活函數,以及輸出層的激活函數和損失函數。上圖用的是兩層隱藏層(最後一層是輸出層)。隱藏層所用激活函數a( )是ReLu,輸出層的激活函數是線性linear(也可看成是沒有激活函數)。隱藏層都是1000節點。損失函數L( )是用於比較距離MSE:mean((output - target)^2)。MSE越小表示預測效果越好。訓練過程就是不斷減小MSE的過程。到此所有數據的維度都已確定:

    • 訓練數據:input in R^{39} ;label in R^{48}

    • 權重矩陣:W_{h1}in R^{1000x39};W_{h2}in R^{1000x1000} ;W_{o}in R^{48x1000}

    • 偏移向量:b_{h1}in R^{1000};b_{h2}in R^{1000} ;b_{o}in R^{48}

    • 網路輸出:output in R^{48}

  • 數據預處理(preprocessing):將所有樣本的input和label處理成能夠使用神經網路的數據,label的值域符合激活函數的值域。並簡單優化數據以便讓訓練易於收斂。比如中心化(mean subtraction)、歸一化(normlization)、主成分分析(PCA)、白化(whitening)。假設上圖的input和output全都經過了中心化和歸一化。

  • 權重初始化(weights initialization)W_{h1},W_{h2},W_{0}在訓練前不能為空,要初始化才能夠計算loss從而來降低。W_{h1},W_{h2},W_{0}初始化決定了loss在loss function中從哪個點開始作為起點訓練網路。上圖用均勻分布初始權重(Uniform distribution)。
  • 訓練網路(training):訓練過程就是用訓練數據的input經過網路計算出output,再和label計算出loss,再計算出gradients來更新weights的過程。

    • 正向傳遞:,算當前網路的預測值output =linear (W_{o} cdot Relu(W_{h2}cdot Relu(W_{h1}cdot input+b_{h1})+b_{h2}) +b_{o})
    • 計算loss:loss = mean((output - target)^2)
    • 計算梯度:從loss開始反向傳播計算每個參數(parameters)對應的梯度(gradients)。這裡用Stochastic Gradient Descent (SGD) 來計算梯度,即每次更新所計算的梯度都是從一個樣本計算出來的。傳統的方法Gradient Descent是正向傳遞所有樣本來計算梯度。SGD的方法來計算梯度的話,loss function的形狀如下圖所示會有變化,這樣在更新中就有可能「跳出」局部最小值。

    • 更新權重:這裡用最簡單的方法來更新,即所有參數都 W = W - learningrate * gradient
    • 預測新值:訓練過所有樣本後,打亂樣本順序再次訓練若干次。訓練完畢後,當再來新的數據input,就可以利用訓練的網路來預測了。這時的output就是效果很好的預測值了。下圖是一張實際值預測值的三組對比圖。輸出數據是48維,這裡只取1個維度來畫圖。藍色的是實際值,綠色的是實際值。最上方的是訓練數據的對比圖,而下方的兩行是神經網路模型從未見過的數據預測對比圖。(不過這裡用的是RNN,主要是為了讓大家感受一下效果)

註:此部分內容不是這篇文章的重點,但為了理解深層神經網路,需要明白最基本的訓練過程。

若能理解訓練過程是通過梯度下降儘可能縮小loss的過程即可。

若有理解障礙,可以用python實踐一下從零開始訓練一個神經網路,體會整個訓練過程。若有時間則可以再體會一下計算圖自動求梯度的方便利用TensorFlow。

四、結合Tensorflow playground理解5種空間操作物質組成視角

打開網頁後,總體來說,藍色代表正值,黃色代表負值。拿分類任務來分析。

  • 數據:在二維平面內,若干點被標記成了兩種顏色。黃色,藍色,表示想要區分的兩類。你可以把平面內的任意點標記成任意顏色。網頁給你提供了4種規律。神經網路會根據你給的數據訓練,再分類相同規律的點。

  • 輸入:在二維平面內,你想給網路多少關於「點」的信息。從顏色就可以看出來,x_{1}左邊是負,右邊是正,x_{1}表示此點的橫坐標值。同理,x_{2}表示此點的縱坐標值。x_{1}^{2}是關於橫坐標值的「拋物線」信息。你也可以給更多關於這個點的信息。給的越多,越容易被分開。

  • 連接線:表示權重,藍色表示用神經元的原始輸出,黃色表示用負輸出。深淺表示權重的絕對值大小。滑鼠放在線上可以看到具體值。也可以更改。在(1)中,當把x_{2}輸出的一個權重改為-1時,x_{2}的形狀直接倒置了。不過還需要考慮激活函數。(1)中用的是linear。在(2)中,當換成sigmoid時,你會發現沒有黃色區域了。因為sigmoid的值域是(0,1)

    (1)

    (2)

  • 輸出:黃色背景顏色都被歸為黃點類,藍色背景顏色都被歸為藍點類。深淺表示可能性的強弱。

    上圖中所有在黃色背景顏色的點都會被分類為「黃點「,同理,藍色區域被分成藍點。在上面的分類分布圖中你可以看到每一層通過上一層信息的組合所形成的。權重(那些連接線)控制了「如何組合」。神經網路的學習也就是從數據中學習那些權重。Tensorflow playground所表現出來的現象就是「在我文章里所寫的「物質組成思想」,這也是為什麼我把Tensorflow playground放在了那一部分。

不過你要是把Tensorflow的個名字拆開來看的話,是tensor(張量)的flow(流動)。Tensorflow playground的作者想要闡述的側重點是「張量如何流動」的。

5種空間變換的理解:Tensorflow playground下沒有體現5種空間變換的理解。需要打開這個網站嘗試:ConvNetJS demo: Classify toy 2D data

左側是原始輸入空間下的分類圖,右側是轉換後的高維空間下的扭曲圖。

最終的扭曲效果是所有綠點都被扭曲到了一側,而所有紅點都被扭曲到了另一側。這樣就可以線性分割(用超平面(這裡是一個平面)在中間分開兩類)

深層學習為何要「Deep」(下)是有關為什麼深層比淺層效果好的解釋


多層的好處是可以用較少的參數表示複雜的函數。

在監督學習中,以前的多層神經網路的問題是容易陷入局部極值點。如果訓練樣本足夠充分覆蓋未來的樣本,那麼學到的多層權重可以很好的用來預測新的測試樣本。但是很多任務難以得到足夠多的標記樣本,在這種情況下,簡單的模型,比如線性回歸或者決策樹往往能得到比多層神經網路更好的結果(更好的泛化性,更差的訓練誤差)。

非監督學習中,以往沒有有效的方法構造多層網路。多層神經網路的頂層是底層特徵的高級表示,比如底層是像素點,上一層的結點可能表示橫線,三角; 而頂層可能有一個結點表示人臉。一個成功的演算法應該能讓生成的頂層特徵最大化的代表底層的樣例。如果對所有層同時訓練,時間複雜度會太高; 如果每次訓練一層,偏差就會逐層傳遞。這會面臨跟上面監督學習中相反的問題,會嚴重欠擬合。

2006年,hinton提出了在非監督數據上建立多層神經網路的一個有效方法,簡單的說,分為兩步,一是每次訓練一層網路,二是調優使原始表示x向上生成的高級表示r和該高級表示r向下生成的x"儘可能一致。方法是

1,首先逐層構建單層神經元,這樣每次都是訓練一個單層網路。

2,當所有層訓練完後,hinton使用wake-sleep演算法進行調優。將除最頂層的其它層間的權重變為雙向的,這樣最頂層仍然是一個單層神經網路,而其它層則變為了圖模型。向上的權重用於」認知「,向下的權重用於」生成「。然後使用Wake-Sleep演算法調整所有的權重。讓認知和生成達成一致,也就是保證生成的最頂層表示能夠儘可能正確的復原底層的結點。比如頂層的一個結點表示人臉,那麼所有人臉的圖像應該激活這個結點,並且這個結果向下生成的圖像應該能夠表現為一個大概的人臉圖像。Wake-Sleep演算法分為醒(wake)和睡(sleep)兩個部分。

2.1,wake階段,認知過程,通過外界的特徵和向上的權重(認知權重)產生每一層的抽象表示(結點狀態),並且使用梯度下降修改層間的下行權重(生成權重)。也就是「如果現實跟我想像的不一樣,改變我的權重使得我想像的東西就是這樣的「。

2.2,sleep階段,生成過程,通過頂層表示(醒時學得的概念)和向下權重,生成底層的狀態,同時修改層間向上的權重。也就是「如果夢中的景象不是我腦中的相應概念,改變我的認知權重使得這種景象在我看來就是這個概念「。

由於自動編碼器(auto-encoder,即上面說的神經網路。廣義上的自動編碼器指所有的從低級表示得到高級表示,並能從高級表示生成低級表示的近似的結構,狹義上指的是其中的一種,谷歌的貓臉識別用的)有聯想功能,也就是缺失部分輸入也能得到正確的編碼,所以上面說的演算法也可以用於有監督學習,訓練時y做為頂層網路輸入的補充,應用時頂層網路生成y"。


簡單說說我對深度學習的理解。

dl基於神經網路,神經網路簡單說就是輸入是訓練數據,中間是隱藏節點,輸出是標籤。訓練數據可以以一定的權重激活隱藏節點,隱藏節點激活輸出標籤。dl的創造性在自編碼和稀疏性,自編碼是說dl把輸入當作訓練數據,輸出還是訓練數據,這樣假如中間節點數比較少的話,相當於對數據起了個壓縮的作用(想像輸入是文件,中間層相當於rar壓縮文件,輸出還是輸入文件,這樣只要知道中間層rar的信息,和整個模型的結構,就可以知道輸入是什麼了,這個就相當於壓縮文件)。另一個是稀疏性,就是說假如我想讓中間節點多一點,又不想讓訓練過於overfit,可以加一個限制,假設每個訓練數據都激活盡量少的中間層節點(相當於模擬大腦,大腦對每個輸入不可能所有神經元都起反應,肯定也是少量神經元有反應)。

這樣訓練出來的模型一是可以無監督,二是可以起到降維的作用。訓練出來的模型就可以很好的表達原始數據了。這時候我們對訓練好的數據再在有監督的數據上做進一步訓練,就可以滿足新的需求。


開始幾位大師確定了電腦架構,那個年代目標很單純---電子大腦。腦洞很大。但硬體無法支持理想的速度,即便大規模建造在當時也無濟於事。

直到遊戲機出現,商人一看遊戲機好多人玩,做不成電子大腦但可以先做成遊戲機試試,等遊戲機運算力變強了以後再造電子大腦唄。

於是intel把處理器運算速度從最早的電子遊戲機按照摩爾定律指數增長提升。直到它變成牙膏廠前幾年,一看不對了啊!現在這速度下去馬上可以支持電子大腦初級運算量,不能按照賣遊戲機的錢賣電子大腦啊!於是英明的做了兩件事情:限制精度,擠牙膏。

然後遊戲機就又被限定在手寫輸入,人臉識別(效果一般)以及各大高校的論文之中了。

但這沒有阻止那些擁有真電腦(超算群)人士們的研究步伐,模擬生物神經網路。它能工作(手動英文)!於是NVIDIA登場了,心想把遊戲機安利成電子大腦能賺錢啊,那我們就試試吧。反正牙膏廠放著有錢不賺。

所以很多人現在說我搞不明白啊!這個深度神經網路怎麼理解?什麼黑盒,各種求導,好複雜啊!遊戲機沒跑暈,自己先暈了!怎麼回事?對的就是要的這個效果!

第一,深度神經網路不是黑盒,個人電腦開機直到神經網路運行在內存中的每一比特的變化都是可以很細微的觀察的。沒有任何神秘力量,沒有超出科學解釋的現象發生。

第二,深度神經網路的工作方式是基於傳統的電腦架構之上的,就是 數據+演算法。但人們確實從中窺探到了一種全新的電子大腦方式。所以目前有研究提煉一些常用神經網路演算法加速硬體。微軟等巨頭則在開發量子計算

第三,深度神經網路是一個很初級的特徵自動提取器。說初級因為簡單粗暴。以前為了節約算力特徵關鍵模型都是人工親自設定。而現在這部分工作隨著算力的提高可以自動化。所以從某種意義上來說深度神經網路也是一種自動編程機,但和人們相比,一點點小小的自動化都需要很多很多的計算力支持,這一點也不重要,重要的是,它能工作(手動英文)。

那麼深度神經網路究竟是什麼呢?

它是一個能迭代更新自己的特徵提取演算法

那麼深度神經網路究竟是怎麼工作的呢?

數據往演算法里一丟,然後演算法程序就像個數據處理工廠一樣開始工作。那為什麼總有小朋友不能理解?知道不能呢?

問題就在這個處理工廠里,沒見過啊!以前見過的演算法的都是流水線的工廠,我數據往裡面一丟,一步一步條理清楚,一眼望去工廠裡面簡單清晰。(但也不是所有人能理解所有複雜演算法)

現在這個演算法可是像全自動高級工廠,數據往裡一丟,不得了!整個工廠裡面所有機器都動了起來。沒見過的小夥伴當場就被嚇呆瓜了,用流行的話說叫懵住。幾千隻機械手把數據搬來搬去,拿出魔方一樣的盒子裝來裝去又倒出來。整個場面就叫一個震撼。演算法運行規模也更大了。


我不是研究這方面的,我只提一點點我的理解,十分淺薄,希望樓主見諒!

先說最基礎的結構

第一層是輸入,input 之後好多就是隱藏的層,再之後就是輸出啦。

那每一個節點的值怎麼確定呢?

就是依靠他前面所有節點線性組合之後,再將這個值作用到他自己的函數上。例如第二層的某個點y_{2i}=f( Sigma x_{1i}w_{1i} +b)

參數都是學習出來的,f用什麼也是自選的

上個例子:

參數已經訓練好了是20 20 -30

然後根據每個向量x的輸入 我們可以看到y的結果。由於不是做DNN的所以可能有錯回答的,希望大家指正~~~


看過一篇很有意思的博文

http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/

試著解釋MLP

當用MLP 做2分類的時候, 相當於做一個變換 (非線性因為有激活函數), 然後再來切一刀。

有的時候,數據集不好分, 就需要把隱層神經元個數增加(增加維度), 再來切。

從data mining的角度來說, 神經網路就是一個特徵提取器(feature selection feature extraction), 一個固定的網路會提取出最適合這個網路分類的特徵。

從數學的角度來說,

http://deeplearning.cs.cmu.edu/notes/Sonia_Hornik.pdf

Hornik 這個paper (PPT) 證了下任意一個連續函數可以被NN得到的函數一致逼近

理論是不多, 感覺更多是經驗(如果有更多的理論,歡迎分享)。


拿圖像問題舉例。

如果有一幅圖片,一個像素有一個人那麼大,當你距離圖片50cm去看圖片,你只能看到幾個像素,所以你是看不出來這個圖片是個什麼鬼的。站到很遠很遠地方再看它,反而能看得清全貌了。

神經網路的層數多起來,就像你站得更遠去看這個圖片一樣,是觀察粒度上的改變。而更宏觀的粒度層面是需要底下更微觀的粒度層面一層一層傳遞和堆砌出來的,這個傳遞過程當然是信息丟失儘可能少是最好的,這樣才能保證你在大粒度上看東西時信息是儘可能原汁原味的。


分得更準的分類方法 無他


把本來不可分的數據投影到一個不知道是什麼樣的高維空間,然後就可分了,神經網路訓練就是得到這樣一種投影的坐標變換


如果有人真能把他怎麼工作的描述清楚,那就牛逼到家了。宏觀的解釋無非是非線性程度強,逼近能力強。他就是個黑箱子。不久將來,也許有人把他說清楚


神經元(Neuron)是神經網路的基本單元,也稱節點(Node),它從外部或其它節點收到輸入(Input),並通過一個激活函數(Activation Function)來計算輸出(Output);每一個輸入都對應權重(Weight),即這個節點收到的每一個輸入的相對重要性;偏置(Bias)可以理解為一種特殊的輸入。

圖1的神經元有輸入x1和x2,對應的權重值分別為w1和w2,以及值為1的偏置,對應的權重值為b;這個節點通過激活函數f計算出輸出y。

逐層排列的節點構成前饋神經網路(Feedforward Neural Network),每一層中的每一個節點連接下一層中的每一個節點,同一層中的節點之間沒有連接,並且初始來自外部世界的輸入只會朝向輸出層做單向傳遞,而不會構成循環;前饋神經網路分為單層感知器(Single Layer Perceptron)和多層感知器(Multi-Layer Perceptron)兩種。

單層感知器由一個輸入層(Input Layer)和一個輸出層(Output Layer)構成,輸入層中的每一個輸入節點將其從外部收到的輸入提供給輸出層中的每一個輸出節點;輸出節點在計算輸出的過程中,對每一個收到的輸入都會按照其對應的權重進行調整。

多層感知器由一個輸入層、一個輸出層和中間的一個或多個隱藏層(Hidden Layer)構成。

圖2是只有一個隱藏層的多層感知器,其中偏置只能看做一種輸入;隱藏層中的隱藏節點與外部世界沒有直接聯繫。傳統的機器學習大多基於單層感知器,或者至多有一個隱藏層;而要實現深度架構,需要包含超過一個隱藏層。

如圖3,在初始狀態,一個前饋神經網路所有的輸入和節點的權重都是隨機分配的,網路對訓練數據集給定的輸入進行計算,得到相應的輸出則被觀察,並與已知的期望輸出做比較,得出誤差(Error);這一誤差進而被傳回上一層,分攤給上一層中所有的節點,使每一個節點可以調整其收到的每一個輸入的權重,從而更新計算結果;這個過程將不斷重複,直到實際輸出與期望輸出的誤差低於預定門檻,人工神經網路就有了「舉一反三」的能力,即實現泛化(Generalization)。

調整權重的常用方法之一是梯度下降(Gradient Descent),梯度即斜率,是總體網路誤差與每一個權重的關係的描述,在前饋神經網路中表示為:

dError/dweight=dError/dactivation×dactivation/dweight

圖3描述了誤差被從輸出層中的輸出節點傳回上一層中的節點的過程;可以略過圖中的公式而簡單將這個網路看做f(g(h(x)))形式的嵌套函數,並使用鏈式法則(Chain Rule)來求導這樣的函數。

理論上,神經網路有點像樂高玩具,足夠多的樂高方塊可以構建出任何形狀的物體,如圖4。

原文鏈接:人工智慧綜述及技術實現 | 愛就投研究


神經網路直接看斯坦福的教程,中文譯版見鏈接,好好看一遍絕對能動。這才是最經典的教程:

神經網路 - Ufldl


嗯,我覺得DP這種東西看起來也比較的麻煩。

簡單來說,首先如果你明白了所謂的perceptron[感知器],那麼恭喜你,明白了FP,也就是前饋式的網路結構。其實這東西就好像是kNN[最近鄰居法],只不過距離是用和分界面(分類器)點積替代了可能的歐幾里得距離。而很簡單,如果把perception的similarity function替換成為某些特定的kernel,或者說任意的simialrity function,那麼其實就構成了大量的svm的邏輯了。

那麼好的,如果到這裡你明白了perceptron,也是人工神經網路的雛形吧。那麼它就可以構成一個神經元了。由神經元組成就構成了一個一層的網路結構對吧。[其實這些wiki上都有我就不多扯了,圖請自行參考]。對於單一神經元而言,結果是一個logistic regression啦。

然後就剩下隱層需要被解釋了。那麼就扯到了非線性的問題上,就是我們的世界並不是多麼的簡單,以至於東西都是線性可加的。那麼我們加了一層隱層在網路上,通過引入了更多的參數參考,以鏈式法則的方式增加了對非線性的容納性。並增加了網路的魯棒性。

用一個lancelod大大在別處的回答來解釋[如何理解神經網路裡面的反向傳播演算法?]隱層就是個傳話的,用自己的理解來處理加工了上一層給下一層的信息。 [我要開始十分不專業的講故事了,裡面誤導小朋友的地方求各位大大輕噴並糾正]比如一幅畫,輸入就是看到這幅畫的我們定義的第一個人(1層輸入節點),然後就告訴第二個人(2層隱層節點),第二個人自己琢磨了琢磨,講給了第三個人(3層隱層節點),這樣,每一層傳輸,信息都被有效的加工和提煉了,構成了更為複雜的信息流。那麼假設我們的網路就兩個隱層,第三個人添油加醋的告訴了第四個人(4層輸出節點)。這個時候第四個人說,你們說的是非洲平原的大馬猴么。這就告訴我們,這個層數多了啊,信息量少的時候訓練很多時候會出問題的,因為每一層,大家的理解(權重分配)都並不是很合理呢。這個時候呢,怎麼辦呢。這就要開始說到BP,也就是反向傳播了。嗯,lancelod大大是這麼說的:「反向傳播就是,把畫拿給最後一個人看(求取誤差),然後最後一個人就會告訴前面的人下次描述時需要注意哪裡(權值修正)。」 可是,如果中間傳話的人太多,而我們又只有1幅畫(訓練樣本極少)讓我們來訓練他們傳話的技巧,那麼就會很容易,不能很好地,描繪其他的畫[這就會出現卡在局部最優的樣子]。所以我們需要拿很多東西來訓練他們的描述方式,這樣就要求我們有充分的訓練樣本。而且很容易理解,中間傳話的人呢越多,我們需要越多的訓練來校準每個人表達上的誤差。

嗯,不知道這麼說,你是不是會對其中的概念有了一些了解呢。

其實我自己也就拿DNN做過分類,求輕拍。。。

最後給個中文的stanford某課的網站:UFLDL教程 - Ufldl,自然不如之前deeplearning.net那麼solid啦


所謂神經網路演算法,就是對人類學習能力的一種模擬演算法。

理論認為人的認知模式,處事方式是存儲在神經元與神經元之間的連接上的,稱為「神經元連接權重」,人腦神經布局類似網狀結構,神經元是網的交叉點,權重就是網的連線,這些連線有粗有細,也就是權重的大小不同。而人類的學習能力就是去不斷改變權重的值,從而改變自己的認知模式和處事方式,簡單的說,不同人對同一個外部事物有不同看法,就是因為同樣的初始信號,在不同粗細的神經元連線放大或縮小後,變成了側重點不同的最終信號。

最開始的「感知機"只用了2層神經元,即輸入層和輸出層,發現很多問題無法模擬,最著名的就是「異或」問題。

後來聰明的人在輸入層和輸出層之間加了一層神經元叫做隱藏層,3層的神經網路已經可以模擬二維上的任意函數曲線。只不過此時對「連接權重」的訓練過程就變得非常複雜,通常使用一種叫「誤差反傳」的計算方法。

參考人腦,人腦大概有億級層數的神經元(當然,人腦是多任務處理器集合,某些特定的任務如人臉識別,只需用到大腦的某個局部)。於是人們會猜想,更多的隱藏層是否會有更高的學習效果。事實證明的確如此,隨著隱藏層數的增加,一些圖片,語音的識別率越來越高。因此,就有了深度神經網路這一概念。但隱藏層數越多訓練過程也越複雜,且誤差會在多層傳遞的時候衰減,導致Gradient Vanish問題,最終導致訓練結果收斂在局部最優或者難以收斂。

後來又有聰明的人不斷改進誤差訓練演算法,神經網路的層數深度越來越大,現在最NB的是微軟的「殘差神經網路」,已經將隱藏層提高至152層。


最近剛聽過hinton的講座,連他都說不清裡面是怎麼工作的,估計世界上很少有人能說出為什麼它裡面的物理意義吧。同意 @孫亞楠的說法,現在大多都把dl當做黑箱子來用,至於參數就是靠經驗調整


深度學習的比較好的框架裡頭有一個caffe,但我閱讀caffe源碼似乎發現他直接從底部往頂部傳播,再反向傳播,他在哪裡體現了deep learning的逐層訓練再fine-tuning呢?


我就用樂高做例子吧,不做公式羅列了。

深度學習就好比用樂高搭房子。如果用基礎件搭房子,我需要許多的參數,幾個方塊,幾個圓柱,幾個三角,幾個環形,幾個紅色,幾個綠色……(輸入層);如果我將基礎塊進行簡單的組合,組合成幾塊牆壁,幾塊屋頂,幾塊窗戶和幾個門…(隱含層),這時參數就比較少了,特徵也很明顯了,這些特徵是無導師監督學習到的,而且是完備的(這些牆壁屋頂足夠你搭房子用,不會出現不夠用)。隱含層多了,組件也越整合,所需組件的個數也越少(特徵的可描述性越強,參數越少)。這時再拿一個樂高模型給你,很快就可以通過判斷有沒有屋頂、窗戶、牆壁和門,來斷定這個模型是不是房子,而不用再去數有多少個類型的樂高基礎塊。

與之前神經網路學習演算法比較,DL的優勢還在於它的特徵是網路自己學習到的(無導師監督),不需要人工探索特徵提取的方法,不用依賴個人的經驗選取特徵。它最終得到的特徵空間具有理論依據,更為可靠(通過看有沒有屋頂、牆壁、窗戶和門判斷是否是房子,比數有幾塊方塊、幾個圓柱、幾個三角更可靠)。


我們做這個模擬,就是因為我們無法分析表達他是如何工作的,要是能搞清他是怎麼工作的,那還模擬他干毛?直接擬合公式被


Sleep-Wake 演算法是個不錯的開始,輸入數據同時也是輸出參照數據。這個想法實在很牛叉。人腦本身就具有復原整個宇宙的真實場景的潛力。


推薦閱讀:

美國cs博士一般幾年能畢業?
如何形象又有趣的講解對抗神經網路(GAN)是什麼?
amazon picking challenge(APC)2016中識別和運動規劃的主流演算法是什麼?
48個深度學習相關的平台和開源工具包,一定有很多你不知道的?
如何看待Baidu的Deep Speech 2語音識別系統入選MIT科技評論十大突破?

TAG:語音識別 | 大腦 | 神經網路 | 深度學習DeepLearning |