轉:如何簡單形象又有趣地講解神經網絡是什麼

                                        <h1><a name="t0"></a>如何簡單形象又有趣地講解神經網絡是什麼?</h1>

 

0. 分類
神經網絡最重要的用途是分類,爲了讓大家對分類有個直觀的認識,咱們先看幾個例子:

  • 垃圾郵件識別:現在有一封電子郵件,把出現在裏面的所有詞彙提取出來,送進一個機器裏,機器需要判斷這封郵件是否是垃圾郵件。
  • 疾病判斷:病人到醫院去做了一大堆肝功、尿檢測驗,把測驗結果送進一個機器裏,機器需要判斷這個病人是否得病,得的什麼病。
  • 貓狗分類:有一大堆貓、狗照片,把每一張照片送進一個機器裏,機器需要判斷這幅照片裏的東西是貓還是狗。

這種能自動對輸入的東西進行分類的機器,就叫做分類器。

分類器的輸入是一個數值向量,叫做特徵(向量)。在第一個例子裏,分類器的輸入是一堆0、1值,表示字典裏的每一個詞是否在郵件中出現,比如向量(1,1,0,0,0......)就表示這封郵件裏只出現了兩個詞abandon和abnormal;第二個例子裏,分類器的輸入是一堆化驗指標;第三個例子裏,分類器的輸入是照片,假如每一張照片都是320*240像素的紅綠藍三通道彩色照片,那麼分類器的輸入就是一個長度爲320*240*3=230400的向量。

分類器的輸出也是數值。第一個例子中,輸出1表示郵件是垃圾郵件,輸出0則說明郵件是正常郵件;第二個例子中,輸出0表示健康,輸出1表示有甲肝,輸出2表示有乙肝,輸出3表示有餅乾等等;第三個例子中,輸出0表示圖片中是狗,輸出1表示是貓。

分類器的目標就是讓正確分類的比例儘可能高。一般我們需要首先收集一些樣本,人爲標記上正確分類結果,然後用這些標記好的數據訓練分類器,訓練好的分類器就可以在新來的特徵向量上工作了。

1. 神經元
咱們假設分類器的輸入是通過某種途徑獲得的兩個值,輸出是0和1,比如分別代表貓和狗。現在有一些樣本:

大家想想,最簡單地把這兩組特徵向量分開的方法是啥?當然是在兩組數據中間畫一條豎直線,直線左邊是狗,右邊是貓,分類器就完成了。以後來了新的向量,凡是落在直線左邊的都是狗,落在右邊的都是貓。

 

一條直線把平面一分爲二,一個平面把三維空間一分爲二,一個n-1維超平面把n維空間一分爲二,兩邊分屬不同的兩類,這種分類器就叫做神經元。

大家都知道平面上的直線方程是ax+by+c=0,等式左邊大於零和小於零分別表示點(x,y)在直線的一側還是另一側,把這個式子推廣到n維空間裏,直線的高維形式稱爲超平面,它的方程是:
h = a_1x_1+a_2 x_2+...+a_nx_n+a_0=0
神經元就是當h大於0時輸出1,h小於0時輸出0這麼一個模型,它的實質就是把特徵空間一切兩半,認爲兩瓣分別屬兩個類。你恐怕再也想不到比這更簡單的分類器了,它是McCulloch和Pitts在1943年想出來了。

這個模型有點像人腦中的神經元:從多個感受器接受電信號x_1, x_2,...,x_n,進行處理(加權相加再偏移一點,即判斷輸入是否在某條直線h=0的一側),發出電信號(在正確的那側發出1,否則不發信號,可以認爲是發出0),這就是它叫神經元的原因。

當然,上面那幅圖我們是開了上帝視角才知道“一條豎直線能分開兩類”,在實際訓練神經元時,我們並不知道特徵是怎麼抱團的。神經元模型的一種學習方法稱爲Hebb算法:

先隨機選一條直線/平面/超平面,然後把樣本一個個拿過來,如果這條直線分錯了,說明這個點分錯邊了,就稍微把直線移動一點,讓它靠近這個樣本,爭取跨過這個樣本,讓它跑到直線正確的一側;如果直線分對了,它就暫時停下不動。因此訓練神經元的過程就是這條直線不斷在跳舞,最終跳到兩個類之間的豎直線位置。

2. 神經網絡
MP神經元有幾個顯著缺點。首先它把直線一側變爲0,另一側變爲1,這東西不可微,不利於數學分析。人們用一個和0-1階躍函數類似但是更平滑的函數Sigmoid函數來代替它(Sigmoid函數自帶一個尺度參數,可以控制神經元對離超平面距離不同的點的響應,這裏忽略它),從此神經網絡的訓練就可以用梯度下降法來構造了,這就是有名的反向傳播算法。

神經元的另一個缺點是:它只能切一刀!你給我說說一刀怎麼能把下面這兩類分開吧。

