淺談深度學習基礎(上)

第二個Topic講深度學習,承接前面的《淺談機器學習基礎》。

深度學習簡介

前面也提到過,機器學習的本質就是尋找最優模型,比如講語音識別,就是將一段語音通過若干模型精準的轉化為對應的文字,圖像識別轉化為識別結果,圍棋程序轉化為下一步走子,智能對話系統轉化為對用戶的回答。

而深度學習是機器學習的一個大分支,深度學習的概念源于對人工神經網絡的研究,深度學習的基本結構(也即模型)是深度神經網絡。

講到人工神經網絡就不得不先講感知機,感知機是最簡單的一種人工神經網絡,是一種二元線性分類器。感知機抽象于生物神經細胞,神經細胞結構大致可分為:樹突、突觸、細胞體及軸突。單個神經細胞可被視為一種只有兩種狀態的機器——激動時為『是』,而未激動時為『否』。神經細胞的狀態取決于從其它的神經細胞收到的輸入信號量,及突觸的強度(抑制或加強)。當信號量總和超過了某個閾值時,細胞體就會激動,產生電脈沖。電脈沖沿著軸突并通過突觸傳遞到其它神經元。為了模擬神經細胞行為,與之對應的感知機基礎概念被提出,如權重(突觸)、偏置(閾值)及激活函數(細胞體)。


感知機

不同的輸入a與其對應的權重w相乘后全部加和,再與偏置值相加后送入激活函數,經激活函數后得到該感知機的輸出。在人工神經網絡中,規定神經元函數只能對輸入變量(指向它的節點的值)線性組合后的結果進行一次非線性變換(激活函數)。這里的激活函數可以采用Sigmoid函數,前面的《淺談機器學習基礎》對其有講述,Sigmoid函數的輸出值在0到1之間:

感知機也被用來特指單層人工神經網絡,以區別于多層感知機。感知機無法處理線性不可分問題。什么叫線性不可分?舉個例子,二維平面上有兩類點,無法用一條一維直線將其完全分開;N維空間中有兩類點,用N-1維的分隔超平面無法將兩類點完全分開,就叫做線性不可分。

感知機(神經元)之間采用不同的連接方式,也就構成了不同的網絡結構。每個神經元都擁有自己的權重值和偏置值。權重值和偏置值構成了這個網絡的參數Θ

簡單的前饋神經網絡

給定Θ參數值可以定義一個神經元,也即定義一個函數;再給定網絡結構,就可以定義一個神經網絡,也即一組函數。

深度神經網絡中的深度意味著神經網絡的層數很多,神經網絡中第一層是輸入層,最后一層是輸出層,中間數層是隱藏層,每一層都由若干神經元構成。

我們可以選擇應用Softmax層作為輸出層,Softmax層可以將輸出層神經元的輸出值進行處理,使其總和為1。這在分類場景,判定屬于哪類的概率最大時,提供了方便,也使得數據更容易被理解。

那具體處理問題時到底選多少層?每一層多少個神經元?這個只能靠直覺和試錯。

我們已經選定了深度學習的基本結構,也就是深度神經網絡,接下來要談的是對神經網絡輸出結果好壞的量化評估以及如何找到最佳的參數值。

就拿我們剛才提到過的分類場景來談,具體一些,手寫數字識別場景,對于一個神經網絡,我們給定其一組初始參數值,然后將手寫數字以圖片的形式輸入,在輸出層,我們有10個輸出層神經元,每個神經元的輸出分別代表了判定輸入是數字0~9的概率,哪個神經元的輸出值最大,也即該神經網絡的判定結果是該神經元對應的數字。

但是,在初始參數條件,一般神經網絡的輸出結果并不完全正確,我們需要對其參數進行優化,要優化參數,首先要度量誤差,誤差來源于預測結果與實際結果的距離,比如對于手寫數字識別,給定一張寫著『2』的圖片,最理想的輸出是,只有2對應的那個神經元輸出為1,其它輸出均應該為0。我們可以選擇計算每個神經元的輸出與理論結果的誤差,然后將其加和,由此得到了我們對神經網絡的優化目標,也即通過調整參數讓整個損失函數的函數值最小。

那我們該如何確定最佳參數值呢?遍歷肯定不行,如果D層,每層N個神經元,那復雜度就是N的D次方。我們終究還是要選擇梯度下降方法,梯度下降方法的原理在《淺談機器學習基礎》中有詳細的原理介紹。


梯度下降法參數迭代公式

η是學習速率,η后面的式子是損失函數對該參數變量的偏導數。

深度學習網絡分類

