入門 | 一文簡述循環神經網絡

2021-02-15 機器之心

選自Hackernoon

作者:Debarko De

機器之心編譯

參與:李詩萌、路

本文簡要介紹了什麼是循環神經網絡及其運行原理,並給出了一個 RNN 實現示例。

什麼是循環神經網絡(RNN)?它們如何運行?可以用在哪裡呢?本文試圖回答上述這些問題,還展示了一個 RNN 實現 demo,你可以根據自己的需要進行擴展。

循環神經網絡架構

基礎知識。Python、CNN 知識是必備的。了解 CNN 的相關知識,是為了與 RNN 進行對比:RNN 為什麼以及在哪些地方比 CNN 更好。

我們首先從「循環」(Recurrent)這個詞說起。為什麼將其稱為循環?循環的意思是:

經常或重複出現

將這類神經網絡稱為循環神經網絡是因為它對一組序列輸入重複進行同樣的操作。本文後續部分將討論這種操作的意義。

我們為什麼需要 RNN?

也許你現在想的是,已經有像卷積網絡這樣表現非常出色的網絡了,為什麼還需要其他類型的網絡呢?有一個需要用到 RNN 的特殊例子。為了解釋 RNN,你首先需要了解序列的相關知識,我們先來講一下序列。

序列是相互依賴的(有限或無限)數據流,比如時間序列數據、信息性的字符串、對話等。在對話中,一個句子可能有一個意思,但是整體的對話可能又是完全不同的意思。股市數據這樣的時間序列數據也是,單個數據表示當前價格,但是全天的數據會有不一樣的變化,促使我們作出買進或賣出的決定。

當輸入數據具有依賴性且是序列模式時,CNN 的結果一般都不太好。CNN 的前一個輸入和下一個輸入之間沒有任何關聯。所以所有的輸出都是獨立的。CNN 接受輸入,然後基於訓練好的模型輸出。如果你運行了 100 個不同的輸入,它們中的任何一個輸出都不會受之前輸出的影響。但想一下如果是文本生成或文本翻譯呢?所有生成的單詞與之前生成的單詞都是獨立的(有些情況下與之後的單詞也是獨立的,這裡暫不討論)。所以你需要有一些基於之前輸出的偏向。這就是需要 RNN 的地方。RNN 對之前發生在數據序列中的事是有一定記憶的。這有助於系統獲取上下文。理論上講,RNN 有無限的記憶,這意味著它們有無限回顧的能力。通過回顧可以了解所有之前的輸入。但從實際操作中看,它只能回顧最後幾步。

本文僅為了與人類大體相關聯,而不會做任何決定。本文只是基於之前關於該項目的知識做出了自己的判斷(我甚至尚未理解人類大腦的 0.1%)。

何時使用 RNN?

RNN 可用於許多不同的地方。下面是 RNN 應用最多的領域。

1. 語言建模和文本生成

給出一個詞語序列,試著預測下一個詞語的可能性。這在翻譯任務中是很有用的,因為最有可能的句子將是可能性最高的單詞組成的句子。

2. 機器翻譯

將文本內容從一種語言翻譯成其他語言使用了一種或幾種形式的 RNN。所有日常使用的實用系統都用了某種高級版本的 RNN。

3. 語音識別

基於輸入的聲波預測語音片段,從而確定詞語。

4. 生成圖像描述

RNN 一個非常廣泛的應用是理解圖像中發生了什麼,從而做出合理的描述。這是 CNN 和 RNN 相結合的作用。CNN 做圖像分割,RNN 用分割後的數據重建描述。這種應用雖然基本,但可能性是無窮的。

5. 視頻標記

可以通過一幀一幀地標記視頻進行視頻搜索。

深入挖掘

本文按照以下主題進行。每一部分都是基於之前的部分進行的,所以不要跳著讀。

前饋網絡

循環網絡

循環神經元

基於時間的反向傳播(BPTT)

RNN 實現

前饋網絡入門

