AQF燒腦文章~本文將揭秘深度網(wǎng)絡(luò)背后的數(shù)學(xué)奧秘!不要怪我沒有告訴你,數(shù)學(xué)不好千萬不要亂點。
目前,我們可以使用像Keras、TensorFlow或PyTorch這些高級的、專業(yè)的庫和框架而不需要一直擔(dān)心權(quán)重矩陣的大小,也不需要記住決定使用的激活函數(shù)的導(dǎo)數(shù)公式。通常我們只需要構(gòu)建一個神經(jīng)網(wǎng)絡(luò),即使是一個結(jié)構(gòu)非常復(fù)雜的神經(jīng)網(wǎng)絡(luò),也只需要導(dǎo)入一些庫和幾行代碼。這節(jié)省了我們找出bug的時間,并簡化了工作。然而,如果了解神經(jīng)網(wǎng)絡(luò)內(nèi)部發(fā)生的事情,對架構(gòu)選擇、超參數(shù)調(diào)優(yōu)或優(yōu)化等任務(wù)有很大幫助。
介紹
為了更多地了解神經(jīng)網(wǎng)絡(luò)的原理,我決定寫一篇文章,一部分是為了我自己,一部分為了幫助其他人理解這些有時難以理解的概念。對于那些對代數(shù)和微積分不太熟悉的人,我會盡量詳細(xì)一些,但正如標(biāo)題所示,這是一篇涉及很多數(shù)學(xué)的文章。
.jpg)
例如,我們將解決如圖1所示的數(shù)據(jù)集二分類問題,兩種類別的點形成圓圈,這種排列對于許多傳統(tǒng)的ML算法來說是不方便的,但是一個簡單的神經(jīng)網(wǎng)絡(luò)卻可以很好地解決這個問題。為了解決這個問題,我們將使用一個神經(jīng)網(wǎng)絡(luò),結(jié)構(gòu)如圖2所示。五個有不同數(shù)量單元的全連接層,對于隱藏層,我們將使用ReLU作為激活函數(shù),對輸出層使用Sigmoid。這是一個相當(dāng)簡單的架構(gòu),但復(fù)雜到足以成為我們深入探討的例子。

KERAS解決方案
首先,我將介紹一個最流行的機(jī)器學(xué)習(xí)庫之一KERAS

正如我在介紹中提到的,只要導(dǎo)入一些庫和幾行代碼就足以構(gòu)建和訓(xùn)練一個模型,該模型對訓(xùn)練集進(jìn)行分類的準(zhǔn)確率基本上可以達(dá)到100%。我們的任務(wù)歸根結(jié)底是根據(jù)所選擇的架構(gòu)提供超參數(shù)(層數(shù)、層內(nèi)神經(jīng)元數(shù)、激活函數(shù)或epoch數(shù))?,F(xiàn)在讓我們看看背后的原理。我在學(xué)習(xí)的過程中弄了一個非??岬囊曈X效果,希望能讓你提起興趣。

什么是神經(jīng)網(wǎng)絡(luò)
讓我們從回答這個關(guān)鍵問題開始:什么是神經(jīng)網(wǎng)絡(luò)?這是一種生物啟發(fā)的方法,可以構(gòu)建能夠?qū)W習(xí)和獨立查找數(shù)據(jù)連接的計算機(jī)程序。網(wǎng)絡(luò)是一組按層排列的軟件“神經(jīng)元”,以一種允許交流的方式連接在一起。
每個神經(jīng)元接收一組變量x (從1到n編號)作為輸入并計算預(yù)測的y值。向量x實際上包含了訓(xùn)練集中m個例子中的一個特征值。更重要的是,每個單元都有自己的一組參數(shù),通常被稱為w(權(quán)重列向量)和b(偏差),它們在學(xué)習(xí)過程中會發(fā)生變化。在每次迭代中,神經(jīng)元根據(jù)向量x的當(dāng)前權(quán)值w計算向量x的加權(quán)平均值并加上偏差。最后,通過一個非線性激活函數(shù)g來傳遞計算結(jié)果。

單層
先把范圍縮小來考慮如何計算整個神經(jīng)網(wǎng)絡(luò)層,通過在單個單元內(nèi)發(fā)生的原理來向量化整個網(wǎng)絡(luò)層,將這些計算組合成矩陣方程。為了統(tǒng)一符號,為選定的層編寫方程[l]。順便說一下,下標(biāo)i標(biāo)記了這層神經(jīng)元的順序。

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

為了清楚起見,寫出第2層對應(yīng)的方程:

就像看見的那樣,對于每個層的操作原理都差不多。在這里使用for循環(huán)并不十分有效,因此為了加快計算速度,我們將使用向量化來進(jìn)行加速。首先,把轉(zhuǎn)置后的權(quán)重w的水平向量疊加起來來構(gòu)建一個矩陣w。同樣,我們可以把每個神經(jīng)元的偏移值疊加起來構(gòu)建一個垂直向量b。現(xiàn)在沒有什么可以阻止我們建立一個矩陣方程來計算所有神經(jīng)元層,以下是會用到的矩陣和向量的維度。

