一、如何處理序列信息
從分詞到embedding是從文件到稠密詞向量的過程,解決了模型輸入的問題,即文本數(shù)值化。
第二個(gè)問題就是,如何從一個(gè)詞向量序列中有效地提取整個(gè)序列的特征。
例如: 意圖識(shí)別中,希望將“播放周杰倫的《稻香》”歸類到“音樂播放”。目前能得到各詞元的詞向量,如何將這些向量融合成能表達(dá)證據(jù)指令含義的“文本向量”,并送入分類器呢?
1.1、簡(jiǎn)單方法的局限性
針對(duì)詞向量序列融合成一個(gè)定長(zhǎng)的文本向量,
早期解決方案
- 像詞袋法一樣,將所有向量相加或取平均。它的局限是忽略了語序信息。例如“我愛你”和“你愛我” 會(huì)得到完全相同的文本向量。 同時(shí)所有詞視為同等重要。
- 使用全連接神經(jīng)網(wǎng)絡(luò)(FCN)。 具體處理方式是先求和再FCN或者先FCN再求和。同樣無法理解詞元之間的順序關(guān)系和上下文依賴,也沒有捕獲序列特征。
3.使用CNN, 通過一維卷積核,滑過整個(gè)詞向量。 缺陷是它的感受野是固定的。雖然可以通過堆疊多層CNN來擴(kuò)大感受野,但是對(duì)于句子開頭和結(jié)尾床距離依賴,CNN讓然難以有效捕捉,無法預(yù)先設(shè)定一個(gè)適用于所有句子的最佳窗口大小。
二、 引入“記憶”的RNN
RNN 能夠記住在處理當(dāng)前詞元之前都看過了哪些信息。

(1)輸入 Xt: 作為每一個(gè)時(shí)間步的輸入, 通過權(quán)重矩陣U連接到隱藏層。
(2)前一個(gè)時(shí)刻的隱藏狀態(tài)(ht-1): hidden_state,通過循環(huán)權(quán)重矩陣W連接到隱藏層。
(3) 當(dāng)前時(shí)刻的隱藏狀態(tài)(ht): 當(dāng)前時(shí)刻輸出的新隱藏狀態(tài)。
(4) 狀態(tài)更新: ht-1到ht的過程
(5) 當(dāng)前的隱藏狀態(tài)ht也可以被用來計(jì)算當(dāng)前時(shí)間步的最終輸出。
? U和W 為什么設(shè)計(jì)為“時(shí)間步上參數(shù)共享”?
- 處理變長(zhǎng)序列
模型不依賴固定序列長(zhǎng)度。訓(xùn)練時(shí)學(xué)10步的規(guī)律,推理時(shí)可處理100步的輸入(因每步用同一套規(guī)則)。- 大幅減少參數(shù)量:若每步用獨(dú)立參數(shù)(如U?, U?...),參數(shù)量隨序列長(zhǎng)度爆炸增長(zhǎng),極易過擬合。共享后參數(shù)量?jī)H由隱藏層維度決定(與序列長(zhǎng)度無關(guān))。
- 學(xué)習(xí)時(shí)序模式:共享的W使模型能捕捉“任意時(shí)間間隔的依賴”(如“主語→謂語”的關(guān)系),而非僅記住特定位置的模式。
- ** 平移不變性** : 相同模式出現(xiàn)在序列不同位置時(shí)(如“下雨”在句首或句尾),模型能用相同邏輯處理,提升泛化能力。
- 理論與生物啟發(fā): 模擬人類處理語言/時(shí)間序列的方式:用同一套認(rèn)知規(guī)則處理不同時(shí)刻的信息。
三、RNN工作原理解析
3.1 文本分類實(shí)例