前饋網絡通過在網絡的每個節點上做出的一系列操作傳遞信息。前饋網絡每次通過每個層直接向後傳遞信息。這與其他循環神經網絡不同。一般而言,前饋網絡接受一個輸入並據此產生輸出,這也是大多數監督學習的步驟,輸出結果可能是一個分類結果。它的行為與 CNN 類似。輸出可以是以貓狗等作為標籤的類別。

前饋網絡是基於一系列預先標註過的數據訓練的。訓練階段的目的是減少前饋網絡猜類別時的誤差。一旦訓練完成,我們就可以用訓練後的權重對新批次的數據進行分類。

一個典型的前饋網絡架構

還有一件事要注意。在前饋網絡中,無論在測試階段展示給分類器的圖像是什麼,都不會改變權重,所以也不會影響第二個決策。這是前饋網絡和循環網絡之間一個非常大的不同。

與循環網絡不同,前饋網絡在測試時不會記得之前的輸入數據。它們始終是取決於時間點的。它們只會在訓練階段記得歷史輸入數據。

循環網絡

也就是說,循環網絡不僅將當前的輸入樣例作為網絡輸入,還將它們之前感知到的一併作為輸入。

我們試著建立了一個多層感知器。從簡單的角度講,它有一個輸入層、一個具備特定激活函數的隱藏層,最終可以得到輸出。

多層感知器架構示例

如果在上述示例中的層數增加了,輸入層也接收輸入。那麼第一個隱藏層將激活傳遞到下一個隱藏層上,依此類推。最後到達輸出層。每一個隱藏層都有自己的權重和偏置項。現在問題變成了我們可以輸入到隱藏層嗎?

每一層都有自己的權重(W)、偏置項(B)和激活函數(F)。這些層的行為不同,合併它們從技術層面上講也極具挑戰性。為了合併它們,我們將所有層的權重和偏置項替換成相同的值。如下圖所示:

現在我們就可以將所有層合併在一起了。所有的隱藏層都可以結合在一個循環層中。所以看起來就像下圖:

我們在每一步都會向隱藏層提供輸入。現在一個循環神經元存儲了所有之前步的輸入,並將這些信息和當前步的輸入合併。因此,它還捕獲到一些當前數據步和之前步的相關性信息。t-1 步的決策影響到第 t 步做的決策。這很像人類在生活中做決策的方式。我們將當前數據和近期數據結合起來,幫助解決手頭的特定問題。這個例子很簡單,但從原則上講這與人類的決策能力是一致的。這讓我非常想知道我們作為人類是否真的很智能,或者說我們是否有非常高級的神經網絡模型。我們做出的決策只是對生活中收集到的數據進行訓練。那麼一旦有了能夠在合理時間段內存儲和計算數據的先進模型和系統時,是否可以數位化大腦呢?所以當我們有了比大腦更好更快的模型(基於數百萬人的數據訓練出的)時,會發生什麼?