解決辦法是多層神經網絡,底層神經元的輸出是高層神經元的輸入。我們可以在中間橫着砍一刀,豎着砍一刀,然後把左上和右下的部分合在一起,與右上的左下部分分開;也可以圍着左上角的邊沿砍10刀把這一部分先挖出來,然後和右下角合併。

 

每砍一刀,其實就是使用了一個神經元,把不同砍下的半平面做交、並等運算,就是把這些神經元的輸出當作輸入,後面再連接一個神經元。這個例子中特徵的形狀稱爲異或,這種情況一個神經元搞不定,但是兩層神經元就能正確對其進行分類。

只要你能砍足夠多刀,把結果拼在一起,什麼奇怪形狀的邊界神經網絡都能夠表示,所以說神經網絡在理論上可以表示很複雜的函數/空間分佈。但是真實的神經網絡是否能擺動到正確的位置還要看網絡初始值設置、樣本容量和分佈。

神經網絡神奇的地方在於它的每一個組件非常簡單——把空間切一刀+某種激活函數(0-1階躍、sigmoid、max-pooling),但是可以一層一層級聯。輸入向量連到許多神經元上,這些神經元的輸出又連到一堆神經元上,這一過程可以重複很多次。這和人腦中的神經元很相似:每一個神經元都有一些神經元作爲其輸入,又是另一些神經元的輸入,數值向量就像是電信號,在不同神經元之間傳導,每一個神經元只有滿足了某種條件纔會發射信號到下一層神經元。當然,人腦比神經網絡模型複雜很多:人工神經網絡一般不存在環狀結構;人腦神經元的電信號不僅有強弱,還有時間緩急之分,就像莫爾斯電碼,在人工神經網絡裏沒有這種複雜的信號模式。

 

 

神經網絡的訓練依靠反向傳播算法:最開始輸入層輸入特徵向量,網絡層層計算獲得輸出,輸出層發現輸出和正確的類號不一樣,這時它就讓最後一層神經元進行參數調整,最後一層神經元不僅自己調整參數,還會勒令連接它的倒數第二層神經元調整,層層往回退着調整。經過調整的網絡會在樣本上繼續測試,如果輸出還是老分錯,繼續來一輪迴退調整,直到網絡輸出滿意爲止。這很像中國的文藝體制,武媚娘傳奇劇組就是網絡中的一個神經元,最近剛剛調整了參數。

3. 大型神經網絡

我們不禁要想了,假如我們的這個網絡有10層神經元,第8層第2015個神經元,它有什麼含義呢?我們知道它把第七層的一大堆神經元的輸出作爲輸入,第七層的神經元又是以第六層的一大堆神經元做爲輸入,那麼這個特殊第八層的神經元,它會不會代表了某種抽象的概念?

就好比你的大腦裏有一大堆負責處理聲音、視覺、觸覺信號的神經元,它們對於不同的信息會發出不同的信號,那麼會不會有這麼一個神經元(或者神經元小集團),它收集這些信號,分析其是否符合某個抽象的概念,和其他負責更具體和更抽象概念的神經元進行交互。

2012年多倫多大學的Krizhevsky等人構造了一個超大型卷積神經網絡[1],有9層,共65萬個神經元,6千萬個參數。網絡的輸入是圖片,輸出是1000個類,比如小蟲、美洲豹、救生船等等。這個模型的訓練需要海量圖片,它的分類準確率也完爆先前所有分類器。紐約大學的Zeiler和Fergusi[2]把這個網絡中某些神經元挑出來,把在其上響應特別大的那些輸入圖像放在一起,看它們有什麼共同點。他們發現中間層的神經元響應了某些十分抽象的特徵。

第一層神經元主要負責識別顏色和簡單紋理


第二層的一些神經元可以識別更加細化的紋理,比如布紋、刻度、葉紋。

 

第三層的一些神經元負責感受黑夜裏的黃色燭光、雞蛋黃、高光。


第四層的一些神經元負責識別萌狗的臉、七星瓢蟲和一堆圓形物體的存在。


第五層的一些神經元可以識別出花、圓形屋頂、鍵盤、鳥、黑眼圈動物。

 

這裏面的概念並不是整個網絡的輸出,是網絡中間層神經元的偏好,它們爲後面的神經元服務。雖然每一個神經元都傻不拉幾的(只會切一刀),但是65萬個神經元能學到的東西還真是深邃呢。

[1] Krizhevsky, A., Sutskever, I., & Hinton, G. E. (2012). Imagenet classification with deep convolutional neural networks. In Advances in neural information processing systems(pp. 1097-1105).
[2] Zeiler, M. D., & Fergus, R. (2013). Visualizing and understanding convolutional neural networks. arXiv preprint arXiv:1311.2901.

 

9分鐘深度學習視頻教學

視頻代碼教學

視頻裏演示的代碼,已經編寫成免費上機操作教程,可一步步跟着指示進行學習。

基於 TensorFlow Eager 進行深度學習

