Deep Learning | Andrew Ng (05-week1)—循環序列模型

【第 5 部分-序列模型-第一週】在吳恩達深度學習視頻基礎上,筆記總結,添加個人理解。後期複習階段參考 大樹先生的博客 鏈接看這裏 大樹先生 - ZJ

Coursera 課程 |deeplearning.ai |網易雲課堂

CSDNhttp://blog.csdn.net/JUNJUN_ZHAO/article/details/79362639


循環序列模型 (Recurrent Neural Networks)

1.1 爲什麼選擇序列模型?(Why sequence models?)

深度學習中最激動人心的領域之一:序列模型。

例如循環神經網絡(RNN)在語音識別,自然語言處理等其他領域中引起變革。

能夠應用序列模型的例子:語音識別、音樂生成、情感分類、DNA 序列分析、機器翻譯、視頻活動識別、名稱實體識別等。

序列模型的應用

  • 語音識別:將輸入的語音信號直接輸出相應的語音文本信息。無論是語音信號還是文本信息均是序列數據。
  • 音樂生成:生成音樂樂譜。只有輸出的音樂樂譜是序列數據,輸入可以是空或者一個整數。
  • 情感分類:將輸入的評論句子轉換爲相應的等級或評分。輸入是一個序列,輸出則是一個單獨的類別。
  • DNA序列分析:找到輸入的DNA序列的蛋白質表達的子序列。
  • 機器翻譯:兩種不同語言之間的相互轉換。輸入和輸出均爲序列數據。
  • 視頻行爲識別:識別輸入的視頻幀序列中的人物行爲。
  • 命名實體識別:從輸入的句子中識別實體的名字。

這裏寫圖片描述

學習目標:學習構建自己的序列模型。


1.2 數學符號 (Notation)

定義數學符號開始,一步步構建序列模型。

這裏寫圖片描述

  • 輸入 x : Harry Potter and Hermione Granger invented a new spell.

目標:構建一個能夠自動識別句中人名位置序列模型。—命名實體識別問題(Named-entity recognition)NER

此例子中爲:識別 Harry Potter 和 Hermione Granger

x1x2x3......xt......x9 9 組特徵表示上述 x 中 9 個單詞。

  • 輸出 y : 1 1 0 1 1 0 0 0 0

y1y2y3......yt......y9

t : 意味着這些是時間序列。

  • 輸入序列的長度:Tx=9

  • 輸出序列的長度:Ty=9

x(i)t : 第 i 個 訓練樣本 x 的第 t 個元素。 Tx(i) : 第 i 個訓練樣本的輸入序列長度。

y(i)t : 第 i 個訓練樣本 y 的第 t 個元素。 Ty(i) : 第 i 個訓練樣本的輸出序列長度。

這裏寫圖片描述

使用自然語言處理 (NLP),如何在序列中表示單個單詞?

首先,需要詞彙表(字典)。列出在表示中所使用的所有單詞。如圖中所表示,不同的單詞在自己的詞彙表中對應得索引不同。
此例子中使用的 10000 個單詞的詞彙表,根據不同的商業模式,應用,所構建的詞彙表不同,30000,50000,(大型互聯網)1000000等。

One-hot 向量表示法:

如上圖所示:x1 是一個 10000 維度的向量,只有 第 4075 索引位置是 1,其餘位置都是 0 。

對於不在詞彙表中的單詞的表示:返回 <UNK> (Unknown Word)


1.3 循環神經網絡模型 (Recurrent Neural Network Model)

對於上述 命名實體識別問題 (NER) 之所以不使用標準神經網絡(standard network)來解決,是因爲存在兩個主要問題。

這裏寫圖片描述

  1. 首先是在不同的例子中輸入和輸出可以是不同的長度。
  2. 像這樣一個簡單的神經網絡架構,它不會共享在文本中不同位置上學到的特徵。(例如卷積神經網絡,可以傳遞學習到的特徵等)
    • 此外,每一個訓練樣本都是一個 10,000 維的向量。所以,這只是一個非常大的輸入層,同時,第一層的權重矩陣將最終具有大量的參數。