對多樣本向量化
到目前為止我們列出的方程只涉及到一個樣本。在學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的過程中,你通常要處理大量的數(shù)據(jù),多達(dá)數(shù)百萬個樣本。因此,下一步將對多個樣本進(jìn)行向量化。假設(shè)我們的數(shù)據(jù)集有m個樣本,每個樣本都有nx特征。首先,我們將把每一層的垂直向量x、a,和z放在一起來分別創(chuàng)建x, a和z矩陣。然后,重寫之前的簡化方程來應(yīng)用新的矩陣。

什么是激活函數(shù)?我們?yōu)槭裁葱枰?
激活函數(shù)是神經(jīng)網(wǎng)絡(luò)的關(guān)鍵要素之一。沒有它們,我們的神經(jīng)網(wǎng)絡(luò)就會變成線性函數(shù)的組合,那么它本身還是一個線性函數(shù)。我們模型的可擴(kuò)展性有限,不會比邏輯回歸要好。非線性元素在學(xué)習(xí)過程中有很好的彈性和并且可以構(gòu)建比較復(fù)雜的函數(shù)。激活函數(shù)對學(xué)習(xí)速度也有顯著影響,所以激活函數(shù)也是選擇的一個重要標(biāo)準(zhǔn)。圖6列出了一些常用的激活函數(shù)。目前,最流行可能是ReLU。但我們有時仍然使用sigmoid,當(dāng)我們處理二分類問題時,希望模型返回的值在0到1之間,會在輸出層使用sigmoid。

損失函數(shù)
關(guān)于學(xué)習(xí)過程的基本信息來源是損失函數(shù)。一般來說,損失函數(shù)是用來衡量我們離“理想”的解決方案有多遠(yuǎn)。在我們的例子中使用了二元交叉熵,但是根據(jù)問題的不同可以應(yīng)用不同的函數(shù)。我們使用的函數(shù)如下式所示,學(xué)習(xí)過程中其值的變化如圖7所示。它顯示了每一次迭代的損失函數(shù)值降低和準(zhǔn)確率的提高。

神經(jīng)網(wǎng)絡(luò)如何學(xué)習(xí)?
神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)過程即改變W和b參數(shù)的值,使損失函數(shù)最小化。為了實現(xiàn)這一目標(biāo),我們將借助于微積分,使用梯度下降法來求出函數(shù)的最小值。在每次迭代中,我們將計算損失函數(shù)對于神經(jīng)網(wǎng)絡(luò)每個參數(shù)的偏導(dǎo)數(shù)的值。對于那些不太熟悉這種計算方法的人,我只想提一下導(dǎo)數(shù)有一種神奇的能力來描述函數(shù)的斜率。由于這一點,我們知道如何調(diào)整參數(shù)來使圖形上下移動。為了能夠直觀地了解梯度下降法的工作原理,我準(zhǔn)備了一個小的可視化。你可以看到,隨著epoch一直走,我們是如何實現(xiàn)最小化的。在神經(jīng)網(wǎng)絡(luò)中,它工作的原理也差不多,在每次迭代中用計算的梯度來顯示我們應(yīng)該移動的方向,主要的區(qū)別是在實際的神經(jīng)網(wǎng)絡(luò)中,我們有更多的參數(shù)要操作,重點是:如何計算這些復(fù)雜的導(dǎo)數(shù)?

反向傳播
反向傳播是一個允許我們計算非常復(fù)雜的梯度的算法,根據(jù)以下公式調(diào)整神經(jīng)網(wǎng)絡(luò)的參數(shù)。

在上面的等式中,α表示學(xué)習(xí)率——是調(diào)整變量的一個超參數(shù)。選擇一個學(xué)習(xí)率是至關(guān)重要的——如果我們設(shè)置的太低,神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的非常緩慢,我們設(shè)置的太高,我們將無法找到最小值。利用鏈?zhǔn)椒▌t計算dW和db,即損失函數(shù)對W和b的偏導(dǎo)數(shù),dW和db的大小,跟W和b是一樣的。圖9顯示了神經(jīng)網(wǎng)絡(luò)中的操作序列。我們清楚地看到前向傳播和反向傳播如何協(xié)同工作來優(yōu)化損失函數(shù)的。

結(jié)論
希望我已經(jīng)解釋了在神經(jīng)網(wǎng)絡(luò)中發(fā)生的數(shù)學(xué),但至少了解了這部分內(nèi)容對以后的神經(jīng)網(wǎng)絡(luò)的工作是很有幫助的。我認(rèn)為文章提到的內(nèi)容是最重要的,但它們只是冰山一角。我強(qiáng)烈建議你自己嘗試搭建這樣一個小型的神經(jīng)網(wǎng)絡(luò),不使用高級框架,只使用Numpy。
如果你看到這里,恭喜你!這篇文章并不是那么容易閱讀。
>>>點擊咨詢Python金融實戰(zhàn)應(yīng)用
.jpg)
.jpg)
.jpg)
完善下表,48小時內(nèi)查收全套AQF備考資料
.jpg)
聲明▎更多內(nèi)容請關(guān)注微信號量化金融分析師。原創(chuàng)文章,歡迎分享,若需引用或轉(zhuǎn)載請保留此處信息。




