2
本文作者: AI研習(xí)社-譯站 | 2018-12-05 10:25 |
本文為 AI 研習(xí)社編譯的技術(shù)博客,原標(biāo)題 :
Deep Dive into Math Behind Deep Networks
作者 | Piotr Skalski
翻譯 | 灰灰在學(xué)習(xí)、Disillusion
校對(duì) | 醬番梨 整理 | 菠蘿妹
原文鏈接:l
https://towardsdatascience.com/https-medium-com-piotr-skalski92-deep-dive-into-deep-networks-math-17660bc376ba
如今,我們擁有許多高級(jí)的,特殊的庫(kù)與框架,比如 Keras,TensorFlow或者PyTorch,也不再總需要擔(dān)心權(quán)重矩陣的大小,更不需要記住我們決定使用的激活函數(shù)導(dǎo)數(shù)的公式。通常我們只需要盡力一個(gè)神經(jīng)網(wǎng)絡(luò),即使是一個(gè)結(jié)構(gòu)非常復(fù)雜的神經(jīng)網(wǎng)絡(luò),也只需要導(dǎo)入和幾行代碼就可以完成了。這節(jié)省了我們搜索漏洞的時(shí)間并簡(jiǎn)化了我們的工作。但是,對(duì)于神經(jīng)網(wǎng)絡(luò)的深入了解對(duì)我們完成在構(gòu)架選擇,或者超參數(shù)的調(diào)整或優(yōu)化的任務(wù)上有著很大的幫助。
注意:感謝Jung Yi Lin 的幫助,你也可以閱讀中文版的這篇文章。我在GitHub上提供了用于創(chuàng)建本文中使用的可視化的源代碼。
了解更多的神經(jīng)網(wǎng)絡(luò)的工作原理。我決定在今年夏天抽出點(diǎn)時(shí)間深入的學(xué)習(xí)一下數(shù)學(xué)。我也打算寫(xiě)一篇關(guān)于最新的學(xué)習(xí)咨詢(xún)的文章,以便幫助別人理解一些生澀難懂的概念。我編寫(xiě)的這篇文章會(huì)對(duì)那些不太擅長(zhǎng)線性代數(shù)和微積分的人十分友好,但就像標(biāo)題所暗示的,這將是一篇與數(shù)學(xué)密切相關(guān)的文章。
圖1.訓(xùn)練集的可視化
舉一個(gè)例子:我們將解決確定二進(jìn)制分類(lèi)數(shù)據(jù)集問(wèn)題,如下面圖一所示。如果兩個(gè)類(lèi)不同那就會(huì)形成兩個(gè)圓圈——這種設(shè)置非常不方便在許多傳統(tǒng)的ML算法中,但是再一些小型神經(jīng)網(wǎng)絡(luò)中卻可以有很好的效果。為了解決這個(gè)問(wèn)題,我們將使用具有圖二結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)——5個(gè)具有不同數(shù)量單位的全連接層。對(duì)于隱藏層,我們將使用relu作為其激活函數(shù),而將Sigmod作為輸出層。這是相當(dāng)簡(jiǎn)單的一種構(gòu)造,而不是復(fù)雜到足以成為一個(gè)需要我們深思熟慮的一個(gè)例子。
圖2.神經(jīng)網(wǎng)絡(luò)架構(gòu)
首先,我們用最流行的機(jī)器學(xué)習(xí)庫(kù)之一——KERAS提出了第一種解決方法。
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(4, input_dim=2,activation='relu'))
model.add(Dense(6, activation='relu'))
model.add(Dense(6, activation='relu'))
model.add(Dense(4, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=50, verbose=0)
就像這樣。正如我在介紹中提到的,一些導(dǎo)入加幾行代碼就足以創(chuàng)建并且訓(xùn)練一個(gè)能夠?qū)ξ覀兊臏y(cè)試集中的樣本進(jìn)行幾乎100%分類(lèi)的模型了。我們的任務(wù)歸根結(jié)底就是根據(jù)設(shè)定超參數(shù)(層數(shù),層中神經(jīng)元數(shù),激活函數(shù)或時(shí)期數(shù))選擇神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)?,F(xiàn)在讓我們看一看訓(xùn)練背后的過(guò)程。哦......我在學(xué)習(xí)過(guò)程中創(chuàng)建了一個(gè)很酷的可視化界面。希望你看了以后不會(huì)難以入睡。
圖3.對(duì)訓(xùn)練合適的類(lèi)進(jìn)行可視化展示
讓我們先回答一個(gè)問(wèn)題:什么是神經(jīng)網(wǎng)絡(luò)?它是一種生物學(xué)啟發(fā)的構(gòu)建計(jì)算機(jī)程序的方法,能夠?qū)W習(xí)和獨(dú)立地找到數(shù)據(jù)中的連接。正如圖二所展示的。網(wǎng)絡(luò)是層疊排列的軟件“神經(jīng)元”的集合,他們以允許通信的方式連在一起。
單個(gè)神經(jīng)元
每個(gè)神經(jīng)元接收一組x值(編號(hào)從1到n)作為輸入并計(jì)算預(yù)測(cè)的y^值。向量X是訓(xùn)練集中m個(gè)樣本之一的特征值的量化。更重要的是每個(gè)單元都有自己的一組參數(shù),通常要用到在學(xué)習(xí)過(guò)程中不斷變化的w(權(quán)重列向量)和b(偏差值),在每次迭代中神經(jīng)元計(jì)算向量x的值的加權(quán)平均值,基于其當(dāng)前的權(quán)重向量w并加上偏差,最后,該計(jì)算的結(jié)果通過(guò)非線性激活函數(shù)g()。我將在以后的部分中提及一些關(guān)于最流行的激活函數(shù)。
單個(gè)層
現(xiàn)在讓我們往小的地方看,考慮如何對(duì)整個(gè)神經(jīng)網(wǎng)絡(luò)層進(jìn)行計(jì)算。我們將運(yùn)用我們所知的在單個(gè)神經(jīng)元內(nèi)部的原理,矢量化整個(gè)層,將這些計(jì)算結(jié)合到矩陣方程中。方程式將會(huì)被編寫(xiě)在選擇層中,為了統(tǒng)一符號(hào)[l]。順便說(shuō)一下,下標(biāo)i標(biāo)記該層中神經(jīng)元的索引。
圖5,單個(gè)層
一個(gè)更重要的評(píng)價(jià):當(dāng)我們?yōu)橐粋€(gè)單個(gè)單元編寫(xiě)方程時(shí),我們使用x和y^,它們分別是特征值的列向量和預(yù)測(cè)值,當(dāng)我們切換到圖層的一般表示法時(shí),我們使用向量a - 該向量可以激活相應(yīng)的層。因此,x向量就可以激活層0——輸入層,每個(gè)神經(jīng)元都執(zhí)行者如下所類(lèi)似的計(jì)算:
為清楚起見(jiàn),讓我們寫(xiě)下如第二層的方程式:
正如你所看到的,對(duì)于每個(gè)層,我們必須執(zhí)行許多非常類(lèi)似的操作,因此其實(shí)for循環(huán)在此使用效率并不高,所以我們將其矢量化以加快運(yùn)算,首先,我們將向量水平堆疊成一個(gè)N*1的向量。
我們將每個(gè)權(quán)重w進(jìn)行轉(zhuǎn)置以形成舉證W,類(lèi)似地,我們將層中的每個(gè)神經(jīng)元的偏差堆疊在一起,從而創(chuàng)建垂直向量b,現(xiàn)在沒(méi)有什么可以阻止我們構(gòu)建一個(gè)矩陣方程,它可以使我們一次對(duì)層的所有神經(jīng)元進(jìn)行計(jì)算。讓我們寫(xiě)下我們使用的矩陣和向量的維數(shù)。
多個(gè)矢量化例子
這個(gè)我們?cè)O(shè)置的方程式目前為止只包含一個(gè)例子。在神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)過(guò)程中,你通常使用大量數(shù)據(jù),最多可達(dá)數(shù)百萬(wàn)條。因此,下一步將是矢量化多個(gè)例子。假設(shè)我們的數(shù)據(jù)集中有m個(gè)條目,每個(gè)條目都有nx個(gè)特征,首先,我們將每層的垂直向量x,a和z組合在一起,分別創(chuàng)建X,A和Z矩陣。然后我們重寫(xiě)先前布局的方程式,同時(shí)考慮新創(chuàng)建的矩陣。
激活函數(shù)是神經(jīng)網(wǎng)絡(luò)的關(guān)鍵元素之一,如果缺失了他們,那么我們的神經(jīng)網(wǎng)絡(luò)就只剩下線性函數(shù)的組成了。所以神經(jīng)網(wǎng)絡(luò)將直接成為一個(gè)線性函數(shù)。我們的模型也將缺失多樣的擴(kuò)展性,導(dǎo)致其甚至連邏輯回歸都不如。
非線性的元素使得復(fù)雜的函數(shù)在學(xué)習(xí)過(guò)程中具有更好的靈活性和可塑性。我們選擇激活函數(shù)的主要原因是,它能對(duì)學(xué)習(xí)速度有著重大影響,圖6顯示了一些常用的激活函數(shù)。目前,最受歡迎的隱藏層應(yīng)該是ReLU函數(shù),但是我們有時(shí)仍然會(huì)使用sigmoid,尤其是在輸出層。當(dāng)我們處理二進(jìn)制分類(lèi)時(shí),我們希望模型返回的值在0到1的范圍內(nèi)。
圖6.最流行的激活函數(shù)及其衍生物的圖
促進(jìn)深度學(xué)習(xí)的發(fā)展進(jìn)程的基石可以說(shuō)就是損失的值。一般來(lái)說(shuō),損失函數(shù)就是表示的我們理想值與現(xiàn)實(shí)值之間的差距。在我們的例子中,我們使用二進(jìn)制交叉熵,但根據(jù)問(wèn)題,我們還可以用不同的函數(shù)。我們使用的函數(shù)由以下公式表示,在圖7中可以看到學(xué)習(xí)過(guò)程中其價(jià)值的變化。它顯示了每次迭代時(shí)損失函數(shù)的值是如何減小同時(shí)使精確值增加。
圖7.學(xué)習(xí)過(guò)程中精確值和損失值的變化
學(xué)習(xí)過(guò)程其實(shí)就是最小化損失值,通過(guò)改變W和參數(shù)的值。為了達(dá)到這個(gè)目標(biāo),我們從使用積分和梯度下降法去找到一個(gè)可以使loss值最小的函數(shù)。在每次迭代中我們將計(jì)算神經(jīng)網(wǎng)絡(luò)的每一部分的損失函數(shù)的偏導(dǎo)數(shù)的值。對(duì)于那些不太擅長(zhǎng)這種計(jì)算的人,我就簡(jiǎn)單的說(shuō),導(dǎo)數(shù)具有很好的描述函數(shù)斜率的能力。由于我們知道如何改變變量使其在圖表中向下移動(dòng)。
為了形成關(guān)于梯度下降如何工作的直觀理解(再次引起你的注意)我準(zhǔn)備了一個(gè)小的可視化示意圖。你可以看到我們從隨機(jī)點(diǎn)走向最低點(diǎn)的每一步。在我們的神經(jīng)網(wǎng)絡(luò)中它以同樣的方式工作——每次迭代的梯度都向我們展示了我們應(yīng)該移動(dòng)的方向。最主要的不同點(diǎn)是在我們的示范神經(jīng)網(wǎng)絡(luò),我們有更多的參數(shù)需要考慮。但是...我們又如何計(jì)算這些全導(dǎo)數(shù)呢?
圖8.實(shí)際中的梯度下降
正如我們所需要的,反向傳播是一種可以讓我們計(jì)算非常復(fù)雜的梯度的算法,我們可以根據(jù)以下公式調(diào)整神經(jīng)網(wǎng)絡(luò)的參數(shù)。
在上面的等式中,α表示學(xué)習(xí)率 —— 一個(gè)超參數(shù),可以使你控制調(diào)整表現(xiàn)的參數(shù)。選擇學(xué)習(xí)率至關(guān)重要 —— 如果我們通常將其設(shè)置得太低。我們的神經(jīng)網(wǎng)絡(luò)將非常緩慢地學(xué)習(xí);如果我們?cè)O(shè)置得太高,我們無(wú)法達(dá)到最低限度。關(guān)于W和b的損失函數(shù)的偏導(dǎo)數(shù)dW和db,我們使用鏈?zhǔn)椒椒ㄟM(jìn)行計(jì)算。dW和db矩陣的大小與W的大小相同。圖9顯示了神經(jīng)網(wǎng)絡(luò)中的操作順序。我們清楚地看到前向和后向傳播如何一起工作以?xún)?yōu)化損失函數(shù)。
圖9.前向和后向傳播
希望我已經(jīng)解釋了在神經(jīng)網(wǎng)絡(luò)中發(fā)生的數(shù)學(xué)。在使用神經(jīng)網(wǎng)絡(luò)時(shí),至少基本了解這個(gè)過(guò)程是非常有用的。我認(rèn)為我提到的這些事情是最重要的,但它們僅僅是冰山一角。我強(qiáng)烈建議你嘗試自己編寫(xiě)這樣一個(gè)小的神經(jīng)網(wǎng)絡(luò),不使用高級(jí)框架,只使用Numpy。
如果你成功讀到這里,恭喜你。這肯定不是一篇很簡(jiǎn)單的文章。如果你喜歡本文,請(qǐng)?jiān)赥witter和Medium上關(guān)注我,并查看我正在進(jìn)行的其他項(xiàng)目,如GitHub和Kaggle。本文是“神經(jīng)網(wǎng)絡(luò)的奧秘”系列文章的第二篇,如果你還沒(méi)有機(jī)會(huì)閱讀其他文章。保持好奇!雷鋒網(wǎng)
想要繼續(xù)查看該篇文章相關(guān)鏈接和參考文獻(xiàn)?雷鋒網(wǎng)
長(zhǎng)按鏈接點(diǎn)擊打開(kāi)或點(diǎn)擊【深度網(wǎng)絡(luò)揭秘之深度網(wǎng)絡(luò)背后的數(shù)學(xué)】:
https://ai.yanxishe.com/page/TextTranslation/1161
AI研習(xí)社每日更新精彩內(nèi)容,觀看更多精彩內(nèi)容:雷鋒網(wǎng)
等你來(lái)譯:
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。