天天看點

揭秘:深度網絡背後的數學奧秘

目前,我們可以使用像

Keras

TensorFlow

PyTorch

這些進階的、專業的庫和架構而不需要一直擔心權重矩陣的大小,也不需要記住決定使用的激活函數的導數公式。通常我們隻需要建構一個神經網絡,即使是一個結構非常複雜的神經網絡,也隻需要導入一些庫和幾行代碼。這節省了我們找出bug的時間,并簡化了工作。然而,如果了解神經網絡内部發生的事情,對架構選擇、超參數調優或優化等任務有很大幫助。本文源代碼可以在我的

GitHub

上找到。

介紹

為了更多地了解神經網絡的原理,我決定寫一篇文章,一部分是為了我自己,一部分為了幫助其他人了解這些有時難以了解的概念。對于那些對代數和微積分不太熟悉的人,我會盡量詳細一些,但正如标題所示,這是一篇涉及很多數學的文章。

揭秘:深度網絡背後的數學奧秘

例如,我們将解決如圖1所示的資料集二分類問題,兩種類别的點形成圓圈,這種排列對于許多傳統的ML算法來說是不友善的,但是一個簡單的神經網絡卻可以很好地解決這個問題。為了解決這個問題,我們将使用一個神經網絡,結構如圖2所示。五個有不同數量單元的全連接配接層,對于隐藏層,我們将使用ReLU作為激活函數,對輸出層使用Sigmoid。這是一個相當簡單的架構,但複雜到足以成為我們深入探讨的例子。

揭秘:深度網絡背後的數學奧秘
KERAS 解決方案

首先,我将介紹一個最流行的機器學習庫之一KERAS

揭秘:深度網絡背後的數學奧秘

正如我在介紹中提到的,隻要導入一些庫和幾行代碼就足以建構和訓練一個模型,該模型對訓練集進行分類的準确率基本上可以達到100%。我們的任務歸根結底是根據所選擇的架構提供超參數(層數、層内神經元數、激活函數或epoch數)。現在讓我們看看背後的原理。我在學習的過程中弄了一個非常酷的視覺效果,希望能讓你提起興趣。

揭秘:深度網絡背後的數學奧秘
什麼是神經網絡?

讓我們從回答這個關鍵問題開始:什麼是神經網絡?這是一種生物啟發的方法,可以建構能夠學習和獨立查找資料連接配接的計算機程式。網絡是一組按層排列的軟體“神經元”,以一種允許交流的方式連接配接在一起。

每個神經元接收一組變量x (從1到n編号)作為輸入并計算預測的y值。向量x實際上包含了訓練集中m個例子中的一個特征值。更重要的是,每個單元都有自己的一組參數,通常被稱為w(權重列向量)和b(偏差),它們在學習過程中會發生變化。在每次疊代中,神經元根據向量x的目前權值w計算向量x的權重平均值并加上偏差。最後,通過一個非線性激活函數g來傳遞計算結果。

揭秘:深度網絡背後的數學奧秘
單層

先把範圍縮小來考慮如何計算整個神經網絡層,通過在單個單元内發生的原理來向量化整個網絡層,将這些計算組合成矩陣方程。為了統一符号,為標明的層編寫方程[l]。順便說一下,下标i标記了這層神經元的順序。

揭秘:深度網絡背後的數學奧秘

更重要的一點是:當我們寫單個單元的等式時,我們使用x和y-hat來分别表示特征的列向量和預測值。在切換到層的通用符号時,使用向量a——表示對應層的激活。是以,x向量表示第0層的激活,也就是輸入層。層中的每個神經元按照如下公式進行計算:

揭秘:深度網絡背後的數學奧秘

為了清楚起見,寫出第2層對應的方程:

揭秘:深度網絡背後的數學奧秘

就像看見的那樣,對于每個層的操作原理都差不多。在這裡使用for循環并不十分有效,是以為了加快計算速度,我們将使用向量化來進行加速。首先,把轉置後的權重w的水準向量疊加起來來建構一個矩陣w。同樣,我們可以把每個神經元的偏移值疊加起來建構一個垂直向量b。現在沒有什麼可以阻止我們建立一個矩陣方程來計算所有神經元層,以下是會用到的矩陣和向量的次元。

