天天看點

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

智能系統與技術叢書 點選檢視第二章 點選檢視第三章

基于浏覽器的深度學習

Deep Learning in the Browser

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

[ 法 ] 澤維爾·布裡(Xavier Bourry) 

[ 美 ] 佐佐木凱(Kai Sasaki)

[ 奧地利 ] 克裡斯托夫·科納( Christoph K.rner)

[ 日 ] 中野禮一郎(Reiichiro Nakano) 著

俠 天 易樂天 譯

第1章

深度學習

本章簡單介紹深度學習的主要的數學和實際概念以及架構。我們将聚焦監督學習中分類的數學概念。它是從标注的訓練集中學習将新資料進行正确分類的過程。一旦你了解了概念,你能将相同的技術應用于其他監督學習任務,比如回歸。

從本章開始,我們将介紹神經網絡背後的數學知識。讀完 1.1 節,你可以通過簡單的預訓練神經網絡完成二分類任務。

接下來的 1.2 節講解基于标注訓練集訓練神經網絡的技術。然後,你會了解損失函數的重要性、反向傳播算法如何工作、優化技術(比如梯度下降算法和牛頓動量勢能算法)之間的差別。

1.1 深度神經網絡的數學基礎

本節介紹深度學習和神經網絡背後的數學基礎概念。我們主要關注從輸入資料樣本計算神經網絡的輸出,這通常稱為模型推斷。

這裡展示的神經網絡推斷主要包括多個嵌套權重線性函數、非線性激活函數和歸一化的組合。在二維世界裡,權重線性函數是一個直線方程。激活函數就是,當輸入值達到某個門檻值時立即激活的函數。我們稱它們為門限或者非線性函數,歸一化函數主要由減去均值和除以标準差組成。

在簡單的分類任務中,直線方程描述的是兩個不同分類的元素間的分割直線。如果兩個分類是線性可分的,則完美的分類器是分割直線将所有的元素分成兩邊。代入一個點坐标,直線方程傳回一個到該直線的有符号距離的倍數,其中符号代表直線的一邊。非線性激活函數将這個有符号距離轉換為不同的值。比如,最流行的轉換函數傳回值的符号(+1或者-1),傳回+1或者0,或者隻傳回正值和0。你将會在後續看到這些激活函數并讨論它們的數學特性。歸一化函數将所有的資料點轉化成中心點為 0 且标準差為 1 的歸一化空間。

正如你所見,這些概念相當直覺,在高中課程中就有介紹。我們下面用 n 維空間(代替二維)的操作和嵌套函數建構網絡,這會增加一些複雜性。

1.1.1 感覺機--------門控線性回歸

第一個進階的人工智能和機器學習的數學架構是在 1958 年由心理學家 F. Rosenblatt 提出的。他建構了一個神經腦細胞的簡單數學模型--感覺機(Perceptron),通過激活和重複模拟生物學習行為。

如圖1-1所示,感覺機計算所有輸入變量 xi 的權重和,接着是通過階躍函數表示的激活門函數。如果輸入的權重之和大于0,則門限打開(輸出1)。下面是感覺機公式,它是由階躍函數封裝的輸入權重之和:

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

在這裡顯示的簡單數學操作是在 20 世紀 50 年代提出的,它是現代深度神經網絡的基石。此外,我們将解釋,感覺機數學概念和計算二分類是極其相似的,用多元直線方程作為二分類之間的分割直線。

1.1.1.1 直線方程

先介紹二維直線方程:

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

在上面的公式中,k是直線的斜率,d是偏離中心的位移。用變量a、b和c代替k和d(這裡,

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

)。你也可能看到如下的直線表示:

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

上面的公式有一個很好的特性,當代入一個資料點 P = (p1; p2) 到直線公式,結果的符号代表資料點 P屬于直線的哪一邊。該函數形成一個訓練好的線性分類器,它将資料點分為兩個分類,分别位于直線的兩邊。

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

上面結果的絕對值是資料點到直線的最短距離的倍數:

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

。該值也稱分類得分。

從上面的例子可以看出和感覺機等式非常相似,唯一不同的是激活門函數用的是(sign符号) 函數。想象一下資料點 P 是一個元素的兩個次元,直線是二維二分類模型,y傳回分類+1或者-1。尋找優化的分割直線将會在1.2節讨論。

1.1.1.2 超平面方程

