什么是神經(jīng)網(wǎng)絡-循環(huán)神經(jīng)網(wǎng)絡RNN各層詳解及實例展示
循環(huán)神經(jīng)網(wǎng)絡(RNN)是一類能夠處理序列數(shù)據(jù)的神經(jīng)網(wǎng)絡,它在處理自然語言處理、語音識別、時間序列分析等任務中表現(xiàn)出色。RNN的獨特之處在于它能夠捕捉序列中的時間依賴關系,這使得它與傳統(tǒng)的前饋神經(jīng)網(wǎng)絡(如MLP)有著顯著的不同。
RNN的基本原理
在標準的前饋神經(jīng)網(wǎng)絡中,輸入和輸出之間的映射是靜態(tài)的:輸入通過一組層的線性變換和非線性激活函數(shù),然后生成輸出。而RNN引入了循環(huán)的概念:在處理序列數(shù)據(jù)時,RNN不僅考慮當前時間步的輸入,還會考慮之前所有時間步的信息。這種“記憶”機制通過隱藏狀態(tài)(hidden state)來實現(xiàn)。
隱藏狀態(tài)的循環(huán)關系
RNN通過一個隱藏狀態(tài)(hidden state)來記住先前的時間步的信息。隱藏狀態(tài)會在每一個時間步進行更新,并傳遞到下一個時間步。這一過程可以用以下公式表示:
ht=σ(Wxhxt+Whhht?1+bh)
其中:
- ht 是時間步 t
- xt 是時間步 t
- ht?1是前一個時間步的隱藏狀態(tài)。
- Wxh
- Whh
- bh
- σ 是激活函數(shù)(如?
?tanh?
? 或??ReLU?
?)。
這個公式表示了RNN的核心思想:當前隱藏狀態(tài) ht 是當前輸入 xt 和前一個隱藏狀態(tài) ht?1
輸出層
在RNN的每一個時間步,隱藏狀態(tài)會被用來生成輸出。輸出通常是當前時間步的隱藏狀態(tài)通過某種變換得到的結果:
yt=σ(Whyht+by)
其中:
- yt 是時間步 t
- Why
- by
- σ
輸出層的形式和目的可以根據(jù)具體任務進行調整。例如,在分類任務中,輸出層可能是一個 ??softmax?
? 函數(shù),用于生成類別概率分布;在回歸任務中,輸出層可能是一個線性函數(shù)。
下面讓我們分解RNN的每一層,深入理解其工作原理。
輸入層
RNN的輸入層用于接收序列數(shù)據(jù)。每個時間步的輸入數(shù)據(jù)可以是一個向量 xt,表示一個時間點的特征。在自然語言處理中,xt 通常是詞向量(word embedding);在時間序列分析中,xt
- 向量化處理:通常,輸入數(shù)據(jù)首先會被向量化。例如,文本數(shù)據(jù)中的單詞會被轉換為一個詞向量;音頻數(shù)據(jù)會被轉換為頻譜特征。這個向量化的過程是必要的,因為神經(jīng)網(wǎng)絡只能處理數(shù)值數(shù)據(jù)。
- 時間步:RNN的輸入是一個序列數(shù)據(jù),這意味著輸入數(shù)據(jù)是按時間順序排列的一組向量。輸入序列的長度可以是固定的,也可以是可變的。
隱藏層
隱藏層是RNN的核心部分,它負責處理輸入序列中的時間依賴關系。每個時間步的隱藏狀態(tài) ht 不僅依賴于當前時間步的輸入 xt,還依賴于前一個時間步的隱藏狀態(tài) ht?1。
- 記憶機制:RNN的隱藏層通過反饋機制將前一個時間步的信息傳遞到當前時間步。這種機制使得RNN能夠“記住”之前的信息,并用這些信息來影響當前時間步的輸出。
- 激活函數(shù):為了引入非線性,隱藏層通常會應用一個激活函數(shù),如?
?tanh?
? 或??ReLU?
?。??tanh?
? 函數(shù)是RNN中常用的激活函數(shù),因為它的輸出范圍在 [-1, 1] 之間,適合處理序列數(shù)據(jù)中的正負信息。 - 參數(shù)共享:在RNN中,不同時間步之間共享相同的參數(shù)(即權重矩陣和偏置項)。這減少了模型的復雜度,并確保模型能夠處理不同長度的序列。
輸出層
輸出層用于生成最終的輸出。在每一個時間步,RNN的隱藏狀態(tài)會被用來計算當前時間步的輸出。
- 輸出形式:輸出可以是每個時間步的預測值(如時間序列預測),也可以是整個序列的分類結果(如情感分析)。輸出層的設計通常與具體任務密切相關。
激活函數(shù):輸出層可以使用各種激活函數(shù),視任務而定。例如,分類任務中使用??softmax?
? 函數(shù),而回歸任務中則可能使用線性激活函數(shù)。那么RNN的訓練過程是什么樣的呢?
RNN的訓練過程與傳統(tǒng)神經(jīng)網(wǎng)絡類似,但由于其循環(huán)結構,存在一些特殊的挑戰(zhàn)。訓練RNN的主要方法是反向傳播通過時間(Backpropagation Through Time, BPTT)。
反向傳播通過時間(BPTT)
BPTT是一種擴展的反向傳播算法,適用于RNN。它通過展開RNN,將循環(huán)結構轉換為一個展開的鏈式結構,從而可以應用標準的反向傳播算法。展開后,RNN的每個時間步都被視為一個獨立的神經(jīng)網(wǎng)絡層,這些層之間共享參數(shù)。
- 展開過程:在時間序列上展開RNN,就像將整個網(wǎng)絡“鋪開”,每一個時間步的隱藏狀態(tài)都變成一個獨立的節(jié)點,與其他節(jié)點通過共享的權重相連。這個展開的過程使得RNN的時間依賴性可以通過標準的反向傳播算法進行處理。
- 梯度計算:通過BPTT,RNN可以計算損失函數(shù)相對于每個參數(shù)的梯度,從而更新權重。這一過程包括前向傳播(計算輸出和損失)以及反向傳播(計算梯度并更新參數(shù))。?
梯度消失與梯度爆炸
由于RNN的循環(huán)結構,BPTT在處理長序列時,可能會遇到梯度消失或梯度爆炸的問題。這些問題使得訓練深層RNN或長序列RNN變得困難。
- 梯度消失:在長序列中,梯度在反向傳播的過程中可能會逐漸減小,導致模型的參數(shù)更新變得極其緩慢,甚至無法更新。這使得RNN難以捕捉長時間依賴關系。
- 梯度爆炸:相反,梯度也可能在反向傳播過程中急劇增大,導致模型的參數(shù)更新過大,模型發(fā)散。
接下來進行實例講解:
假設我們有三天的天氣數(shù)據(jù),每天的數(shù)據(jù)包括:
- 溫度:使用一個實數(shù)表示,例如 xt1?
- 濕度:使用一個實數(shù)表示,例如 xt2?
我們將這些數(shù)據(jù)組織成一個向量輸入RNN,例如: xt=[xt1,xt2]
我們需要預測第4天的天氣,并通過前3天的天氣數(shù)據(jù)進行訓練。
輸入數(shù)據(jù)
第1天到第3天的天氣數(shù)據(jù)表示為三個輸入向量:
- 第1天: x1=[15°C,60%]
- 第2天: x2=[16°C,65%]
- 第3天: x3=[18°C,70%]
RNN的工作過程
RNN的核心是它的隱藏狀態(tài),用向量表示為 ht,它包含了之前時間步的信息。RNN通過遞歸計算,將當前的輸入 xt 和前一時刻的隱藏狀態(tài) ht?1結合起來,生成當前時刻的隱藏狀態(tài) ht。
公式如下: ht=σ(Wh?ht?1+Wx?xt+bh)
其中:
- Wh
- Wx
- bh
- σ
實例講解:
假設我們有一個簡單的RNN,初始隱藏狀態(tài) h0
第1天:
輸入 x1=[15,60],初始隱藏狀態(tài) h0=[0,0]。RNN根據(jù)權重矩陣和偏置項計算新的隱藏狀態(tài): h1=σ(Wh?h0+Wx?x1+bh)假設結果是 h1=[0.5,0.8],這表示RNN通過第1天的天氣數(shù)據(jù)學習到了一些信息,并存儲在隱藏狀態(tài)中。
第2天:
輸入 x2=[16,65],現(xiàn)在RNN使用 h1 和 x2 計算新的隱藏狀態(tài): h2=σ(Wh?h1+Wx?x2+bh) 假設結果是 h2=[0.7,1.1],這表示RNN結合了第1天和第2天的數(shù)據(jù)更新了記憶。
第3天:
輸入 x3=[18,70],RNN根據(jù) h2 和 x3 計算出新的隱藏狀態(tài): h3=σ(Wh?h2+Wx?x3+bh) 假設結果是 h3=[1.0,1.5],現(xiàn)在隱藏狀態(tài)包含了前3天的天氣信息。
輸出預測
最后,RNN使用第3天的隱藏狀態(tài) h3 來預測第4天的天氣。輸出層通過以下公式計算預測結果: y4=σ(Wy?h3+by)假設輸出結果 y4=[20,72],這意味著RNN預測第4天的溫度為20°C,濕度為72%。
這個例子展示了RNN如何使用向量來逐步處理輸入數(shù)據(jù)并更新隱藏狀態(tài)。RNN通過當前的輸入 xt 和之前的隱藏狀態(tài) ht?1,遞歸地更新隱藏狀態(tài) ht,從而對下一個時間步進行預測。在這個過程中,RNN的隱藏狀態(tài)是關鍵,它可以“記住”之前時間步的信息并結合當前輸入做出合理的預測。
本文轉載自 ??人工智能訓練營??,作者: 小A學習
