大數據

【數據分析】從零開始帶你瞭解商業數據分析模型——深度學習之多層感知器(下)

從上一個章節的介紹中,我們主要了解深度學習(特指多層感知器)的一些基本情況,以及它背後複雜的計算過程。

參數學習的每一次迭代,都會消耗巨大的運算資源和時間。因此本篇我們來談談如何選擇合適的超參數來加速模型的學習過程。

**1

多層感知器的建模優化**

在機器學習的上下文中,模型超參數指的是在建模學習過程之前即預設好的參數。他們不是通過訓練得到的參數數據。

常見的超參數有:模型迭代循環次數、學習速率、深度學習隱藏層的層數等等。

超參數的優化方式和途徑有很多,這個章節主要會從兩個方面來探討優化方法,即:

**學習訓練速度

模型穩定性**

**01

學習訓練速度

選擇合適的損失函數**

在模型訓練結束後的損失函數報告中,我們有時會觀察到下圖所示的現象:在最開始和最後的迭代過程中,模型的學習速率很慢,然而在迭代的中間過程中,模型的學習速率相對較快。
微信圖片_20200812154239.png

接下來,我們會用一個樣本案例來幫助大家解析上面這個現象出現的原因。

假設,我們現在有一個單層單節點的神經網絡模型。將輸入數據記作x,真實輸出數據記作y。模型的線性運算我們可由下式來表示:

微信圖片_20200812154243.png

假設我們的非線性運算(也叫做激活函數)使用sigmoid函數,並記作:
微信圖片_20200812154246.png
微信圖片_20200812154248.png

這個案例中,我們將常見的L2範數函數作為損失函數,即:
微信圖片_20200812154251.png

基於權重w求出損失函數L的偏微分,我們可以得出:

微信圖片_20200812154253.png

逐步分析上述偏微分的成分:

(δ(wx+b)-y):表示預測值和真實值之間的差值。如果它兩的偏差太大,參數更新時速率也會很大;

x:代表的是輸入數據。如果輸入數據很大,模型學習時參數更新速率也理應很快;

δ'(wx+b):代表的是激活函數的導數。

通過觀察sigmoid函數的圖像,大家也許就會發現,當函數輸入值過小或者過大時,函數的增長率是極度緩慢的!這其實也就解釋了為什麼有的時候模型的學習速率會在兩端迭代時相對緩慢。

微信圖片_20200812154255.png

為加快模型學習速度,我們通常會更聰明的選擇損失函數,比如交叉熵損失函數,即:
微信圖片_20200812154258.png

假設我們依然使用sigmoid函數作為激活函數,通過相應的微分運算之後,我們可以得出交叉熵損失函數的偏微分為:
微信圖片_20200812154300.png

從上面的公式,我們可以觀察到,我們已經避開了sigmoid函數的導數部分。所以,大多數時候我們能夠得到一個更合理更平滑的模型學習過程。

除了交叉熵函數,其他常見的損失函數還有softmax損失函數。感興趣的讀者可以自行翻閱資料或與作者進行進一步溝通。

選擇合適的激活函數

回憶一下上一章節提到的案例,我們可以發現,激活函數不僅存在於輸出層,它還同時存在於每一個隱藏層。所以它的選擇除了會影響求損失函數的偏微分結果,還會影響每一個隱藏層的求偏微分結果。

因此為每一層隱藏層選擇合適的激活函數,也會大大加快模型的學習速率
微信圖片_20200812154303.png

回顧一下激活函數的一些基本要求:

首先它需要是非線性的函數。如果它是一個線性函數的話,我們就可以把激活函數和前面的線性運算組合起來成為一個全新的線性運算。但這樣也就沒有了隱藏層的意義;

其次它必須是可以求導的函數。因為參數的更新規則是基於每一層運算表達式的偏微分求得的;

最後,激活函數的導數最好是可以維持在一個相對穩定的數值。

基於上述的三點考量,ReLU函數成為了一種常見的激活函數選項。

如下圖最左邊所示,最基本的激活函數可以有表達式表示。即,當輸入大於零時,ReLU函數的導數為非零常數,當輸入小於零時,ReLU函數的導數為零。當然ReLU函數也存在兩種不同的變型。他們主要是為了處理當輸入值小於零時,模型的學習速率。

由此可見,將ReLU函數作為激活函數可以有效地避開我們上述提到的問題,從而大大的加快參數學習過程。
微信圖片_20200812154306.jpg