如前所述,深度學習指的是一類廣泛的機器學習技術和架構,其特點是采用多層的非線性信息處理方法,這種方法在本質上是分層的。根據這些結構和技術不同的應用領域,如合成/生成或識別/分類,我們可以大致把這些結構分為三類:

  • 無監督的或生成式學習的深度網絡:針對模式分析和合成任務,用于在沒有目標類標簽信息的情況下捕捉觀測到的或可見數據的高階相關性。各種文獻中的無監督特征或表達學習指的就是這一類深度網絡。當用于生成模式時,它也可以用來描述可見數據和其相關分類的聯合分布概率,此時它具有可以利用的類別標簽,而且這些類別標簽被看做是可見數據的一部分。在后一種情況中,利用貝葉斯準則可以把生成學習網絡轉換為判別式學習網絡。

  • 有監督學習的深度網絡:直接提供用于模式分類目的的判別能力,它的特點是描述了可見數據條件下的后驗分布(條件概率分布)。這種有監督的學習,目標類別標簽總是以直接或間接形式給出,所以它們也被稱作判別式深度網絡。

  • 混合深度網絡:目標是判別式模型,往往以生成式或無監督深度網絡的結果作為重要輔助,可以通過更好地優化和正則化上個類別中的深度網絡來實現,也可以通過對第一個類別所述的深度生成式或無監督深度網絡的參數進行估計時,使用判別式準則來實現。

在其他文獻里,一般將深度機器學習技術分為深度判別式模型(深度神經網絡DNN、遞歸神經網絡RNN、卷積神經網絡CNN等)和生成式/無監督模型(受限玻爾茲曼機RBM、深度信念網絡DBN、深度玻爾茲曼機DBM、正則化的自編碼器等),然而這種二元分類方法忽略了通過深度學習研究所獲得的重要觀點,即生成式和無監督學習如何通過更好地進行正則化與優化,來大幅提高DNN和其他深度判別式和監督學習模型的訓練效果。同時,無監督學習的深度網絡并不一定必須是概率模型,也不一定能從模型中得到有意義的采樣。深度有監督的學習模型適合復雜系統的端到端學習;而深度無監督學習模型,尤其是概率生成模型,更容易理解,更容易嵌入領域知識,更容易組合,對不確定性進行處理。

下面先只講無監督和生成式學習深度網絡。

無監督學習是指在學習過程中不使用特定任務的監督信息(如目標類別標簽)。這一類深度網絡大多可以通過從網絡中采樣來有效生成樣本,因此是生成式模型,例如RBM、DBN、DBM和廣義除噪自編碼器。然而這一類別中的有些網絡采樣并不容易,因而本質上并不是生成式的,例如稀疏編碼網絡和原始形式的深度自編碼器。

生成式或無監督深度網絡有多個子類:

一類是各種自編碼器及其堆疊形式,具體的說,在除噪自編碼器中,輸入向量首先被『破壞』,例如,隨機選擇一定比例的輸入并把它們設為零,或加入高斯噪聲,然后調整參數,使隱層編碼結點重構出原始的、未損壞的輸入數據,調整參數所使用的準則包括原始輸入與重建輸入的最小均方誤差和KL散度準則。將未損壞數據進行轉換,獲得編碼表示,并將其作為下一層堆疊自編碼器的輸入。

另一類有生成能力的深度無監督模型是深度玻爾茲曼機(DBM),DBM包含很多隱變量層,并且同一層變量之間沒有連接。DBM是玻爾茲曼機(BM)的一個特例。當DBM的隱層數為1時,我們就得到了受限玻爾茲曼機(RBM),RBM與DBM一樣,沒有隱層到隱層和顯層到顯層的連接。RBM的主要優點是,通過組合許多RBM,把上一層RBM的特征激勵作為下一層的訓練數據,可以高效的對隱層進行學習,這樣組合也即得到了深度信念網絡(DBN)。

還有兩類,一種是和積網絡(SPN),另一種是無監督學習模式下的RNN。

自編碼器

深度自編碼器是一類特殊的無分類標簽的深度神經網絡。其輸出向量與輸入向量同維,常按照輸入向量的某種形式,通過隱層學習一個數據的表示或對原始數據進行有效編碼。值得注意的是,這種自編碼器是一種不利用類標簽的非線性特征提取方法。就方法本身而言,這種特征提取的目的在于保留和獲得更好的信息表示,而不是執行分類任務,盡管有時這兩個目標是相關的。

一個典型的自編碼器擁有一個表示原始數據或者輸入特征向量的輸入層;一個或多個表示特征轉換的隱層;一個跟輸入層匹配、用于信息重構的輸出層。當隱層數目大于1時,這個自編碼器就被視為深層結構。隱層的維度可以小于(當目標是特征壓縮)或大于(當目標是映射特征匹配更高維的空間)輸入層的維度。