YJango:超智能體S01:高考與機器學習​zhuanlan.zhihu.com圖標YJango:超智能體M01:7分鐘入門線性代數+微積分​zhuanlan.zhihu.com圖標

一、基本變換:層

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

  • 數學式子\vec{y}= a(W\cdot\vec{x} + {b}),其中\vec{x}是輸入向量,\vec{y}是輸出向量,\vec{b}是偏移向量,W是權重矩陣,a()是激活函數。每一層僅僅是把輸入\vec x經過如此簡單的操作得到\vec y
  • 數學理解:通過如下5種對輸入空間(輸入向量的集合)的操作,完成 輸入空間 ——> 輸出空間 的變換 (矩陣的行空間到列空間)。 
    注:用“空間”二字的原因是被分類的並不是單個事物,而是一類事物。空間是指這類事物所有個體的集合。
    • 1. 升維/降維
    • 2. 放大/縮小
    • 3. 旋轉
    • 4. 平移
    • 5. “彎曲” 
      這5種操作中,1,2,3的操作由W\cdot\vec{x}完成,4的操作是由+\vec{b}完成,5的操作則是由a()來實現。 (此處有動態圖5種空間操作,幫助理解)

 

每層神經網絡的數學理解:用線性變換跟隨着非線性變化,將輸入空間投向另一個空間
  • 物理理解:對 W\cdot\vec{x} 的理解就是通過組合形成新物質a()又符合了我們所處的世界都是非線性的特點。
    • 情景:\vec{x}是二維向量,維度是碳原子和氧原子的數量[C;O],數值且定爲[1;1],若確定\vec{y}是三維向量,就會形成如下網絡的形狀 (神經網絡的每個節點表示一個維度)。通過改變權重的值,可以獲得若干個不同物質。右側的節點數決定了想要獲得多少種不同的新物質。(矩陣的行數)

  • 1.如果權重W的數值如(1),那麼網絡的輸出y⃗ 就會是三個新物質,[二氧化碳,臭氧,一氧化碳]。 \left[ \begin{matrix} CO_{2}\\ O_{3}\\ CO \end{matrix} \right]= \left[ \begin{matrix} 1 & 2 \\ 0 & 3\\ 1 & 1 \end{matrix} \right] \cdot \left[ \begin{matrix} C \\ O \\ \end{matrix} \right] (1)
  • 2.也可以減少右側的一個節點,並改變權重W至(2),那麼輸出\vec{y} 就會是兩個新物質,[ O_{0.3};CO_{1.5}]。 \left[ \begin{matrix} O_{0.3}\\ CO_{1.5}\\ \end{matrix} \right]= \left[ \begin{matrix} 0& 0.3 \\ 1 & 1.5\\ \end{matrix} \right] \cdot \left[ \begin{matrix} C \\ O \\ \end{matrix} \right](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}\cdot\vec{x} + {b}_{1})) + {b}_{2})。 
設想網絡擁有很多層時,對原始輸入空間的“扭曲力”會大幅增加,如下圖,最終我們可以輕鬆找到一個超平面分割空間。

 

當然也有如下圖失敗的時候,關鍵在於“如何扭曲空間”。所謂監督學習就是給予神經網絡網絡大量的訓練例子,讓網絡從訓練例子中學會如何變換空間。每一層的權重W就控制着如何變換空間,我們最終需要的也就是訓練好的神經網絡的所有層的權重矩陣。

 

這裏有非常棒的可視化空間變換demo,一定要打開嘗試並感受這種扭曲過程。更多內容請看Neural Networks, Manifolds, and Topology

線性可分視角:神經網絡的學習就是學習如何利用矩陣的線性變換加激活函數的非線性變換,將原始輸入空間投向線性可分/稀疏的空間去分類/迴歸。 增加節點數:增加維度,即增加線性轉換能力。 增加層數:增加激活函數的次數,即增加非線性轉換次數。

物理視角:“物質組成”

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

 

  • 人臉識別情景:我們可以模擬這種思想並應用在畫面識別上。由像素組成菱角再組成五官最後到不同的人臉。每一層代表不同的不同的物質層面 (如分子層)。而每層的W存儲着如何組合上一層的物質從而形成新物質。 
    如果我們完全掌握一架飛機是如何從分子開始一層一層形成的,拿到一堆分子後,我們就可以判斷他們是否可以以此形成方式,形成一架飛機。 
    附:Tensorflow playground展示了數據是如何“流動”的。

 

物質組成視角:神經網絡的學習過程就是學習物質組成方式的過程。 增加節點數:增加同一層物質的種類,比如118個元素的原子層就有118個節點。 增加層數:增加更多層級,比如分子層,原子層,器官層,並通過判斷更抽象的概念來識別物體。

三、神經網絡的訓練

知道了神經網絡的學習過程就是學習控制着空間變換方式(物質組成方式)的權重矩陣後,接下來的問題就是如何學習每一層的權重矩陣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,主要是爲了讓大家感受一下效果)

 

https://www.zhihu.com/question/22553761

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章