當前位置:
首頁 > 知識 > 深度網路揭秘之深度網路背後的數學

深度網路揭秘之深度網路背後的數學

本文為 AI 研習社編譯的技術博客,原標題 :

Deep Dive into Math Behind Deep Networks

作者 |Piotr Skalski

翻譯 |灰灰在學習、Disillusion

校對 | 醬番梨 整理 | 菠蘿妹

https://towardsdatascience.com/https-medium-com-piotr-skalski92-deep-dive-into-deep-networks-math-17660bc376ba


神秘的神經網路第一部分

如今,我們擁有許多高級的,特殊的庫與框架,比如 Keras,TensorFlow或者PyTorch,也不再總需要擔心權重矩陣的大小,更不需要記住我們決定使用的激活函數導數的公式。通常我們只需要儘力一個神經網路,即使是一個結構非常複雜的神經網路,也只需要導入和幾行代碼就可以完成了。這節省了我們搜索漏洞的時間並簡化了我們的工作。但是,對於神經網路的深入了解對我們完成在構架選擇,或者超參數的調整或優化的任務上有著很大的幫助。

注意:感謝Jung Yi Lin 的幫助,你也可以閱讀中文版的這篇文章。我在GitHub上提供了用於創建本文中使用的可視化的源代碼。


介紹

了解更多的神經網路的工作原理。我決定在今年夏天抽出點時間深入的學習一下數學。我也打算寫一篇關於最新的學習諮詢的文章,以便幫助別人理解一些生澀難懂的概念。我編寫的這篇文章會對那些不太擅長線性代數和微積分的人十分友好,但就像標題所暗示的,這將是一篇與數學密切相關的文章。

圖1.訓練集的可視化

舉一個例子:我們將解決確定二進位分類數據集問題,如下面圖一所示。如果兩個類不同那就會形成兩個圓圈——這種設置非常不方便在許多傳統的ML演算法中,但是再一些小型神經網路中卻可以有很好的效果。為了解決這個問題,我們將使用具有圖二結構的神經網路——5個具有不同數量單位的全連接層。對於隱藏層,我們將使用relu作為其激活函數,而將Sigmod作為輸出層。這是相當簡單的一種構造,而不是複雜到足以成為一個需要我們深思熟慮的一個例子。

圖2.神經網路架構

KERAS的解決方法

首先,我們用最流行的機器學習庫之一——KERAS提出了第一種解決方法。

就像這樣。正如我在介紹中提到的,一些導入加幾行代碼就足以創建並且訓練一個能夠對我們的測試集中的樣本進行幾乎100%分類的模型了。我們的任務歸根結底就是根據設定超參數(層數,層中神經元數,激活函數或時期數)選擇神經網路的結構。現在讓我們看一看訓練背後的過程。哦......我在學習過程中創建了一個很酷的可視化界面。希望你看了以後不會難以入睡。

圖3.對訓練合適的類進行可視化展示


什麼是神經網路?

讓我們先回答一個問題:什麼是神經網路?它是一種生物學啟發的構建計算機程序的方法,能夠學習和獨立地找到數據中的連接。正如圖二所展示的。網路是層疊排列的軟體「神經元」的集合,他們以允許通信的方式連在一起。

單個神經元

每個神經元接收一組x值(編號從1到n)作為輸入並計算預測的y^值。向量X是訓練集中m個樣本之一的特徵值的量化。更重要的是每個單元都有自己的一組參數,通常要用到在學習過程中不斷變化的w(權重列向量)和b(偏差值),在每次迭代中神經元計算向量x的值的加權平均值,基於其當前的權重向量w並加上偏差,最後,該計算的結果通過非線性激活函數g()。我將在以後的部分中提及一些關於最流行的激活函數。

單個層

現在讓我們往小的地方看,考慮如何對整個神經網路層進行計算。我們將運用我們所知的在單個神經元內部的原理,矢量化整個層,將這些計算結合到矩陣方程中。方程式將會被編寫在選擇層中,為了統一符號[l]。順便說一下,下標i標記該層中神經元的索引。

圖5,單個層

一個更重要的評價:當我們為一個單個單元編寫方程時,我們使用x和y^,它們分別是特徵值的列向量和預測值,當我們切換到圖層的一般表示法時,我們使用向量a - 該向量可以激活相應的層。因此,x向量就可以激活層0——輸入層,每個神經元都執行者如下所類似的計算:

為清楚起見,讓我們寫下如第二層的方程式:

