遞歸神經(jīng)網(wǎng)絡(luò)(RNN)
RNN是最強(qiáng)大的模型之一,它使我們能夠開發(fā)如分類、序列數(shù)據(jù)標(biāo)注、生成文本序列(例如預(yù)測下一輸入詞的SwiftKey keyboard應(yīng)用程序),以及將一個序列轉(zhuǎn)換為另一個序列(比如從法語翻譯成英語的語言翻譯)等應(yīng)用程序。大多數(shù)模型架構(gòu)(如前饋神經(jīng)網(wǎng)絡(luò))都沒有利用數(shù)據(jù)的序列特性。例如,我們需要數(shù)據(jù)呈現(xiàn)出向量中每個樣例的特征,如表示句子、段落或文檔的所有token。前饋網(wǎng)絡(luò)的設(shè)計只是為了一次性地查看所有特征并將它們映射到輸出。讓我們看一個文本示例,它顯示了為什么順序或序列特性對文本很重要。I had cleaned my car和I had my car cleaned兩個英文句子,用同樣的單詞,但只有考慮單詞的順序時,它們才意味著不同的含義。
人類通過從左到右閱讀詞序列來理解文本,并構(gòu)建了可以理解文本數(shù)據(jù)中所有不同內(nèi)容的強(qiáng)大模型。RNN的工作方式有些許類似,每次只查看文本中的一個詞。RNN也是一種包含某特殊層的神經(jīng)網(wǎng)絡(luò),它并不是一次處理所有數(shù)據(jù)而是通過循環(huán)來處理數(shù)據(jù)。由于RNN可以按順序處理數(shù)據(jù),因此可以使用不同長度的向量并生成不同長度的輸出。圖6.3提供了一些不同的表示形式。
圖6.3來自關(guān)于RNN一個著名博客(http://karpathy.github.io/2015/05/21/rnn-effectiveness),其中作者Andrej Karpathy寫明了如何使用Python從頭開始構(gòu)建RNN并將其用作序列生成器。
6.4.1通過示例了解RNN如何使用
假設(shè)我們已經(jīng)構(gòu)建了一個RNN模型,并且嘗試了解它提供的功能。當(dāng)了解了RNN的作用后,就可以來探討一下RNN內(nèi)部發(fā)生了什么。
讓我們用Thor的評論作為RNN模型的輸入。我們正在看的示例文本是the action scenes were top notch in this movie... .首先將第一個單詞the傳遞給模型;該模型生成了狀態(tài)向量和輸出向量兩種不同的向量。狀態(tài)向量在處理評論中的下一個單詞時傳遞給模型,并生成新的狀態(tài)向量。我們只考慮在最后一個序列中生成的模型的輸出。圖6.4概括了這個過程。
圖6.4演示了以下內(nèi)容:
· RNN如何通過展開和圖像來工作;
· 狀態(tài)如何以遞歸方式傳遞給同一模型。
到現(xiàn)在為止,我們只是了解了RNN的功能,但并不知道它是如何工作的。在了解其工作原理之前來看一些代碼片段,它會更詳細(xì)地展示我們學(xué)到的東西。仍然將RNN視為黑盒:
在上述代碼中,hidden變量表示狀態(tài)向量,有時也稱為隱藏狀態(tài)。到現(xiàn)在為止,我們應(yīng)該知道了如何使用RNN。現(xiàn)在來看一下實(shí)現(xiàn)RNN的代碼,并了解RNN內(nèi)部發(fā)生的情況。以下代碼包含RNN類:
除了上述代碼中的單詞RNN之外,其他一切聽起來與在前面章節(jié)中使用的非常類似,因?yàn)镻yTorch隱藏了很多反向傳播的復(fù)雜度。讓我們通過init函數(shù)和forward函數(shù)來了解發(fā)生了什么。
__init__函數(shù)初始化了兩個線性層,一個用于計算輸出,另一個用于計算狀態(tài)或隱藏向量。
forward函數(shù)將input向量和hidden向量組合在一起,并將其傳入兩個線性層,從而生成輸出向量和隱藏狀態(tài)。對于output層,我們應(yīng)用log_softmax函數(shù)。
initHidden函數(shù)有助于創(chuàng)建隱藏向量,而無需在第一次時聲明調(diào)用RNN。讓我們通過圖6.5了解RNN類的作用。
圖6.5說明了RNN的工作原理。
審核編輯 黃昊宇
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4779瀏覽量
101060 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5512瀏覽量
121430
發(fā)布評論請先 登錄
相關(guān)推薦
評論