深度學習面試100題(第61-65題)

七月線上實驗室發表於2018-07-24
640?wx_fmt=gif

點選藍字關注我們,小七等你好久嘍


640?wx_fmt=png

深度學習

面試大題第61-65題


640?wx_fmt=jpeg

61題

深度學習中有什麼加快收斂/降低訓練難度的方法?

解析:

瓶頸結構

殘差

學習率、步長、動量

優化方法

預訓練


640?wx_fmt=jpeg

62題

請簡單說下計算流圖的前向和反向傳播

解析:

640?wx_fmt=png


640?wx_fmt=jpeg

63題

請寫出鏈式法則並證明

解析:

鏈式法則或鏈鎖定則(英語:chain rule),是求複合函式導數的一個法則。設f和g為兩個關於x的可導函式,則複合函式

640?wx_fmt=png

的導數

640?wx_fmt=png

640?wx_fmt=png


以下是一個簡單的例子

640?wx_fmt=png

以下的簡單的一個證明

640?wx_fmt=png


640?wx_fmt=jpeg

64題

請寫出Batch Normalization的計算方法及其應用

解析:

機器學習流程簡介

1)一次性設定(One time setup)

 - 啟用函式(Activation functions)

- 資料預處理(Data Preprocessing)

- 權重初始化(Weight Initialization)

- 正則化(Regularization:避免過擬合的一種技術)

- 梯度檢查(Gradient checking)


2)動態訓練(Training dynamics)

- 跟蹤學習過程 (Babysitting the learning process)

- 引數更新 (Parameter updates)

- 超級引數優化(Hyperparameter optimization)

- 批量歸一化(Batch Normalization簡稱BN,其中,Normalization是資料標準化或歸一化、規範化,Batch可以理解為批量,加起來就是批量標準化。解決在訓練過程中中間層資料分佈發生改變的問題,以防止梯度消失或爆炸、加快訓練速度)


3)評估(Evaluation)

- 模型組合(Model ensembles)

(訓練多個獨立的模型,測試時,取這些模型結果的平均值)


為什麼輸入資料需要歸一化(Normalized Data),或者說,歸一化後有什麼好處呢?


原因在於神經網路學習過程本質就是為了學習資料分佈,一旦訓練資料與測試資料的分佈不同,那麼網路的泛化能力也大大降低,所以需要使用輸入資料歸一化方法,使訓練資料與測試資料的分佈相同。


另外一方面,加之神經網路訓練時一旦網路某一層的輸入資料的分佈發生改變,那麼這一層網路就需要去適應學習這個新的資料分佈,所以如果訓練過程中,訓練資料的分佈一直在發生變化,那麼將會影響網路的訓練速度。


為了讓訓練深度網路簡單高效,研究者提出了隨機梯度下降法(SGD),但是它有個毛病,就是需要我們人為的去選擇引數,比如學習率、引數初始化、權重衰減係數、Drop out比例等。這些引數的選擇對訓練結果至關重要,以至於我們很多時間都浪費在這些的調參上。


舉個例子,比如某個神經元 x = 1, 某個 Weights 的初始值為 0.1, 這樣後一層神經元計算結果就是 Wx 0.1 *1 = 0.1;

如果 x = 20, 這樣 Wx = 0.1 * 20 = 2。現在還不能看出什麼問題, 但是, 當我們加上一層激勵函式, 啟用這個 Wx 值的時候, 問題就來了。


如果使用 像 tanh 的激勵函式, Wx 的啟用值就變成了 ~0.1 和 ~1, 接近於 1 的部已經處在了 激勵函式的飽和階段, 也就是如果 x 無論再怎麼擴大, tanh 激勵函式輸出值也還是 接近1。

640?wx_fmt=png


換句話說, 神經網路在初始階段已經不對那些比較大的 x 特徵範圍 敏感了. 這樣很糟糕, 想象我輕輕拍自己的感覺和重重打自己的感覺居然沒什麼差別, 這就證明我的感官系統失效了. 當然我們是可以用之前提到的對資料做 normalization 預處理, 使得輸入的 x 變化範圍不會太大, 讓輸入值經過激勵函式的敏感部分. 但剛剛這個不敏感問題不僅僅發生在神經網路的輸入層, 而且在隱藏層中也經常會發生。

