獨家 | 一文為你解析神經網路(附例項、公式)

資料派THU發表於2018-01-11

640?wx_fmt=png&wxfrom=5&wx_lazy=1

原文標題:Introduction To Neural Networks

作者:Ben Gorman

翻譯:申利彬

校對:和中華

本文長度為4000字,建議閱讀12分鐘

本文通過建立一個識別“階梯”模式的網路模型,帶你從全方位瞭解神經網路。


人工神經網路風靡一時,人們不禁要問,這個朗朗上口的名字是否在模型自身的營銷和應用中起到了一定作用。


據我所知,很多商業經理會說他們的產品使用了人工神經網路和深度學習。顯然他們肯定不會說產品使用了“連線圓模型”(Connected Circles Models)或者“失敗-懲罰-修正模型”(Fail and Be Penalized Machines)。但毫無疑問,人工神經網路已經在影像識別、自然語言處理等許多領域取得了成功的應用。


作為一個並未完全理解這些技術的專業資料科學家,就像一個沒有工具的建築工人,這讓我感到很羞愧。因此,我彌補了這些缺失的功課,並寫下這篇文章來幫助別人克服那些我在學習過程中遇到的困難和難題。


注意:本文示例中的R程式碼可以在 https://github.com/ben519/MLPB/blob/master/Problems/Classify%20Images%20of%20Stairs/intro_to_nnets_article_materials.R找到。


我們從一個激勵問題開始。在這裡,我們收集了2*2網格畫素的灰度影像,每個畫素的灰度值在0(白)至255(黑)之間。目標是建立一個識別“階梯”模式的網路模型。


0?wx_fmt=png


首先,我們關心的是如何找到一個能夠合理擬合資料的模型,至於擬合方法,後面再考慮。


預處理


對每一個影像,給畫素打上x1,x2,x3,x4 的標籤並且生成一個輸入向量0?wx_fmt=gif餵給模型。希望我們的模型可以把有階梯模式的影像預測為True,沒有階梯模式的影像預測為False。


0?wx_fmt=png


0?wx_fmt=gif


單層感知機(模型迭代0)


我們可以構建一個簡單的單層感知機模型,它使用輸入的加權線性組合返回預測分數。如果預測分數大於選定的閾值,則預測為1,反之預測為0。更正式的表示式如下:


0?wx_fmt=gif


我們重新表述如下:


0?wx_fmt=gif


0?wx_fmt=png


 0?wx_fmt=gif即為我們的預測分數。


更形象的描述,我們可以把輸入節點餵給輸出節點來表示一個感知機。


0?wx_fmt=png


對應於我們的例子,假設我們建立了如下的模型:


0?wx_fmt=gif


下面是感知機如何在我們訓練影像上執行:


0?wx_fmt=png


這肯定比隨機猜測好,而且有一定的邏輯性。在所有階梯模式的底部都有深色陰影畫素,這也對應著x3和x4有較大的正係數。但是,這個模型還是有一些明顯的問題:


問題 1.1:這個模型輸出一個與似然概念相關的實數(更高的值意味著影像代表階梯的概率更大),但是將這些值解釋為概率是沒有依據的,特別是因為它們可能超出範圍[ 0, 1 ]。

問題 1.2:這個模型不能捕捉到變數和目標之間的非線性關係,為了看到這個問題,可以考慮一下下面的假設場景:


  • 案例一:從一個影像開始x = [100, 0, 0, 125],x3 從0增加至60。


0?wx_fmt=png


  • 案例二:還是上一個影像x = [100, 0, 60, 125],x3 從60增加至120。


0?wx_fmt=png


直觀上來看,案例一應該比案例二在0?wx_fmt=gif上有更大的增長,但是我們的感知機模型是線性方程,在 x3 的等效+ 60的變化導致這兩種情況下的0?wx_fmt=gif等效+ 0.12。


雖然我們的線性感知機還有很多的問題,但是我們先從解決這兩個問題開始。

 

