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