rnn神经网络模型_一文读懂序列建模(deeplearning.ai)之循环神经网络(RNNs)
作者:Pulkit Sharma,2019年1月21日
翻譯:陳之炎
校對:丁楠雅
本文為你詳細介紹序列模型,并分析其在不同的真實場景中的應用。
簡介
如何預測一個序列中接下來要發生什么事情是一個非常吸引人的課題,這是我對數據科學如此著迷的原因之一!有趣的是——人類的頭腦確實擅長于此,但是機器卻不是這樣的。如果一本書中有一個神秘的情節,人類的大腦就會開始預測出結果,然而,如何教會機器來做類似的事情呢?
多虧了深度學習,我們今天能做的事情比幾年前要多的多。處理序列數據的能力,如音樂歌詞、句子翻譯、理解評論或構建聊天機器人-所有這些都要歸功于序列建模。
這便是我們在本文中需要學習的內容,由于這是deeplearning.ai專業系列課程的一部分,我希望讀者能夠了解到某些概念。如果你還沒有讀過前幾篇文章,或者還需要快速復習一下,可以訪問以下鏈接:
- 深度學習和神經網絡入門指南(deeplearning.ai第1課)
- https://www.analyticsvidhya.com/blog/2018/10/introduction-neuric-networks-deep-learning/
- 改進神經網絡–超參數調整、正則化和其他(deeplearning.ai第2課)
- https://www.analyticsvidhya.com/blog/2018/11/neuric-networks-hyperparameter-tuning-regularization-deeplearning/
- 從零開始學習卷積神經網絡的綜合教程(deeplearning.ai第4課)
- https://www.analyticsvidhya.com/blog/2018/11/neuric-networks-hyperparameter-tuning-regularization-deeplearning/
在本節課程中,我們將看到如何將序列模型應用到不同的真實場景中去,如情感分類、圖像字幕等。
課程目錄
- 課程結構
- 課程內容:序列模型
序列模型課程內容如下:
一、模塊1:循環神經網絡(RNNs)
二、模塊2:自然語言處理(NLP)和單詞嵌入
2.1 單詞嵌入簡介
2.2 學習單詞嵌入:Word2vec & GloVe
2.3 單詞嵌入的應用程序
三、模塊3:序列模型與注意力(Attention)機制
到目前為止,我們已經在這個系列課程中涵蓋了相當多的內容,以下是對所學概念的簡要概括:
- 深度學習和神經網絡基礎。
- 淺層和深層神經網絡的工作原理。
- 如何通過超參數調整、正則化和優化來提高深度神經網絡的性能。
- 如何通過scratch實現卷積神經網絡。
現在我們把重點轉向序列建模,本課程分為三個模塊(官方課程名稱為:Andrew Ng教授的深度學習專業課程第5課):
- 在模塊1中,我們將學習循環神經網絡及其工作原理,此外,還將在本模塊中介紹GRU和LSTM。
- 在模塊2中,重點學習自然語言處理和單詞嵌入。我們將學到如何將Word2vec和Glove框架應用于學習單詞嵌入
- 最后,模塊3將介紹注意力(Attention)模型的概念。我們將學到如何將大而復雜的句子從一種語言翻譯成另一種語言。
準備好了嗎?那我們便從模塊1開始第5課序列模型的學習吧!由于平臺系統字數限制,后續推出模塊2:自然語言處理(NLP)和單詞嵌入、模塊3:序列模型與注意力(Attention)機制,敬請關注!
一、模塊1:循環神經網絡
第5課第一模塊的目標是:
- 了解什么是循環神經網絡(RNN)
- 學習包括LSTM、GRUS和雙向RNN在內的多種算法
如果這些縮寫聽起來令人生畏,不要擔心——我們會很快把它們解決掉。
1. 首先,為什么是序列模型?
為回答這個問題,將向你展示一些在真實場景中應用到的序列模型示例。
- 語音識別:
這是一個很常見的應用(每個有智能手機的人都會知道這一點),在這里,輸入是一個音頻剪輯板,模型生成文本轉錄。在這里,音頻被認為是一個序列,隨著時間的推移,輸出為一系列單詞。
- 情感分類:
序列模型的另一個流行應用是情感分類。我們將一個文本句子作為輸入,模型必須預測出句子的情感(積極、消極、憤怒、興奮等),輸出可以為分級或標星。
- DNA序列分析:
給定一個DNA序列作為輸入,期望模型能夠預測出哪一部分DNA屬于哪一種蛋白質。
- 機器翻譯:
用一種語言輸入一個句子,比如法語,希望模型能把它轉換成另一種語言,比如英語。在這里,輸入和輸出都是序列:
- 視頻活動識別:
這實際上是利用序列模型對即將到來的事件(和當前的趨勢)進行預測,該模型用來預測給定視頻中正在進行的活動,在這里,輸入是一個幀序列。
- 名稱實體識別:
這當然是我最喜歡的序列模型示例。如下圖所示,我們用一句話作為輸入,并希望模型能識別出該句子中的人名:
現在,在做進一步深入探討之前,需要討論幾個重要的符號,你會在整個文章中看到這些符號。
2. 將在本文中使用到的符號
我們用“x”來表示一個句子,為方便理解,以下面的示例句子為例:
X:哈利和赫敏發明了一種新的咒語。
現在,我們用x來表示句子中的每個詞:
- x<1> = 哈利
- x<2>=赫敏,等等
上述句子的輸出將是:
Y=1 0 1 0 0 0 0
在這里,1表示這個單詞代表一個人的名字(0表示它是其他)。下面是我們經常用到的一些常用符號:
- Tx = 輸入句長度
- Ty = 輸出句長度
- x(i) = ith 訓練樣本
- x(i) = ith訓練樣本的tth訓練
- Tx(i) = ith輸入句長度
此時,我們或許會問——如何在一個序列中表示一個單獨的單詞呢?嗯,這里,我們要依靠詞匯表或字典,即我們在句子中使用到的單詞列表,詞匯表結構如下所示:
詞匯表的大小因不同的應用而異,通常從訓練集中挑選出現頻度最高的單詞來制作詞匯表。
現在,假設我們想表示單詞“Harry”這個詞,它在詞匯表中的位置是4075th 位,我們對這個詞匯進行一次編碼,以表示“Harry”:
通常,x是一個獨熱編碼向量,我們將1放在第4075t位置,所有其余的單詞將表示為0。
如果單詞不出現在詞匯表中,會創建一個未知的標記,并將其添加到詞匯表中。就這么簡單!
3. 循環神經網絡(RNN)模型
當X,Y之中有一個是序列,或者X和Y都是序列時,我們使用循環神經網絡來學習從X到Y的映射。但是,為什么不能用一個標準的神經網絡來解決這些序列問題呢?
問得太好了!下面,讓我用一個例子來做出解釋。假設我們需要構建下述神經網絡:
這里主要有兩個問題:
- 輸入和輸出沒有固定的長度,也就是說,一些輸入語句可以是10個單詞,而其他的可以是<>10(大于或小于)。最終輸出也是如此
- 如果使用一個標準的神經網絡,我們將無法在不同的文本位置上共享所學的特征。
為此,需要建立一種表示,用它來解析不同長度的句子,并減少模型中的參數數量。這就是我們要用到循環神經網絡的地方,這便是典型RNN:
RNN獲取第一個單詞(x<1>),并將其饋送到預測輸出(y‘<1>)的神經網絡層。重復此過程,直到最后一步x生成最后的輸出y‘,這是輸入字數和輸出字數相等的網絡。
RNN按從左到右的順序掃描數據。注意,RNN在每個時間步長中使用的參數是共享的,在每個輸入層和隱藏層(Wax)之間、每個時間步長(Waa)之間以及隱藏層和輸出層(Wya)之間共享參數。
因此,如果需要對x<3>進行預測,我們也會得到關于x<1>和x<2>的信息。RNN的一個潛在缺點是:它只從先前的時間步長獲取信息,而不是從后續的時間步長獲取信息。這個問題可以用雙向RNN來解決,我們會在稍后進行討論。現在,我們來看看RNN模型中的前向傳播的步驟:
a<0> 是一個全零向量,我們計算與標準神經網絡相類似的激活函數:
- a<0> = 0
- a<1> = g(Waa * a<0> + Wax * x<1> + ba)
- y<1> = g’(Wya * a<1> + by)
同樣,我們可以計算每個時間步長的輸出。這些公式的一般形式可以寫成:
可以用更為簡潔的方法列出這些方程:
水平疊加Waa 和Wya 以獲得Wa,a和x垂直疊加。目前只有一個矩陣,而不是帶著兩個參數的矩陣。簡言之,這便是循環神經網絡的前向傳播原理。
3.1 時間軸上的反向傳播
接下來,你可能會看到這種情況-反向傳播步驟與前向傳播的方向正好相反。我們有一個損失函數,為了得到準確的預測,需要將它最小化。損失函數由以下公式給出:
我們計算每個時間步長里的損失,最后對所有這些損失求和,以計算序列的最終損失:
在前向傳播中,我們從左向右移動,即增加時間t的步長。在反向傳播中,我們從右向左移動,即在時間軸上向后移動(因此稱為時間反向傳播)。
到目前為止,我們看到的是輸入和輸出序列長度相等的應用場景。但是如果輸入和輸出序列長度不等的情況又如何呢?我們將在下一節中看到這些不同的應用場景。
3.2 不同種類的RNN
可以用多種不同類型的RNN來處理序列長度不同的示例。這些問題可分為以下幾類:
- 多對多
前面看到的名稱實體識別示例屬于這個類別。假設我們有一系列的單詞,對于每個單詞,我們必須預測它是否是一個人名。針對此類問題的RNN架構如下:
對于每個輸入字,我們預測它對應的輸出字。
- 多對一
來看看情緒分類問題:我們將一個句子傳遞給模型,它將返回與該句子對應的情感或評級。這是一個多對一的問題,輸入序列可以有不同的長度,而輸出只有一個。針對此類問題的RNN架構如下所示:
這里,我們在句子結束時會得到一個輸出。
- 一對多
以音樂生成為例,我們希望用音樂作為輸入來預測歌詞。在這種情況下,輸入只是一個單詞(或一個整數),輸出的長度可變。這類問題的RNN體系結構如下所示:
還有一種RNN在工業上廣泛使用,即機器翻譯,將一種語言的輸入句翻譯成另一種語言。這是一個多對多的問題,輸入序列的長度可能等于也可能不等于輸出序列的長度。
在這種情況下,我們有編碼器和解碼器。編碼器讀取輸入語句,解碼器將其轉換為輸出語句:
3.3 語言模型和序列生成
假設需要建立一個語音識別系統,我們聽到一句話:“蘋果和梨沙拉很好吃”。該模型將預測什么——“蘋果配梨沙拉很美味”還是“蘋果和梨沙拉是美味”?
我希望是第二句話!語音識別系統通過預測每個句子的概率來選擇句子。
但是又如何來構建語言模型呢?
假設有一個輸入語句:
貓平均每天睡15小時
構建語言模型的步驟如下:
- 第1步:標記輸入,即創建字典
- 第2步:將這些單詞映射到一個編碼向量,可以添加的標記來表示句子的結束。
- 第3步:構建RNN模型
我們取第一個輸入詞并對其進行預測,輸出會告訴我們字典中任意單詞的概率是多少。第二個輸出會告訴我們給定第一個輸入字的預測詞的概率:
RNN模型中的每一步都會查看前面的一組單詞,以預測下一個單詞。訓練RNN模型會遇到各種各樣的挑戰,這將在下一節進行討論。
3.4 RNN的梯度消失
循環神經網絡的最大問題之一是它會陷入梯度消失。怎么回事?我們來考慮這兩個句子:
那只貓吃了一堆食物,已經吃飽了。
貓已經吃了一堆食物之后,都已經吃飽了。
以上兩個句子中哪一句語法正確?是第一句。(如果你錯過了請再讀一遍!)
基本RNN不擅長捕獲長期依賴項,這是因為在反向傳播過程中,來自輸出Y的梯度將很難傳播回來,從而影響先期層的權重。因此,在基本RNN中,輸出受到更接近該單詞的那個輸入的影響。
為避免這種情況的發生,我們可以通過設置一個預先定義的閾值來對它們進行剪輯。
3.5 門控循環單元(GRU)
GRU是RNN的一種改進形式。它們在捕獲更長范圍的依賴關系方面非常有效,并且有助于解決梯度消失問題。在時間步長t中計算激活的公式為:
RNN的隱藏單元如下圖所示:
一個單元的輸入是來自前一個單元的激活和該時間步長的輸入字。在計算該步長的激活和輸出的時候,我們在這個RNN中添加一個存儲單元,以便記住當前單詞以外的單詞。來看看GRU的方程:
c = a
其中c是一個存儲單元。
在每個時間步長內,將c
這便是更新c值的候選值。我們還定義了一個更新門,利用這個門的值來決定是否更新存儲單元,更新門的方程為:
請注意,因為使用sigmoid來計算更新值,所以,更新門的輸出總是在0和1之間。我們使用先前的存儲單元值和更新門輸出來更新存儲單元。c的更新方程如下:
當門值為0時,c = c,即不更新c;;當門值為1時,c = c,對值進行更新。舉一個例子來理解這一概念:
當遇到cat這個詞時,門(gate)值為1;對于序列中的所有其他單詞,門(gate)值為0,因此cat的信息將被攜帶到單詞“was”。我們期望模型能預測到單詞were的地方應該是was。
GRUS就是通過這種方式來助力于記憶長期依賴關系,下面是這個可視化工具,會有助于你理解GRU工作原理:
每個單元均有三個輸入:a, c 和x,以及三個輸出:a, c 和 y(hat)。
3.6 長期短期記憶(LSTM)
當前,LSTM在深度學習中非常流行。由于它們的復雜性,現在可能沒有很多工業應用程序,但請相信我,它們很快就會出現。花點時間學習這個概念是值得的——將來它會派上用場。
為了更好地理解LSTM,讓我們一起回顧一下在GRU那個小節中看到的所有方程:
在計算c的相關性時,只是添加了一個門(gate),而這個門(gate)告訴我們c與c的更新值之間是如何相關的,對于GRUs來說, a = c。
LSTM是增強版的GRU,它的應用更為普遍。LSTM的方程式為:
這和GRU的類似,對吧?我們只是使用a取代了c。更新門的公式也可以寫為:
在LSTM中,還有一個遺忘門和一個輸出門。這些門的方程與更新門的方程相類似:
最后,將c的值更新為:
下一層的激活將是:
你會使用哪種算法——GRU還是 LSTM?
每種算法都有各自的優點。你會發現:它們的準確度取決于你試圖解決的問題的類型。GRU的優勢在于它有一個更簡捷的架構,因此我們可以用它來構建一些大的模型,然而, LSTM則更為強大和有效,因為它有3個門。
3.7 雙向RNN
到目前為止,我們看到的RNN架構只關注序列中先前的信息。如果我們的模型能夠同時考慮到序列的先前信息和后續信息,同時在特定的時間步長中進行預測,那會有多棒啊?
是的,這完全有可能做到!歡迎來到雙向RNN的世界。但是在介紹雙向RNN以及它們的工作原理之前,還是讓我們先看看為什么需要它。
來看看一個命名實體識別問題,我們想知道序列中的一個單詞是否代表一個人名。看看下面這個例子:
他說:“泰迪熊在打折!“
如果我們把這個句子輸入一個簡單的RNN,模型會預測“Teddy”是一個人的名字。它沒有考慮到這個詞后面會發生什么。通過雙向RNN,可以解決這個問題。
現在假設我們有一個4個單詞的輸入序列,雙向RNN看起來像:
利用以下公式,計算RNN單元的輸出:
同樣,可以有雙向GRU和雙向LSTM。使用雙向RNN的缺點是,在進行預測之前,必須先查看整個數據序列。但是,標準的B-RNN算法對于構建和設計大多數NLP應用程序時,效率是非常高的。
3.8 深度RNN
還記得深度神經網絡的樣子嗎?
它有一個輸入層,一些隱藏層和一個輸出層。深度RNN也類似,它采用相似的網絡架構并在時間軸上展開:
這里,激活函數的表示法如下:
假設需要計算a[2]<3> :
這是為深度RNN準備的。深呼吸,這些內容是不是不難消化?后續請關注模塊2:自然語言處理(NLP)和單詞嵌入的學習!
譯者簡介
陳之炎,北京交通大學通信與控制工程專業畢業,獲得工學碩士學位,歷任長城計算機軟件與系統公司工程師,大唐微電子公司工程師,現任北京吾譯超群科技有限公司技術支持。目前從事智能化翻譯教學系統的運營和維護,在人工智能深度學習和自然語言處理(NLP)方面積累有一定的經驗。業余時間喜愛翻譯創作,翻譯作品主要有:IEC-ISO 7816、伊拉克石油工程項目、新財稅主義宣言等等,其中中譯英作品“新財稅主義宣言”在GLOBAL TIMES正式發表。能夠利用業余時間加入到THU 數據派平臺的翻譯志愿者小組,希望能和大家一起交流分享,共同進步
— 完 —
關注清華-青島數據科學研究院官方微信公眾平臺“THU數據派”及姊妹號“數據派THU”獲取更多講座福利及優質內容。
總結
以上是生活随笔為你收集整理的rnn神经网络模型_一文读懂序列建模(deeplearning.ai)之循环神经网络(RNNs)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java用beaninfo_JavaBe
- 下一篇: 招商银行信用卡自助还款什么时候扣款