深度學習面試100題(第31-35題)

七月線上實驗室發表於2018-07-16

31.梯度爆炸會引發什麼問題?

解析:

在深度多層感知機網路中,梯度爆炸會引起網路不穩定,最好的結果是無法從訓練資料中學習,而最壞的結果是出現無法再更新的 NaN 權重值。

梯度爆炸導致學習過程不穩定。—《深度學習》,2016。

在迴圈神經網路中,梯度爆炸會導致網路不穩定,無法利用訓練資料學習,最好的結果是網路無法學習長的輸入序列資料。


32.如何確定是否出現梯度爆炸?

解析:

訓練過程中出現梯度爆炸會伴隨一些細微的訊號,如:

模型無法從訓練資料中獲得更新(如低損失)。

模型不穩定,導致更新過程中的損失出現顯著變化。

訓練過程中,模型損失變成 NaN。

如果你發現這些問題,那麼你需要仔細檢視是否出現梯度爆炸問題。


以下是一些稍微明顯一點的訊號,有助於確認是否出現梯度爆炸問題。

訓練過程中模型梯度快速變大。

訓練過程中模型權重變成 NaN 值。

訓練過程中,每個節點和層的誤差梯度值持續超過 1.0。


33.如何修復梯度爆炸問題?

解析:

有很多方法可以解決梯度爆炸問題,本節列舉了一些最佳實驗方法。

(1) 重新設計網路模型

在深度神經網路中,梯度爆炸可以通過重新設計層數更少的網路來解決。

使用更小的批尺寸對網路訓練也有好處。

在迴圈神經網路中,訓練過程中在更少的先前時間步上進行更新(沿時間的截斷反向傳播,truncated Backpropagation through time)可以緩解梯度爆炸問題。


(2)使用 ReLU 啟用函式

在深度多層感知機神經網路中,梯度爆炸的發生可能是因為啟用函式,如之前很流行的 Sigmoid 和 Tanh 函式。

使用 ReLU 啟用函式可以減少梯度爆炸。採用 ReLU 啟用函式是最適合隱藏層的新實踐。


(3)使用長短期記憶網路

在迴圈神經網路中,梯度爆炸的發生可能是因為某種網路的訓練本身就存在不穩定性,如隨時間的反向傳播本質上將迴圈網路轉換成深度多層感知機神經網路。

使用長短期記憶(LSTM)單元和相關的門型別神經元結構可以減少梯度爆炸問題。

採用 LSTM 單元是適合迴圈神經網路的序列預測的最新最好實踐。


(4)使用梯度截斷(Gradient Clipping)

在非常深且批尺寸較大的多層感知機網路和輸入序列較長的 LSTM 中,仍然有可能出現梯度爆炸。如果梯度爆炸仍然出現,你可以在訓練過程中檢查和限制梯度的大小。這就是梯度截斷。

處理梯度爆炸有一個簡單有效的解決方案:如果梯度超過閾值,就截斷它們。

 ——《Neural Network Methods in Natural Language Processing》,2017.

具體來說,檢查誤差梯度的值是否超過閾值,如果超過,則截斷梯度,將梯度設定為閾值。

梯度截斷可以一定程度上緩解梯度爆炸問題(梯度截斷,即在執行梯度下降步驟之前將梯度設定為閾值)。

     ——《深度學習》,2016.

在 Keras 深度學習庫中,你可以在訓練之前設定優化器上的 clipnorm 或 clipvalue 引數,來使用梯度截斷。

預設值為 clipnorm=1.0 、clipvalue=0.5。詳見:https://keras.io/optimizers/。


(5)使用權重正則化(Weight Regularization)

如果梯度爆炸仍然存在,可以嘗試另一種方法,即檢查網路權重的大小,並懲罰產生較大權重值的損失函式。該過程被稱為權重正則化,通常使用的是 L1 懲罰項(權重絕對值)或 L2 懲罰項(權重平方)。

對迴圈權重使用 L1 或 L2 懲罰項有助於緩解梯度爆炸。

——On the difficulty of training recurrent neural networks,2013.

在 Keras 深度學習庫中,你可以通過在層上設定 kernel_regularizer 引數和使用 L1 或 L2 正則化項進行權重正則化。


34.LSTM神經網路輸入輸出究竟是怎樣的?

解析:

第一要明確的是神經網路所處理的單位全部都是:向量

下面就解釋為什麼你會看到訓練資料會是矩陣和張量

常規feedforward 輸入和輸出:矩陣

        輸入矩陣形狀:(n_samples, dim_input)

        輸出矩陣形狀:(n_samples, dim_output)

注:真正測試/訓練的時候,網路的輸入和輸出就是向量而已。加入n_samples這個維度是為了可以實現一次訓練多個樣本,求出平均梯度來更新權重,這個叫做Mini-batch gradient descent。 如果n_samples等於1,那麼這種更新方式叫做Stochastic Gradient Descent (SGD)。

Feedforward 的輸入輸出的本質都是單個向量。


常規Recurrent (RNN/LSTM/GRU) 輸入和輸出:張量

        輸入張量形狀:(time_steps, n_samples,  dim_input)

        輸出張量形狀:(time_steps, n_samples,  dim_output)

注:同樣是保留了Mini-batch gradient descent的訓練方式,但不同之處在於多了time step這個維度。 