具有Sigmoid啟用函式的單層感知機

(模型迭代1)


我們可以通過在感知機中加Sigmoid啟用函式來解決上面的問題1.1問題1.2回想一下,Sigmoid函式是一個S形曲線,在0和1之間的垂直軸上有界,因此經常被用來模擬二元事件的概率。


0?wx_fmt=gif


0?wx_fmt=png


按照這個想法,我們可以用下面的圖片和等式更新我們的模型:


0?wx_fmt=png


0?wx_fmt=gif


0?wx_fmt=gif


看起來有點熟悉?沒錯,這就是邏輯迴歸。然而,將模型解釋為具有Sigmoid“啟用函式”的線性感知器是更合適的,因為這樣可以給我們更多的空間去推廣。另外,我們現在把0?wx_fmt=gif解釋為概率,那必須相應更新我們的決策規則。


0?wx_fmt=gif


繼續我們的示例問題,假設我們提出以下擬合模型:


0?wx_fmt=gif


0?wx_fmt=gif

0?wx_fmt=gif


觀察該模型如何在前一節中的同一示例影像上執行:


0?wx_fmt=png


很明顯,已經解決了上面的問題1.1,繼續看如何解決問題1.2


  • 案例一:從一個影像開始x = [100, 0, 0, 125],x3 從0增加至60。


0?wx_fmt=png


  • 案例二:還是上一個影像x = [100, 0, 60, 125],x3 從60增加至120。


0?wx_fmt=png


注意,當0?wx_fmt=gif增加時,Sigmoid函式的曲率如何引起案例一“點亮”的(迅速增加)。但是隨著z繼續增加,增長的速度就變得緩慢了。這符合我們的直覺,即與案例二相比,案例一是階梯的概率增長幅度更大。


0?wx_fmt=png

然而,這個模型還是存在問題:


問題 2.1:0?wx_fmt=gif與每個變數是單調關係,如果我們想要辨識輕微的陰影階梯該怎麼辦呢?


問題 2.2:該模型沒有考慮變數之間的關係,假定影像底部一行是黑色,又如果左上角的畫素是白色的,那麼右上角的畫素變暗會增加影像是階梯的概率。如果左上角的畫素是黑色的,右上角的畫素變暗則會降低影像是階梯的概率。換句話說,增加 x3 可能增加或減少0?wx_fmt=gif取決於其他變數的值,很明顯目前的模型無法達到這點。


具有Sigmoid啟用函式的多層感知機

(模型迭代2)


可以通過向感知機模型再加一層來解決上述問題2.1問題2.2


我們構建一些基本模型,比如上面的一個模型,然後我們將每個基本模型的輸出作為另一個感知機的輸入。這個模型實際上是一個香草神經網路(“香草”是一種常見的“常規”或“沒有任何花哨的東西”的委婉說法),讓我們看看它對某些例子可能有什麼作用。


示例1 識別階梯模式


  • 搭建一個模型,當“左側階梯”被識別時,該模型“點亮”0?wx_fmt=gif

  • 搭建一個模型,當“右側階梯”確定時該模型“點亮”0?wx_fmt=gif

  • 把基本模型的分數加起來,這樣當0?wx_fmt=gif0?wx_fmt=gif都比較大時才會把最後一層網路上Sigmoid函式“點亮”。

 

0?wx_fmt=png

0?wx_fmt=png


或者


  • 搭建一個模型,當最後一列是黑色時模型“點亮”0?wx_fmt=gif

  • 搭建一個模型,當左上角的畫素是黑色,右上角的畫素;

  • 亮時模型“點亮”0?wx_fmt=gif

  • 搭建一個模型,當左上角畫素是亮的,右上角的畫素是黑色時模型“點亮”0?wx_fmt=png

  • 把基本模型的分數加起來,只有當0?wx_fmt=gif0?wx_fmt=gif的值大或者0?wx_fmt=gif0?wx_fmt=png的值大時才會讓最後一層網路上Sigmoid函式“點亮”。(注意,0?wx_fmt=gif0?wx_fmt=png不會同時很大)


