從上一個章節的介紹中,我們主要了解深度學習(特指多層感覺器)的一些基本情況,以及它背後複雜的計算過程。
參數學習的每一次疊代,都會消耗巨大的運算資源和時間。是以本篇我們來談談如何選擇合适的超參數來加速模型的學習過程。
**1
多層感覺器的模組化優化**
在機器學習的上下文中,模型超參數指的是在模組化學習過程之前即預設好的參數。他們不是通過訓練得到的參數資料。
常見的超參數有:模型疊代循環次數、學習速率、深度學習隐藏層的層數等等。
超參數的優化方式和途徑有很多,這個章節主要會從兩個方面來探讨優化方法,即:
**學習訓練速度
模型穩定性**
**01
學習訓練速度
選擇合适的損失函數**
在模型訓練結束後的損失函數報告中,我們有時會觀察到下圖所示的現象:在最開始和最後的疊代過程中,模型的學習速率很慢,然而在疊代的中間過程中,模型的學習速率相對較快。

接下來,我們會用一個樣本案例來幫助大家解析上面這個現象出現的原因。
假設,我們現在有一個單層單節點的神經網絡模型。将輸入資料記作x,真實輸出資料記作y。模型的線性運算我們可由下式來表示:
假設我們的非線性運算(也叫做激活函數)使用sigmoid函數,并記作:
這個案例中,我們将常見的L2範數函數作為損失函數,即:
基于權重w求出損失函數L的偏微分,我們可以得出:
逐漸分析上述偏微分的成分:
(δ(wx+b)-y):表示預測值和真實值之間的內插補點。如果它兩的偏差太大,參數更新時速率也會很大;
x:代表的是輸入資料。如果輸入資料很大,模型學習時參數更新速率也理應很快;
δ'(wx+b):代表的是激活函數的導數。
通過觀察sigmoid函數的圖像,大家也許就會發現,當函數輸入值過小或者過大時,函數的增長率是極度緩慢的!這其實也就解釋了為什麼有的時候模型的學習速率會在兩端疊代時相對緩慢。
為加快模型學習速度,我們通常會更聰明的選擇損失函數,比如交叉熵損失函數,即:
假設我們依然使用sigmoid函數作為激活函數,通過相應的微分運算之後,我們可以得出交叉熵損失函數的偏微分為:
從上面的公式,我們可以觀察到,我們已經避開了sigmoid函數的導數部分。是以,大多數時候我們能夠得到一個更合理更平滑的模型學習過程。
除了交叉熵函數,其他常見的損失函數還有softmax損失函數。感興趣的讀者可以自行翻閱資料或與作者進行進一步溝通。
選擇合适的激活函數
回憶一下上一章節提到的案例,我們可以發現,激活函數不僅存在于輸出層,它還同時存在于每一個隐藏層。是以它的選擇除了會影響求損失函數的偏微分結果,還會影響每一個隐藏層的求偏微分結果。
是以為每一層隐藏層選擇合适的激活函數,也會大大加快模型的學習速率。
回顧一下激活函數的一些基本要求:
首先它需要是非線性的函數。如果它是一個線性函數的話,我們就可以把激活函數和前面的線性運算組合起來成為一個全新的線性運算。但這樣也就沒有了隐藏層的意義;
其次它必須是可以求導的函數。因為參數的更新規則是基于每一層運算表達式的偏微分求得的;
最後,激活函數的導數最好是可以維持在一個相對穩定的數值。
基于上述的三點考量,ReLU函數成為了一種常見的激活函數選項。
如下圖最左邊所示,最基本的激活函數可以有表達式表示。即,當輸入大于零時,ReLU函數的導數為非零常數,當輸入小于零時,ReLU函數的導數為零。當然ReLU函數也存在兩種不同的變型。他們主要是為了處理當輸入值小于零時,模型的學習速率。
由此可見,将ReLU函數作為激活函數可以有效地避開我們上述提到的問題,進而大大的加快參數學習過程。
盡管ReLU函數在模型訓練速度上表現優異,sigmoid函數和另一種tanh函數依然有作為激活函數存在的意義。因為它們都是良好二分類器。
仔細觀察下圖的右邊兩個函數的分布情況,我們可以看到它們都将近乎一半的,輸入值較小的數推向了0/-1,并将另一半的,輸入值較大的數拉向了1。
是以如果我們對資料,對深度學習的模型架構設計中有很強的自信的話,我們可以大膽的在隐藏層中采用sigmoid函數或tanh函數作為激活函數,使得模型的最終的分類效果表現得更為優異。
**02
通常來說,深度學習的每一次參數學習并不會使用全部的資料集。訓練開始時,我們通常都會抽樣出一批資料,并将它們稱作batch,樣本的個數叫做batch size。
對于每一個統計模型來講,輸入值的分布情況一定會顯著的影響到最終的模型學習結果。即,不同的訓練樣本輸入會導緻不同的參數訓練結果。
這一個特性在深度學習的上下文中尤其的關鍵。因為在深度學習的模型架構中,每一層的輸出值都會作為下一層的輸入值使用。是以輸入層的樣本資料分布情況,會被隐藏層無限放大到輸出層。
為了應對這種訓練結果不穩定的情況,我們通常會采用一種常見的歸一方法,即Batch Normalization。
如下圖步驟所示,BN會對樣本資料作出一定的标準化處理,進而改變樣本的分布,使其輸入分布更加的穩定。每一層達到穩定輸入分布後,它會使得損失函數的優化空間變得更加平滑,即參數更新時的梯度能夠更加順滑,進而避免了梯度爆炸或彌散等現象。
通常與Batch Normalization一起使用的技巧叫做Dropout。Dropout 指的是在模型學習過程中,模型會随機的去忽略一些神經節點。
忽略掉那些神經節點後的學習結果會更加具有普适性,并更少的依賴某一些特定的神經節點。Dropout也是深度學習中防止學習過拟合的一種關鍵技巧。
**03
小結**
簡單歸納一下上述提到的優化超參數的方法:
**選擇合适的損失函數
合理運用Batch Normalization和Dropout**
當然了,除此之外,優化超參數的技巧還有很多。比如引入深監督、适當調節學習率和引入梯度階段等。如果讀者有興趣的話,可以在評論區留言,如果感興趣的人多的話,我們可以後期出一篇專題做進一步介紹。
**2
在Altair KnowledgeStudio中
實操多層感覺器
**
Altair Knowledge Studio中的多層感覺器是基于Keras架構建立的。它抛開了複雜的基于Python的編碼語言,并直接将其模組化功能封裝好,為使用者提供了一個可以拖拉拽的易用界面。
下面我們省略掉前期的資料導入及節點連接配接的步驟,直接進入模型超參數的設定界面。
模型節點的第一個界面主要是為了确立清楚訓練資料集和驗證資料集。與此同時,我們還需設定好資料集中我們所關心的因變量(可以是多個),自變量和模型無需考慮的變量。
點選下一步,我們可以來到更詳細的超參數設定界面。如下如所示:
界面的最上面部分是自定義多層感覺器的模型架構,比如有多少隐藏層,每個隐藏層的神經節點數,以及相應的激活函數;
界面的中部提供了引入Batch Normalization 和Dropout的勾選項;
界面的最下面部分則是幫助使用者設定疊代次數,樣本大小及參數更新規則等功能。
值得一提的是,在每個界面的最右邊,大家會看見一個“Code”的邊欄。點開它的話,大家就可以看見如何在Keras架構下,用Python語言實作我們上述所提及的模型設定。
因為空間有限,下圖僅僅是Python語言實作的一小部分截圖:
結語
希望通過上一篇和這一篇文章,大家能夠對深度學習,尤其是多層感覺器有更進一步的了解。
我們下一篇文章準備為大家簡單介紹一下當下另一個比較火熱的話題 – 自動機器學習(AutoML)。如果大家對資料分析或者預測模型感興趣,歡迎在文後留言與我們交流,也歡迎大家提出寶貴意見或建議。