緊接着,你可以用矩陣表示重寫直線方程。這對處理大于二維的情況非常有用:

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

該直線方程由權重向量

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

表示。現在這個方程可以用n維權重向量

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

和輸入向量

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

擴充到n維空間。這個多元直線方程稱為超平面(hyperplane)。

注意:在機器學習中,許多問題都是高次元的。計算機視覺是一個例子,其中深度學習模型操作像素值。對于灰階圖,輸入圖形是100×100維,分割超平面将被定義為一個10000維的空間。

1.1.1.3 線性二分類器

下面我們生成一個更通用的門限激活函數 h(x),代替簡單的階躍函數或者符号函數作為門限。線性分類器等式如下,變量 b 表示偏置,代替二維中的變量 c:

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

上面的公式是感覺機的向量表示,帶有更通用的激活函數。是以,你能認為感覺機(也叫作神經元(Neuron)) 就像線性多元二分類器,通過線性超平面将資料點分為兩類。

下面來看三種不同的有兩類資料點的二維資料集。圖 1-2顯示這些資料集,不同顔色的點代表屬于不同的類别。将這些資料分類意味着繪制一個幾何圖形把所有相同類别的資料點劃分在一邊,而其他的樣本資料點在圖形的另外一邊。

感覺機作為一個線性分類器有極大的局限性:它隻能正确地分類線性可分的元素;在二維空間中,分類器為直線。是以,隻有左邊圖形表示的資料集可以用單個直線分開。異或(XOR)資料集隻能用多個線性分割組合将它們分開,然後與對角線結合。我們将在下面介紹這種問題。右邊圖形的資料集需要更複雜的分類器将所有的資料點正确标記。

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

1.1.2 多層感覺機

感覺機最大的缺陷是隻能用來進行線性分類。因為感覺機隻由輸入權重之群組成,它隻能表示線性可分的函數。如果考慮 XOR 問題(所有的類别不能用單個直線分開),你需要尋找一個更靈活的解決方案,它能組合線性分割以解決更複雜的分類。

下面在一個層中聚合多個神經元,比如每個神經元生成一個輸出 yi。将目前層所有的神經元權重和偏置組合為一個權重矩陣

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

和一個偏置向量

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

上面的公式

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

經常被稱為全連接配接層(fully-connected layer)。是以,一個全連接配接層是由神經元的數目定義的。n個神經元計算n個輸出,其中每個輸出都是感覺機公式的結果。

多層感覺機背後的思想是堆疊多個全連接配接層,每個層的輸出成為下一個層的輸入。

下面是将三個層堆疊在一起的例子:

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

多層感覺機也稱為隐藏層(hidden layer),它是大部分深度學習架構的一個子產品。多層堆疊的全連接配接層稱為人工神經網絡(Artiflcial Neural Network)。

雖然多個嵌套隐藏層的模型能近似任意函數,但是它們還是比單個全連接配接層更難訓練。事實上,網絡的綜合誤差項并不能用來更新單個層的權重。在 1.2 節,你将學習更多關于反向傳播算法的内容,其将綜合誤差分解成每個層的誤差,該方法使得嵌套層的訓練變為可能。

推薦你去playground.tensorflow.org 試試不同的輸入資料,包括激活函數及神經元和隐藏層的數目。

1.1.3 卷積和池化

當全連接配接層用于二維圖檔資料集時,它會有些缺點。首先,模型訓練的參數數量(W和

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

中的所有項)相當大。對于向量化的100×100 RGB圖檔來說,1024個神經元的單個層需要訓練1024×100×100×3(W的參數)+1024(

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

的參數)個訓練參數。進一步地講,像素值的局部鄰域都是互相獨立的,但是在每個神經元中的輸入像素值都是相關的。

1.1.3.1 通過卷積共享權重

對于二維圖檔資料集的有效使用方式是使用較小的二維n×n局部過濾器。對于每個輸出像素,計算所有n個輸入像素的權重之和,這裡的權重是過濾器的參數。滑動過濾器通過圖檔上的所有可能的位置,對每個局部使用相同的過濾器權重。該過程稱為卷積(convolution),在傳統計算機視覺應用中 (比如,邊界或者塊探測) 經常被用作經典的過濾器。