另一篇文章(https://deeplearning4j.org/lstm.html)的有趣觀點:人總是被自己的行為所困擾。

我們用一個例子來闡述上面的解釋,這個例子是預測一系列字母後的下一個字母。想像一個有 8 個字母的單詞 namaskar。

namaskar(合十禮):印度表示尊重的傳統問候或姿勢,將手掌合起置於面前或胸前鞠躬。

如果我們在向網絡輸入 7 個字母後試著找出第 8 個字母,會發生什麼呢?隱藏層會經歷 8 次迭代。如果展開網絡的話就是一個 8 層的網絡,每一層對應一個字母。所以你可以想像一個普通的神經網絡被重複了多次。展開的次數與它記得多久之前的數據是直接相關的。

循環神經網絡的運作原理

循環神經元

這裡我們將更深入地了解負責決策的實際神經元。以之前提到的 namaskar 為例,在給出前 7 個字母後,試著找出第 8 個字母。輸入數據的完整詞彙表是 {n,a,m,s,k,r}。在真實世界中單詞或句子都會更複雜。為了簡化問題,我們用的是下面這個簡單的詞彙表。

在上圖中,隱藏層或 RNN 塊在當前輸入和之前的狀態中應用了公式。在本例中,namaste 的字母 n 前面什麼都沒有。所以我們直接使用當前信息推斷,並移動到下一個字母 a。在推斷字母 a 的過程中,隱藏層應用了上述公式結合當前推斷 a 的信息與前面推斷 n 的信息。輸入在網絡中傳遞的每一個狀態都是一個時間步或一步,所以時間步 t 的輸入是 a,時間步 t-1 的輸入就是 n。將公式同時應用於 n 和 a 後,就得到了一個新狀態。

用於當前狀態的公式如下所示:

h_t 是新狀態,h_t-1 是前一個狀態。x_t 是時間 t 時的輸入。在對之前的時間步應用了相同的公式後,我們已經能感知到之前的輸入了。我們將檢查 7 個這樣的輸入,它們在每一步的權重和函數都是相同的。

現在試著以簡單的方式定義 f()。我們使用 tanh 激活函數。通過矩陣 W_hh 定義權重,通過矩陣 W_xh 定義輸入。公式如下所示:

上例只將最後一步作為記憶,因此只與最後一步的數據合併。為了提升網絡的記憶能力,並在記憶中保留較長的序列,我們必須在方程中添加更多的狀態,如 h_t-2、h_t-3 等。最後輸出可以按測試階段的計算方式進行計算:

其中,y_t 是輸出。對輸出與實際輸出進行對比,然後計算出誤差值。網絡通過反向傳播誤差來更新權重,進行學習。本文後續部分會對反向傳播進行討論。

基於時間的反向傳播算法(BPTT)

本節默認你已經了解了反向傳播概念。如果需要對反向傳播進行深入了解,請參閱連結:http://cs231n.github.io/optimization-2/。

現在我們了解了 RNN 是如何實際運作的,但是在實際工作中如何訓練 RNN 呢?該如何決定每個連接的權重呢?如何初始化這些隱藏單元的權重呢?循環網絡的目的是要準確地對序列輸入進行分類。這要靠誤差值的反向傳播和梯度下降來實現。但是前饋網絡中使用的標準反向傳播無法在此應用。

與有向無環的前饋網絡不同,RNN 是循環圖,這也是問題所在。在前饋網絡中可以計算出之前層的誤差導數。但 RNN 的層級排列與前饋網絡並不相同。

答案就在之前討論過的內容中。我們需要展開網絡。展開網絡使其看起來像前饋網絡就可以了。

展開 RNN

在每個時間步取出 RNN 的隱藏單元並複製。時間步中的每一次複製就像前饋網絡中的一層。在時間步 t+1 中每個時間步 t 層與所有可能的層連接。因此我們對權重進行隨機初始化,展開網絡,然後在隱藏層中通過反向傳播優化權重。通過向最低層傳遞參數完成初始化。這些參數作為反向傳播的一部分也得到了優化。

展開網絡的結果是,現在每一層的權重都不同,因此最終會得到不同程度的優化。無法保證基於權重計算出的誤差是相等的。所以每一次運行結束時每一層的權重都不同。這是我們絕對不希望看到的。最簡單的解決辦法是以某種方式將所有層的誤差合併到一起。可以對誤差值取平均或者求和。通過這種方式,我們可以在所有時間步中使用一層來保持相同的權重。

RNN 實現

本文試著用 Keras 模型實現 RNN。我們試著根據給定的文本預測下一個序列。

代碼地址:https://gist.github.com/09aefc5231972618d2c13ccedb0e22cc.git

該模型是 Yash Katariya 建的。我對該模型做了一些細微的改動以適合本文的要求。

本文為機器之心編譯,轉載請聯繫原作者獲得授權

✄---

加入機器之心(全職記者 / 實習生):hr@jiqizhixin.com

投稿或尋求報導:content@jiqizhixin.com

廣告 & 商務合作:bd@jiqizhixin.com

相關焦點

  • 神經網絡解析|RNN(循環神經網絡)
    大家如果了解BP算法或者前文我們介紹的CNN網絡就會發現,他們的輸出都是只考慮前一個輸入的影響而不考慮其它時刻輸入的影響,比如簡單的貓,狗等圖片,或者手寫數字等單個物體的識別具有較好的效果。但是,對於一些與時間先後有關的,比如視頻的下一時刻的預測,文檔前後文內容的預測等,這些算法的表現就不盡如人意了。因此,RNN就應運而生了。
  • 循環神經網絡(RNN)和LSTM初學者指南 | 入門資料
    對於人工智慧初學者來說,是一份非常不錯的入門資料。循環網絡,是一種人工神經網絡(ANN),用來識別數據序列中的模式。比如文本、基因組、筆記、口語或來自傳感器、股票市場和政府機構的時間序列數據。它的算法考慮了時間和順序,具有時間維度。研究表明,RNN是最強大和最有用的神經網絡之一,它甚至能夠適用於圖像處理。
  • 循環神經網絡(RNN)
    1.循環神經網絡用於解決6.求解RNN模型依然採取前向傳播與反向傳播算法多層感知機(MLP)是深度神經網絡(DNN)的基礎模型,通常DNN就是指多層感知機,在此基礎上加入卷積層和池化層,就得到了卷積神經網絡(CNN)。
  • RNN循環神經網絡
    點擊上方「AI與計算機視覺」,選擇加"星標"或「置頂」重磅乾貨,第一時間送達什麼是RNNRNN主要用來處理序列數據在傳統的神經網絡模型中但是這種普通的神經網絡對於很多問題卻無能為力。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。RNN之所以稱為循環神經網絡,即一個序列當前的輸出與前面的輸出也有關。
  • 從零開始實現循環神經網絡(無框架)
    >背景循環神經網絡是深度神經網絡的一種,發展於二十世紀八九十年代,隨著二十一世紀一零年代後深度學習的復興,循環神經網絡的研究與應用也走上了快車道。本文的預測目標為,給定一個新的序列如[a, a, a, a, a],預測該序列接下來應該出現的字母,直到句子結尾。 循環神經網絡(Recurrent Neural Network)循環神經網絡是深度神經網絡的一種,也包括輸入層、隱藏層和輸出層。
  • 一文學會用 Tensorflow 搭建神經網絡
    神經網絡由大量的節點和之間的聯繫構成,負責傳遞信息和加工信息,神經元也可以通過訓練而被強化。這個圖就是一個神經網絡系統,它由很多層構成。輸入層就是負責接收信息,比如說一隻貓的圖片。輸出層就是計算機對這個輸入信息的認知,它是不是貓。隱藏層就是對輸入信息的加工處理。神經網絡是如何被訓練的,首先它需要很多數據。比如他要判斷一張圖片是不是貓。
  • 從零開始用 Python 構建循環神經網絡
    (給Python開發者加星標,提升Python技能)英文:Faizan Shaikh,翻譯:李文婧,轉自:數據派(ID:datapi)
  • 【神經網絡】Keras入門
    KerasKeras 是一個用 Python 編寫的高級神經網絡 API,它能夠以 TensorFlow, CNTK, 或者 Theano 作為後端運行。也就是 TensorFlow 的高級 API,雖然叫做高級,但是用起來很簡單。
  • 針對初學者的循環神經網絡介紹
    循環神經網絡(RNN)是一種專門處理序列的神經網絡。它們通常用於自然語言處理(NLP)任務,因為它們在處理文本方面非常有效。在本文中,我們將探索什麼是RNN,了解它們是如何工作的,並使用Python從頭構建一個真正的RNN(僅使用numpy庫)。這篇文章假設你有神經網絡的基本知識。
  • 理解循環神經網絡RNN(6.2)
    6.2 理解循環神經網絡(RNN)前面所有見過的神經網絡模型,比如,全聯結網絡和卷積網絡,它們最主要的特徵是沒有記憶。每個輸入被單獨處理,也沒有保留輸入之間的狀態。在這種神經網絡中,要想處理序列數據或者時序數據,那就需要一次輸入整個序列到神經網絡模型:把整個序列當作單個數據點。
  • 一文讀懂圖神經網絡
    一、圖神經網絡介紹什麼是圖神經網絡圖神經網絡(Graph Neural Networks, GNNs)是基於圖結構的深度學習方法,近期被廣泛應用到各類圖像、自然語言處理等任務上。圖為什麼要使用圖神經網絡圖神經網絡有靈活的結構和更新方式,可以很好的表達一些數據本身的結構特性,除了一些自帶圖結構的數據集(如Cora,Citeseer等)以外,圖神經網絡目前也被應用在更多的任務上,比如文本摘要,文本分類和序列標註任務等,目前圖神經網絡以及其變種在很多任務上都取得了目前最好的結果
  • 深度學習-機器學習從入門到深入全套資源分享
    神經網絡模型概覽    1. 一文看懂25個神經網絡模型    2. DNN概述論文:詳解前饋、卷積和循環神經網絡技術    3. colah's blog    4. Model Zoom    5. DNN概述    6.
  • LSTM、GRU與神經圖靈機:詳解深度學習最熱門的循環神經網絡
    近日,Jason Brownlee 通過一篇長文對循環神經網絡進行了系統的介紹。機器之心對本文進行了編譯介紹。循環神經網絡(RNN/recurrent neural network)是一類人工神經網絡,其可以通過為網絡添加額外的權重來在網絡圖(network graph)中創建循環,以便維持一個內部狀態。
  • 從零開始用 Python 構建循環神經網絡(附代碼)
    (給數據分析與開發加星標,提升數據技能)英文:Faizan Shaikh,翻譯:李文婧,轉自:數據派(ID:datapi)
  • 一文了解神經網絡工作原理
    「人工神經網絡(ANN)是一種信息處理範例,它受到生物神經系統(大腦)信息處理方式的啟發。由大量高度互連的處理元件(神經元)組成,這些元件協同工作以解決特定問題。」主要內容:1. 神經元2. 激活功能3. 激活功能的類型4. 神經網絡如何工作5. 神經網絡如何學習(反向傳播)6.
  • 循環神經網絡原理--RNN,LSTM,GRU
    U、V、W代表神經網絡中的權重矩陣。在循環神經網絡中,向量S的值不僅僅和X有關,還和上一層的隱藏層輸出向量S有關。因此U是X和S之間的映射矩陣,W是上一隱藏層S的輸出和該層的向量S的映射矩陣。V是每個隱藏層的向量和輸出層向量映射矩陣。RNN展開後
  • 入門 | 從Q學習到DDPG,一文簡述多種強化學習算法
    最近,隨著與神經網絡的結合,這種算法不斷發展,已經能夠解決更複雜的任務,比如鐘擺問題。雖然已經有大量的強化學習算法,但似乎並沒有什麼文章對它們進行全面比較。每次需要決定將哪些算法應用於特定的任務時,都讓我很糾結。本文旨在通過簡要討論強化學習的設置來解決這個問題,並簡要介紹一些眾所周知的算法。1.
  • 前沿 | 簡述脈衝神經網絡SNN:下一代神經網絡
    脈衝神經網絡(SNN)屬於第三代神經網絡模型,實現了更高級的生物神經模擬水平。
  • 生物神經網絡與人工神經網絡的遞歸性
    深度學習人工神經網絡的遞歸性    深度學習網絡是人工神經網絡的一種子類,神經元(或節點)排列成層。與早期研究的此類網絡只有一兩個此類層相比,現在網絡中存在許多層,賦予主觀深度,與其同名。在一個典型的全連通前饋深度學習網絡中,給定層中的所有神經元都會立即將輸出發送給該層中的所有神經元(計算的方向流通常是從下到上或從左到右進行模式化)。
  • 想入門深度學習?先弄懂這八個神經網絡架構再說!
    在這篇博客文章中,我想分享我認為任何機器學習研究人員都應該熟悉的八個神經網絡架構,以促進他們的工作。一般來說,這些架構可分為三類:1. 前饋神經網絡這是實際應用中最常見的神經網絡類型。第一層是輸入,最後一層是輸出。如果有多個隱藏層,我們稱之為「深度」神經網絡。他們計算出一系列改變樣本相似性的變換。各層神經元的活動是前一層活動的非線性函數。