官术网_书友最值得收藏!

第2章 深度學習

2.1 深度學習的原理

深度學習(Deep Learning)是深度神經網絡(Deep Neural Networks)的另一個名稱。深度學習的核心是深度神經網絡的設計與訓練,采用層級更深、參數規模更大的神經網絡。

神經網絡可以看作是對人腦的智能原理的一個數學抽象,包括神經元的結構和神經元的連接結構。其中,神經元的一個建模是邏輯回歸單元。

深度學習通過單一的算法學習特征表示。邏輯回歸是最常用的分類算法,也是深度學習的基本組成單元。

2.1.1 人工神經元

人工神經元可以理解為一組輸入加權疊加,再經過一個連續可導的非線性變換進行輸出。為了敘述方便,以下人工神經元簡稱神經元。

1.邏輯斯提回歸單元

邏輯斯提回歸單元(Logistic Regression Unit)是最簡單的人工神經元結構。單個邏輯斯提回歸單元可以進行二類分類,多個邏輯斯提回歸單元的組合,就可以完成復雜的分類工作。多層邏輯斯提回歸單元在實際中表現出更好的性能。

單個邏輯斯提回歸單元的數學表達式如下:

其中,wixi分別為權重與輸入,y為輸出結果。f()函數采用邏輯斯提函數或邏輯曲線(Logistic Function)。f()函數的數學表達式和形狀(見圖2-1)如下:

圖2-1 f()函數的形狀

其圖形是一條S形曲線(Sigmoid Curve)。邏輯函數因其曲線形狀為S形,所以,也被稱為S()函數或Sigmoid()函數。Sigmoid()函數的取值為(0,1)。

2.激活函數

f()函數也稱為人工神經元的激活函數(Activation Function or Trigger Function)。當f()函數采用邏輯斯提函數時,則人工神經元就是邏輯斯提回歸單元。除了邏輯斯提回歸單元的形式,人工神經元還有其他形式。例如,f()函數可以是tanh()函數、Softmax()函數和ReLU()函數(Rectified Linear Units)等。

雙曲正切函數tanh(),其數學表達式如下:

tanh()函數和Sigmoid()函數是同類的,只是取值變為(-1,1)。

ReLU()函數的數學表達式如下:

ReLU(x)=max(x,0)

ReLU()還有其推廣形式,稱為PReLU(Parametric ReLU)。PReLU()的數學表達式如下,其中α≈0.01:

Softmax()函數(又稱為歸一化指數函數)多用于輸出一個識別對象的概率分布。Softmax()函數的數學表達式如下:

2.1.2 多層人工神經網絡

將多個人工神經元排列連接起來,就形成了多層人工神經網絡。圖2-2給出了一個二層神經網絡結構的例子。

圖2-2 二層神經網絡

該神經網絡分為輸入層、隱藏層和輸出層。輸入層有3個輸入(x0,x1,x2),中間有一個隱藏層,輸出層有2個輸出(y1,y2),共有5個神經元。

該網絡的連接結構采用多層全連接(Fully Connected Network,FCN)的模式,是人工神經網絡中最簡單的連接方式。

為了敘述方便,以下人工神經網絡簡稱神經網絡。

2.1.3 神經網絡訓練

如果激活函數f(x)是一個連續可導函數,如Sigmoid()函數,那么神經網絡本質上是一個由輸入和內部權重作為變量的連續可導函數。

神經網絡的訓練過程屬于機器學習的監督學習(Supervise Learning),即訓練數據上都有相應的標簽(Label)。神經網絡對具有標簽的訓練樣本進行學習,從而確定網絡的權重參數,然后用訓練得到網絡,對訓練樣本集外的數據進行標簽的預測。

神經網絡訓練的本質,就是找到相應的內部權重,使得在訓練數據(樣本)輸入到網絡后,網絡的實際輸出與預期輸出(即標簽)之間差異最小。

1.損失函數最小化

神經網絡的輸出結果會與實際所對應的標簽之間存在差別,可以引入相似度度量函數,來表示這種差異,稱為損失函數(Loss())、成本函數(Cost())或代價函數。