如果我們在自動編碼器的基礎上加上L1的規則限制(L1主要是約束每一層中的節點中大部分都要為0,只有少數不為0,稀疏約束項),我們就可以得到稀疏自動編碼方法。也就是上面提到的特征壓縮,如果隱藏節點比可視節點(輸入、輸出)少的話,被迫的降維,自編碼器會自動習得訓練樣本的特征(變化最大,信息量最多的維度),所謂稀疏性,就是對一對輸入,隱藏節點中被激活的節點數(輸出接近1)遠遠小于被抑制的節點數目(輸出接近0)。那么使神經元大部分的時間都是被抑制的限制被稱作稀疏性限制。

另外提一下降噪自編碼器,原理很簡單,降噪自編碼器與自編碼器的區別在于,降噪自編碼器在原本自編碼器的輸入上加上了噪聲,然后希望通過訓練輸出去除噪聲后的原數據。

棧式自編碼器是一個由多層稀疏自編碼器組成的神經網絡,由于其隱層數目大于1,所以可被認定為是一種深度自編碼器。

在棧式自編碼器中,前一層的自編碼器的輸出作為其后一層自編碼器的輸入。對于一個n層棧式自編碼器的編碼過程就是,按照從前向后的順序執行每一層自編碼器的編碼步驟。

假設我們要訓練一個4層的神經網絡模型用于分類任務,網絡結構如下:


棧式自編碼器的訓練

整個過程分為兩個階段,一個是無監督預訓練階段(pre-training),另一個是有監督微調階段。預訓練階段實際上就是一層一層的按照原先訓練稀疏自編碼器的方法訓練每一層的參數。

在預訓練階段,首先,我們要采用稀疏自編碼網絡,先訓練從輸入層到H1層的參數:


訓練完畢后,我們去除解碼層,只留下從輸入層到隱藏層的編碼階段。

接著我們訓練從H1到H2的參數,我們把無標簽數據的H1層元素的激活值,作為H2層的輸入層,然后再進行自編碼訓練:


最后訓練完畢后,再去除H2的解碼層,如此重復,可以訓練更高層的網絡,這就是逐層貪婪訓練的思想。

訓練完H2之后,我們就可以接分類層softmax,用于多分類任務:


以上的過程就是所謂的無監督預訓練。后面接著就是利用上面的參數作為網絡的初始值,繼續進行神經網絡的訓練了。

玻爾茲曼機

首先是玻爾茲曼分布,其分布的概率公式如下:


玻爾茲曼分布概率公式
玻爾茲曼分布概率公式

pi為量子態i的幾率,εi為量子態i的能量,k為玻爾茲曼常數,T為系統溫度,M為系統可具有的量子態的總數。

可以看到,εi越大,pi越小,也即物理意義為,在保守力場作用下,低能量的狀態比高能量的狀態擁有更高的分布幾率,舉個例子,一個大盒子里放有若干個球,球總是傾向于先占據盒子的底部,即重力勢能低的位置,也即處于穩態。

然后是BM,BM是玻爾茲曼機,玻爾茲曼機是一種隨機神經網絡(同時也是遞歸神經網絡),描述一個隨機網絡主要需要確定兩點。

第一個是這個隨機網絡的概率分布函數,由于網絡節點的取值狀態是隨機的,從貝葉斯網絡的觀點來看,要描述整個網絡,需要三種概率分布,分別是聯合概率分布、邊緣概率分布(邊緣概率分布的邊緣源于它是一組概率的加和,通常被放在表的邊緣,P(A)=sum(P(B)*P(A|B)+P(C)*P(A|C)))和條件概率分布。

第二個是這個隨機網絡的能量函數,隨機神經網絡根植于統計力學,受統計力學的啟發,引入了能量函數。能量函數是描述整個系統狀態的一種測度,系統越有序或概率分布越集中,系統的能量越小。反之,系統越無序或者概率分布越趨向于均勻分布,則系統的能量越大(與前面講過的熵類似)。能量函數的最小值,也就對應了系統的穩態,一般情況下,我們就是要找到系統的穩態,也就是能量函數的最小值。

沒有特定限制連接方式的玻爾茲曼機目前為止并沒有在機器學習的實際問題中起到什么作用,只是理論上顯得有趣。

接下來是受限玻爾茲曼機,圖示如下:


包含三個可見單元和四個隱單元的受限玻爾茲曼機示意圖(不包含偏置節點)
包含三個可見單元和四個隱單元的受限玻爾茲曼機示意圖(不包含偏置節點)

RBM與前饋神經網絡不一樣,RBM在可見層和隱層間的連接方向是不確定的,值可以進行雙向傳播;且可見層與隱層,層間完全連接,而層內沒有連接,也即二分圖(不受限玻爾茲曼機隱層單元間存在連接,使之成為遞歸神經網絡)。