0?wx_fmt=png


0?wx_fmt=png


示例2 識別微弱階梯


  • 搭建幾個基本模型,當底部一行是陰影,x1是陰影x2是白色,x2是陰影x1是白色時曲率“開火”0?wx_fmt=gif0?wx_fmt=gif0?wx_fmt=png

  • 搭建幾個基本模型,當底部一行是黑色,x1是黑色x2是白色,x2是黑色x1是白色時曲率“開火”0?wx_fmt=gif0?wx_fmt=gif0?wx_fmt=gif

  • 結合這幾個基本模型,當結果輸進Sigmoid函式之前把黑色識別器從陰影識別器中去除。


0?wx_fmt=png


0?wx_fmt=png


相關概念及方法解釋


  • 神經網路:單層感知機只有一個輸出層,因此,我們建立的模型也被稱為雙層感知機因為有一個輸出層是另一個輸出層的輸入。但是,我們可以把這些網路統稱為神經網路,並且三層網路分別稱為輸入層、隱藏層和輸出層。


0?wx_fmt=png


  • 不唯一的啟用函式:我們的示例使用了Sigmoid啟用函式,我們也可以選擇其它型別的啟用函式Tanh和Relu。不過啟用函式必須是非線性的,否則神經網路將簡化為等效的單層感知器。


  • 搭建多分類器:我們可以在輸出層增加幾個節點,從而很容易把我們的模型擴充套件為多分類器。每一個輸出節點都是我們要預測的一個類別。我們可以使用softmax函式把0?wx_fmt=gif的一個向量對映為一個0?wx_fmt=gif向量,並且向量內的元素加和為1,以此來代替用Sigmoid函式把一個實數0?wx_fmt=gif對映在[0, 1]之間。


0?wx_fmt=png


  • 使用兩層以上的網路(深度學習):你可能會想,“我們是否可以擴充套件我們的香草神經網路,使它的輸出層被送入第四層(第五層,第六層等等)?”答案是Yes,而且這就是我們經常提到的深度學習,並且效果還很好。然而,值得注意的是,任何一個具有多個隱藏層的網路都可以由僅有一個隱藏層的網路模擬,根據Universal Approximation Theorem定理可以用一個隱層的神經網路來逼近任何連續函式。但是,經常用深層神經網路架構來代替單隱層架構,是因為它們在擬合過程中可以更快地收斂到一個比較好的結果。


0?wx_fmt=png


從擬合模型到訓練樣本(反向傳播)


目前為止,我們討論了神經網路如何有效的工作,接下來我們說一下如何讓網路模型擬合標記的訓練樣本。換句話說,我們如何根據標記的訓練樣本,來選擇最合適的網路引數。一般大家會選擇梯度下降優化演算法(MLE最大似然估計也可以),梯度下降過程如下所示:


  • 從一些標記好的訓練資料開始

  • 選擇一個可微的損失函式找最小值0?wx_fmt=gif

  • 選擇一個網路架構,主要是確定網路有多少層,每層有多少節點

  • 隨機初始化網路的權值

  • 在這個模型上執行訓練資料,產生樣本的預測值,然後根據損失函式計算總體誤差0?wx_fmt=gif(這稱為正向傳播)

  • 每一個權值的微小變化都決定著損失函式的大小,換句話說,要對每一個權值求梯度。(這稱為反向傳播)

  • 在負梯度方向上選擇一個小的步長,比如0?wx_fmt=gif,如果而且0?wx_fmt=gif,這時我們需要減小0?wx_fmt=gif來使當前的損失函式值降低。更新0?wx_fmt=gif的方式0?wx_fmt=gif(0.001是我們預先設定的步長值)

  • 重複這個過程(從第五步開始),直到設定的迭代次數或者損失函式收斂。