Recurrent 的任意時刻的輸入的本質還是單個向量,只不過是將不同時刻的向量按順序輸入網路。所以你可能更願意理解為一串向量 a sequence of vectors,或者是矩陣。


python程式碼表示預測的話:

import numpy as np


#當前所累積的hidden_state,若是最初的vector,則hidden_state全為0

hidden_state=np.zeros((n_samples, dim_input))


#print(inputs.shape): (time_steps, n_samples,  dim_input)

outputs = np.zeros((time_steps, n_samples, dim_output))


for i in range(time_steps):

    #輸出當前時刻的output,同時更新當前已累積的hidden_state

    outputs[i],hidden_state = RNN.predict(inputs[i],hidden_state)

#print(outputs.shape): (time_steps, n_samples, dim_output)


但需要注意的是,Recurrent nets的輸出也可以是矩陣,而非三維張量,取決於你如何設計。

(1)若想用一串序列去預測另一串序列,那麼輸入輸出都是張量 (例如語音識別 或機器翻譯 一箇中文句子翻譯成英文句子(一個單詞算作一個向量),機器翻譯還是個特例,因為兩個序列的長短可能不同,要用到seq2seq;

(2)若想用一串序列去預測一個值,那麼輸入是張量,輸出是矩陣 (例如,情感分析就是用一串單片語成的句子去預測說話人的心情)


Feedforward 能做的是向量對向量的one-to-one mapping,

Recurrent 將其擴充套件到了序列對序列 sequence-to-sequence mapping.

但單個向量也可以視為長度為1的序列。所以有下圖幾種型別:


640?wx_fmt=png

 

除了最左側的one to one是feedforward 能做的,右側都是Recurrent所擴充套件的


若還想知道更多

(1)可以將Recurrent的橫向操作視為累積已發生的事情,並且LSTM的memory cell機制會選擇記憶或者忘記所累積的資訊來預測某個時刻的輸出。

(2)以概率的視角理解的話:就是不斷的conditioning on已發生的事情,以此不斷縮小sample space

(3)RNN的思想是: current output不僅僅取決於current input,還取決於previous state;可以理解成current output是由current input和previous hidden state兩個輸入計算而出的。並且每次計算後都會有資訊殘留於previous hidden state中供下一次計算。


35.什麼是RNN?

解析:

RNNs的目的使用來處理序列資料。在傳統的神經網路模型中,是從輸入層到隱含層再到輸出層,層與層之間是全連線的,每層之間的節點是無連線的。但是這種普通的神經網路對於很多問題卻無能無力。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。


RNNs之所以稱為迴圈神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的資訊進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連線而是有連線的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。


理論上,RNNs能夠對任何長度的序列資料進行處理。但是在實踐中,為了降低複雜性往往假設當前的狀態只與前面的幾個狀態相關,下圖便是一個典型的RNNs: 

640?wx_fmt=jpeg

RNNs包含輸入單元(Input units),輸入集標記為{x0,x1,...,xt,xt+1,...},而輸出單元(Output units)的輸出集則被標記為{y0,y1,...,yt,yt+1.,..}。RNNs還包含隱藏單元(Hidden units),我們將其輸出集標記為{s0,s1,...,st,st+1,...},這些隱藏單元完成了最為主要的工作。你會發現,在圖中:有一條單向流動的資訊流是從輸入單元到達隱藏單元的,與此同時另一條單向流動的資訊流從隱藏單元到達輸出單元。在某些情況下,RNNs會打破後者的限制,引導資訊從輸出單元返回隱藏單元,這些被稱為“Back Projections”,並且隱藏層的輸入還包括上一隱藏層的狀態,即隱藏層內的節點可以自連也可以互連。

 

640?wx_fmt=png


上圖將迴圈神經網路進行展開成一個全神經網路。例如,對一個包含5個單詞的語句,那麼展開的網路便是一個五層的神經網路,每一層代表一個單詞。對於該網路的計算過程如下:


(1)xt表示第t,t=1,2,3...步(step)的輸入。比如,x1為第二個詞的one-hot向量(根據上圖,x0為第一個詞); 

(2) st為隱藏層的第t步的狀態,它是網路的記憶單元。 st根據當前輸入層的輸出與上一步隱藏層的狀態進行計算。st=f(Uxt+Wst−1),其中f一般是非線性的啟用函式,如tanh或ReLU,在計算s0時,即第一個單詞的隱藏層狀態,需要用到s−1,但是其並不存在,在實現中一般置為0向量;

(3)ot是第t步的輸出,如下個單詞的向量表示,ot=softmax(Vst). 


參考資料:

1. YJango,

https://www.zhihu.com/question/41949741

2. 一隻鳥的天空,

http://blog.csdn.net/heyongluoyao8/article/details/48636251


題目來源:

七月線上官網(https://www.julyedu.com/)——面試題庫——面試大題——深度學習 第26-30題。

640?wx_fmt=gif

為了幫助大家更好的學習和理解深度學習,我們特意推出了“深度學習第四期”課程,7月31日開課,每週二週四晚上8~10點直播上課,每次課至少2小時,共10次課;本課程提供以下服務:直播答疑、課後回放、佈置作業且解答、畢業考試且批改、面試輔導。課程詳情可點選文末“閱讀原文”進行檢視,或者加微信客服:julyedukefu_02 進行諮詢。

掃碼加客服微信

640?wx_fmt=jpeg

640?wx_fmt=jpeg

相關文章