- 飛槳PaddlePaddle深度學習實戰(zhàn)
- 劉祥龍等編著
- 4156字
- 2020-09-28 17:21:29
1.2.2 微積分基礎
機器學習和深度學習除了需要線性代數(shù)的基礎知識,還需要一定的微積分基礎知識。在機器學習和深度學習計算過程中,反向傳播算法(第5章著重講述)需要用到偏導數(shù)求解的知識,而梯度下降算法(第3章著重講述)需要理解梯度的概念。
1.導數(shù)
首先介紹導數(shù)的相關知識。導數(shù)(Derivative)的直觀理解是反映瞬時變化率的量。如圖1-1所示,考慮一個實際問題,縱坐標是車輛位移,橫坐標是時間,如何知道t1時刻車輛的瞬時速度呢?
獲得瞬時速度的核心思想是用平均速度去逼近瞬時速度。這里可以考慮t1和t2,t1在前t2在后,它們之間有一定的時間間隔,這個時間間隔為△t。在這段時間間隔內(nèi)產(chǎn)生的位移為△s。那么該時間內(nèi)的平均速度為△s/△t。△t不斷縮小,也就是t2不斷靠近t1,當t2與t1無限接近幾乎重合時,便可以視作t1點的瞬時速率(如圖1-1所示)。
圖1-1 斜率示意圖
導數(shù)是從瞬時速度的概念中類比抽象出來的。將瞬時速率拓展到更一般的情形,在更廣的函數(shù)范圍內(nèi),根據(jù)這種無限逼近的思路,知道任意變量在一點處的變化率(斜率),函數(shù)在這一點處的斜率就是導數(shù)。在高等數(shù)學中更為嚴謹?shù)亩x為:對于定義域和值域都是實域的函數(shù)y=f(x),若f(x)在點x0的某個鄰域△x內(nèi),極限
存在,則稱函數(shù)y=f(x)在x0處可導,且導數(shù)為f'(x0)。
圖1-2所示是函數(shù)y=4x的曲線,當x=3時,y=12,而當x坐標軸向右移動很小的一段距離0.001時,x=3.001,y=12.004。
這時,定義x發(fā)生的變化為dx,dx=0.001,定義y發(fā)生的變化為dy,dy=0.004,讀者便能計算得到這一小段變化形成的圖中三角形的斜率(Slope)為4,此時的斜率便是y=4x在x=3處的導數(shù)值f'(3)=Slope=4。當然,這里的0.001只是說明x的變化很小而已,實際上dx是一個無限趨近于0的值,遠比0.001要小。類似地,計算x=5時的導數(shù),也能用上述方法,當x=5,y=20,當x=5.001,y=20.004,從而dy=0.004,dx=0.001。函數(shù)y=f(x)=4x在x=5處的導數(shù)為f'(5)=Slope=dy/dx=4。同樣,其他形狀的曲線的任意一點的導數(shù),也能用類似的方法計算得到。此外,讀者也許會發(fā)現(xiàn),直線的導數(shù)在任意一點都相同,為一個確定的值。
圖1-2 導數(shù)推導計算示意圖
上面描述的是在某一點的導數(shù)概念,接下來將這個概念推廣開來。若函數(shù)f(x)在其定義域內(nèi)包含的每一個點都可導,那么也可以說函數(shù)f(x)在這個區(qū)間內(nèi)可導。這樣定義函數(shù)f'(x)為函數(shù)f(x)的導函數(shù),通常也稱為導數(shù)。函數(shù)f(x)的導數(shù)f'(x)也可以記作▽xf(x),或
,以上便是函數(shù)與變量的導數(shù)的基本知識。
2.偏導數(shù)
一個多變量的函數(shù)的偏導數(shù)(Partial Derivative)就是它關于其中一個變量的導數(shù)而保持其他變量恒定(相對于全導數(shù),在全導數(shù)中所有變量都允許變化)。簡單理解,偏導數(shù)就是對多元函數(shù)求其中一個未知數(shù)的導數(shù),如在含x和y的函數(shù)中對x求導,此時是將另一個未知數(shù)y看成是常數(shù),相當于對未知數(shù)x求導,如式(1-11)、(1-12)所示:
此時稱為函數(shù)關于x的偏導數(shù),同理,函數(shù)關于y的偏導數(shù)如式(1-13)所示:
拓展到更為多元的情況下,一個含有多個未知數(shù)的函數(shù)f',對于其中任意一個變量p求偏導時,只將p視為未知量,其余未知數(shù)視為常量(注意只是“視為”)。
特別地,當函數(shù)f中本身只含有一個未知數(shù)x時,f關于x的導數(shù)也就是f關于x的偏導數(shù),如式(1-14)所示:
讀者可以參考圖1-3所示的例子,J是一個關于a和b的函數(shù),J=f(a,b)=3a+2b:
圖1-3 偏導數(shù)推導計算示意圖
當a不變、b發(fā)生變化時,假定b在點(1,2)處發(fā)生變化,a=1,b=2,此時J=7。而當b增加0.001時,a=1,b=2.001,此時J=7.002。類比于前一小節(jié)推導導數(shù)時的方法,偏導數(shù)也能用相似的方法推導得到,在點(1,2)處求J關于b的偏導數(shù),由于a不發(fā)生變化,所以可以求得J對b的偏導數(shù)。用類似的方法,讀者也能求得在點(1,2)處,J對a的偏導數(shù)。
3.向量的導數(shù)
之前介紹的函數(shù)都是關于一個標量的函數(shù),如f(x)=x,在這樣的函數(shù)中變量本身是一個數(shù)。但是在機器學習和深度學習中,有時候還需要對向量求導,下面介紹向量的求導方法。
(1)標量對向量求導
首先介紹維度的概念。對于向量而言,向量的維度是一個向量中分量的個數(shù)。對于函數(shù)而言,其中是數(shù)值型變量,這樣由數(shù)值型變量構成的函數(shù)也被稱為標量的函數(shù)?,F(xiàn)有向量x,這樣函數(shù)f(x)關于向量x的導數(shù)仍然是p維向量,導數(shù)向量中第i個元素的值為。也即函數(shù)對向量求導數(shù),其結果為函數(shù)對向量的各個分量求偏導數(shù)。
更為嚴謹?shù)臄?shù)學定義為,對于一個p維向量x∈Rp,關于標量的函數(shù)y=f(x)=f(x1,x2,…,xp)∈R,則y關于x的導數(shù)如式(1-15)所示:
(2)向量對向量求導
當函數(shù)中是關于向量的函數(shù),函數(shù)f本身就可以表示成q維向量,現(xiàn)有向量x=[x1,…,xp]T,p與q不相同時,函數(shù)f對于向量x求導,所得到的結果是一個p×q矩陣,其中,第i行第j列的元素為。也即由標量的函數(shù)構成的函
數(shù)f對向量x求導,其結果為一個矩陣,矩陣的第n行為函數(shù)f中的每一個函數(shù),對其求偏導。更為嚴謹?shù)臄?shù)學定義為,對于一個p維向量x∈Rp,則f關于x的導數(shù)為:
4.導數(shù)法則
(1)加減法則(Addition Rule)
兩個函數(shù)的和(或差)的導數(shù),等于兩個函數(shù)分別對自變量求導的和(或差)。設y=f(x)并且z=g(x),則兩者的和的函數(shù)對于同一個變量求導的結果,將會是兩個函數(shù)對于變量分別求導后求和的結果。
加減法則常常被用于簡化求導過程。在一些情形下,往往函數(shù)本身是很復雜的,直接求導將會有很高的復雜度,這時利用加減法則,將函數(shù)分成兩個或者多個獨立的簡單函數(shù),再分別求導和求和,原本復雜的問題就變得簡單了。
在深度學習和機器學習中,加減法則常常用于計算兩個直接相連的神經(jīng)元之間的相互影響。例如,神經(jīng)網(wǎng)絡后一層節(jié)點為x,它同時受到前一層的神經(jīng)元y和z的影響,影響關系為x=y+z,那么當y和z同時變化時,若要計算x所發(fā)生的變化,便可通過式(1-17)計算得到。
(2)乘法法則(Product Rule)
學習完導數(shù)的加減法則,讀者也許會推測乘法法則是否與之相類似,即兩個函數(shù)乘積的導數(shù)等于兩個函數(shù)分別求導的乘積,答案是否定的。這里以矩陣乘法為例,若x∈Rp,y=f(x)∈Rq,z=g(x)∈Rq,乘積的求導過程將如式(1-18)所示:
乘法法則乍看之下比較抽象,這里用一個實際的例子來說明。如果y的轉置代表函數(shù)中的系數(shù)矩陣,z是自變量矩陣,二者同時對于x求偏導數(shù),所得到的結果將會變成兩個部分,一個部分是自變量的矩陣,另一個部分是系數(shù)的矩陣。機器學習乘法法則也常常用于計算兩個直接相連的神經(jīng)元之間的相互影響,當后一層神經(jīng)元C是由前一層神經(jīng)元A和B通過乘法關系得到的,則可以利用乘法法則計算A和B變化時對C的影響。
(3)鏈式法則(Chain Rule)
鏈式法則作為在機器學習和深度學習中最為常用的法則,其重要性毋庸置疑,但鏈式法則本身不好理解,這里我們以一個函數(shù)輸入輸出流為例來闡釋鏈式法則。
觀察以下一組函數(shù),這組函數(shù)的輸入值是x=(x1,x2)。第一個函數(shù)f1是一個求和過程,第二個函數(shù)f2是一個求積過程:
把這兩個函數(shù)值作為輸入送給第三個函數(shù)g,函數(shù)g就是一個關于x1,x2的復合函數(shù),其最終的輸出值用y表示。由輸入x逐步計算得到結果y的過程如圖1-4所示。
圖1-4 復合函數(shù)計算圖
如果由變量到函數(shù)是一個正向傳遞的過程,那么求導便是一個反向的過程(如圖1-5所示)。
如果要求得函數(shù)g對x1的偏導數(shù),觀察圖1-5,可以發(fā)現(xiàn)其由g節(jié)點到x1節(jié)點共有兩條路徑,每條路徑由兩條有向邊組成。每條路徑可以看作其經(jīng)過的邊的值的乘積,而兩個路徑求和就恰巧得到了函數(shù)g對x1的偏導數(shù)。當我們把函數(shù)g看作關于x1,x2的復合函數(shù)時,分別求得g對x1和x2的偏導數(shù)可以得到式(1-20)所示的結果,這便是復合函數(shù)求導的鏈式法則。
圖1-5 復合函數(shù)求導計算圖
特別地,當f1與f2均為向量函數(shù)時,此時鏈式法則將會發(fā)生調(diào)整,如式(1-21)所示:
向量求導的鏈式法則與標量函數(shù)的鏈式法則很相似,只不過求導過程變成了求Jacobi矩陣,Jacobi矩陣定義如式(1-22)所示:
需要注意的是,偏導數(shù)鏈式法則中乘法所用到的都是1.2.1節(jié)中提到的元素乘,符號為⊙。
鏈式法則作為深度學習中最為常用的一條求導法則,常常用于利用反向傳播算法進行神經(jīng)網(wǎng)絡的訓練工作,我們將在后續(xù)章節(jié)詳細學習。
5.常見的向量和矩陣的導數(shù)
這里提供一些常見的向量及矩陣的導數(shù)知識,讀者在推導神經(jīng)網(wǎng)絡中的導數(shù)計算時會用到這些知識。向量對于其本身的導數(shù)為單位向量,這一點與標量的計算相類似。當一個數(shù)或者一個向量對其本身求導,所得到的結果將是1或者單位向量。反映到深度學習神經(jīng)網(wǎng)絡中神經(jīng)元的相互影響上,便可以理解為一個神經(jīng)元如果受到自身變化的影響,那么其自身變化多少,影響的大小就有多少:
向量w和x的乘積,設其為z,那么z對于w求偏導數(shù),其結果為x的轉置:
拓展到矩陣,矩陣W和矩陣X的乘積設其為矩陣Z,那么Z對于W求偏導數(shù),其結果為X的轉置:
上述規(guī)則說明,依照系數(shù)向量(或矩陣)反推輸入向量(或矩陣),即倘若在神經(jīng)網(wǎng)絡中我們知道了神經(jīng)元的輸出結果和系數(shù)向量(或矩陣),我們便能反推得到輸入,從而進行驗證或其他操作。
矩陣A與向量x的乘積對x求偏導數(shù),其結果為矩陣A的轉置AT。這個規(guī)則常常用于求解具有Ax關系的神經(jīng)元之間的相互連接,也即后一個神經(jīng)元如果收到前一個神經(jīng)元x的影響是Ax,那么當直接相連的前一個神經(jīng)元增加(或減少)一個單位時,后一個神經(jīng)元將相應地增加(或減少)AT個單位:
向量x的轉置與矩陣A的乘積對向量x求偏導數(shù),其結果為矩陣A本身。這個規(guī)則常常用于求解具有xTA關系的神經(jīng)元之間的相互連接,也即后一個神經(jīng)元如果收到前一個神經(jīng)元x的影響是XTA,那么當直接相連的前一個神經(jīng)元增加(或減少)一個單位時,后一個神經(jīng)元將相應地增加(或減少)A個單位。
6.梯度
之前討論的導數(shù)基本上是直接考量函數(shù)變化率,梯度(Gradient)則從另一個角度考量函數(shù)變化最快的方向。在機器學習和深度學習中梯度下降法用以求解損失函數(shù)的最小值。梯度的本意是一個向量,該向量表示某一函數(shù)在某一點處的方向導數(shù)沿著向量方向取得最大值,即函數(shù)在該點處沿著該方向(梯度的方向)變化最快,變化率最大(為該梯度的模)。
在機器學習中,考慮二元函數(shù)的情形。設函數(shù)z=f(x,y)在平面區(qū)域D內(nèi)具有一階連續(xù)偏導數(shù),則對于每一點P(x,y)∈D,都可以定出一個向量,這個向量稱為函數(shù)z=f(x,y)在點P(x,y)的梯度,記作grad f(x,y)。如圖1-6所示,折線方向便是梯度方向。
圖1-6 梯度下降示意圖
倘若圖1-6中的曲面表示的是損失函數(shù),那么梯度下降方向便是損失函數(shù)中損失減少最快的方向。使用梯度可以找到到達最小損失較快的方向,設定一個恰當?shù)某跏贾岛吞綔y步長,就能在最快的速度下找到需要的最小損失值。梯度作為探測損失函數(shù)中最小損失的一個“指南針”,避免了尋找一個最小損失值時低效率的枚舉情況發(fā)生,這對于機器學習和深度學習模型的優(yōu)化求解具有很重要的意義。
- Oracle WebLogic Server 12c:First Look
- Node.js 10實戰(zhàn)
- Docker技術入門與實戰(zhàn)(第3版)
- 深入淺出Prometheus:原理、應用、源碼與拓展詳解
- Java入門很輕松(微課超值版)
- 深入實踐Spring Boot
- C語言程序設計(第2版)
- JavaScript+jQuery開發(fā)實戰(zhàn)
- 數(shù)據(jù)庫系統(tǒng)原理及MySQL應用教程
- DevOps Automation Cookbook
- 數(shù)據(jù)結構習題精解(C語言實現(xiàn)+微課視頻)
- 深入理解Java7:核心技術與最佳實踐
- Apache Spark 2.x for Java Developers
- Android系統(tǒng)級深入開發(fā)
- Deep Learning with R Cookbook