標準的受限玻爾茲曼機由二值(布爾/伯努利)隱層和可見層單元組成,權重矩陣W中的每個元素指定了隱層單元hj和可見層單元vi之間連接的權重值(受限玻爾茲曼機每條邊必須連接一個隱單元和可見單元),此外對于每個可見層單元vi有偏置ai,對每個隱層單元hj有偏置bi。前面在講述玻爾茲曼機時提到過,我們要確定兩部分內容,一個是聯合概率分布、邊緣概率分布和條件概率分布,另一個是能量函數。給出了前面的定義,我們先給出受限玻爾茲曼機的能量函數:

更換其為矩陣表示:


根據能量函數,我們進一步給出受限玻爾茲曼機中隱層和可見層之間的聯合概率分布:


邊緣概率分布(通過對所有隱層配置求和得到):


由于受限玻爾茲曼機是一個二分圖,所以隱層單元的激活在給定可見單元取值的情況下是條件獨立的,所以條件概率分布:


可見層對隱層
可見層對隱層

隱層對可見層
隱層對可見層

單個節點的激活概率為:


和:


σ為Sigmoid函數。

上面的過程是不是與我們在《淺談機器學習基礎》文中推導LR目標函數的過程有些相似?先利用Sigmoid函數表示出每個節點的激活概率,接下來最大化訓練集V的生成概率,訓練RBM也是同理:

訓練受限玻爾茲曼機,即最優化權重矩陣W,使訓練集V的生成概率最大,常采用的算法叫做對比分歧(contrastive divergence,CD)算法。這一算法在梯度下降的過程中使用吉布斯采樣完成對權重的更新,與訓練前饋神經網絡中利用反向傳播算法(BP)類似。

首先簡單說一下什么是吉布斯采樣(Gibbs),當積分、期望、聯合概率分布很難計算出來(NP問題)的時候,我們利用條件概率產生符合分布的樣本,用于估計分布的期望,邊緣分布;是一種在無法精確計算情況下,用計算機模擬的方法。

之后是CD-k算法,CD算法的大概思路是,從任意一個樣本開始,用經過k次吉布斯采樣得到的樣本來近似梯度的計算,然后依照梯度去更新參數,與前面講過的梯度上升/下降算法原理相同。

CD-k算法的具體過程借用別人文章中的截圖來描述:


CD-k算法

對所有的樣本都進行k次吉布斯采樣,圖中藍色的兩個sample函數,就是進行吉布斯采樣的過程,sample_h_given_v(v,W,a,b)做的事情是這樣的(sample_v_given_v(h,W,a,b)類似):
qj=P(hj|v),j=1,2,…,nh,產生一個[0,1]的隨機數rj,對每一個hj,如果rj<qj,則hj=1,否則hj=0。也即qj這個條件概率越大,越接近1,那hj為1的概率就越大,也即根據條件概率進行吉布斯采樣。

整個RBM的訓練過程如下:


然后是DBN,DBN也即深度信念網絡,深度信念網絡可使用多個RBM堆疊而成,并可使用梯度下降法和反向傳播算法(BP)進行調優(使用BP對整個DBN微調,對RBM的無監督預訓練獨立用CD算法)。

具體的說,在講自動編碼器的時候,我們舉了一個逐層貪婪預訓練方法的例子,這種無監督逐層預訓練是一種通用技術,也就是說,不僅前面的自編碼器可以逐層預訓練,RBM堆疊起來的DBN也可以進行無監督的逐層預訓練,方法與自編碼器的訓練過程類似,主要分為如下兩步:

第一步:分別單獨無監督的訓練每一層RBM網絡,確保特征向量映射到不同特征空間時,都盡可能多地保留特征信息。

舉個例子,隱含層RBM H可以看做是RBM H+1的可見層。第一個RBM的輸入層即是整個網絡的輸入層,逐層貪婪預訓練的工作模式如下:

  • 通過CD算法對所用訓練樣本訓練第一個RBM
  • 將第一個RBM的隱含層作為第二個RBM的輸入層數據進行訓練,同樣采用CD算法
  • 對所有層重復上面的過程
  • 和棧式自編碼器一樣,通過預訓練后,網絡堆疊一個或多個層間全連接的RBM隱含層進行擴展,這構成了一個可以通過反向傳播進行微調的多層感知機。

第二步:在DBN的最后一層設置BP網絡,接受RBM的輸出特征向量作為它的輸入特征向量,有監督地訓練實體關系分類器。每一層RBM網絡只能確保自身層內權值對該層特征向量映射達到最優,并不是對整個DBN的特征向量映射達到最優,所以反向傳播網絡還將錯誤信息自頂向下傳播至每一層RBM,微調整個DBN網絡。

每次訓練都使當前RBM隱層激活概率無限接近于可見層,實際上,這樣的貪婪過程達到了近似的最大似然學習,而且這個學習過程不需要標簽信息,用的是可見層輸入作為調整依據,所以是無監督的。

RBM網絡訓練模型的過程可以看做對一個深層BP網絡權值參數的初始化,使DBN克服BP網絡因隨機初始化權值參數而容易陷入局部最優和訓練時間過長的問題點。