舉例: 給“播放周杰倫的《稻香》”進(jìn)行分類。
- 分詞: ["播放", "周杰倫", "的", "《稻香》"], 轉(zhuǎn)為ID序列 [23, 58, 102, 203](假設(shè)), embedding 得到4個(gè)詞向量。 輸入序列形狀為(4,128)
- 進(jìn)入RNN 逐步按順序逐步處理, hidden_state 維度為H=64。 初始化h0一般為零向量。
(1) 第一步 t=1, 輸入為x1="播放" 和隱藏狀態(tài) h0, 計(jì)算h1, h1得到了包含“播放”的信息。
(2)第二步 t=2, 輸入x2="周杰倫" 和隱藏狀態(tài)h1, 計(jì)算h2, h2得到了包含“播放”和“周杰倫”的信息。
(3)第三步 t=3, 輸入 x3="的" 和隱藏狀態(tài)h2, 計(jì)算h3, h3得到了包含“播放周杰倫的”的信息
(4) 第四步,t=4, 輸入x4="《稻香》"和隱藏狀態(tài)h3, 計(jì)算h4,h4得到了整個(gè)句子的信息。
最后h4被認(rèn)為是整個(gè)句子動(dòng)態(tài)上下文表示,也就是我們需要的“文本向量”。它捕獲了整個(gè)句子的語序和語義信息。將h4送入全連接分類層,則可以得到各類別的置信度了。
通過這種方式RNN成功地將一個(gè)變長(zhǎng)的詞向量序列,編碼成了一個(gè)蘊(yùn)含序列信息的固定長(zhǎng)度的特征向量。
3.2 從靜態(tài)到動(dòng)態(tài)的飛躍
RNN解決了靜態(tài)詞向量的局限性,實(shí)現(xiàn)了Type到Token的跨越。
靜態(tài)的Type(詞嵌入)體現(xiàn)在word2vec等模型中,學(xué)到字典中的靜態(tài)語義。
RNN 通過隱藏狀態(tài)ht則實(shí)現(xiàn)了動(dòng)態(tài)的Token表示。
動(dòng)態(tài)詞向量:指的他是基于文本上下文產(chǎn)生的,而不是固定的向量。
ELMO? 動(dòng)態(tài)詞向量
四、從零實(shí)現(xiàn)一個(gè)RNN
五、雙向循環(huán)神經(jīng)網(wǎng)絡(luò)
上邊單向RNN, 信息只利用了t時(shí)刻和之前的信息,但是自然語言處理任務(wù)重,一個(gè)詞通常依賴于上文也依賴于下文。例如 “蘋果味道不錯(cuò)”,只看上文不知道蘋果是指水果還是蘋果公司。
為了利用未來信息,提出了雙向循環(huán)神經(jīng)網(wǎng)絡(luò),同時(shí)利用過去和未來的上下文信息。
5.1 BiRNN結(jié)構(gòu)與原理
原理是由兩個(gè)完全獨(dú)立的RNN構(gòu)成,并將他們疊加進(jìn)行處理。一個(gè)是正向的,一個(gè)是反向的。

注意: 正香和反向的兩個(gè)RNN擁有各自獨(dú)立的權(quán)重參數(shù),訓(xùn)練中被同事優(yōu)化。
為什么不直接訓(xùn)練兩個(gè)獨(dú)立的RNN然后合并結(jié)果
BiRNN 可以在同一個(gè)Loss下同事訓(xùn)練兩個(gè)方向的權(quán)重,這樣能更好的適應(yīng)目標(biāo)任務(wù)。
最終輸出是兩個(gè)獨(dú)立RNN的隱藏狀態(tài)的拼接,如果每個(gè)RNN的hidden_size為H,那么BiRNN在每個(gè)時(shí)間步的輸出維度將變?yōu)?H。
在Pytorch中,設(shè)置bidirectional為True。隱藏狀態(tài)存儲(chǔ)的第一個(gè)維度為num_layers*2,分別存儲(chǔ)了正向和反向RNN在最后一個(gè)時(shí)間步的隱藏狀態(tài)。
5.2 BiRNN的作用與局限
作用: 提取了更完整的上下文相關(guān)的特征,使得在許多NLP任務(wù)重(如命名實(shí)體識(shí)別、情感分析、機(jī)器翻譯等)都取得了比單向RNN更好的效果。
局限:沒有解決長(zhǎng)距離依賴問題,依然會(huì)面臨梯度消失或梯度爆炸的挑戰(zhàn)。BiRNN因?yàn)樾枰幚硗暾男蛄胁拍苡?jì)算反向信息,所以無法被用于需要實(shí)時(shí)預(yù)測(cè)的場(chǎng)景。
六、隨時(shí)間反向傳播
BPTT(隨時(shí)間反向傳播):將RNN沿著時(shí)間維度展開,可視作一個(gè)各層參數(shù)共享的深層前饋網(wǎng)絡(luò),在這個(gè)結(jié)構(gòu)上執(zhí)行通用的反向傳播算法。
假設(shè)整個(gè)序列的總損失L是所有時(shí)間步損失Lt的總和。
目標(biāo)則是計(jì)算損失L對(duì)共享參數(shù)U和W的梯度。