640?wx_fmt=png


既然 x 換到了隱藏層當中, 我們能不能對隱藏層的輸入結果進行像之前那樣的normalization 處理呢? 答案是可以的, 因為大牛們發明了一種技術, 叫做 batch normalization, 正是處理這種情況。


Batch Normalization由Google提出在這篇論文中《Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出。


與啟用函式層、卷積層、全連線層、池化層一樣,BN(Batch Normalization)也屬於網路的一層。


BN的本質原理:在網路的每一層輸入的時候,又插入了一個歸一化層,也就是先做一個歸一化處理(歸一化至:均值0、方差為1),然後再進入網路的下一層。不過歸一化層可不像我們想象的那麼簡單,它是一個可學習、有引數(γ、β)的網路層。


歸一化公式:

640?wx_fmt=png


以下是Normalization過程(引用Google論文中的解釋):

640?wx_fmt=png

輸入:輸入資料x1..xm(這些資料是準備進入啟用函式的資料) 

計算過程中可以看到, 

1.求資料均值; 

2.求資料方差; 

3.資料進行標準化(個人認為稱作正態化也可以) 

4.訓練引數γ,β 

5.輸出y通過γ與β的線性變換得到新的值 


How to BN?

怎樣學BN的引數就是經典的chain rule。


在正向傳播的時候,通過可學習的γ與β引數求出新的分佈值

在反向傳播的時候,通過鏈式求導方式,修正γ與β以及相關權值 

640?wx_fmt=png


Why is BN?

因為BN保證每一層的輸入分佈穩定,這一點本身可以使得訓練加速,而且另一方面它也可以幫助減少梯度消失和梯度爆炸的現象。


梯度消失

關於梯度消失,以sigmoid函式為例子,sigmoid函式使得輸出在[0,1]之間。


640?wx_fmt=png


事實上x到了一定大小,經過sigmoid函式的輸出範圍就很小了,參考下圖 

640?wx_fmt=png

如果輸入很大,其對應的斜率就很小,我們知道,其斜率(梯度)在反向傳播中是權值學習速率。所以就會出現如下的問題,

640?wx_fmt=png


在深度網路中,如果網路的啟用輸出很大,其梯度就很小,學習速率就很慢。假設每層學習梯度都小於最大值0.25,網路有n層,因為鏈式求導的原因,第一層的梯度小於0.25的n次方,所以學習速率就慢,對於最後一層只需對自身求導1次,梯度就大,學習速率就快。


這會造成的影響是在一個很大的深度網路中,淺層基本不學習,權值變化小,後面幾層一直在學習,結果就是,後面幾層基本可以表示整個網路,失去了深度的意義。


梯度爆炸

關於梯度爆炸,根據鏈式求導法,第一層偏移量的梯度=啟用層斜率1x權值1x啟用層斜率2x…啟用層斜率(n-1)x權值(n-1)x啟用層斜率n。假如啟用層斜率均為最大值0.25,所有層的權值為100,這樣梯度就會指數增加。


640?wx_fmt=jpeg

65題

神經網路中會用到批量梯度下降(BGD)嗎?為什麼用隨機梯度下降(SGD)?

解析:

1)一般不用BGD


2)a. BGD每次需要用到全量資料,計算量太大

b. 引入隨機因素,即便陷入區域性極小,梯度也可能不為0,這樣就有機會跳出區域性極小繼續搜尋(可以作為跳出區域性極小的一種方式,但也可能跳出全域性最小。還有解決區域性極小的方式:多組引數初始化、使用模擬退火技術)


640?wx_fmt=gif

分享一哈:之前公司三週年慶活動,推出新人大禮包的活動,註冊即送免費課程,此活動還在繼續,此活動有超6千人報名了,現在免費,免費,免費送嘍,親們抓緊時間噢,掃碼檢視詳情~~

640?wx_fmt=png640?wx_fmt=png640?wx_fmt=png

長按二維碼檢視


福利時刻:為了幫助大家更多的學習課程的相關知識,我們特意推出了深度學習系列課程。

640?wx_fmt=gif640?wx_fmt=png


 更多資訊

 請戳一戳

640?wx_fmt=gif640?wx_fmt=jpeg640?wx_fmt=gif

點選“閱讀原文”,可線上報名參加

相關文章