rnn 可用於許多不同的地方。下面是 rnn 應用最多的領域。
1. 語言建模和文字生成
給出乙個詞語序列,試著**下乙個詞語的可能性。這在翻譯任務中是很有用的,因為最有可能的句子將是可能性最高的單詞組成的句子。
2. 機器翻譯
將文字內容從一種語言翻譯成其他語言使用了一種或幾種形式的 rnn。所有日常使用的實用系統都用了某種高階版本的 rnn。
3. 語音識別
基於輸入的聲波**語音片段,從而確定詞語。
4. 生成影象描述
rnn 乙個非常廣泛的應用是理解影象中發生了什麼,從而做出合理的描述。這是 cnn 和 rnn 相結合的作用。cnn 做影象分割,rnn 用分割後的資料重建描述。這種應用雖然基本,但可能性是無窮的。
本文按照以下主題進行。每一部分都是基於之前的部分進行的,所以不要跳著讀。
前饋網路入門
前饋網路通過在網路的每個節點上做出的一系列操作傳遞資訊。前饋網路每次通過每個層直接向後傳遞資訊。這與其他迴圈神經網路不同。一般而言,前饋網路接受乙個輸入並據此產生輸出,這也是大多數監督學習的步驟,輸出結果可能是乙個分類結果。它的行為與 cnn 類似。輸出可以是以貓狗等作為標籤的類別。
前饋網路是基於一系列預先標註過的資料訓練的。訓練階段的目的是減少前饋網路猜類別時的誤差。一旦訓練完成,我們就可以用訓練後的權重對新批次的資料進行分類。
乙個典型的前饋網路架構
還有一件事要注意。在前饋網路中,無論在測試階段展示給分類器的影象是什麼,都不會改變權重,所以也不會影響第二個決策。這是前饋網路和迴圈網路之間乙個非常大的不同。
與迴圈網路不同,前饋網路在測試時不會記得之前的輸入資料。它們始終是取決於時間點的。它們只會在訓練階段記得歷史輸入資料。
迴圈網路
也就是說,迴圈網路不僅將當前的輸入樣例作為網路輸入,還將它們之前感知到的一併作為輸入。
我們試著建立了乙個多層感知器。從簡單的角度講,它有乙個輸入層、乙個具備特定啟用函式的隱藏層,最終可以得到輸出。
多層感知器架構示例
如果在上述示例中的層數增加了,輸入層也接收輸入。那麼第乙個隱藏層將啟用傳遞到下乙個隱藏層上,依此類推。最後到達輸出層。每乙個隱藏層都有自己的權重和偏置項。現在問題變成了我們可以輸入到隱藏層嗎?
每一層都有自己的權重(w)、偏置項(b)和啟用函式(f)。這些層的行為不同,合併它們從技術層面上講也極具挑戰性。為了合併它們,我們將所有層的權重和偏置項替換成相同的值。如下圖所示:
現在我們就可以將所有層合併在一起了。所有的隱藏層都可以結合在乙個迴圈層中。所以看起來就像下圖:
我們在每一步都會向隱藏層提供輸入。現在乙個迴圈神經元儲存了所有之前步的輸入,並將這些資訊和當前步的輸入合併。因此,它還捕獲到一些當前資料步和之前步的相關性資訊。t-1 步的決策影響到第 t 步做的決策。這很像人類在生活中做決策的方式。我們將當前資料和近期資料結合起來,幫助解決手頭的特定問題。這個例子很簡單,但從原則上講這與人類的決策能力是一致的。這讓我非常想知道我們作為人類是否真的很智慧型,或者說我們是否有非常高階的神經網路模型。我們做出的決策只是對生活中收集到的資料進行訓練。那麼一旦有了能夠在合理時間段內儲存和計算資料的先進模型和系統時,是否可以數位化大腦呢?所以當我們有了比大腦更好更快的模型(基於數百萬人的資料訓練出的)時,會發生什麼?
我們用乙個例子來闡述上面的解釋,這個例子是**一系列字母後的下乙個字母。想象乙個有 8 個字母的單詞 namaskar。
namaskar(合十禮):印度表示尊重的傳統問候或姿勢,將手掌合起置於面前或胸前鞠躬。如果我們在向網路輸入 7 個字母後試著找出第 8 個字母,會發生什麼呢?隱藏層會經歷 8 次迭代。如果展開網路的話就是乙個 8 層的網路,每一層對應乙個字母。所以你可以想象乙個普通的神經網路被重複了多次。展開的次數與它記得多久之前的資料是直接相關的。
迴圈神經網路的運作原理
迴圈神經元
這裡我們將更深入地了解負責決策的實際神經元。以之前提到的 namaskar 為例,在給出前 7 個字母後,試著找出第 8 個字母。輸入資料的完整詞彙表是 。在真實世界中單詞或句子都會更複雜。為了簡化問題,我們用的是下面這個簡單的詞彙表。
在上圖中,隱藏層或 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)
現在我們了解了 rnn 是如何實際運作的,但是在實際工作中如何訓練 rnn 呢?該如何決定每個連線的權重呢?如何初始化這些隱藏單元的權重呢?迴圈網路的目的是要準確地對序列輸入進行分類。這要靠誤差值的反向傳播和梯度下降來實現。但是前饋網路中使用的標準反向傳播無法在此應用。
與有向無環的前饋網路不同,rnn 是迴圈圖,這也是問題所在。在前饋網路中可以計算出之前層的誤差導數。但 rnn 的層級排列與前饋網路並不相同。
答案就在之前討論過的內容中。我們需要展開網路。展開網路使其看起來像前饋網路就可以了。
展開 rnn
在每個時間步取出 rnn 的隱藏單元並複製。時間步中的每一次複製就像前饋網路中的一層。在時間步 t+1 中每個時間步 t 層與所有可能的層連線。因此我們對權重進行隨機初始化,展開網路,然後在隱藏層中通過反向傳播優化權重。通過向最低層傳遞引數完成初始化。這些引數作為反向傳播的一部分也得到了優化。
展開網路的結果是,現在每一層的權重都不同,因此最終會得到不同程度的優化。無法保證基於權重計算出的誤差是相等的。所以每一次執行結束時每一層的權重都不同。這是我們絕對不希望看到的。最簡單的解決辦法是以某種方式將所有層的誤差合併到一起。可以對誤差值取平均或者求和。通過這種方式,我們可以在所有時間步中使用一層來保持相同的權重。
rnn 實現
該模型是 yash katariya 建的。我對該模型做了一些細微的改動以適合本文的要求。
RNN迴圈神經網路簡述
by yang liu 1.什麼是rnn 迴圈神經網路 recurrent neural network,rnn 是一類以序列 sequence 資料為輸入,在序列的演進方向進行遞迴 recursion 且所有節點 迴圈單元 按鏈式連線的遞迴神經網路 recursive neural network...
卷積神經網路簡述
卷積神經網路 cnn 是目前最流行的深度學習演算法之一,尤其適用於發現影象中的模式,從而識別物體 人臉和場景。直接從影象資料中學習,使用模式對影象進行分類,無需手動特徵提取。使用cnn實現深度學習變得越來越流行的三大因素 cnn為影象識別和模式檢測提供了乙個最佳體系架構。與gpu和平行計算的發展相結...
迴圈神經網路
原文 迴圈神經網路也可以畫成下面這個樣子 對於語言模型來說,很多時候光看前面的詞是不夠的,比如下面這句話 我的手機壞了,我打算 一部新手機。可以想象,如果我們只看橫線前面的詞,手機壞了,那麼我是打算修一修?換一部新的?還是大哭一場?這些都是無法確定的。但如果我們也看到了橫線後面的詞是 一部新手機 那...