1. 程式人生 > >DeepLearning.ai筆記:(5-1)-- 迴圈神經網路(Recurrent Neural Networks)

DeepLearning.ai筆記:(5-1)-- 迴圈神經網路(Recurrent Neural Networks)


title: ‘DeepLearning.ai筆記:(5-1)-- 迴圈神經網路(Recurrent Neural Networks)’
id: dl-ai-5-1
tags:

  • dl.ai
    categories:
  • AI
  • Deep Learning
    date: 2018-10-18 10:26:52

第五門課講的是序列模型,主要是對RNN演算法的應用,如GRU,LSTM演算法,應用在詞嵌入模型,情感分類,語音識別等領域。

第一週講的是RNN的基本演算法。

序列模型的應用

序列模型用在了很多的地方,如語音識別,音樂生成,情感分類,DNA序列分析,機器翻譯,視訊內容檢測,名字檢測等等。

數學符號

先講一下NG在課程中主要用到的數學符號。

對於輸入一個 x x 的句子序列,可以細分為一個個的詞,每一個詞記為KaTeX parse error: Expected '}', got '\>' at position 6: x^{<t\̲>̲},對應的輸出 y

y 記為KaTeX parse error: Expected '}', got '\>' at position 6: y^{<t\̲>̲}

其中,輸入x的序列長度為 T x T_x ,輸出 y

y 的序列長度為 T y T_y

而針對很多個不同的序列,KaTeX parse error: Expected '}', got '\>' at position 9: X^{(i)<t\̲>̲}表示第 i i 個樣本的第t的詞。

那麼如何用數學的形式表示這個KaTeX parse error: Expected '}', got '\>' at position 6: x^{<t\̲>̲}呢?這裡用到了one-hot編碼,假設詞表中一共有10000個詞彙,那麼KaTeX parse error: Expected '}', got '\>' at position 6: x^{<t\̲>̲}就是一個長度為10000的向量,在這之中只有一個維度是1,其他都是0

迴圈神經網路

如果用傳統的神經網路,經過一個N層的神經網路得到輸出y。

效果並不是很好,因為:

  • 輸入和輸出在不同的樣本中是可以不同長度的(每個句子可以有不同的長度)
  • 這種樸素的神經網路結果並不能共享從文字不同位置所學習到的特徵。(如卷積神經網路中學到的特徵的快速地推廣到圖片其他位置)

所以迴圈神經網路採用每一個時間步來計算,輸入一個KaTeX parse error: Expected '}', got '\>' at position 6: x^{<t\̲>̲}和前面留下來的記憶KaTeX parse error: Expected '}', got '\>' at position 8: a^{<t-1\̲>̲},來得到這一層的輸出KaTeX parse error: Expected '}', got '\>' at position 6: y^{<t\̲>̲}和下一層的記憶KaTeX parse error: Expected '}', got '\>' at position 6: a^{<t\̲>̲}

這裡需要注意在零時刻,我們需要編造一個啟用值,通常輸入一個零向量,有的研究人員會使用隨機的方法對該初始啟用向量進行初始化。同時,上圖中右邊的迴圈神經網路的繪製結構與左邊是等價的。

迴圈神經網路是從左到右掃描資料的,同時共享每個時間步的引數。

  • W a x W_{ax} 管理從輸入KaTeX parse error: Expected '}', got '\>' at position 6: x^{<t\̲>̲}到隱藏層的連線,每個時間步都使用相同的 W a x W_{ax} ,同下;
  • W a a W_{aa} 管理啟用值KaTeX parse error: Expected '}', got '\>' at position 6: a^{<t\̲>̲}到隱藏層的連線;
  • W y a W_{ya} 管理隱藏層到啟用值KaTeX parse error: Expected '}', got '\>' at position 6: y^{<t\̲>̲}的連線。

RNN的前向傳播

前向傳播公式如圖,這裡可以把 W a a W a x W_{aa},W_{ax} 合併成一項,為 W a W_a ,而後將KaTeX parse error: Expected '}', got '\>' at position 9: [a^{<t-1\̲>̲},x^{<t\>}]合併成一項。

RNN的反向傳播

定義一個loss function,然後倒回去計算。

不同型別的RNN

對於RNN,不同的問題需要不同的輸入輸出結構。

  • One to many:如音樂生成,輸入一個音樂型別或者空值,生成一段音樂
  • Many to one:如情感分類問題,輸入某個序列,輸出一個值來判斷得分。
  • many to many( T x = T y T_x = T_y ):輸入和輸出的序列長度相同
  • many to many( T x ! = T y T_x != T_y ):如機器翻譯這種,先輸入一段,然後自己生成一段,輸入和輸出長度不一定相同的。