上述訓練DBN的過程,第一步叫做預訓練,第二步叫做微調。最上面有監督學習的那一層,根據具體的應用可以換成任何分類器模型,不必是BP網絡。

這個過程和棧式自編碼器很相似,只是用RBM將自編碼器進行替換,用CD算法訓練RBM替代BP算法訓練自編碼器。

這里再提一下反向傳播算法。

反向傳播(英語:Backpropagation,縮寫為BP)是“誤差反向傳播”的簡稱,是一種與最優化方法(如梯度下降法)結合使用的,用來訓練人工神經網絡的常見方法。

BP算法主要分為兩個階段:

第一個階段是激勵傳播:每次迭代中的傳播環節也分為兩步:1.(前向傳播階段)將訓練送入網絡以獲得激勵響應。2.(反向傳播階段)將激勵響應與訓練輸入對應的目標輸出求差,從而獲得隱層和輸出層的響應誤差。

第二個階段是權重更新:對于每個突觸上的權重,更新步驟也有兩步(參見上篇文章當中對梯度下降算法的講述):1.得到對應的梯度。2.用當前權重減去梯度。

三層網絡BP算法示例

BP算法實際上就是應用在多層網絡中的梯度下降算法,原理與梯度下降算法相同,但區別在于BP算法需要求不同層連接所對應的梯度,而不是像普通的梯度下降算法那樣,只需處理一層的問題。

利用BP算法計算輸出層連接的梯度時,過程與普通梯度下降算法相同;但如果j是網絡中任一內層神經元,求損失函數E對于相應連接權重wijij下一層的神經元,wij即兩者之間連接的權重)的偏導數就不太容易了,需要先求對oj的偏導。

考慮E為接受來自神經元j輸入的所有神經元L = u,v,...,w輸入的函數:

oj取全微分,可以得到該導數的一個遞歸表達式:

也即,只要知道所有下一層(指離輸出層更近的一層)的輸出ol的導數,即可計算oj的導數,把它們放在一起:

其中:


所以得到BP算法的權重迭代公式(與普通梯度下降法參數迭代公式形式類似):


以上即為BP算法推導的全過程。

BP算法說到底是種梯度下降算法,前面也提到過,梯度下降法能得到局部最優,但并不能保證一定會得到全局最優。我們通常采用RBM pre-train的方法來避免其收斂到局部最小值。

根據前面的內容,好像稀疏自動編碼器(sparse autoencoder)堆疊得到棧式自動編碼器(stacked autoencoders),RBM堆疊得到DBN;而且二者都可以被用來做有監督DNN的預訓練,用的還都是同樣的無監督逐層預訓練方法,二者實際上也都是起到了特征探測器的作用,都是給定一個輸入,得到一個中間層,并利用中間層去重構一個和輸入相同的樣本,然后利用不同的評價指標,通過某種優化方法,盡可能的縮小輸出樣本和輸入樣本之間的差異。那它們的區別在什么地方呢?

首先Autocoder是一個確定模型,它的輸入和輸出之間有著嚴格的數學公式;而RBM源于BM,源于玻爾茲曼分布,是一個基于概率的不確定模型。

Autocoder訓練時采用BP算法,直接做梯度下降(看成只有一層的BP神經網絡),而RBM采用CD-k算法,只能利用k次吉布斯采樣的結果去近似的計算梯度。

深度神經網絡的訓練

一般對DNN的訓練要從兩個角度去考慮,第一個是如何讓網絡在訓練集上有良好的表現,第二個是如何在訓練集表現良好的前提下,使其在測試集上也有同樣的表現。

如何在訓練集上調優

選擇合適的損失函數

前面我們默認采用的都是平方誤差損失函數,但很多時候,平方誤差損失函數并不是我們最好的選擇,比如當我們用Softmax作為輸出層時,就更傾向于選擇交叉熵損失函數。

交叉熵和平方誤差損失函數曲面

前面我們也提到過熵的定義,知道熵是一個不確定性的測度,也就是說,我們對于某件事情知道得越多,那么,熵就越小,因而對于試驗的結果我們越不感到意外。交叉熵的概念就是用來衡量估計模型與真實概率分布之間的差異情況的。


多輸入單輸出神經元交叉熵損失函數

其中y為期望的輸出,a為神經元實際的輸出(a=σ(z), where z=∑Wj*Xj+b)。

與方差誤差函數一樣,交叉熵函數同樣擁有兩個性質,一個是非負性,一個是當真實輸出a與期望輸出y接近時,損失函數的函數值接近于0。

另外,它可以克服方差代價函數更新權重過慢的問題。我們看看它的導數:



從式子中我們可以看到,權重的更新是受σ(z)?y這一項影響,也即誤差越大,權重更新速度越快,誤差越小,更新速度越慢。這項性質在上面的交叉熵損失函數曲面圖中也可以體現出來,誤差越大,曲面越陡峭,偏導也就越大,梯度下降也就越快。

Mini-batch

我們上篇文章《淺談機器學習基礎》中,講過梯度下降算法(batch-GD),講過隨機梯度下降算法(SGD),它們的區別在于,batch-GD單次迭代要使用整個訓練集,而SGD單次迭代每次只使用單個樣本。那我們就一定要走兩個極端嗎,要么全部使用,要么只使用一個?我們可以選擇只使用一部分,把整個訓練集拆成一部分一部分使用,這就叫做mini-batch,我們可以把SGD看做mini-batch的特例,也即batch size = 1,而batch-GD的batch size就等于整個訓練集。

而且還要引入一個epoch的概念,一次參數更新叫做一次迭代,當經歷若干次迭代后,全部訓練樣本都已經被使用過了,這就叫一個epoch。batch-GD一次迭代就是一個epoch,SGD要迭代訓練樣本數目次,才算是一個epoch。

各類梯度下降算法

對于batch-GD,每次迭代的梯度方向計算由所有訓練樣本共同投票決定,計算損失函數在整個訓練集上的梯度方向,沿著該方向搜尋下一個迭代點。”batch“的含義是訓練集中所有樣本參與每一輪迭代。

batch GD每一輪迭代需要所有樣本參與,對于大規模的機器學習應用,經常有billion級別的訓練集,計算復雜度非常高。因此,有學者就提出,反正訓練集只是數據分布的一個采樣集合,我們能不能在每次迭代只利用部分訓練集樣本呢?這就是mini-batch算法。

假設訓練集有m個樣本,每個mini-batch(訓練集的一個子集)有b個樣本,那么,整個訓練集可以分成m/b個mini-batch。

SGD就是mini-batch的一個特殊情況,batch size = 1。

然后是Online GD,隨著互聯網行業的蓬勃發展,數據變得越來越“廉價”。很多應用有實時的,不間斷的訓練數據產生。在線學習(Online Learning)算法就是充分利用實時數據的一個訓練算法。

Online GD于mini-batch GD/SGD的區別在于,所有訓練數據只用一次,然后丟棄。這樣做的好處是可以最終模型的變化趨勢。比如搜索廣告的點擊率(CTR)預估模型,網民的點擊行為會隨著時間改變。用batch算法(每天更新一次)一方面耗時較長(需要對所有歷史數據重新訓練);另一方面,無法及時反饋用戶的點擊行為遷移。而Online Leaning的算法可以實時的最終網民的點擊行為遷移。

選擇新的激活函數

這里要先提一個問題,就是神經網絡并不一定是層數越多,越深越好,層數多了也會隨之產生很多問題,比如梯度消失和梯度爆炸。

先簡單的說一下梯度消失現象,因為前面也講過BP算法,我們知道,梯度的傳播是反向的,從輸出層向輸入層,如果層數過多,就會導致這樣的問題,越靠近輸出層的層梯度越大,學習的也越快,而越靠輸入層,梯度就越小,參數更新也就越慢,如果整個網絡的層數又多,會導致輸入層附近的層幾乎無法有效更新,梯度幾乎為零,這就叫梯度消失。

但是梯度消失的本質是什么?我們前面講過BP算法的推導:


其中:


可以看到,除了輸出層,計算每一層的梯度都是要乘以上一層梯度的一部分以及層間連接的權重和的,而計算上一層的梯度這部分又要乘以上上層梯度的一部分,是個連乘式,所以層數越多,就是越多的數相乘,如果這些數字都小于1,那么乘的越多,越接近輸入層,算出來的梯度就越接近零,如果這些數字都大于1,那么乘的越多,越接近輸入層,算出來的梯度就越大。梯度接近零叫做梯度消失,梯度變得過大就叫做梯度爆炸,而且我們發現這個乘數是個累加項,而且這個累加項里面,包含權重wjl,所以如果初始權重過小,那梯度消失的風險就大,如果初始權重過大,那就很可能會梯度爆炸,唯一可能的情況是讓這些乘積基本等于1,但這不太可能。

那我們怎么解決這個梯度消失的問題呢?看資料里面講,從2006年起,我們通過前面講過的RBM pre-train來解決梯度消失的問題,畢竟RBM pre-train靠的是無監督逐層訓練,是種最大似然學習,最后的有監督BP,只是用來微調的。但是2015年之后,人們一般采用ReLU激活函數來避免梯度消失/爆炸的問題。

Rectified Linear Unit (修正線性單元/線性整流函數,ReLU),函數圖像如下:


線性整流函數圖像
線性整流函數圖像

我們將其與其他常見的Sigmoid激活函數圖像作對比:


Sigmoid
Sigmoid