卷積操作由過濾器大小和兩個傳統的參數(步長(stride)和填充(padding))描述。步長和填充控制過濾器(也稱為卷積核(kernel))如何滑動圖像局部。步長參數是過濾器從一個局部移動到另外一個局部滑過的像素數目。如果你在一個100×100的輸入圖檔上用1個像素的步長滑動3×3的過濾器,輸出的結果圖檔是98×98的次元(你将會在圖檔的每個邊界丢失一個像素)。如果步長為2,那麼輸出的次元将會減半。填充參數描述的是增加的像素對應的常數值(經常設為0),如果允許你控制卷積輸出的次元,那麼會在輸入圖檔的周圍增加該值。是以,如果3×3的過濾器,步長為1,填充為1,那麼輸入圖檔的次元和輸出次元相同。

許多深度學習架構用same和valid代替數值型值。這樣處理的原因是:如果依賴過濾器的大小和步長,你必須手動計算正确的填充值來保證輸出的次元與輸入的次元相同,或者生成一個合法的輸出圖檔。而用 same和valid 選項,會自動計算正确的數值型填充值,這對使用者來說更友善。

卷積神經網絡(Convolutional Neural Network,CNN)是在二維圖檔資料集中使用卷積操作的神經網絡。相對于ANN将輸入圖檔像素簡單地堆疊放入一個向量,CNN的輸入是寬度、高度和深度(RGB顔色通道)的三維輸入。在大部分神經網絡中,一個batch的所有輸入圖檔會堆疊成第四維(batch),然後圖檔過濾器應用于每個batch的三維圖檔資料。

一個2D卷積層(也稱為 Conv Layer)由一系列 2D 過濾器組成。每個 2D 過濾器在每個輸入圖檔的深度次元上沿着空間次元卷積,然後計算所有深度次元上的權重之和。是以一個2D過濾器建立輸入三維資料的一個2D輸出圖檔。沿着深度次元疊加多個2D過濾器,我們建立沿着深度次元的多個輸出圖檔。

由于權重參數共享,卷積層比全連接配接層更有效,可以利用二維圖檔資料的局部依賴。在圖檔資料集中,這些局部鄰域由相同形狀、對象、紋理等的多個相關的鄰域的像素表示。一個卷積層有w×h×d×f+f個參數需要在訓練過程中學習獲得。w和h參數表示過濾器的寬度和高度,d表示過濾器的深度,f是過濾器的數量。

類似全連接配接層,卷積層經常緊跟着非線性激活函數。你将會在 1.1.4 節學習到更多關于激活函數的知識。

1.1.3.2 通過池化減少空間次元

神經網絡可以隻使用卷積層,但是它很難控制輸出的空間次元。再加上,卷積層總是包含可訓練的參數。池化是參數化的下采樣操作,它可以減少輸入資料的空間次元。如果你有計算機視覺方面的背景,你會明白在許多圖檔過濾器(比如,高斯和拉普拉斯圖像金字塔SIFT和SURF)中使用該操作。

池化操作不可訓練的參數之一是聚合的下采樣函數:max 和 avg 是最常用的兩種選擇。在神經網絡中,大部分情況下會選擇 max池化,這是因為它使得梯度計算變得簡單。對于n×n的池化來講,這些聚合函數應用于n個輸入像素會生成一個輸出像素。類似于卷積操作,池化操作也會應用于所有的圖檔位置,并使用步長和填充參數。

1.1.4 激活函數

非線性激活函數将超平面的權重之和與圖像過濾器轉換成一個激活信号,是以,如果他們大于 0,會輸出值。這些函數在神經網絡中占據重要地位,因為它們能堆疊層。如果沒有激活函數,嵌套多層感覺機将會等效于單個層。因為它隻由權重之群組成。

激活函數也是以層的形式組織并嵌入神經網絡架構。激活函數經常緊跟卷積層和全連接配接層使用。在神經網絡中,ReLU 和 ELU 激活函數對于門檻值型激活函數來說是常用的選擇。

有一些激活函數層因其特殊的數學特性,經常選作神經網絡的最後一個層。例如, softmax 激活函數,它會傳回一個向量,其中向量的所有元素之和為1。該激活函數一般用于建立分類器的輸出。

本節将講解常用的激活函數,以及它們的數學特性。

1.1.4.1 sigmoid 和超正切 tanh 激活函數

在感覺機方程中的階躍函數之後,sigmoid激活函數成為20世紀80年代激活函數的最常用的選擇。理由是sigmoid函數平滑地将任意值映射到0~1,并且相對于階躍函數,sigmoid激活函數連續可導。

sigmoid 激活函數由下面的公式定義 (如圖 1-3 所示):

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

第二個介紹的是激活函數tanh,其在20世紀80年代被重度使用。它的形狀與sigmoid 非常相似,取值範圍是-1~1。tanh的數值計算過程更穩定,激活函數的數值穩定性可以避免在訓練過程中梯度爆炸。

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

tanh 激活函數由以下公式定義 (如圖1-4所示):

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章
帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

1.1.4.2 ReLU、Leaky ReLU 和 ELU 激活函數

線性整流(Rectifled Linear Unit,ReLU)函數廣泛用于深度神經網絡的非線性部分。ReLU 激活函數在0的位置不可導,ReLU激活函數極大地提升了神經網絡的學習過程,因為輸入層在門限觸發時,總的梯度可簡單地擷取。

ReLU激活函數由下面的公式定義 (如圖1-5所示):

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

ReLU激活函數的一個問題是其負數的激活值都為 0。這個問題看起來很直白,所有的訓練樣本都會在超平面錯誤的一邊。這會導緻每個神經元的0激活,輸出為0,損失也為0。當損失為0時,神經元的權重不可調。

帶洩漏的線性整流函數(Leaky ReLU或者 Parametric Leaky ReLU)引入一個負的斜率,確定在負值的情況下激活值不等于0。斜率由參數a調整,标準的Leaky ReLU斜率為0.01。如圖 1-6 所示。

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

ReLU和Leaky ReLU的另一個問題是激活函數在0處不可導。 指數線性單元(Exponential Linear Unit ,ELU)通過一個全可導指數函數近似 Leaky ReLU 激活函數來解決上述問題。如圖1-7所示。

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

1.1.4.3 softmax 激活函數

softmax激活函數将所有值歸一化為0~1之間的取值,并且所有值之和等于1。softmax激活函數由下面的等式定義:

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

softmax激活函數主要用在分類網絡的最後輸出層,因為它将原始的分類得分轉換成機率值。輸出的結果向量描述的是輸入的機率分布。如圖1-8所示。

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

1.2 深度神經網絡的訓練

在1.1 節,我們假設有一種方法可以計算神經網絡的權重W,使得神經網絡表示的直線(或者超平面)能夠完美地分割兩個(或多個)類别的元素。在本節,你将學習訓練一個神經網絡的知識,通過使用一系列标記的訓練資料集來找到合适的權重W。

假設一系列的訓練樣本屬于某一類,那麼你首先需要計算目前的超平面将這些樣本分割到不同的類别有多好。好意味着誤差 (比如誤分類的樣本數量,或者超平面分割錯誤的樣本) 最小。度量“好”的函數稱為損失函數(loss function),它評估目前分類器是否合适。你會發現損失函數的形狀會強烈地影響訓練和學習過程。

雖然你有了分類器的綜合損失函數,但是你不可能為了提高整體模型的效果而開始調優單個嵌入層的權重,因為每個層将其損失增加到總的損失中。這就是為什麼神經網絡在 20 世紀 60 年代沒有廣泛流行起來。為了适當調整模型權重,首先需要計算綜合損失中每個嵌入層的貢獻值,這個過程稱為反向傳播(back-propagation)。一旦你有了每個層的損失函數,可以無依賴地調整每個層的權重。反向傳播要求你計算每個層的導數,這也是為什麼深度神經網絡也經常被稱為可微分程式設計(difierentiable programming)。

無依賴的層權重是在逐漸疊代的過程中調整。在每個疊代步驟中,層權重沿着梯度的反方向調整,以達到優化損失函數的目的。最常用的優化算法是梯度下降算法(Gradient Descent),也有其他更有效率的技術,比如牛頓動量勢能(Nesterov Momentum)算法和Adam 法。

1.2.1 損失函數的重要性

優化或者訓練一個模型最重要的部分是損失函數,它用來評估訓練模型在給定訓練集上的表現好壞。當定義損失函數時要關注該函數的良好數學性質,比如可導性。當損失函數的導數為0時,你可以得到該函數的極值。訓練一個神經網絡模型的目标就是找到最小化的損失函數值。

在神經網絡中,損失函數是次元非常高的函數(經常是百萬級别),取決于所有可訓練的神經網絡參數。