語言模型和序列生成

什麼是語言模型?

對於下面的例子,兩句話有相似的發音,但是想表達的意義和正確性卻不相同,如何讓我們的構建的語音識別系統能夠輸出正確地給出想要的輸出。也就是對於語言模型來說,從輸入的句子中,評估各個句子中各個單詞出現的可能性,進而給出整個句子出現的可能性。

使用RNN構建語言模型:

  • 訓練集:一個很大的語言文字語料庫;
  • Tokenize:將句子使用字典庫標記化;其中,未出現在字典庫中的詞使用“UNK”來表示;
  • 第一步:使用零向量對輸出進行預測,即預測第一個單詞是某個單詞的可能性;
  • 第二步:通過前面的輸入,逐步預測後面一個單詞出現的概率;

對新序列取樣

當我們訓練得到了一個模型之後,如果我們想知道這個模型學到了些什麼,一個非正式的方法就是對新序列進行取樣。具體方法如下:

在每一步輸出 y y 時,通常使用 softmax 作為啟用函式,然後根據輸出的分佈,隨機選擇一個值,也就是對應的一個字或者英文單詞。

然後將這個值作為下一個單元的x輸入進去(即KaTeX parse error: Expected '}', got '\>' at position 6: x^{<t\̲>̲}=y^{<t−1\>}), 直到我們輸出了終結符,或者輸出長度超過了提前的預設值n才停止取樣。

RNN的梯度消失

RNN存在一個梯度消失問題,如:

  • The cat, which already ate …………,was full;
  • The cats, which already ate …………,were full.

cat 和 cats要經過很長的一系列詞彙後,才對應 was 和 were,但是我們在傳遞過程中KaTeX parse error: Expected '}', got '\>' at position 6: a^{<t\̲>̲}很難記住前面這麼多詞彙的內容,往往只和前面最近幾個詞彙有關而已。

當然,也有可能是每一層的梯度都很大,導致的梯度爆炸問題,不過這個問題可以通過設定閾值來解決,關鍵是要解決梯度消失問題。我們知道一旦神經網路層次很多時,反向傳播很難影響前面層次的引數。

GRU(Gated Recurrent Unit)

那麼如何解決梯度消失問題了,使用GRU單元可以有效的捕捉到更深層次的連線,來改善梯度消失問題。

原本的RNN單元如圖:

而GRU單元多了一個c(memory cell)變數,用來提供長期的記憶能力。

具體過程為:

完整的GRU還存在另一個門,用來控制 c ˉ \bar c KaTeX parse error: Expected '}', got '\>' at position 8: c^{<t-1\̲>̲}之間的聯絡強弱:

LSTM(Long short-term memory)

GRU能夠讓我們在序列中學習到更深的聯絡,長短期記憶(long short-term memory, LSTM)對捕捉序列中更深層次的聯絡要比GRU更加有效。

GRU只有兩個門,而LSTM有三個門,分別是更新門、遺忘門、輸出門: Γ u , Γ f , Γ o \Gamma_u,\Gamma_f, \Gamma_o

GRU和LSTM公式對比

更新門:用來決定是否更新KaTeX parse error: Expected '}', got '\>' at position 11: \bar c^{<t\̲>̲}

遺忘門:來決定是否遺忘上一個KaTeX parse error: Expected '}', got '\>' at position 8: c^{<t-1\̲>̲}

輸出門:來決定是否輸出KaTeX parse error: Expected '}', got '\>' at position 6: c^{<t\̲>̲}

雙向RNN

雙向RNN(bidirectional RNNs)模型能夠讓我們在序列的某處,不僅可以獲取之間的資訊,還可以獲取未來的資訊。

對於下圖的單向RNN的例子中,無論我們的RNN單元是基本的RNN單元,還是GRU,或者LSTM單元,對於例子中第三個單詞”Teddy”很難判斷是否是人名,僅僅使用前面的兩個單詞是不夠的,需要後面的資訊來進行判斷,但是單向RNN就無法實現獲取未來的資訊。

而雙向RNN則可以解決單向RNN存在的弊端。在BRNN中,不僅有從左向右的前向連線層,還存在一個從右向左的反向連線層。

Deep RNN

與深層的基本神經網路結構相似,深層RNNs模型具有多層的迴圈結構,但不同的是,在傳統的神經網路中,我們可能會擁有很多層,幾十層上百層,但是對與RNN來說,三層的網路結構就已經很多了,因為RNN存在時間的維度,所以其結構已經足夠的龐大。如下圖所示: