54 循環(huán)神經(jīng)網(wǎng)絡(luò) RNN【動手學(xué)深度學(xué)習v2】

循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)
- recurrent neural networks,RNNs
- 對于序列模型的神經(jīng)網(wǎng)絡(luò)
回顧
潛變量自回歸模型
使用潛變量 ht 總結(jié)過去的信息

- n 元語法模型中,單詞 xt 在時間步 t 的條件概率僅取決于前面 n-1 個單詞
- xt 是和 ht 與 x(t-1) 相關(guān)的
- t 時刻的潛變量 ht 是和 h(t-1) 和 x(t-1) 相關(guān)的
隱藏層和隱狀態(tài)的區(qū)別:
- 隱藏層是在從輸入到輸出的路徑上(以觀測角度來理解)的隱藏的層
- 隱狀態(tài)是在給定步驟所做的任何事情(以技術(shù)角度來定義)的輸入,并且這些狀態(tài)只能通過先前時間步的數(shù)據(jù)來計算
循環(huán)神經(jīng)網(wǎng)絡(luò)是具有隱狀態(tài)的神經(jīng)網(wǎng)絡(luò)
假設(shè)有一個觀察 x 和一個隱變量 ht ,根據(jù)ht就能夠生成輸出 ot

- t 時刻的輸出 ot 是根據(jù) ht 輸出的,ht 使用的是 x(t-1) 中的內(nèi)容
- 在計算損失的時候,是比較 ot 和 xt 之間的損失
- xt 是用來更新 ht 使得觀察 xt 向后移動
- 捕獲并保留序列直到當前時間步的歷史信息(如當前時間步下神經(jīng)網(wǎng)絡(luò)的狀態(tài)或記憶)的隱藏變量被稱為隱狀態(tài)(hidden state)
循環(huán)神經(jīng)網(wǎng)絡(luò)在三個相鄰時間步的計算邏輯

- 首先拼接當前時間步 t 的輸入 Xt 和前一時間步 t-1 的隱狀態(tài) H(t-1)
- 然后將拼接的結(jié)果送入帶有激活函數(shù) Φ 的全連接層
- 全連接層的輸出就是當前時間步 t 的隱狀態(tài) Ht
循環(huán)神經(jīng)網(wǎng)絡(luò)與 MLP(多層感知機)的區(qū)別就在于多了一個時間軸,假設(shè)沒有這個時間關(guān)系的話,循環(huán)神經(jīng)網(wǎng)絡(luò)就會退化成為 MLP
- 保存了前一個時間步的隱藏狀態(tài) h(t-1)
- 引入了一個新的權(quán)重參數(shù) Whh 來描述如何在當前時間步中使用前一個時間步的隱藏變量
- 假設(shè) ht 是一個隱藏狀態(tài),Φ 是激活函數(shù)。Whx 是 MLP 隱層的權(quán)重,x(t-1) 是 t-1 時刻的輸入,bh 是對應(yīng)的偏移量
- ht 不僅和 x 相關(guān),還和前一時刻的 h 相關(guān)
- 輸出是由隱藏狀態(tài)乘上權(quán)重再加上一個偏移量得到的
所以,
1、循環(huán)神經(jīng)網(wǎng)絡(luò)就是在 MLP 的基礎(chǔ)上加了一項 Whh*h(t-1) 使得它能夠于前一時刻的 h(t-1) 產(chǎn)生關(guān)聯(lián),假設(shè)忽略掉時間軸的情況下,本身和 MLP 是沒有任何區(qū)別的
2、循環(huán)神經(jīng)網(wǎng)絡(luò)并沒有對 x 進行建模,所有 x 之間的時序信息都存儲在潛變量 h 當中
- 實際上就相當于是將時序信息存儲在了 Whh 中
3、因為在當前時間步中,隱狀態(tài)使用的定義與前一個時間步中使用的定義相同,因此隱藏變量的計算是循環(huán)的,于是基于循環(huán)計算的隱狀態(tài)神經(jīng)網(wǎng)絡(luò)被命名為循環(huán)神經(jīng)網(wǎng)絡(luò)(recurrent neural network),循環(huán)神經(jīng)網(wǎng)絡(luò)中執(zhí)行隱藏變量計算的層稱為循環(huán)層(recurrent layer)
循環(huán)神經(jīng)網(wǎng)絡(luò)在語言模型中的使用
基于循環(huán)神經(jīng)網(wǎng)絡(luò)的字符級語言模型
- 語言模型的目標是根據(jù)過去的的和當前的詞元預(yù)測下一個詞元(因此需要將原始序列移位一個詞元作為標簽)
- 為簡化訓(xùn)練,這里所使用的是字符級語言模型,將文本詞元化為字符而不是單詞
訓(xùn)練步驟
輸入序列和標簽分別是“machine”和“achine”

在訓(xùn)練過程中,對每個時間步的輸出層的輸出進行 softmax 操作,然后利用交叉熵損失計算模型輸出和標簽之間的誤差
- 以上圖中第3個時間步的輸出 O3 為例,由于隱藏層中隱狀態(tài)的循環(huán)計算,O3 由文本序列 “m” 、“a” 和 “c” 確定
- 由于訓(xùn)練數(shù)據(jù)中輸入文本序列的下一個字符是 “h” ,因此第三個時間步的損失將取決于下一個字符的概率分布,而下一個字符是基于特征序列 “m”、“a”、“c” 和這個時間步的標簽 “h” 生成的

語言模型中,假設(shè)當前輸入是“你”的話,那么會更新隱變量,然后預(yù)測“好”,接下來觀測到了“好”,然后更新隱變量,再輸出逗號
- 輸出是用來匹配觀察的,但是在生成 t 時刻的輸出 ot 時,不能夠看到 t 時刻的觀察 xt ,也就是說當前時刻的輸出是用來預(yù)測當前時刻的觀察,但是輸出發(fā)生在觀察之前
困惑度(perplexity)
語言模型實際上就是一個分類模型,假設(shè)字典大小是 m 的話,語言模型實際上就是 m 類的分類問題,每次預(yù)測下一個詞的時候,實際上就是在預(yù)測下一個詞的類別
衡量分類問題的好壞可以用交叉熵,因此,衡量一個語言模型的好壞可以用平均交叉熵

- n:序列長度,長為 n 的序列就相當于是做 n 次預(yù)測,也就是做了 n 次分類,因此衡量一個語言模型的好壞可以在交叉熵的基礎(chǔ)上取平均
- p:語言模型的預(yù)測概率,由語言模型給出
- xt:真實詞,在時間步 t 從該序列中觀察到的實際詞元
由于歷史原因 NLP 使用困惑度 exp(π) 來衡量,平均每次可能的選項,也就是對上面的平均交叉熵做指數(shù)運算
- 為什么做指數(shù)運算?好處是做完指數(shù)運算之后結(jié)果會變大,數(shù)值變大之后就能夠很容易看出來改進所帶來的好處
困惑度的最好的理解是“下一個詞元的實際選擇數(shù)的調(diào)和平均數(shù)”,也可以認為是下一個詞的候選數(shù)量,這樣在直觀上更容易理解
- 在最好的情況下,模型總是完美地估計標簽詞元的概率為1。 在這種情況下,模型的困惑度為1
- 在最壞的情況下,模型總是預(yù)測標簽詞元的概率為0。 在這種情況下,困惑度是正無窮大,表示根本預(yù)測不出下一個詞到底是什么
- 在基線上,該模型的預(yù)測是詞表的所有可用詞元上的均勻分布。 在這種情況下,困惑度等于詞表中唯一詞元的數(shù)量。 事實上,如果在沒有任何壓縮的情況下存儲序列, 這將是我們能做的最好的編碼方式。 因此,這種方式提供了一個重要的上限, 而任何實際模型都必須超越這個上限
梯度裁剪
迭代中計算這 T 個時間步上的梯度,在反向傳播過程中產(chǎn)生長度為 O(T) 的矩陣乘法鏈,導(dǎo)致數(shù)值不穩(wěn)定
- 一連串的矩陣相乘的話會導(dǎo)致結(jié)果要么很小,要么很大:如果結(jié)果很小的話可能會導(dǎo)致訓(xùn)練不動;如果結(jié)果很大的話,可能會發(fā)生梯度爆炸導(dǎo)致結(jié)果出錯
梯度裁剪能夠有效預(yù)防梯度爆炸
- 如果梯度長度超過 θ ,那么拖影回長度 θ

- g:所有層上的梯度全部放在向量 g 當中
- 假設(shè) g 的長度 L 太長導(dǎo)致超過了 θ ,那么就需要將長度 L 降回到 θ ,也就是說只要是 g 的長度是正常的就不做任何操作,如果 g 的長度超出了給定的范圍,就將其裁剪回給定的范圍中,這樣就能夠有效地避免梯度爆炸
更多應(yīng)用

一對一
- 也就是最簡單的 MLP :給定一個樣本,然后輸出一個標簽
一對多
- 文本生成:給定一個詞,然后生成一個一個的詞
多對一
- 文本分類:給定一個序列,在最后的時刻輸出,得到具體的分類
多對多
- 問答、機器翻譯:給定一個序列,先不輸出,然后在序列輸入完畢之后輸出答案
- Tag 生成:給定一個序列,然后輸出每個詞的 Tag ,比如輸入一個句子,然后輸出句子中每個詞是名詞、動詞還是形容詞等
總結(jié)
1、對隱藏狀態(tài)使用循環(huán)計算的神經(jīng)網(wǎng)絡(luò)稱為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),循環(huán)神經(jīng)網(wǎng)絡(luò)的輸出取決于當下輸入和前一時間的隱變量
- 循環(huán)神經(jīng)網(wǎng)絡(luò)的隱藏狀態(tài)可以捕獲當前時間步序列的歷史信息
- 隱變量是用來存儲歷史信息和下一個歷史信息的轉(zhuǎn)換規(guī)則,所以在拿到過去的輸入和當前的隱藏狀態(tài)就能夠預(yù)測當前的輸出
- Whh 擁有一定的時序預(yù)測目的
2、應(yīng)用到語言模型中時,循環(huán)神經(jīng)網(wǎng)絡(luò)根據(jù)當前詞預(yù)測下一次時刻詞
- 根據(jù)當前的輸入更新當前時刻的隱藏狀態(tài)就能夠預(yù)測下一個時刻的輸出
- RNN 是一個隱變量模型,隱變量是一個向量
3、通常使用困惑度來衡量語言模型的好壞
- 取平均值,然后進行指數(shù)操作,就得到了困惑度
- 困惑度實際上衡量了語言模型對下一個詞的預(yù)測所選取的候選詞數(shù)量,這個候選詞的數(shù)量越少越好
4、為了解決梯度爆炸的問題,RNN 一般是需要進行梯度裁剪的,這也是最簡單的方法
5、循環(huán)神經(jīng)網(wǎng)絡(luò)模型的參數(shù)數(shù)量不會隨著時間步的增加而增加
6、使用循環(huán)神經(jīng)網(wǎng)絡(luò)可以創(chuàng)建字符級語言模型
Q&A
- 1、循環(huán)神經(jīng)網(wǎng)絡(luò)與遞歸神經(jīng)網(wǎng)絡(luò)是一個東西嗎?如果不是,有什么區(qū)別呢?
- ?QA P2 - 00:00?
- 2、前面講的目標檢測現(xiàn)在發(fā)展已經(jīng)比較成熟了,一個人做的話,也不是很容易發(fā) paper ,現(xiàn)在講的自然語言處理方面,有哪些方向適合一個人做?。?/strong>
- ?QA P2 - 01:04?
- 3、中文需不需要分詞,可否直接基于字來做?
- ?QA P2 - 04:04?
- 4、現(xiàn)在有沒有什么 voice 和 image 融合算法適合落地?
- ?QA P2 - 05:05?
- 5、請問老師,中文文本語調(diào)用什么算法做比較好?除了詞頻統(tǒng)計之類的
- ?QA P2 - 06:39?
- 6、有沒有模型既能處理時序信息,同時還能做目標檢測?比如想追蹤一個視頻里的目標,應(yīng)該怎么做?
- ?QA P2 - 07:20?
----end----
其他參考
1、《動手學(xué)深度學(xué)習》,PPT,https://courses.d2l.ai/zh-v2/assets/pdfs/part-3_3.pdf
2、《動手學(xué)深度學(xué)習》,教材,https://zh-v2.d2l.ai/chapter_recurrent-neural-networks/rnn.html
54 循環(huán)神經(jīng)網(wǎng)絡(luò) RNN【動手學(xué)深度學(xué)習v2】的評論 (共 條)