損失函數的選擇依賴于具體的任務。帶有分類标簽的回歸和分類模型,考慮預測值和真實值之間的誤差,可以從損失函數獲得好處。帶有類别的分類模型隻有 true和false兩個值。

在分類任務中,常用的損失函數是交叉熵(Cross-Entropy)損失函數,它用來計算兩個機率分布的拟合:真實值的機率分布和預測值的機率分布。交叉熵損失函數經常和 softmax 激活函數一起使用。在回歸任務中,常用的損失函數是平方誤差的和,也稱為均方誤差(Mean Squared Error)。

1.2.2 正則化

訓練帶有幾千到百萬級參數的神經網絡模型的一個常見問題是過拟合。神經網絡學習樣本的特殊性,卻丢失了泛化性。這個問題可以通過對比訓練資料集的準确度和測試集的準确度來診斷:神經網絡在訓練集上預測分類準确度高于在新資料集上的預測準确度。避免過拟合的一個流行的政策是給損失函數增加一個正則項。正則項一般是由每個層的所有可訓練參數的L1和L2範式計算得到。

L1正則項懲罰值不為0的參數,使得權重變得稀疏。L2正則項懲罰值大的參數,留下值小的參數。L2權重正則化也稱為權重延遲(weight decay),因為在梯度下降過程中每個參數更新前将權重裁剪。

整個訓練模型的損失是由分類或者回歸的損失函數加上一個正則項損失來提升泛化能力。

1.2.3 反向傳播算法

一旦知道了神經網絡預測的損失函數,你不能直接用這個損失更新每個層的權重。你首先需要計算每個層的損失貢獻總和,然後根據損失的梯度調整層的權重。你可以通過逐漸反向疊代計算出每個層的梯度,然後應用導數的鍊式法則計算每個層的梯度貢獻值。這個過程稱為反向傳播算法。

鍊式法則形式如下:

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

上面等式的意義是,将計算z對x的偏導數轉化為計算z對y的偏導數乘以y對x的偏導數。有了這種轉化之後,你可以将計算損失函數對于模型輸入的偏導數,轉化成計算神經網絡損失對最後一個層的輸出的偏導數,最後一個層的損失對前一個層的輸出的偏導數,以此類推。反向傳播算法可以無依賴地調整層的權重。

1.2.4 優化方法

你需要一個優化器算法,在每個 epoch 訓練時減少分類器的訓練損失,調整網絡權重,達到高效地訓練深度神經網絡模型的目的。最經典的常用優化器選擇是梯度下降(Gradient Descent ,GD)算法。

對于梯度下降算法,首選,從神經網絡的最後一個層的損失開始,采用反向傳播算法計算每個層的損失的梯度。該梯度是一個高次元向量,其指向最小損失的反方向。第二步,為權重增加一個梯度的乘積來更新權重。其中梯度乘積對應的因子稱為學習率(learning rate),它可以控制損失函數空間疊代的步長。

下面的等式顯示了第i個層的權重 Wi采用梯度下降優化算法更新的邏輯,其中α是學習率,Li是第i個層的損失值。

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

在深度學習中,我們經常采用mini-batch的梯度下降的算法,該算法同時兼顧了随機梯度下降算法和經典梯度算法的優點:随機梯度算法每次疊代隻使用一個樣本;經典梯度下降算法疊代一次使用整個樣本集。

雖然梯度下降算法簡單,但是它也有不少缺點,比如步長固定、局部最優、收斂時長、複雜損失函數的收斂性,等等。是以,有許多基于梯度下降算法開發的更健壯的優化算法,比如Momentum、Nesterov Momentum、Adam、RMSProp等算法。你可以從大部分深度學習架構中的Optimizer下找到上述算法。

提升梯度下降算法收斂性的一種方式是,使用梯度指數級衰減的移動平均來建構速度v進行梯度下降的更新。這種優化算法稱為動量算法(Momentum),它的收斂速度比梯度下降快。更新步驟如下:

帶你讀《基于浏覽器的深度學習 》之一:深度學習第1章

如果你知道目前的動量,你可以計算出新位置的梯度 W+v來代替W。Nesterov Momentum是該算法的一種變體。

1.3 本章小結

前面我們介紹了主要的數學知識和實踐的概念以及深度學習的架構,從下一章開始我們學習神經網絡架構。

繼續閱讀