正如你所看到的,對於每個層,我們必須執行許多非常類似的操作,因此其實for循環在此使用效率並不高,所以我們將其矢量化以加快運算,首先,我們將向量水平堆疊成一個N*1的向量。

我們將每個權重w進行轉置以形成舉證W,類似地,我們將層中的每個神經元的偏差堆疊在一起,從而創建垂直向量b,現在沒有什麼可以阻止我們構建一個矩陣方程,它可以使我們一次對層的所有神經元進行計算。讓我們寫下我們使用的矩陣和向量的維數。

多個矢量化例子

這個我們設置的方程式目前為止只包含一個例子。在神經網路的學習過程中,你通常使用大量數據,最多可達數百萬條。因此,下一步將是矢量化多個例子。假設我們的數據集中有m個條目,每個條目都有nx個特徵,首先,我們將每層的垂直向量x,a和z組合在一起,分別創建X,A和Z矩陣。然後我們重寫先前布局的方程式,同時考慮新創建的矩陣。


什麼是激活函數,我們又為什麼需要它呢?

激活函數是神經網路的關鍵元素之一,如果缺失了他們,那麼我們的神經網路就只剩下線性函數的組成了。所以神經網路將直接成為一個線性函數。我們的模型也將缺失多樣的擴展性,導致其甚至連邏輯回歸都不如。

非線性的元素使得複雜的函數在學習過程中具有更好的靈活性和可塑性。我們選擇激活函數的主要原因是,它能對學習速度有著重大影響,圖6顯示了一些常用的激活函數。目前,最受歡迎的隱藏層應該是ReLU函數,但是我們有時仍然會使用sigmoid,尤其是在輸出層。當我們處理二進位分類時,我們希望模型返回的值在0到1的範圍內。

圖6.最流行的激活函數及其衍生物的圖


損失功能

促進深度學習的發展進程的基石可以說就是損失的值。一般來說,損失函數就是表示的我們理想值與現實值之間的差距。在我們的例子中,我們使用二進位交叉熵,但根據問題,我們還可以用不同的函數。我們使用的函數由以下公式表示,在圖7中可以看到學習過程中其價值的變化。它顯示了每次迭代時損失函數的值是如何減小同時使精確值增加。

圖7.學習過程中精確值和損失值的變化


神經網路是如何學習?

學習過程其實就是最小化損失值,通過改變W和參數的值。為了達到這個目標,我們從使用積分和梯度下降法去找到一個可以使loss值最小的函數。在每次迭代中我們將計算神經網路的每一部分的損失函數的偏導數的值。對於那些不太擅長這種計算的人,我就簡單的說,導數具有很好的描述函數斜率的能力。由於我們知道如何改變變數使其在圖表中向下移動。

為了形成關於梯度下降如何工作的直觀理解(再次引起你的注意)我準備了一個小的可視化示意圖。你可以看到我們從隨機點走向最低點的每一步。在我們的神經網路中它以同樣的方式工作——每次迭代的梯度都向我們展示了我們應該移動的方向。最主要的不同點是在我們的示範神經網路,我們有更多的參數需要考慮。但是...我們又如何計算這些全導數呢?

圖8.實際中的梯度下降


反向傳播

正如我們所需要的,反向傳播是一種可以讓我們計算非常複雜的梯度的演算法,我們可以根據以下公式調整神經網路的參數。

在上面的等式中,α表示學習率 —— 一個超參數,可以使你控制調整表現的參數。選擇學習率至關重要 —— 如果我們通常將其設置得太低。我們的神經網路將非常緩慢地學習;如果我們設置得太高,我們無法達到最低限度。關於W和b的損失函數的偏導數dW和db,我們使用鏈式方法進行計算。dW和db矩陣的大小與W的大小相同。圖9顯示了神經網路中的操作順序。我們清楚地看到前向和後向傳播如何一起工作以優化損失函數。

圖9.前向和後向傳播


結論

希望我已經解釋了在神經網路中發生的數學。在使用神經網路時,至少基本了解這個過程是非常有用的。我認為我提到的這些事情是最重要的,但它們僅僅是冰山一角。我強烈建議你嘗試自己編寫這樣一個小的神經網路,不使用高級框架,只使用Numpy。

如果你成功讀到這裡,恭喜你。這肯定不是一篇很簡單的文章。如果你喜歡本文,請在Twitter和Medium上關注我,並查看我正在進行的其他項目,如GitHub和Kaggle。本文是「神經網路的奧秘」系列文章的第二篇,如果你還沒有機會閱讀其他文章。保持好奇!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

TAG:AI研習社 |