ReLU函數的表現通常優于其他激活函數,廣泛使用于諸如圖像識別等計算機視覺人工智能領域,其具有如下幾個優點:

  • 計算速度快,因為其由兩段線性函數構成,計算起來不知道比Sigmoid快到哪里去
  • ReLU有一定仿生物學原理,ReLU激活函數與人腦中神經元的激活方式最為類似,人腦接受相應刺激后,只有少量相關神經元(1%-4%)被激活,而大多數神經元都處于被抑制的狀態,Sigmoid函數在輸入為0時就已經是1/2半飽和的穩定狀態了,不夠符合實際生物學對人工神經網絡的期望,而ReLU的表現要好的多,不過一般情況下,使用了ReLU,網絡中也大概有50%的神經元會處于激活狀態。
  • 采用ReLU可以解決梯度消失/爆炸的問題,前面講過梯度消失/爆炸的原理,在于復雜多層網絡下的梯度連乘,而ReLU的價值就在于抑制相當一部分神經元的激活,實際上是對網絡進行了簡化,去掉了網絡中被抑制的那些神經元。

ReLU函數還有幾種變體,往往是更改了輸入小于0時的函數曲線,比如Leaky ReLU、Parametric ReLU等,不詳述。

另外還要說的一點就是Maxout,ReLU其實是Maxout的一種特例。

那什么是Maxout?


Maxout

我們知道,在人工神經網絡中,規定神經元函數只能對輸入變量線性組合后的結果進行一次非線性變換。而這次非線性變換,就是激活函數。

接下來具體講一下Maxout的算法流程,首先對于每個隱藏層神經元,如果它接受d個輸入,那么Maxout隱藏層每個神經元的計算公式如下:

上面的公式就是maxout隱藏層神經元i的計算公式。其中,k就是maxout層所需要的參數了,由我們人為設定大小。公式中Z的計算公式為:

權重W是一個大小為(d,m,k)三維矩陣,b是一個大小為(m,k)的二維矩陣,這兩個就是我們需要學習的參數。而這個k就是我們同時訓練的參數組數。本來傳統的人工神經網絡,第i層到第i+1層只有一組參數(k=1),但是現在,我們同時訓練k組參數,然后選擇激活值最大的作為輸出。

以前的做法是,z=W*X+b,然后out=f(z)f就是我們通常講的激活函數,比如Sigmoid、tanh。

而在Maxout里面,相當于在每個輸出神經元前面又加了一層,相當于對輸入變量線性組合后的結果并不直接送到輸出神經元里面,而是相當于新加了一個『隱隱層』,這個『隱隱層』有k個神經元,這個k就是Maxout里面的那個參數k,然后前面線性組合的結果就分別送到這k個神經元里面,分別進行計算(比如k等于5):

z1=w1*x+b1
z2=w2*x+b2
z3=w3*x+b3
z4=w4*x+b4
z5=w5*x+b5

然后取最大的out=max(z1,z2,z3,z4,z5)作為輸出,同時訓練k組參數,這就是Maxout。

Maxout激活函數的圖像如下:


k=2和k=3時的Maxout示例

我們可以看到k=2時第一個圖像就是ReLU的函數圖像。按我的理解,ReLU就是Maxout的k=2,然后在隱隱層放了一個z=0的神經元。

自適應學習速率

上篇文章講梯度下降時提到過學習速率η,它對訓練效果也起到很重要的影響,如果η過大,那每次更新后,總誤差可能并不會縮小;而如果η過小,那訓練速度又會變得相當慢。所以我們很自然的有這樣的想法,學習速率η不應該是一直不變的,我們希望這個學習速率η能夠隨著每次epoch而減小。

Adagrad就是針對這一問題提出的,自適應地為各個參數分配不同學習率的算法。其公式如下:


Adagrad

學習速率η不再恒定不變,而是根據上式持續更新,下面的分母會隨著迭代次數的增加累加gigi是第i次更新所得到偏導數。

也即,對于所有的參數來講,學習速率都是越來越小的。而且,偏導越小,學習速率減小的就越慢。

第一條很好理解,第二條要簡單解釋一下,如果偏導很小,說明本來的更新速率就很小,如果再將學習速率這個參數以一個較快的速度減小,那這個維度下的總參數更新速率就會變的過慢。

當然Adagrad也不是唯一的算法,擁有類似功能的還有RMSprop、Adadelta、AdaSecant、Adam等,而且一般而言Adam是目前的最優選擇。

Momentum

我們考慮這樣一個問題,如果單純的只靠梯度來作為權重更新的唯一依據,會出現什么樣的問題,如下圖所示:


當梯度非常小,也即曲面在對應維度上非常平緩時,權重的更新會變得相當慢;在鞍點,也即偏導數為0的點,該維度權重會停止更新;而且也很容易停留在局部最小值而達不到全局最小值。

Momentum是沖量的意思,不過我們可以簡單的把它理解為慣性,把梯度下降看做一個小球沿曲線滑落的過程,這樣即便在梯度為零的點,也能以一個較快的速度進行梯度下降,甚至還有可能幫助損失函數突破局部最小值的限制,到達全局最小值。

前面所提到的表現優秀的Adam算法,就相當于RMSProp (高級版Adagrad) + Momentum。

如何優化在測試集上的表現

模型由于采用了過于復雜的參數,從而在訓練集上擁有良好表現,而在測試集上表現很差,這樣的現象叫做過擬合。這一部分就是要講如何解決過擬合的問題。

增大訓練集

首先來講最簡單的一個方法,增大訓練集,通過使用更大的訓練集來增強模型對于各種樣本的適應性。

增大訓練集也有兩種方法,一個自然是去找到更多的訓練樣本,而另一個,是去創造更多的訓練樣本。比如在圖像識別中,我們可以通過對已有圖像訓練樣本的角度進行調整來創造一個新的訓練樣本,我們也可以通過在訓練樣本中加上一些噪聲來創造新的訓練樣本等。

提早停止(Early Stopping)

Early Stopping

模型在測試集上的誤差往往首先會隨著測試集誤差的減小而減小,但到了后期,模型就會傾向于通過過擬合來進一步降低自身在訓練集上的誤差,而這樣的優化實際上是升高了模型在測試集上的誤差的。所以我們可以通過提前停止訓練來一定程度上避免過擬合。

正則化

正則化的目的是為了防止過擬合,但是正則化為什么可以防止過擬合?

正則化是在我們通常的損失函數后面加一個正則項,這個正則項實際上是一個對參數大小的懲罰項,那為什么正則項可以限制參數不能過大?

因為正則項里面通常包含參數,而我們的優化目的又是盡可能的縮小損失函數函數值,所以在優化的過程中,我們就會讓參數盡可能的小。那為什么參數小了就可以防止過擬合?我讀的資料里面寫的都是參數越大,模型越復雜,越容易過擬合,那為什么參數大了模型就越復雜?

我們可以想一下,模型函數求導后的式子中是會保留有參數的,如果參數越大,也就意味著模型的導數越大,也就意味著模型曲線越不平滑,也就越容易通過各種扭曲去擬合噪聲樣本點,也即越容易發生過擬合。

L0,L1,L2正則項是機器學習中常用的正則項:

L0:指非零參數的個數。前面講過正則項的目的是為了懲罰參數過大,在這里也就是希望零參數越多越好,非零參數越少越好;優化損失函數正好是限制了正則項過大,也即限制了非零參數的個數過多。但使用L0正則項有個問題,就是難以優化,所以一般不用。

L1:


采用L1正則項

L2:


采用L2正則項

對于使用了L1、L2正則項的損失函數來說,往極小值處優化自身函數值實際上就限制了正則項不能過大,也就限制了w不能過大,也即防止了過擬合。

L1會趨向于產生少量的特征,而其他的特征都是0,也即實現稀疏,只保留少量特征。而L2會選擇更多的特征,這些特征都會接近于0。L2正則項也叫權重衰減,是最常用的正則項,而且帶L2的回歸,就是我們上篇文章所提到過的嶺回歸,上篇文章說『嶺回歸就是在原來最小二乘法式子求逆之前先加上一個階數與樣本數相同的對角矩陣,也即加上一個正則項,使矩陣為奇異的風險大降低,損失了無偏性,來換取高的數值穩定性』,里面的這個正則項,就可以理解為L2正則項。

Dropout

Dropout也是防止過擬合的一種方法。基本原理很簡單,就是訓練時,每次更新參數之前,隨機去掉網絡中p%的神經元,也即更改了網絡結構,讓整個網絡變得更簡單。如果與前面的梯度下降結合起來,那就是每次使用訓練集的一個新的mini-batch之前,都隨機丟掉網絡中p%的神經元,用剩下的神經元進行訓練,進行參數更新。

然后到使用測試集的時候,使用完整的網絡,但所有權重統一乘以(1-p)%。因為訓練時只用部分神經元就生成了較為合適的輸出z,如果使用了全部的神經元而權重仍然使用訓練時的權重,那結果可能就會變成zn倍。

而且因為前面講了是隨機去掉網絡中p%的神經元的,所以可能若干次訓練的神經網絡是會共享部分神經元的,當然也可能不共享,如果p較大的話。

如果非要講原理的話,我借用我在其他資料里面看到的,當一群人組隊做事情的時候,如果每個人都想著,我的隊友會干活的,那什么事情都完成不了;如果每個人都認為,我的隊友不行,還是得靠我自己,那么事情會做的好的多:>

Network Structure

有些神經網絡的結構天然就是能防止過擬合的,比如CNN,池化過程避免了過擬合。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容