神經網絡訓練的目標是使損失函數最小,所以,訓練過程是損失函數的求最小化過程。損失函數可以通過交叉熵的方式,來計算損失。其他的損失函數形式還有均方求和、均方根等度量函數,但是這類函數作為損失函數的缺點是它們屬于非凸函數,存在很多極小值點。

交叉熵形式的損失函數表示如下:

其中,y′表示訓練樣本對應的標簽,y表示神經網絡的輸出。

實際中還會在損失函數中加上一些正則項(Regularizer)或懲罰項(Penalty Term),該過程稱為正則化(Regularization)。目的是為了防止過學習(Over-fitting)。常見的懲罰項是

2.反向傳播算法

這里給出多層神經網絡的一種更加抽象表示,這種表示抽象了每層的基本特征,如圖2-3所示。

根據損失函數的性質和鏈式求導法則,可以反向逐層計算損失函數對權重的導數,調整權重最小化損失函數。這個方法稱為反向傳播算法(Back-Propagation Algorithm)。多層神經網絡的反向傳播的過程如圖2-4所示。

圖2-3 多層神經網絡

圖2-4 多層神經網絡的反向傳播方法

3.隨機梯度下降法

隨機梯度下降方法(Stochastic Gradient Descent,SGD)是最常用的權重調節方法,基本方法如下。

步驟1:隨機初始化每個神經元的輸入權重和偏差(Weights and Bias)。

步驟2:選取一個隨機樣本(Samples)。

步驟3:根據神經網絡的輸出結果,從最后一層開始,逐層計算每層權重的偏導數。

步驟4:逐層調整每層的權重,產生新的權重值。

返回到步驟2,繼續隨機選取下一個樣本。

4.實際訓練過程

多層神經網絡的實際訓練過程是將樣本數據“分批訓練”,同時采用隨機梯度下降法和反向傳播方法,逐層調整權重參數。

訓練過程中的一些術語解釋如下。

(1)先將整個訓練集分成多個同樣大小的子集,每個子集稱為一個批次(Batch),子集的大?。礃颖緮的浚┯蓞蹬未笮。˙atch Size)控制。

(2)使用隨機梯度下降法,其中每一步可以使用不止一個樣本,這稱為迷你批次(Minibatch)。每次迭代所用的樣本數目稱為迷你批次大?。∕inibatch Size)。當迷你批次大小為1時,就是普通的隨機梯度下降。

(3)每個批次的數據被依次送入網絡進行訓練,訓練完一個批次,被稱為一次迭代(Iteration)。

(4)訓練集的所有訓練樣本都被送入網絡訓練,完成一次訓練的過程,稱為一個時代(Epoch)。

(5)時代記錄了整個訓練集被反復訓練的次數,而迭代記錄網絡權重參數的調整次數。

迭代和時代之間的數量關系由批次大小和訓練集大小決定。

5.自編碼器

1)自編碼器初始化權重

自編碼器(Autoencoder)主要用于多層神經網絡參數的初始化。采用隨機化網絡參數的方法,會導致網絡收斂慢的問題。而采用自編碼器方法,在一些訓練過程中證明是有效的。自編碼器的結構如圖2-5所示。

圖2-5 自編碼器的結構

自編碼器的功能是神經網絡的輸出盡可能地還原輸入的特征。這樣可以對多層神經網絡的每一層逐層去構造自編碼器,用訓練出來的權重作為多層神經網絡每一層的初始權重。

自編碼器初始化多層神經網絡的參數方法描述如下。

(1)預訓練:使用無監督的數據,對每一層進行預訓練。

(2)微調步驟1:對最后的輸出層用監督學習的標記數據,進行訓練。

(3)微調步驟2:使用標記數據,對整個網絡進行反向傳播訓練。

2)降噪自編碼器

降噪自編碼器(Denoising Autoencoder,DA)的原理是人工破壞或者屏蔽部分輸入,輸入到自編碼器進行訓練,讓自編碼器學到數據間的關聯性。實際操作中,屏蔽是隨機進行的,所以,神經網絡最終學到的是通過部分數據聯想到缺失數據的能力。

