您的位置:首頁>正文

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

原文標題: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(黑)之間。 目標是建立一個識別“階梯”模式的網路模型。

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

預處理

對每一個圖像, 給圖元打上x1,x2,x3,x4 的標籤並且生成一個輸入向量

喂給模型。 希望我們的模型可以把有階梯模式的圖像預測為True, 沒有階梯模式的圖像預測為False。

單層感知機(模型反覆運算0)

我們可以構建一個簡單的單層感知機模型, 它使用輸入的加權線性組合返回預測分數。

如果預測分數大於選定的閾值, 則預測為1, 反之預測為0。 更正式的運算式如下:

我們重新表述如下:

即為我們的預測分數。

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

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

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

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

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

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

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

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

直觀上來看,案例一應該比案例二在

上有更大的增長,但是我們的感知機模型是線性方程,在 x3 的等效+ 60的變化導致這兩種情況下的

等效+ 0.12。

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

具有Sigmoid啟動函數的單層感知機

(模型反覆運算1)

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

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

看起來有點熟悉?沒錯,這就是邏輯回歸。然而,將模型解釋為具有Sigmoid“啟動函數”的線性感知器是更合適的,因為這樣可以給我們更多的空間去推廣。另外,我們現在把

解釋為概率,那必須相應更新我們的決策規則。

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

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

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

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

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

注意,當

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

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

問題 2.1:

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

問題 2.2:該模型沒有考慮變數之間的關係,假定圖像底部一行是黑色,又如果左上角的圖元是白色的,那麼右上角的圖元變暗會增加圖像是階梯的概率。如果左上角的圖元是黑色的,右上角的圖元變暗則會降低圖像是階梯的概率。換句話說,增加 x3 可能增加或減少

取決於其他變數的值,很明顯目前的模型無法達到這點。

具有Sigmoid啟動函數的多層感知機

(模型反覆運算2)

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

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

示例1 識別階梯模式

搭建一個模型,當“左側階梯”被識別時,該模型“點亮”

搭建一個模型,當“右側階梯”確定時該模型“點亮”

把基本模型的分數加起來,這樣當

都比較大時才會把最後一層網路上Sigmoid函數“點亮”。

或者

搭建一個模型,當最後一列是黑色時模型“點亮”

搭建一個模型,當左上角的圖元是黑色,右上角的圖元;

亮時模型“點亮”

搭建一個模型,當左上角圖元是亮的,右上角的圖元是黑色時模型“點亮”

把基本模型的分數加起來,只有當

的值大或者

的值大時才會讓最後一層網路上Sigmoid函數“點亮”。(注意,

不會同時很大)

示例2 識別微弱階梯

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

搭建幾個基本模型,當底部一行是黑色,x1是黑色x2是白色,x2是黑色x1是白色時曲率“開火”

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

相關概念及方法解釋

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

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

搭建多分類器:我們可以在輸出層增加幾個節點,從而很容易把我們的模型擴展為多分類器。每一個輸出節點都是我們要預測的一個類別。我們可以使用softmax函數把

的一個向量映射為一個

向量,並且向量內的元素加和為1,以此來代替用Sigmoid函數把一個實數

映射在[0, 1]之間。

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

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

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

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

選擇一個可微的損失函數找最小值

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

隨機初始化網路的權值

在這個模型上運行訓練資料,產生樣本的預測值,然後根據損失函數計算總體誤差

(這稱為正向傳播)

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

在負梯度方向上選擇一個小的步長,比如

,如果而且

,這時我們需要減小

來使當前的損失函數值降低。更新

的方式

(0.001是我們預先設置的步長值)

重複這個過程(從第五步開始),直到設定的反覆運算次數或者損失函數收斂。

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

挑戰 1:計算的複雜性

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

將會是鏈式法則的噩夢。

解決這個問題,就要認識到你在使用鏈式法則求

時會重複使用中間導數,這可以讓你避免重複計算同一個數。

另外一種解決方法,我們可以找一個特殊的啟動函數,它的導數可以用函數值來表示,例如

=

。在正向傳播過程中,為了計算出預測值

必須計算每個向量元素的

。它可以用在反向傳播中計算梯度值來更新每個節點的權值,這樣不僅節省時 間還節省記憶體。

第三種解決方法,把訓練集分成“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/

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

直觀上來看,案例一應該比案例二在

上有更大的增長,但是我們的感知機模型是線性方程,在 x3 的等效+ 60的變化導致這兩種情況下的

等效+ 0.12。

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

具有Sigmoid啟動函數的單層感知機

(模型反覆運算1)

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

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

看起來有點熟悉?沒錯,這就是邏輯回歸。然而,將模型解釋為具有Sigmoid“啟動函數”的線性感知器是更合適的,因為這樣可以給我們更多的空間去推廣。另外,我們現在把

解釋為概率,那必須相應更新我們的決策規則。

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

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

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

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

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

注意,當

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

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

問題 2.1:

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

問題 2.2:該模型沒有考慮變數之間的關係,假定圖像底部一行是黑色,又如果左上角的圖元是白色的,那麼右上角的圖元變暗會增加圖像是階梯的概率。如果左上角的圖元是黑色的,右上角的圖元變暗則會降低圖像是階梯的概率。換句話說,增加 x3 可能增加或減少

取決於其他變數的值,很明顯目前的模型無法達到這點。

具有Sigmoid啟動函數的多層感知機

(模型反覆運算2)

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

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

示例1 識別階梯模式

搭建一個模型,當“左側階梯”被識別時,該模型“點亮”

搭建一個模型,當“右側階梯”確定時該模型“點亮”

把基本模型的分數加起來,這樣當

都比較大時才會把最後一層網路上Sigmoid函數“點亮”。

或者

搭建一個模型,當最後一列是黑色時模型“點亮”

搭建一個模型,當左上角的圖元是黑色,右上角的圖元;

亮時模型“點亮”

搭建一個模型,當左上角圖元是亮的,右上角的圖元是黑色時模型“點亮”

把基本模型的分數加起來,只有當

的值大或者

的值大時才會讓最後一層網路上Sigmoid函數“點亮”。(注意,

不會同時很大)

示例2 識別微弱階梯

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

搭建幾個基本模型,當底部一行是黑色,x1是黑色x2是白色,x2是黑色x1是白色時曲率“開火”

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

相關概念及方法解釋

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

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

搭建多分類器:我們可以在輸出層增加幾個節點,從而很容易把我們的模型擴展為多分類器。每一個輸出節點都是我們要預測的一個類別。我們可以使用softmax函數把

的一個向量映射為一個

向量,並且向量內的元素加和為1,以此來代替用Sigmoid函數把一個實數

映射在[0, 1]之間。

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

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

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

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

選擇一個可微的損失函數找最小值

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

隨機初始化網路的權值

在這個模型上運行訓練資料,產生樣本的預測值,然後根據損失函數計算總體誤差

(這稱為正向傳播)

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

在負梯度方向上選擇一個小的步長,比如

,如果而且

,這時我們需要減小

來使當前的損失函數值降低。更新

的方式

(0.001是我們預先設置的步長值)

重複這個過程(從第五步開始),直到設定的反覆運算次數或者損失函數收斂。

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

挑戰 1:計算的複雜性

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

將會是鏈式法則的噩夢。

解決這個問題,就要認識到你在使用鏈式法則求

時會重複使用中間導數,這可以讓你避免重複計算同一個數。

另外一種解決方法,我們可以找一個特殊的啟動函數,它的導數可以用函數值來表示,例如

=

。在正向傳播過程中,為了計算出預測值

必須計算每個向量元素的

。它可以用在反向傳播中計算梯度值來更新每個節點的權值,這樣不僅節省時 間還節省記憶體。

第三種解決方法,把訓練集分成“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/

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示