儘管ReLU函數在模型訓練速度上表現優異,sigmoid函數和另一種tanh函數依然有作為激活函數存在的意義。因為它們都是良好二分類器。

仔細觀察下圖的右邊兩個函數的分佈情況,我們可以看到它們都將近乎一半的,輸入值較小的數推向了0/-1,並將另一半的,輸入值較大的數拉向了1。

所以如果我們對數據,對深度學習的模型框架設計中有很強的自信的話,我們可以大膽的在隱藏層中採用sigmoid函數或tanh函數作為激活函數,使得模型的最終的分類效果表現得更為優異。

**02

模型穩定性**

通常來說,深度學習的每一次參數學習並不會使用全部的數據集。訓練開始時,我們通常都會抽樣出一批數據,並將它們稱作batch,樣本的個數叫做batch size。

對於每一個統計模型來講,輸入值的分佈情況一定會顯著的影響到最終的模型學習結果。即,不同的訓練樣本輸入會導致不同的參數訓練結果

這一個特性在深度學習的上下文中尤其的關鍵。因為在深度學習的模型框架中,每一層的輸出值都會作為下一層的輸入值使用。所以輸入層的樣本數據分佈情況,會被隱藏層無限放大到輸出層。

為了應對這種訓練結果不穩定的情況,我們通常會採用一種常見的歸一方法,即Batch Normalization

如下圖步驟所示,BN會對樣本數據作出一定的標準化處理,從而改變樣本的分佈,使其輸入分佈更加的穩定。每一層達到穩定輸入分佈後,它會使得損失函數的優化空間變得更加平滑,即參數更新時的梯度能夠更加順滑,從而避免了梯度爆炸或彌散等現象。

微信圖片_20200812154310.png

通常與Batch Normalization一起使用的技巧叫做Dropout。Dropout 指的是在模型學習過程中,模型會隨機的去忽略一些神經節點。

忽略掉那些神經節點後的學習結果會更加具有普適性,並更少的依賴某一些特定的神經節點。Dropout也是深度學習中防止學習過擬合的一種關鍵技巧。

**03

小結**

簡單歸納一下上述提到的優化超參數的方法:

**選擇合適的損失函數

選擇合適的激活函數

合理運用Batch Normalization和Dropout**

當然了,除此之外,優化超參數的技巧還有很多。比如引入深監督、適當調節學習率和引入梯度階段等。如果讀者有興趣的話,可以在評論區留言,如果感興趣的人多的話,我們可以後期出一篇專題做進一步介紹。

**2

在Altair KnowledgeStudio中

實操多層感知器
**

Altair Knowledge Studio中的多層感知器是基於Keras框架建立的。它拋開了複雜的基於Python的編碼語言,並直接將其建模功能封裝好,為用戶提供了一個可以拖拉拽的易用界面。

下面我們省略掉前期的數據導入及節點連接的步驟,直接進入模型超參數的設置界面。

模型節點的第一個界面主要是為了確立清楚訓練數據集和驗證數據集。與此同時,我們還需設定好數據集中我們所關心的因變量(可以是多個),自變量和模型無需考慮的變量。

微信圖片_20200812154313.png

點擊下一步,我們可以來到更詳細的超參數設置界面。如下如所示:

界面的最上面部分是自定義多層感知器的模型架構,比如有多少隱藏層,每個隱藏層的神經節點數,以及相應的激活函數;

界面的中部提供了引入Batch Normalization 和Dropout的勾選項;

界面的最下面部分則是幫助用戶設置迭代次數,樣本大小及參數更新規則等功能。
微信圖片_20200812154316.png

值得一提的是,在每個界面的最右邊,大家會看見一個“Code”的邊欄。點開它的話,大家就可以看見如何在Keras框架下,用Python語言實現我們上述所提及的模型設置。

因為空間有限,下圖僅僅是Python語言實現的一小部分截圖:
微信圖片_20200812154318.png

結語

希望通過上一篇和這一篇文章,大家能夠對深度學習,尤其是多層感知器有更進一步的瞭解。

我們下一篇文章準備為大家簡單介紹一下當下另一個比較火熱的話題 – 自動機器學習(AutoML)。如果大家對數據分析或者預測模型感興趣,歡迎在文後留言與我們交流,也歡迎大家提出寶貴意見或建議。

Leave a Reply

Your email address will not be published. Required fields are marked *