舉個例子,輸入一個9維的數據,通過屏蔽最后一維,比如將第9維數據(置零),得到一個8維+0的9維數據。將此數據經過一個9-3-9的神經網絡處理,得到新的9維數據。訓練要求新的9維數據和沒被屏蔽前的輸入數據一樣。這樣,自編碼器至少完成了這樣一件事:給定前8維,推測最后一維。

這種推測不是簡單的“線性插值”,因為神經網絡的每層輸出,都要通過激活函數,進行了一次非線性函數變化。所以,這種推測肯定不是線性插值的,而是一種更復雜的數值插值方法。

具體參考鏈接http://deeplearning.net/tutorial/dA.html。

6.訓練的小技巧

這些神經網絡訓練調試的小技巧源于Le Quoc V的教程。因為當時還沒有完整成熟的深度學習框架,很多情況下需要自己去調整優化。有了成熟的框架后,有些問題就不用太關心了。

(1)用數值近似的方法檢查反向傳播算法的梯度計算的正確性(依賴選擇的框架)。

(2)隨機初始化參數是很重要的。一個好的方法是參數初始化采用高斯分布或均勻分布。有時調整一下初始化的協方差又會有幫助(依賴選擇的框架)。

(3)確保隨機初始化不要“飽和”網絡。這意味著絕大多數時間,神經元的輸出為0.2~0.8。如果神經元輸出太多的0或1,梯度值會比較小,訓練時間會比較長。

(4)能夠有效地監控訓練過程(依賴選擇的框架)。

(5)選取好的學習率。建議學習率為0.1或0.0 1。學習率過大,參數值改變過于激進;學習率過小,參數值改變過于保守。

(6)選取好的超參數(如層數、每層神經元數目)是一個當前研究的問題。一種好的方法是采用交叉驗證(Cross Validation)。選取一個驗證集,與訓練集完全無關。如果超參數在訓練集上表現好,而在驗證集上表現不佳,這個模型就是過擬合(Overfits):模型有太多的自由度并記住了訓練集的特征,但是無法推廣。如果模型的超參數在訓練集上表現極差,這就是欠擬合(Underfits):模型沒有足夠的自由度,應該增加隱藏層數或者神經元的數目。另外,在訓練集上表現不佳,也可能是學習率選取不好(比較重要)。

(7)選取好的超參數,也可以使用Gridsearch方法,隨機搜索或貝葉斯優化。在Gridsearch方法中,所有的組合都會嘗試,并用驗證集進行交叉檢驗。如果Gridsearch成本太高,可以用隨機搜索來產生配置。貝葉斯優化檢查先前的超參數的網絡組合,找出一個擬合函數,然后選擇一個最大化效用函數的超參數組合。

(8)神經網絡需要長時間訓練,需要花費時間去優化代碼速度。例如,用快速矩陣矢量庫、后向傳播算法的矢量化版本(依賴選擇的框架)。

(9)可以采用單精度而不是用雙精度來存放參數。這可以減少一半的存儲空間,而不會損害神經網絡的性能。缺點是用數值近似做梯度正確性的檢查會復雜些。

(10)神經網絡的一個不方便之處是目標函數一般不是非凸函數。這意味著我們獲得的最小值,很可能是局部最小而非全局最小。所以,神經網絡對隨機初始化比較敏感。學習過程的其他隨機化方面也會影響結果。例如,學習率的選擇,迭代樣本的不同順序會產生不同的優化參數。

(11)在許多情況中,使用較大的迷你批次是一個好方法,因為可以降低樣本的噪聲(計算多個樣本的平均值的例子)。另外,速度更快,因為矩陣向量庫用更大的矩陣工作會更好。

主站蜘蛛池模板: 永兴县| 朝阳市| 泗洪县| 灵璧县| 灵宝市| 夏津县| 绍兴县| 萝北县| 安徽省| 大埔区| 昌邑市| 西华县| 平顶山市| 龙山县| 盐边县| 无棣县| 郴州市| 泰顺县| 慈溪市| 广安市| 渭源县| 沈阳市| 徐州市| 柳林县| 宽城| 都江堰市| 和硕县| 广水市| 布拖县| 城市| 广昌县| 扬州市| 老河口市| 青铜峡市| 古交市| 贡山| 棋牌| 改则县| 昌都县| 凭祥市| 磴口县|