自吳恩達發布 deeplearning.ai 課程以來,很多學習者陸續完成了所有專項課程並精心製作了課程筆記,在此過程中機器之心也一直在為讀者推薦優質的筆記。上個月,deep learning.ai 第五課發布,該系列課程最終結課。Mahmoud Badry 在 GitHub 上開源了五項課程的完整筆記,介紹了包括序列模型在內的詳細知識點。機器之心簡要介紹了該項目,並重點描述了第五項課程序列模型。
項目地址:https://github.com/mbadry1/DeepLearning.ai-Summary
上周吳恩達在推特上展示了一份由 TessFerrandez 完成的深度學習專項課程信息圖,這套信息圖優美地記錄了深度學習課程的知識與亮點。這一份信息圖的詳細介紹請查看:這是一份優美的信息圖,吳恩達點讚的 deeplearning.ai 課程總結 。
Deeplearning.ai 課程開課以來,一直受到大家的關注,也有眾多讀者積極的參與到學習中。機器之心在這段時間內也介紹了多篇該系列課程的學習筆記,以下為前四課的筆記與學習心得:
吳恩達 Deeplearning.ai 課程學習全體驗:深度學習必備課程(已獲證書)入門 | 吳恩達 Deeplearning.ai 全部課程學習心得分享資源 | 吳恩達 deeplearning.ai 第四課學習心得:卷積神經網絡與計算機視覺
Mahmoud Badry 完成的筆記主要分為五部分,分別對應神經網絡與深度學習基礎、提升 DNN 性能的技巧與方法等、結構化機器學習項目、卷積神經網絡和序列模型五門課程。值得注意的是,該項目完成的筆記十分詳細,基本上五門課程的知識點全都覆蓋到了。例如第一項課程以每周不同主題為序記錄了從神經網絡簡介到 Goodfellow 採訪等基本知識點。
由於前四課很多知識點都已經介紹過,因此本文我們著重介紹第五課的筆記概要,讀者可自行查閱 GitHub 閱讀完整的筆記,也可查看機器之心往期發過的一些課程資料。
第五課序列模型簡介
本課程將講授如何構建自然語言、音頻和其他序列數據的模型。在深度學習的幫助下,序列算法比兩年前效果更好,用於大量有趣的應用,如語音識別、音樂合成、聊天機器人、機器翻譯、自然語言理解等。學完本課,你將:
了解如何構建和訓練循環神經網絡(RNN)及其常用變體,如 GRU 和 LSTM。使用序列模型處理自然語言問題,如文本合成。將序列模型應用到音頻應用中,如語音識別和音樂合成。這是 Deep Learning Specialization 課程的第五課,也是最後一課。
適用人群:
學完第一、二、四課的學習者。同樣推薦大家學習第三課。已經對神經網絡(包括 CNN)具備深厚理解,並想學習如何開發循環神經網絡的人。
該課程介紹循環神經網絡(RNN)、自然語言處理和詞嵌入還有序列模型和注意力機制等,以下將簡要介紹 Mahmoud Badry 所完成的序列模型筆記。
序列模型
序列模型(如 RNN 和 LSTM)極大地改變了序列學習,序列模型可通過注意力機制獲得增強。序列模型在語音識別、音樂生成、情感分類、DNA 序列分析、機器翻譯、視頻活動識別、命名實體識別等方面得到應用。
循環神經網絡模型(RNN)
循環神經網絡出現於 20 世紀 80 年代,最近由於網絡設計的推進和圖形處理單元上計算能力的提升,循環神經網絡變得越來越流行。這種網絡尤其是對序列數據非常有用,因為每個神經元或者單元能用它的內部存儲來保存之前輸入的相關信息。在語言的案例中,「I had washed my house」這句話的意思與「I had my house washed」大不相同。這就能讓網絡獲取對該表達更深的理解。
RNN 有很多應用,在自然語言處理(NLP)領域表現良好。下圖是一個用於解決命名實體識別任務的 RNN 網絡。
用於解決命名實體識別任務的 RNN 網絡。
簡化版 RNN 表示法。
沿時間的反向傳播(BPTT)
RNN 架構中的反向傳播,w_a、b_a、w_y、b_y 被序列中的所有元素共享。
這裡使用交叉熵損失函數:
其中第一個公式是序列中一個元素的損失函數,整個序列的損失是每個元素的損失之和。
在上圖中沿時間反向傳播中,激活值 a 從一個序列元素向另一個元素傳播。
RNN 的類型
RNN 的不同類型。
RNN 的梯度消失
「梯度消失」指的是隨著網絡深度增加,參數的梯度範數指數式減小的現象。梯度很小,意味著參數的變化很緩慢,從而使得學習過程停滯。循環神經網絡在語言建模等序列問題上有非常強大的力量,但同時它也存在很嚴重的梯度消失問題。因此像 LSTM 和 GRU 等基於門控的 RNN 有非常大的潛力,它們使用門控機制保留或遺忘前面時間步的信息,並形成記憶以提供給當前的計算過程。
門控循環單元(GRU)
GRU 旨在解決標準 RNN 中出現的梯度消失問題。GRU 背後的原理與 LSTM 非常相似,即用門控機制控制輸入、記憶等信息而在當前時間步做出預測,表達式如下:
GRU 有兩個有兩個門,即一個重置門(reset gate)和一個更新門(update gate)。從直觀上來說,重置門決定了如何將新的輸入信息與前面的記憶相結合,更新門定義了前面記憶保存到當前時間步的量。如果我們將重置門設置為 1,更新門設置為 0,那麼我們將再次獲得標準 RNN 模型。使用門控機制學習長期依賴關係的基本思想和 LSTM 一致,但還是有一些關鍵區別:
GRU 有兩個門(重置門與更新門),而 LSTM 有三個門(輸入門、遺忘門和輸出門)。GRU 並不會控制並保留內部記憶(c_t),且沒有 LSTM 中的輸出門。LSTM 中的輸入與遺忘門對應於 GRU 的更新門,重置門直接作用於前面的隱藏狀態。在計算輸出時並不應用二階非線性。
為了解決標準 RNN 的梯度消失問題,GRU 使用了更新門(update gate)與重置門(reset gate)。基本上,這兩個門控向量決定了哪些信息最終能作為門控循環單元的輸出。這兩個門控機制的特殊之處在於,它們能夠保存長期序列中的信息,且不會隨時間而清除或因為與預測不相關而移除。
帶有門控循環單元的循環神經網絡
以下展示了單個門控循環單元的具體結構。
門控循環單元
LSTM
使用傳統的通過時間的反向傳播(BPTT)或實時循環學習(RTTL/Real Time Recurrent Learning),在時間中反向流動的誤差信號往往會爆炸(explode)或消失(vanish)。但 LSTM 可以通過遺忘和保留記憶的機制減少這些問題。
LSTM 單元一般會輸出兩種狀態到下一個單元,即單元狀態和隱藏狀態。記憶塊負責記憶各個隱藏狀態或前面時間步的事件,這種記憶方式一般是通過三種門控機制實現,即輸入門、遺忘門和輸出門。
以下是 LSTM 單元的詳細結構,其中 Z 為輸入部分,Z_i、Z_o 和 Z_f 分別為控制三個門的值,即它們會通過激活函數 f 對輸入信息進行篩選。一般激活函數可以選擇為 Sigmoid 函數,因為它的輸出值為 0 到 1,即表示這三個門被打開的程度。
圖片來源於李弘毅機器學習講義。
若我們輸入 Z,那麼該輸入向量通過激活函數得到的 g(Z) 和輸入門 f(Z_i ) 的乘積 g(Z) f(Z_i ) 就表示輸入數據經篩選後所保留的信息。Z_f 控制的遺忘門將控制以前記憶的信息到底需要保留多少,保留的記憶可以用方程 c*f(z_f)表示。以前保留的信息加上當前輸入有意義的信息將會保留至下一個 LSTM 單元,即我們可以用 c' = g(Z)f(Z_i) + cf(z_f) 表示更新的記憶,更新的記憶 c' 也表示前面與當前所保留的全部有用信息。我們再取這一更新記憶的激活值 h(c') 作為可能的輸出,一般可以選擇 tanh 激活函數。最後剩下的就是由 Z_o 所控制的輸出門,它決定當前記憶所激活的輸出到底哪些是有用的。因此最終 LSTM 的輸出就可以表示為 a = h(c')f(Z_o)。
雙向 RNN(BRNN)
雙向 RNN 和深度 RNN 是構建強大序列模型的有效方法。下圖是一個命名實體識別任務的 RNN 模型:
BRNN 架構
BRNN 的缺點是在處理之前需要整個序列。
深度 RNN
深度 RNN 可幫助構建強大的序列模型。
3 層深度 RNN 圖示。
RNN 的反向傳播
在現代深度學習框架中,你只需實現前向傳播,框架會執行反向傳播,因此大部分機器學習工程師不需要擔心反向傳播。但是,如果你是微積分專家,想了解 RNN 中反向傳播的細節,可參考該 notebook:https://www.coursera.org/learn/nlp-sequence-models/notebook/X20PE/building-a-recurrent-neural-network-step-by-step。
自然語言處理與詞表徵
詞表徵在自然語言處理中是必不可少的部分,從早期的 One-Hot 編碼到現在流行的詞嵌入,研究者一直在尋找高效的詞表徵方法。Mahmoud Badry 在筆記中詳細記錄了詞嵌入方法,包括用於命名實體識別、人臉識別和翻譯系統的詞嵌入等,下圖展示了用於人臉識別的詞嵌入結構:
在這種詞嵌入方法中,我們可以將不同的人臉編碼壓縮為一個向量,進而根據該向量比較是不是同一張臉。
詞嵌入有非常多的優秀屬性,例如給定一張詞嵌入表。該筆記用案例來解釋詞嵌入的語義相近關係,如下圖所示,男性變化到女性與國王變化到女王的反向在嵌入空間內是相同的,這意味著詞嵌入捕捉到了詞與詞之間的語義相關性。
一般來說,Word2Vec 方法由兩部分組成。首先是將高維 one-hot 形式表示的單詞映射成低維向量。例如將 10,000 列的矩陣轉換為 300 列的矩陣,這一過程被稱為詞嵌入。第二個目標是在保留單詞上下文的同時,從一定程度上保留其意義。Word2Vec 實現這兩個目標的方法有 skip-gram 和 CBOW 等,skip-gram 會輸入一個詞,然後嘗試估計其它詞出現在該詞附近的概率。還有一種與此相反的被稱為連續詞袋模型(Continuous Bag Of Words,CBOW),它將一些上下文詞語作為輸入,並通過評估概率找出最適合(概率最大)該上下文的詞。
對於連續詞袋模型而言,Mikolov 等人運用目標詞前面和後面的 n 個詞來同時預測這個詞。他們稱這個模型為連續的詞袋(CBOW),因為它用連續空間來表示詞,而且這些詞的先後順序並不重要。CBOW 可以看作一個具有先知的語言模型,而 skip-gram 模型則完全改變將語言模型的目標:它不像 CBOW 一樣從周圍的詞預測中間的詞;恰恰相反,它用中心語去預測周圍的詞。
Mahmoud Badry 還展示了另一種學習詞嵌入的方法 GloVe,該方法雖然不像語言模型那樣使用廣泛,但它精簡的結構非常容易理解:
序列模型與注意力機制
最後一部分作者著重介紹了注意力機制,包括編碼器解碼器架構的缺陷和引入注意力機制的解決方案。下圖展示了使用語境向量 C 或注意力權重編碼信息的過程。
其實當我們翻譯一個句子時,會尤其關注於正在翻譯的單詞。神經網絡可以通過注意力來實現同樣的行為,即關注所收到信息子集的一部分。
我們通常是使用基於上下文的注意力生成注意力分布。參與的 RNN 會生成一個描述它想關注內容的查詢。每一個條目和這個查詢做點乘來產生一個分數,這個分數描述這個條目與查詢匹配程度。這些分數被輸入一個 softmax 來生成注意力分布。