揭秘:深度網絡背後的數學奧秘
揭秘:深度網絡背後的數學奧秘
對多樣本向量化

到目前為止我們列出的方程隻涉及到一個樣本。在學習神經網絡的過程中,你通常要處理大量的資料,多達數百萬個樣本。是以,下一步将對多個樣本進行向量化。假設我們的資料集有m個樣本,每個樣本都有nx特征。首先,我們将把每一層的垂直向量x、a,和z放在一起來分别建立x, a和z矩陣。然後,重寫之前的簡化方程來應用新的矩陣。

揭秘:深度網絡背後的數學奧秘
什麼是激活函數?我們為什麼需要它?

激活函數是神經網絡的關鍵要素之一。沒有它們,我們的神經網絡就會變成線性函數的組合,那麼它本身還是一個線性函數。我們模型的可擴充性有限,不會比邏輯回歸要好。非線性元素在學習過程中有很好的彈性和并且可以建構比較複雜的函數。激活函數對學習速度也有顯著影響,是以激活函數也是選擇的一個重要标準。圖6列出了一些常用的激活函數。目前,最流行可能是ReLU。但我們有時仍然使用sigmoid,當我們處理二分類問題時,希望模型傳回的值在0到1之間,會在輸出層使用sigmoid。

揭秘:深度網絡背後的數學奧秘
損失函數

關于學習過程的基本資訊來源是損失函數。一般來說,損失函數是用來衡量我們離“理想”的解決方案有多遠。在我們的例子中使用了二進制交叉熵,但是根據問題的不同可以應用不同的函數。我們使用的函數如下式所示,學習過程中其值的變化如圖7所示。它顯示了每一次疊代的損失函數值降低和準确率的提高。

揭秘:深度網絡背後的數學奧秘
神經網絡如何學習?

神經網絡學習過程即改變W和b參數的值,使損失函數最小化。為了實作這一目标,我們将借助于微積分,使用梯度下降法來求出函數的最小值。在每次疊代中,我們将計算損失函數對于神經網絡每個參數的偏導數的值。對于那些不太熟悉這種計算方法的人,我隻想提一下導數有一種神奇的能力來描述函數的斜率。由于這一點,我們知道如何調整參數來使圖形上下移動。為了能夠直覺地了解梯度下降法的工作原理,我準備了一個小的可視化。你可以看到,随着epoch一直走,我們是如何實作最小化的。在神經網絡中,它工作的原理也差不多,在每次疊代中用計算的梯度來顯示我們應該移動的方向,主要的差別是在實際的神經網絡中,我們有更多的參數要操作,重點是:如何計算這些複雜的導數?

揭秘:深度網絡背後的數學奧秘
反向傳播

反向傳播是一個允許我們計算非常複雜的梯度的算法,根據以下公式調整神經網絡的參數。

揭秘:深度網絡背後的數學奧秘

在上面的等式中,α表示學習率——是調整變量的一個超參數。選擇一個學習率是至關重要的——如果我們設定的太低,神經網絡學習的非常緩慢,我們設定的太高,我們将無法找到最小值。利用鍊式法則計算dW和db,即損失函數對W和b的偏導數,dW和db的大小,跟W和b是一樣的。圖9顯示了神經網絡中的操作序列。我們清楚地看到前向傳播和反向傳播如何協同工作來優化損失函數的。

揭秘:深度網絡背後的數學奧秘
結論

希望我已經解釋了在神經網絡中發生的數學,但至少了解了這部分内容對以後的神經網絡的工作是很有幫助的。我認為文章提到的内容是最重要的,但它們隻是冰山一角。我強烈建議你自己嘗試搭建這樣一個小型的神經網絡,不使用進階架構,隻使用Numpy。

如果你看到這裡,恭喜你!這篇文章并不是那麼容易閱讀。

本文由

阿裡雲雲栖社群

組織翻譯。

文章原标題《deep-dive-into-deep-networks-math》

作者:

James Le

  譯者:烏拉烏拉,審校:。

文章為簡譯,更為詳細的内容,請檢視

原文

繼續閱讀