這個(gè)連乘的形式正式RNN產(chǎn)生問題的根源所在。
七、 RNN的局限性
7.1 梯度消失與梯度爆炸
連乘導(dǎo)致小于1的數(shù)連乘會(huì)越來越小,導(dǎo)致梯度消失。 大于1的數(shù)連乘會(huì)導(dǎo)致梯度越來越大,導(dǎo)致梯度爆炸。常見梯度爆炸的解決辦法是梯度裁剪,也就是梯度的范數(shù)超過某個(gè)閾值時(shí),就將其縮放到該閾值。
7.2 長(zhǎng)距離依賴
梯度消失導(dǎo)致了長(zhǎng)距離依賴問題。
(1)反向傳播視角: 梯度消失導(dǎo)致最開始的詞的權(quán)重衰減為零。無法捕捉到遠(yuǎn)距離的語義依賴。
(2)正向傳播視角: 信息遺忘或近期偏執(zhí)。正向計(jì)算過程中,每一步的信息都會(huì)被新的輸入和循環(huán)權(quán)重W 稀釋或覆蓋。經(jīng)過足夠多的時(shí)間步后,序列最初的信息在隱藏狀態(tài)中所剩無幾,導(dǎo)致模型遺忘了最初的差異。
7.3 單向性
常規(guī)RNN信息流是單向的,雙向循環(huán)網(wǎng)絡(luò)結(jié)合正向和反向信息流來解決單向性問題。 為了學(xué)習(xí)更復(fù)雜的特征表示,可以把多個(gè)RNN堆疊起來,構(gòu)成深度循環(huán)神經(jīng)網(wǎng)絡(luò)。但是都沒有從根本上解決梯度傳播帶來的長(zhǎng)距離依賴問題。
研究者發(fā)明了兩種更精巧的門控RNN結(jié)構(gòu),分別是長(zhǎng)短記憶網(wǎng)絡(luò)和門控循環(huán)單元。
總結(jié)
- 如何處理序列信息?
簡(jiǎn)單方法: 類似詞袋法加權(quán); 使用FCN等。 這些都是孤立處理,無法捕獲上下文依賴以及序列特征。CNN (感受野有限,無法捕捉長(zhǎng)距離依賴) - 引入記憶RNN
- RNN工作原理
輸入是當(dāng)前時(shí)間步的輸入x和上一層的隱藏狀態(tài),有相同的U和W權(quán)重,每一個(gè)時(shí)間步計(jì)算之后都會(huì)更新權(quán)重,并輸出新的隱藏狀態(tài)。
這個(gè)最終的輸出可以作為該文本向量,也就是動(dòng)態(tài)向量。 - RNN實(shí)現(xiàn)
- BiRNN: 能夠結(jié)合前文和后文的上下文信息,拼接前向和反向RNN的隱藏狀態(tài),共同優(yōu)化權(quán)重。
- 隨時(shí)間反向傳播: Loss是每個(gè)時(shí)間步的損失之和
- RNN的局限性: 存在梯度爆炸或者梯度消失問題,無法解決長(zhǎng)距離依賴問題。