這裏寫圖片描述

使用循環神經網絡(RNN) 可以解決上述兩個問題。

什麼是循環神經網絡?

如果你從左到右閱讀句子,第一個單詞 x1 以及 初始化 a0 零向量 ,帶入到神經網絡層(隱含層),嘗試預測輸出 y^1 ,同時在時間步 1 產生 a1 。然後,將 a1x2 帶入到神經網絡層(隱含層),嘗試預測輸出 y^2 ,然後前向廣播,進入下一個時間步……直到最後輸入 xTx ,輸出 y^Ty 。因此,在每個時間步,循環神經網絡將這個激活傳遞給下一個時間步,供它使用。

在這個例子中,Tx=Ty ,若 TxTy 不同,體系結構會改變一點。

上圖中右側圖表,是在 論文或書籍中常見的圖表,爲了便於理解,Andrew Ng 使用左側圖表展開講解。

每個時間步的參數是共享的,每一部分都受到參數的影響,如 Waa,Wax,Wya ,後面在解釋這些參數的工作原理。

循環神經網絡是從左到右掃描數據的,同時共享每個時間步的參數。

  • Wax 管理從輸入x<t> 到隱藏層的連接,每個時間步都使用相同的 Wax ,同下;
  • Waa 管理激活值a<t> 到隱藏層的連接;
  • Wya 管理隱藏層到激活值y<t> 的連接。

RNN 的一個弱點:,它只使用序列中較早的信息進行預測,特別是在預測 y^3 時,不使用 x4x5x6 等單詞的信息。

例如:

  1. He said,”Teddy Roosevelt was a great President.”
  2. He said,”Teddy bears are on sale!”

上述例子中,Teddy Roosevelt 是人名。Teddy bears 並非我們想要識別的內容,但是如果只知道前三個單詞 是無法準確識別的,還需要後面的單詞信息。所以這個特定的神經網絡結構的一個限制是,在某一時刻的預測使用輸入或使用來自序列中較早的輸入的信息,而不是在該序列的後面的信息。

後面的視頻將講解 雙向遞歸神經網絡 (BRNN),來解決這個問題。

這裏寫圖片描述

前向傳播:

a0=0

a1=g(Waaa0+Waxx1+ba)

y^1=g(Wyaa1+by)

at=g(Waaat1+Waxxt+ba)

y^t=g(Wyaat+by)
  • 對於激活函數計算 at 常用的是 tanh , 也有使用 Relu 的。(使用 tanh 函數梯度消失的問題會用其他方式解決)

  • 對於輸出 y^ ,根據具體問題選取不同激活函數,如二分類問題可使用 sigmoid,其他 輸出 如 softmax 等。

  • 注:其中Wax 中,前面的 a 表示要得到一個 a 類型的量,x 表示參數W 要乘以一個 x 類型的量,其餘WaaWya 同理;

這裏寫圖片描述

簡化 RNN 符號表示:

at=g(Waaat1+Waxxt+ba)

y^t=g(Wyaat+by)

簡化爲:

at=g(Wa[at1,xt]+ba)

y^t=g(Wyat+by)

其中,使用矩陣的疊加簡化:

  • Wa=[WaaWax] ,假如 a<t1> 是100維,x<t> 是10000 維,那麼Waa 便是(100,100)維的矩陣,Wax 便是(100,10000)維的矩陣。堆疊起來,Wa 便是(100,10100)維的矩陣。
  • [a,x]=[a<t1>x<t>] 表示一個(10100)維的矩陣。

1.4 通過時間的反向傳播 (Backpropogation through time)

上一節講述的是 RNN 的基本結構,以及前向廣播,這一節學習目標是:瞭解 RNN 的反向傳播是如何工作的。

這裏寫圖片描述

紅色箭頭方向是反向傳播。

這裏寫圖片描述

如上圖所示:紅色箭頭方向是反向傳播。綠色線參數相同。

邏輯迴歸損失,也稱爲交叉熵損失。