以上是基本的想法,實際上,這帶來了很多挑戰。


挑戰 1:計算的複雜性


在擬合過程中,我們需要計算的一個問題是L相對於每個權值的梯度。顯然這不容易,因為L依賴於輸出層中的每個節點,每個節點依賴於它前面層中的每個節點,以此類推。而我們用到的神經網路可能會有數十層,高達上千個節點,這就意味著計算0?wx_fmt=gif將會是鏈式法則的噩夢。


解決這個問題,就要認識到你在使用鏈式法則求0?wx_fmt=gif時會重複使用中間導數,這可以讓你避免重複計算同一個數。


另外一種解決方法,我們可以找一個特殊的啟用函式,它的導數可以用函式值來表示,例如0?wx_fmt=gif=0?wx_fmt=gif 。在正向傳播過程中,為了計算出預測值0?wx_fmt=gif必須計算每個向量元素的0?wx_fmt=png。它可以用在反向傳播中計算梯度值來更新每個節點的權值,這樣不僅節省時間還節省記憶體。


第三種解決方法,把訓練集分成“mini batches”,並不斷根據每一個batch更新權值。例如,把你的訓練集分為{batch1, batch2, batch3},在訓練集上第一次過程如下:


  • 使用batch1更新權值

  • 使用batch2更新權值

  • 使用batch3更新權值


每次更新後重新計算L的梯度。


最後一種值得一提的技術是使用GPU而不是CPU,因為GPU更適合並行執行大量計算。


挑戰 2:梯度下降可能找不到全域性最小值


與其說是神經網路的挑戰,不如是梯度下降的挑戰。因為在梯度下降過程中,權值的更新可能會陷入區域性最小值,也有可能越過最小值。也有解決的辦法,可以在訓練過程中選擇不同的步長值或者增加網路的節點或層數來解決這個問題,在增加網路節點或層數時要注意防止過擬合。另外,一些探索式方法,例如momentum也可以有效解決這個問題。


挑戰 3 如何泛化?


我們如何編寫一個通用程式來擬合任意數量的節點和網路層的神經網路呢?我的答案是,“你不必這麼做,完全可以藉助Tensorflow”。但如果你真的想這樣做,最困難的部分就是計算損失函式的梯度,所以把梯度表示成遞迴函式是你要考慮的一個重要問題。 更正式的名字是自動微分,一個五層的神經網路就是四層網路喂進一些感知機中,同樣,四層的神經網路是三層的網路喂進一些感知機中,等等。


原文連結:

http://blog.kaggle.com/2017/11/27/introduction-to-neural-networks/


0?wx_fmt=jpeg

申利彬,研究生在讀,主要研究方向大資料機器學習。目前在學習深度學習在NLP上的應用,希望在THU資料派平臺與愛好大資料的朋友一起學習進步。


翻譯組招募資訊

工作內容:將選取好的外文前沿文章準確地翻譯成流暢的中文。如果你是資料科學/統計學/計算機專業的留學生,或在海外從事相關工作,或對自己外語水平有信心的朋友,資料派翻譯組歡迎你們加入!

你能得到:提高對於資料科學前沿的認知,提高對外文新聞來源渠道的認知,海外的朋友可以和國內技術應用發展保持聯絡,資料派團隊產學研的背景為志願者帶來好的發展機遇。

其他福利:和來自於名企的資料科學工作者,北大清華以及海外等名校學生共同合作、交流。

點選文末“閱讀原文”加入資料派團隊~

轉載須知

如需轉載,請在開篇顯著位置註明作者和出處(轉自:資料派THUID:DatapiTHU),並在文章結尾放置資料派醒目二維碼。有原創標識文章,請傳送【文章名稱-待授權公眾號名稱及ID】至聯絡郵箱,申請白名單授權並按要求編輯。

釋出後請將連結反饋至聯絡郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。


0?wx_fmt=jpeg

點選“閱讀原文”加入組織~

相關文章