關於神經網路:你需要知道這些

機器之心發表於2018-05-15

神經網路(NN)幾乎可以在每個領域幫助我們用創造性的方式解決問題。本文將介紹神經網路的相關知識。讀後你將對神經網路有個大概瞭解,它是如何工作的?如何建立神經網路

本文涉及以下內容:

  • 神經網路的發展歷史

  • 什麼是真正的神經網路

  • 單元/神經元

  • 權重/引數/連線

  • 偏置項

  • 引數

  • 啟用函式

  • 神經網路學習時發生了什麼?

  • 實現細節(如何管理專案中的所有因素)

  • 關於神經網路的更多資訊(更多資源連結)

神經網路的發展歷史

我們簡單回顧一下神經網路的發展歷程,如果你想了解更多關於其發展歷程的資訊,請看這篇維基百科的文章(https://en.wikipedia.org/wiki/Artificial_neural_network#History),它是本章節的基礎。

神經網路起源於 WarrenMcCulloch 和 Walter Pitts 於 1943 年首次建立的神經網路模型。他們的模型完全基於數學和演算法,由於缺乏計算資源,模型無法測試。

後來,在 1958 年,Frank Rosenblatt 建立了第一個可以進行模式識別的模型,改變了現狀。即感知器。但是他只提出了 notation 和模型。實際的神經網路模型仍然無法測試,此前的相關研究也較少。

第一批可以測試並具有多個層的神經網路於 1965 年由 Alexey Ivakhnenko 和 Lapa 建立。

之後,由於機器學習模型具有很強可行性,神經網路的研究停滯不前。很多人認為這是因為 Marvin Minsky 和 Seymour Papert 在 1969 年完成的書《感知機》(Perceptrons)導致的。

然而,這個停滯期相對較短。6 年後,即 1975 年,Paul Werbos 提出反向傳播,解決了 XOR 問題,並且使神經網路的學習效率更高。

1992 年,最大池化(max-pooling)被提出,這有助於 3D 目標識別,因為它具備平移不變性,對變形具備一定魯棒性。

2009 年至 2012 年間,JürgenSchmidhuber 研究小組建立的迴圈神經網路和深度前饋神經網路獲得了模式識別機器學習領域 8 項國際競賽的冠軍。

2011 年,深度學習神經網路開始將卷積層與最大池化層合併,然後將其輸出傳遞給幾個全連線層,再傳遞給輸出層。這些被稱為卷積神經網路

在這之後還有更多的研究。

什麼是神經網路

瞭解神經網路的一個好方法是將它看作複合函式。你輸入一些資料,它會輸出一些資料。

3 個部分組成了神經網路的的基本架構:

  • 單元/神經元

  • 連線/權重/引數

  • 偏置項

你可以把它們看作建築物的「磚塊」。根據你希望建築物擁有的功能來安排磚塊的位置。水泥是權重。無論權重多大,如果沒有足夠的磚塊,建築物還是會倒塌。然而,你可以讓建築以最小的精度執行(使用最少的磚塊),然後逐步構建架構來解決問題。

我將在後面的章節中更多地討論權重、偏置項和單元。

單元/神經元

作為神經網路架構三個部分中最不重要的部分,神經元是包含權重和偏置項的函式,等待資料傳遞給它們。接收資料後,它們執行一些計算,然後使用啟用函式將資料限制在一個範圍內(多數情況下)。

我們將這些單元想象成一個包含權重和偏置項的盒子。盒子從兩端開啟。一端接收資料,另一端輸出修改後的資料。資料首先進入盒子中,將權重與資料相乘,再向相乘的資料新增偏置項。這是一個單元,也可以被認為是一個函式。該函式與下面這個直線方程類似:

關於神經網路:你需要知道這些想象一下有多個直線方程,超過 2 個可以促進神經網路中的非線性。從現在開始,你將為同一個資料點(輸入)計算多個輸出值。這些輸出值將被髮送到另一個單元,然後神經網路會計算出最終輸出值。

權重/引數/連線

作為神經網路最重要的部分,這些(和偏置項)是用神經網路解決問題時必須學習的數值。這就是你現在需要知道的。

偏置項

這些數字代表神經網路認為其在將權重與資料相乘之後應該新增的內容。當然,它們經常出錯,但神經網路隨後也學習到最佳偏置項。

引數

引數必須手動設定。如果將神經網路看作一臺機器,那麼改變機器行為的 nob 就是神經網路的超引數

你可以閱讀我的另一篇文章(https://towardsdatascience.com/gas-and-nns-6a41f1e8146d),瞭解如何最佳化神經網路引數

啟用函式

也稱為對映函式(mapping function)。它們在 x 軸上輸入資料,並在有限的範圍內(大部分情況下)輸出一個值。大多數情況下,它們被用於將單元的較大輸出轉換成較小的值。你選擇的啟用函式可以大幅提高或降低神經網路的效能。如果你喜歡,你可以為不同的單元選擇不同的啟用函式

以下是一些常見的啟用函式

  • Sigmoid

關於神經網路:你需要知道這些

Sigmoid 函式

  • Tanh


關於神經網路:你需要知道這些

tanh 函式

  • ReLU:修正線性單元

關於神經網路:你需要知道這些

修正線性單元函式

  • Leaky ReLU

關於神經網路:你需要知道這些

Leaky ReLU 函式

這是神經網路在任何問題中都可獲得複雜度的原因。增加層(具備單元)可增加神經網路輸出的非線性。

每個層都包含一定數量的單元。大多數情況下單元的數量完全取決於建立者。但是,對於一個簡單的任務而言,層數過多會增加不必要的複雜性,且在大多數情況下會降低其準確率。反之亦然。

每個神經網路有兩層:輸入層和輸出層。二者之間的層稱為隱藏層。下圖所示的神經網路包含一個輸入層(8 個單元)、一個輸出層(4 個單元)和 3 個隱藏層(每層包含 9 個單元)。

關於神經網路:你需要知道這些

深度神經網路

具有兩個或更多隱藏層且每層包含大量單元的神經網路稱為深度神經網路,它催生了深度學習這一新的學習領域。上圖所示神經網路就是這樣一個例子。

神經網路學習時發生了什麼?

神經網路解決問題的最常見方式是使用梯度下降梯度下降相關內容,參見:https://hackernoon.com/gradient-descent-aynk-7cbe95a778da

梯度下降外,另一種常見的訓練神經網路方法是使用反向傳播。使用這種方法,神經網路輸出層的誤差會透過微積分中的鏈式規則向後傳播。這對於沒有微積分知識的初學者來說可能會難以理解,但也不要被嚇倒,反向傳播相關內容,推薦閱讀:http://neuralnetworksanddeeplearning.com/chap2.html。

訓練神經網路有許多注意事項。但對於初學者來說,沒有必要在一篇文章中瞭解全部。

實現細節(如何管理專案中的所有因素)

為了解釋如何管理專案中的所有因素,我建立了一個 Jupyter Notebook,包含一個學習 XOR 邏輯門的小型神經網路。Jupyter Notebook 地址:https://github.com/Frixoe/xor-neural-network/blob/master/XOR-Net-Notebook.ipynb

在檢視並理解 Notebook 內容後,你應該對如何構建基礎神經網路有一個大致的瞭解。

Notebook 建立的神經網路的訓練資料以矩陣排列,這是常見的資料排列方式。不同專案中的矩陣維度可能會有所不同。

大量資料通常分為兩類:訓練資料(60%)和測試資料(40%)。神經網路先使用訓練資料,然後在測試資料上測試網路的準確率

關於神經網路的更多資訊(更多資源連結)

如果你仍然無法理解神經網路,那麼推薦以下資源:

YouTube:

Coursera:

原文連結:https://towardsdatascience.com/nns-aynk-c34efe37f15a

相關文章