單個單一位置或單個時間預測的單個詞彙的損失:

Lt(y^t,yt)=y(i)logy^t(1yt)log(1y^t)

如上圖所示,每個特徵元素計算損失值。

整個序列的整體損失:

L(y^,y)=t=1TyLt(y^t,yt)

以上是 RNN 前向和反向的工作原理,以上講解的例子都是輸入序列的長度等於輸出序列的長度,接下來會展示更廣泛的RNN架構。


1.5 不同類型的循環神經網絡 (Different types of RNNs)

到目前爲止,您已經看到了一種 RNN 架構,例如在 Name entity recognition 中Tx=Ty 。接下來介紹其他不同的 RNN 體系結構。

這裏寫圖片描述

上圖所示例子中,展示了多種不同的 RNN 架構。TxTy 存在不相等的情況。

這裏寫圖片描述

  • Many-to-Many(相等) : Tx=Ty ,如 Name entity recognition (命名實體識別)。

  • Many-to-One : TxTyx=text,y=0/11...5 等,如 Sentiment Classification (情感分類),要對某個序列進行正負判別或者打星操作。在這種情況下,就是輸入是一個序列,但輸出只有一個值

  • One-to-One : 標準神經網絡。

這裏寫圖片描述

  • One-to- Many: TxTyx=Ø ,x 可以爲空集, 如 Music generation (音樂生成) 。當你真正生成序列的時候,經常會把這些前一個合成的輸出文件輸入到下一層。

  • Many-to-Many(不等) : TxTy ,如 Machine translation (機器翻譯),法語翻譯成英語,單詞數量是不同的,則使前半部分爲 encoder,共 Tx 個,後半部分爲 decoder ,共 Ty 個。

這裏寫圖片描述

其中很有意思的一部分是 序列生成,下節講解。


1.6 語言模型和序列生成 (Language model and sequence generation)

那麼什麼是語言模型?

這裏寫圖片描述

在語音識別系統中,我說了一句話,然後一個語言模型能夠告訴我,對於這句話識別得到的多種可能性中,哪種可能概率高。它所做的就是,可以告訴你某個特定的句子出現的概率是多少。

語言模型的基本工作原理可以理解爲,輸出一段語句,它可以給出每一部分的概率,表示爲P(y1,y2......,yTy) ,注意,這裏用 y 表示,比用 x 表示更合適。後面會解釋。

這裏寫圖片描述

如何建立一個語言模型呢?要使用 RNN 建立這樣一個模型,你首先需要一個訓練集包括大量的英文文本。NLP 術語:語料庫。

如上圖所示,在有了以上基礎的前提下,在訓練集中的一個句子。Cats average 15 hours of sleep a day.

這句話結尾需添加一個 Tokenize <EOS>代表句子結束。 然後 每一個單詞 使用 One-hot vectors 表示。如 10000 維度的向量。

如上圖所示,不在詞彙表中的使用 <UNK> 表示。

對於訓練樣本 xt=yt1 , 下面解釋爲什麼這麼表示。

這裏寫圖片描述

如上圖所示:注意一開始,從左向右看,第一個詞是未知的。

x1=0 ,a0=0 ,然後預測輸出 y^1 使用 softmax ,假設詞彙表是 10000 個,則預測輸出的 概率是 P(a)P(aron)....P(cats)...P(Zulu) 額外還有 P(<UNK>)P(<EOS>) 共 10002 個。

然後在預測出第一個之後,會將第一個正確的單詞作爲輸入,x2=y1 來預測第二個單詞 y^2 , P(average | cats)。如上圖所示,依次代入,一直到預測完最後一個單詞。注意 因爲句子結尾是 <EOS> 所以 最後一個的 輸入爲 x9=y8 ,輸出爲 y^9 P(<EOS>| ...... )

單個語句的損失函數(softmax 層後的函數輸出):

L(y^t,yt)=iyitlogy^it

整個句子的損失函數:

L=Lt(y^t,yt)

簡單的例子,一個句子有三個單詞,分別定義爲 y1,y2,y3 ,那麼它的概率是:

P(y1,y2,y3)=P(y1)P(y2|y1)P(y3|y1,y2)

1.7 對新序列採樣 (Sampling novel sequences)

在訓練完一個序列模型之後,要想了解這個模型學習到了什麼,可以採用一個非正式的方法是:進行一次新序列採樣。

記住:一個序列模型,模擬了任意特定單詞序列的概率。

我們要做的就是對這個概率分佈進行採樣,來生成一個新的單詞序列。

這裏寫圖片描述

首先 :x1=0 , a0=0 , 然後預測輸出 y^1 ,得出的概率比如是:P(a)P(aron)….P(cats)…P(Zulu)P(<UNK>) ,然後 使用採樣函數,如 np.random.choice 對 softmax 分佈進行隨機採樣。得出 y^1 是 The, 然後輸入到下一層,前向廣播,進入下一個時間步。直到結束。

如何標記結束?有兩種方式: 1. 詞彙表中含有 <EOS> 2. 限定時間步,20 ,100 等。

而這個特定的程序有時會產生一個 <UNK> 的單詞標記。如果你想確保你的算法從來沒有產生這個標記,你可以做的一件事就是拒絕任何以未知的單詞標記出來的樣本,並且繼續從其他詞彙中重新採樣,直到你得到一個不是未知的單詞。

最後,經過以上步驟,就隨機產生了一些序列語句。

這裏寫圖片描述

目前我們建立的都是基於詞彙的 RNN 模型,根據實際應用,也可以建立一個基於字符的 RNN 結構。如上圖所示。

Vocabulary = [a,b,c,…0,1,…9, ; ,’, : , ,…A….Z]

相對應的 y1,y2,y3 都是字符,而不是單個詞彙,如 Cats average …. y1=C,y2=a,y3=t,y4=

基於字符的優點: 不用擔心 UNK 出現。
主要的缺點:最後會得到太多太長的序列,所以在捕捉句子中的依賴關係方面,效果並不是很好。計算訓練成本也很高。

所以目前的趨勢和常見的均是基於詞彙的語言模型。但隨着計算機運算能力的增強,在一些特定的情況下,也會開始使用基於字符的語言模型。

這裏寫圖片描述

上圖,左側是 一則新聞,右側是 模仿莎士比亞的詩。


1.8 帶有神經網絡的梯度消失 (Vanishing gradients with RNNs)

前面已經瞭解了 RNN 的工作原理,接下來了解其中存在的問題,以及解決辦法。

基本的 RNN 算法,存在一個很大的問題: 就是梯度消失。

這裏寫圖片描述

如圖上所示:第一句 前面的 cat 單數 決定後面 是 was。 第二句 前面的 cats 複數決定後面是 were。這就是語言具有非常長期的依賴關係的一個例子。

而迄今爲止我們已經看到了 RNN 的基礎結構,它不是非常擅長捕獲非常長期的依賴關係。

解釋爲什麼?回想之前學過的梯度消失問題。

一個非常非常深的神經網絡,前向傳播,再反向傳播,輸出的 y^ 很難再影響前面層的權重。則 RNN 同理,梯度消失,不擅長捕捉長期依賴。

回想 梯度爆炸問題:指數級大的梯度 會導致 參數爆炸性增長,神經網絡參數崩潰,會看到很多 NaN,這意味着在你的神經網絡計算數值溢出的結果。

總結:訓練很深的神經網絡時,隨着層數的增加,導數會出現指數級的下降,則導致 梯度消失。或者指數級的增加,導致梯度爆炸。

解決梯度爆炸問題可以使用 梯度修剪(gradient clipping)解決。觀察梯度向量,如果大於某個閾值,可以適當地縮放梯度,保證其不會太大,(通過最大值 閾值來修剪),相對具有魯棒性。

而梯度消失就比較難解決,下面介紹 GRU (Gated Recurrent Unit)門控循環單元,來解決這個問題。


1.9 GRU 單元 (Gated Recurrent Unit )

