# AI框架作用
深度學(xué)習(xí)范式主要是通過(guò)發(fā)現(xiàn)經(jīng)驗(yàn)數(shù)據(jù)中,錯(cuò)綜復(fù)雜的結(jié)構(gòu)進(jìn)行學(xué)習(xí)。通過(guò)構(gòu)建包含多個(gè)處理層的計(jì)算模型(網(wǎng)絡(luò)模型),深度學(xué)習(xí)可以創(chuàng)建多個(gè)級(jí)別的抽象層來(lái)表示數(shù)據(jù)。例如,卷積神經(jīng)網(wǎng)絡(luò)CNN可以使用大量圖像進(jìn)行訓(xùn)練,例如對(duì)貓狗分類去學(xué)習(xí)貓和狗圖片的特征。這種類型的神經(jīng)網(wǎng)絡(luò)通常從所采集圖像中,包含的像素進(jìn)行學(xué)習(xí)。
本章將從深度學(xué)習(xí)的原理開始,進(jìn)而深入地討論在實(shí)現(xiàn)深度學(xué)習(xí)的計(jì)算過(guò)程中使用到的AI框架,看看AI框架具體的作用和目的。
## 深度學(xué)習(xí)原理
深度學(xué)習(xí)的概念源于人工神經(jīng)網(wǎng)絡(luò)的研究,但是并不完全等于傳統(tǒng)神經(jīng)網(wǎng)絡(luò)。在叫法上,很多深度學(xué)習(xí)算法中都會(huì)包含”神經(jīng)網(wǎng)絡(luò)”這個(gè)詞,比如:卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)。所以,深度學(xué)習(xí)可以說(shuō)是在傳統(tǒng)神經(jīng)網(wǎng)絡(luò)基礎(chǔ)上的升級(jí),約等于神經(jīng)網(wǎng)絡(luò)。
雖然深度學(xué)習(xí)理論最初創(chuàng)立于上世紀(jì)八十年代,但有兩個(gè)主要原因?qū)е缕渲钡浇陙?lái)才得以發(fā)揮巨大作用:
- 深度學(xué)習(xí)需要大量的標(biāo)簽化數(shù)據(jù)。例如,無(wú)人駕駛汽車模型訓(xùn)練需要數(shù)萬(wàn)億張圖片和數(shù)千萬(wàn)小時(shí)的視頻進(jìn)行學(xué)習(xí)。
- 深度學(xué)習(xí)需要巨大的計(jì)算能力。例如,需要局別并行架構(gòu)和集群組網(wǎng)能力的高性能 GPU/NPU 對(duì)于深度學(xué)習(xí)計(jì)算進(jìn)行加速。
### 神經(jīng)網(wǎng)絡(luò)
現(xiàn)在業(yè)界比較通用對(duì)神經(jīng)網(wǎng)絡(luò)概念的解釋是:
1. 從通用概念的角度上來(lái)看的話,神經(jīng)網(wǎng)絡(luò)是在模擬人腦的工作機(jī)制,神經(jīng)元與神經(jīng)突觸之間的連接產(chǎn)生不同的信號(hào)傳遞,每個(gè)神經(jīng)元都記錄著信號(hào)的特征。
2. 從統(tǒng)計(jì)學(xué)的角度來(lái)說(shuō),就是在預(yù)測(cè)數(shù)據(jù)的分布,從數(shù)據(jù)中學(xué)得一個(gè)模型,然后再通過(guò)這個(gè)模型去預(yù)測(cè)新的數(shù)據(jù)(這一點(diǎn)就要求測(cè)試數(shù)據(jù)和訓(xùn)練數(shù)據(jù)必須是同分布)。
實(shí)際上,一個(gè)神經(jīng)網(wǎng)絡(luò)由多個(gè)神經(jīng)元結(jié)構(gòu)組成,每一層的神經(jīng)元都擁有多個(gè)輸入和輸出,一層可以由多個(gè)神經(jīng)元組成。例如,第2層神經(jīng)網(wǎng)絡(luò)的神經(jīng)元輸出是第3層神經(jīng)元的輸入,輸入的數(shù)據(jù)通過(guò)神經(jīng)元上的激活函數(shù)(非線性函數(shù)如tanh、sigmod等),來(lái)控制輸出的數(shù)值。
數(shù)學(xué)上簡(jiǎn)單地理解,單個(gè)神經(jīng)元其實(shí)就是一個(gè) $X·W$ 的矩陣乘,然后加一個(gè)激活函數(shù) $fun(X·W)$,通過(guò)復(fù)合函數(shù)組合神經(jīng)元,就變成一個(gè)神經(jīng)網(wǎng)絡(luò)的層。這種模擬生物神經(jīng)元的數(shù)學(xué)計(jì)算,能夠很好地對(duì)大規(guī)模獨(dú)立同分布的數(shù)據(jù)進(jìn)行非線性映射和處理,使得其能夠應(yīng)對(duì)到人工智能的不同任務(wù)。
### 函數(shù)逼近
現(xiàn)在,如果把神經(jīng)網(wǎng)絡(luò)看做一個(gè)復(fù)雜函數(shù),那么這個(gè)函數(shù)可以逼近任何函數(shù)。上面只是定義了什么是神經(jīng)網(wǎng)絡(luò),其實(shí)神經(jīng)網(wǎng)絡(luò)內(nèi)部的參數(shù)(神經(jīng)元鏈接間的權(quán)重)需要通過(guò)求解函數(shù)逼進(jìn)來(lái)確定的。
直觀地看下一個(gè)簡(jiǎn)單的例子:假設(shè)1個(gè)圓圈代表一個(gè)神經(jīng)元,那么一個(gè)神經(jīng)元可模擬“與或非”3種運(yùn)算,3個(gè)神經(jīng)元組成包含1個(gè)隱層的神經(jīng)網(wǎng)絡(luò)即可以模擬異或運(yùn)算。因此,理論上,如此組合的神經(jīng)網(wǎng)絡(luò)可模擬任意組合的邏輯函數(shù)。
很多人會(huì)說(shuō)神經(jīng)網(wǎng)絡(luò)只要網(wǎng)絡(luò)模型足夠深和足夠?qū)挘涂梢詳M合(fit)任意函數(shù),這樣的說(shuō)法數(shù)學(xué)理論上靠譜嗎?嚴(yán)格地說(shuō),神經(jīng)網(wǎng)絡(luò)并不是擬合任意函數(shù),其數(shù)學(xué)理論建立在通用逼近定理(Universal Approximation theorem)的基礎(chǔ)之上:
> 神經(jīng)網(wǎng)絡(luò)則是傳統(tǒng)的逼近論中的逼近函數(shù)的一種推廣。逼近理論證明,只要神經(jīng)網(wǎng)絡(luò)規(guī)模經(jīng)過(guò)巧妙的設(shè)計(jì),使用非線性函數(shù)進(jìn)行組合,它可以以任意精度逼近任意一個(gè)在閉集里的連續(xù)函數(shù)。
既然神經(jīng)網(wǎng)絡(luò)模型理論上能夠逼近任何連續(xù)函數(shù),那么有意思的事情就來(lái)了。我們可以利用神經(jīng)網(wǎng)絡(luò)處理數(shù)學(xué)上分類、回歸、擬合、逼近等問題啦。例如在CV領(lǐng)域?qū)θ四槇D像進(jìn)行分類、通過(guò)回歸檢測(cè)圖像中的車輛和行人,在NLP中對(duì)離散的語(yǔ)料數(shù)據(jù)進(jìn)行擬合。
可是,神經(jīng)網(wǎng)絡(luò)介紹現(xiàn)在還只能逼近任何函數(shù),逼近函數(shù)需要求解,怎么去求解神經(jīng)網(wǎng)絡(luò)呢?
函數(shù)逼近求解:在數(shù)學(xué)的理論研究和實(shí)際應(yīng)用中經(jīng)常遇到逼近求解問題,在選定的一類函數(shù)中尋找某個(gè)函數(shù) $f$,使它與已知函數(shù) $g$(或觀測(cè)數(shù)據(jù))在一定意義下為最佳近似表示,并求出用 $f$ 近似表示 $g$ 而產(chǎn)生的最小誤差(即損失函數(shù)):
$$ loss(w)=f(w)-g $$
所以,神經(jīng)網(wǎng)絡(luò)可以通過(guò)求解損失函數(shù)的最小值,來(lái)確定這個(gè)神經(jīng)網(wǎng)絡(luò)中的參數(shù) $w$,從而固化這個(gè)逼近函數(shù)。
### 反向求導(dǎo)
深度學(xué)習(xí)一般流程是:1)構(gòu)建神經(jīng)網(wǎng)絡(luò)模型,2)定義損失函數(shù)和優(yōu)化器(優(yōu)化目標(biāo)),3)開始訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型(計(jì)算梯度并更新網(wǎng)絡(luò)模型中的權(quán)重參數(shù)),4)最后驗(yàn)證精度,其流程如下圖所示,前三步最為重要。
因?yàn)锳I框架已經(jīng)幫我們封裝好了許多功能,所以遇到神經(jīng)網(wǎng)絡(luò)模型的精度不達(dá)標(biāo),算法工程師可以調(diào)整網(wǎng)絡(luò)模型結(jié)構(gòu)、調(diào)節(jié)損失函數(shù)、優(yōu)化器等參數(shù)重新訓(xùn)練,不斷地測(cè)試驗(yàn)證精度,因此很多人戲稱算法工程師又是“調(diào)參工程師”。
但是在這一過(guò)程中,這種機(jī)械的調(diào)參是無(wú)法觸碰到深度學(xué)習(xí)的本質(zhì)的,為了了解實(shí)際的工作原理,進(jìn)行總結(jié):**訓(xùn)練的過(guò)程本質(zhì)是進(jìn)行反向求導(dǎo)(反向傳播算法實(shí)現(xiàn))的過(guò)程,然后通過(guò)迭代計(jì)算求得神經(jīng)網(wǎng)絡(luò)中的參數(shù),調(diào)整參數(shù)是控制這一過(guò)程的前進(jìn)速度和方向。**
上面這段話我們?nèi)匀宦牪欢瑳]關(guān)系。我們需要了解的是,什么是訓(xùn)練?訓(xùn)練的作用是什么?為什么要求導(dǎo)?為什么在訓(xùn)練的過(guò)程中用到求導(dǎo)?求導(dǎo)的數(shù)學(xué)依據(jù)和意義在哪里?
> 導(dǎo)數(shù)是函數(shù)的局部性質(zhì)。一個(gè)函數(shù)在某一點(diǎn)的導(dǎo)數(shù),描述該函數(shù)在這一點(diǎn)附近的變化率。如果函數(shù)的自變量和取值都是實(shí)數(shù)的話,函數(shù)在某一點(diǎn)的導(dǎo)數(shù)就是該函數(shù)所代表的曲線在這一點(diǎn)上的切線斜率。
那么,針對(duì)導(dǎo)數(shù)的幾何意義,其可以表示為函數(shù)在某點(diǎn)處的切線斜率;在代數(shù)上,其意味著可以求得函數(shù)的瞬時(shí)變化率。如果把神經(jīng)網(wǎng)絡(luò)看做一個(gè)高維復(fù)雜的函數(shù),那么訓(xùn)練的過(guò)程就是對(duì)損失函數(shù)進(jìn)行求導(dǎo),利用導(dǎo)數(shù)的性質(zhì)找到損失函數(shù)的變化趨勢(shì),每次一點(diǎn)點(diǎn)地改變神經(jīng)網(wǎng)絡(luò)仲的參數(shù) $w$,最后逼近得到這個(gè)高維函數(shù)。
## AI框架的作用
### AI框架與微分關(guān)系
根據(jù)深度學(xué)習(xí)的原理,AI框架最核心和基礎(chǔ)的功能是自動(dòng)求導(dǎo)(后續(xù)統(tǒng)一稱為自動(dòng)微分,AutoGrad)。
接下來(lái)有個(gè)更加重要的問題,深度學(xué)習(xí)中的神經(jīng)網(wǎng)絡(luò)為什么需要反向求導(dǎo)?
按照高中數(shù)學(xué)的基本概念,假設(shè)神經(jīng)網(wǎng)絡(luò)是一個(gè)復(fù)合函數(shù)(高維函數(shù)),那么對(duì)這個(gè)復(fù)合函數(shù)求導(dǎo),用的是鏈?zhǔn)椒▌t。舉個(gè)簡(jiǎn)單的例子,考慮函數(shù) $z=f(x,y)$,其中 $x=g(t),t=h(t)$ ,其中 $g(t), h(t)$ 是可微函數(shù),那么對(duì)函數(shù) $z$ 關(guān)于 $t$ 求導(dǎo),函數(shù)會(huì)順著鏈?zhǔn)较蛲庵饘舆M(jìn)行求導(dǎo)。
$$ frac{mathrmxrlff1t x}{mathrmzr9jttb t} = frac{partial z}{partial x} frac{mathrm7x7nx3h x}{mathrmdn1ttj9 t} + frac{partial z}{partial y} frac{mathrmnlnxxzx y}{mathrmx79zjzt t} $$
既然有了鏈?zhǔn)角髮?dǎo)法則,而神經(jīng)網(wǎng)絡(luò)其實(shí)就是個(gè)龐大的復(fù)合函數(shù),直接求導(dǎo)不就解決問題了嗎?反向到底起了什么作用?下面來(lái)看幾組公式。
假設(shè)用3組復(fù)合函數(shù)來(lái)表示一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò):
$$ L_1 = sigmoid(w_1cdot x) $$
$$ L_2 = sigmoid(w_2cdot L_1) $$
$$ L_3 = sigmoid(w_3 cdot L_2) $$
現(xiàn)在定義深度學(xué)習(xí)中網(wǎng)絡(luò)模型的損失函數(shù),即優(yōu)化目標(biāo):
$$ loss = Loss(L_3,y) $$
根據(jù)鏈?zhǔn)角髮?dǎo)法則可以得到:
$$ frac{partial loss}{partial w_3} = {Loss}'(L_3, y) {sigmoid}'(w_3,L_2)L_2 $$
$$ frac{partial loss}{partial w_2} = {Loss}'(L_3, y) {sigmoid}'(w_3,L_2) {sigmoid}'(w_2,L_1) L_1 $$
$$ frac{partial loss}{partial w_1} = {Loss}'(L_3, y) {sigmoid}'(w_3,L_2) {sigmoid}'(w_2,L_1) {sigmoid}'(w_1,x) x $$
假設(shè)神經(jīng)網(wǎng)絡(luò)為上述公式 $L_1,L_2, L_3$,對(duì)損失函數(shù)求神經(jīng)網(wǎng)絡(luò)中各參數(shù)求偏導(dǎo),可以看到在接下來(lái)的求導(dǎo)公式中,每一次導(dǎo)數(shù)的計(jì)算都可以重用前一次的的計(jì)算結(jié)果,于是Paul Werbos在1975年發(fā)明了反向傳播算法(并在1990重新使用神經(jīng)網(wǎng)絡(luò)對(duì)反向求導(dǎo)進(jìn)行表示)。
這里的反向,指的是圖中的反向箭頭,每一次對(duì)損失函數(shù)中的參數(shù)進(jìn)行求導(dǎo),都會(huì)復(fù)用前一次的計(jì)算結(jié)果和與其對(duì)稱的原公式中的變量,更方便地對(duì)復(fù)合函數(shù)進(jìn)行求導(dǎo)。
### AI框架與程序結(jié)合
下面左圖的公式是神經(jīng)網(wǎng)絡(luò)表示的復(fù)合函數(shù)表示,藍(lán)色框框表示的是AI框架,AI框架給開發(fā)者提供構(gòu)建神經(jīng)網(wǎng)絡(luò)模型的數(shù)學(xué)操作,AI框架把復(fù)雜的數(shù)學(xué)表達(dá),轉(zhuǎn)換成計(jì)算機(jī)可識(shí)別的計(jì)算圖。
定義整個(gè)神經(jīng)網(wǎng)絡(luò)最終的損失函數(shù)為 $Loss$ 之后,AI框架會(huì)自動(dòng)對(duì)損失函數(shù)求導(dǎo)(即對(duì)神經(jīng)網(wǎng)絡(luò)模型中各個(gè)參數(shù)求其偏導(dǎo)數(shù))。
上面提到過(guò),每一次求導(dǎo)都會(huì)復(fù)用前一次的計(jì)算結(jié)果和與其對(duì)稱的原公式中的變量。那么干脆直接基于表示神經(jīng)網(wǎng)絡(luò)的計(jì)算圖計(jì)的基礎(chǔ)之上,構(gòu)建一個(gè)與之對(duì)稱的計(jì)算圖(反向計(jì)算圖)。通過(guò)反向計(jì)算圖表示神經(jīng)網(wǎng)絡(luò)模型中的偏導(dǎo)數(shù),反向傳播則是對(duì)鏈?zhǔn)角髮?dǎo)法則的展開。
通過(guò)損失函數(shù)對(duì)神經(jīng)網(wǎng)絡(luò)模型進(jìn)行求導(dǎo),訓(xùn)練過(guò)程中更新網(wǎng)絡(luò)模型中的參數(shù)(函數(shù)逼近的過(guò)程),使得損失函數(shù)的值越來(lái)越小(表示網(wǎng)絡(luò)模型的表現(xiàn)越好)。這一過(guò)程,只要你定義好網(wǎng)絡(luò)AI框架都會(huì)主動(dòng)地幫我們完成。
很有意思的是,AI框架對(duì)整體開發(fā)流程進(jìn)行了封裝,好處是讓算法研究人員專注于神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)的設(shè)計(jì)(更好地設(shè)計(jì)出逼近復(fù)合函數(shù)),針對(duì)數(shù)據(jù)集提供更好的解決方案,研究讓訓(xùn)練加速的優(yōu)化器或者算法等。
綜上所述,**AI框架最核心的作用是提供開發(fā)者構(gòu)建神經(jīng)網(wǎng)絡(luò)的接口(數(shù)學(xué)操作),自動(dòng)對(duì)神經(jīng)網(wǎng)絡(luò)訓(xùn)練(進(jìn)行反向求導(dǎo),逼近地求解最優(yōu)值),得到一個(gè)神經(jīng)網(wǎng)絡(luò)模型(逼近函數(shù))用于解決分類、回歸、擬合的問題,實(shí)現(xiàn)目標(biāo)分類、語(yǔ)音識(shí)別等應(yīng)用場(chǎng)景。**