以上已經瞭解了基礎 RNN 模型的運行機制。本節介紹 GRU 。改變了 神經網絡隱藏層,使其可以更好的捕捉深層連接,並改善了梯度消失問題。

這裏寫圖片描述

at=g(Wa[at1,xt]+ba)

如計算在時間 t 的激活值 at , 輸入 權重 Wa ,上一個時間步的 激活值 at1 ,當前輸入值 xt ,以及偏移量 ba 。激活函數 g ,比如是 tanh。 上圖中 左側部分,繪畫了 輸入及輸出,經過 tanh 後,在經過 softmax ,再輸出 y^t

講解這個圖的目的是,將使用類似的圖來講解 GRU。

這裏寫圖片描述

c = memory cell : 記憶細胞,提供記憶能力,如 主語貓是單數還是複數。

  • ct=at 在 GRU 中這兩個值是相同的,後面的 LSTM 中是不同的

  • c~t=tanh(Wc[ct1,xt]+bc

    c~t= : 候選值,代替 ct 的值,tanh 激活函數計算,Wc 權重,ct1 前一個時間步的記憶值,xt 當前輸入值。bc 偏移項。

    重點:GRU 中的真正思想。(決定是否更新)

  • Γu=σ(Wu[ct1,xt]+bu)

    Γu :更新門 (符號比較像 門的邊緣),0 到 1 之間的值。σ sigmoid 函數 (其函數圖 回想下,介於 0 到 1 之間) u: update 更新

    假設 cat 輸出 是 ct=1 (1 代表單數,0 代表複數)memory cell 在從左往右讀的過程中,會一直記住 這個值,直到 到了 was ,根據 ct=1 所以決定用 was 。

    Γu 決定什麼時候更新這個值,比如 看到 the cat 那麼這是個好的時機去更新 ct=1

  • ct=Γuc~t+(1Γu)ct1

    ct 等於 門的值 element-wise 候選值, (1Γu) element-wise 舊的值。若 Γu1 則代表把候選值 設爲新的值。 若 Γu0 則代表 不更新,還是用舊的值。

詳細的圖解看上圖 左側圖示。簡化的 GRU 示意圖。

優點:從左到右掃描句子時,門可以決定在哪個時間是否更新值。指導需要使用記憶細胞的時候。

Γu=0.000000001 可以緩解梯度消失的問題,即使經過了很多很多的時間步,這個值也可以很好的維持。關鍵所在

注意細節: ct 可以是向量,比如 維度 100 ,同理 上圖中所標註出來的,都是相同的維度。

這裏寫圖片描述

完整 (Full) GRU :

再添加一個門 Γr ,r 可以理解爲代表相關性(relativity),前一個 ct1 對於計算 c~t 有多大的相關性。

c~t=tanh(Wc[Γrct1,xt]+bc)

Γu=σ(Wu[ct1,xt]+bu)

Γr=σ(Wr[ct1,xt]+br)

ct=Γuc~t+(1Γu)ct1

at=ct

產生更大的影響,更好的緩解 梯度消失問題,GRU 是一個常用的版本。LSTM (Long Short Term Memory 長短時記憶網絡)也是比較常用的。


1.10 長短期記憶 Long Short Term Memory Unit (LSTM)

上一節學習的 GRU ,它能夠在序列中學習到非常深的連接,此外 LSTM 也可以做到這一點。且比 GRU 更有效。

這裏寫圖片描述

GRU 回顧:

  • c~t : 代替記憶細胞的候選值。

  • Γu : 更新門,決定什麼時候更新。

  • Γr :相關門,決定前面的序列對後面序列有多大的影響,彼此之間的相關性

  • ct : 由上述幾個值,共同決定是否更新。

  • at=ct : 這裏是相等的。

LSTM:

c~t=tanh(Wc[at1,xt]+bc)

(update) :

Γu=σ(Wu[at1,xt]+bu)

(forget) :

Γf=σ(Wf[at1,xt]+bf)

(output) :

Γo=σ(Wo[at1,xt]+bo)

ct=Γuc~t+Γfct1
# 是維持舊的記憶細胞的值,還是加上新的值。

at=Γoct

在本週結束後的作業練習中:上面的公式是這麼寫的

at=Γottanh(ct)

注意:這裏是三個門,更新門,遺忘門,輸出門。與 GRU 的區別,atct 不相等。

這裏寫圖片描述

公式其實更好理解,上右側圖 展示的更加直觀些。

上圖下方的紅色直線,說明 只要正確了設置了 更新門和遺忘門,LSTM 就能把 c0 一直往下傳遞到 後面某個記憶單元。這也是爲什麼 LSTM 和 GRU 善於維持更深的聯繫,及時經過很長很長的時間步。

此外,上述的 LSTM 與常用的 LSTM 單元 區別在於,

Γo,Γf,Γu 這些門值取決於,不僅是 at1,xt 有時也可以 偷窺下 ct1 的值,這叫做 窺視孔連接 (peephole connection),還有一個細節,如果 ct1 如果是 一個 100 維的向量,其中 第 50 位是 1 , 那麼只會影響 第 50 位對應的門。

GRU 的優點:更簡單,可以構建更深的網絡,計算性能上,也運行的更快。
LSTM 優點:更加強大靈活,這是更好的選擇。


1.11 雙向神經網絡 (Bidirectional RNN)

到現在,之前已經學習瞭解了大部分 RNN 模型的關鍵的構建,此外還有兩個方法,可以構建更好的模型,其中之一就是雙向神經網絡,這個模型可以讓你在序列的某點處,不僅可以獲取之前的信息,也可以獲取未來的信息。本節講解。還有一個是 Deep RNN 下節講解。

這裏寫圖片描述

回顧之前的例子,命名實體識別問題(Named entity recognition),這個網絡存在的一個問題是,當判斷 Teddy 是否是人名中的一部分是,只看前面的部分是不夠的,還需有後面的信息共同進行判斷。需要使用 雙向神經網絡解決這個問題。

這裏寫圖片描述

BRNN 工作原理:

上圖中,綠色畫筆繪畫的部分就是,反向連接,從最後依次反向向前連接,因此網絡構成了一個無環圖(Acyclic graph)。

反向序列從 a4 ,反向進行,到a3 …..

所以整個前向廣播,分爲兩部分,一部分是從左到右,另一部分是從右到左。

最終預測輸出的值:y^t=g(Wy[at,at]+by)

(沒有找到合適的 latex 在字母上方表示向左的箭頭)

實踐中,大部分的 NLP 問題,採用 BRNN W/LSTM (有 LSTM 單元的 BRNN 模型)是一個不錯的選擇。

BRNN 缺點:需要完整的數據的序列,才能預測任意位置。比如,構建語音識別系統,需要等待一個人說完整個句子,才能語音處理,並進一步識別,所以實際上的大型的應用,都是更加複雜的模型。


1.12 深層循環神經網絡 (Deep RNNs)

目前爲止,學習到的不同的 RNN 版本,每一個都可以獨當一面,但是要學習非常複雜的函數,通常的做法是把 RNN 的多個層堆疊起來,來構建更深的模型。

目標:學習如何構建更深的模型。

這裏寫圖片描述

與之前的 標準 (standard)RNN 相比,改變了下符號表示,將 a0 改爲 a[1]0

a[l]t :l 表示 l 層。 t : 第 t 個時間步。

上圖所示爲,三個隱層的新網絡。

其中a[2]3 的計算是:

a[2]3=g(Wa[2][a[2]2,a[1]3]+ba[2])

y1 輸出之前可以做的改變是,增加縱向的連接,但是橫向的連接不會增加。這種結構更加常見。

其中的單元,可以是 標準的 RNN ,也可以是 GRU ,或者 LSTM BRNN 。


PS: 歡迎掃碼關注公衆號:「SelfImprovementLab」!專注「深度學習」,「機器學習」,「人工智能」。以及 「早起」,「閱讀」,「運動」,「英語 」「其他」不定期建羣 打卡互助活動。

發佈了186 篇原創文章 · 獲贊 44 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章