Base-LLM 1.3.1 循環(huán)神經(jīng)網(wǎng)絡(luò)

一、如何處理序列信息

從分詞到embedding是從文件到稠密詞向量的過程,解決了模型輸入的問題,即文本數(shù)值化。
第二個(gè)問題就是,如何從一個(gè)詞向量序列中有效地提取整個(gè)序列的特征。
例如: 意圖識(shí)別中,希望將“播放周杰倫的《稻香》”歸類到“音樂播放”。目前能得到各詞元的詞向量,如何將這些向量融合成能表達(dá)證據(jù)指令含義的“文本向量”,并送入分類器呢?

1.1、簡(jiǎn)單方法的局限性

針對(duì)詞向量序列融合成一個(gè)定長(zhǎng)的文本向量,
早期解決方案

  1. 像詞袋法一樣,將所有向量相加或取平均。它的局限是忽略了語序信息。例如“我愛你”和“你愛我” 會(huì)得到完全相同的文本向量。 同時(shí)所有詞視為同等重要。
  2. 使用全連接神經(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)前詞元之前都看過了哪些信息。

image.png

(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ù)共享”?

  1. 處理變長(zhǎng)序列
    模型不依賴固定序列長(zhǎng)度。訓(xùn)練時(shí)學(xué)10步的規(guī)律,推理時(shí)可處理100步的輸入(因每步用同一套規(guī)則)。
  2. 大幅減少參數(shù)量:若每步用獨(dú)立參數(shù)(如U?, U?...),參數(shù)量隨序列長(zhǎng)度爆炸增長(zhǎng),極易過擬合。共享后參數(shù)量?jī)H由隱藏層維度決定(與序列長(zhǎng)度無關(guān))。
  3. 學(xué)習(xí)時(shí)序模式:共享的W使模型能捕捉“任意時(shí)間間隔的依賴”(如“主語→謂語”的關(guān)系),而非僅記住特定位置的模式。
  4. ** 平移不變性** : 相同模式出現(xiàn)在序列不同位置時(shí)(如“下雨”在句首或句尾),模型能用相同邏輯處理,提升泛化能力。
  5. 理論與生物啟發(fā): 模擬人類處理語言/時(shí)間序列的方式:用同一套認(rèn)知規(guī)則處理不同時(shí)刻的信息。

三、RNN工作原理解析

3.1 文本分類實(shí)例

image.png

舉例: 給“播放周杰倫的《稻香》”進(jìn)行分類。

  1. 分詞: ["播放", "周杰倫", "的", "《稻香》"], 轉(zhuǎn)為ID序列 [23, 58, 102, 203](假設(shè)), embedding 得到4個(gè)詞向量。 輸入序列形狀為(4,128)
  2. 進(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è)是反向的。


image.png

注意: 正香和反向的兩個(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的梯度。

image.png

image.png
image.png

image.png

這個(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é)

  1. 如何處理序列信息?
    簡(jiǎn)單方法: 類似詞袋法加權(quán); 使用FCN等。 這些都是孤立處理,無法捕獲上下文依賴以及序列特征。CNN (感受野有限,無法捕捉長(zhǎng)距離依賴)
  2. 引入記憶RNN
  3. RNN工作原理
    輸入是當(dāng)前時(shí)間步的輸入x和上一層的隱藏狀態(tài),有相同的U和W權(quán)重,每一個(gè)時(shí)間步計(jì)算之后都會(huì)更新權(quán)重,并輸出新的隱藏狀態(tài)。
    這個(gè)最終的輸出可以作為該文本向量,也就是動(dòng)態(tài)向量。
  4. RNN實(shí)現(xiàn)
  5. BiRNN: 能夠結(jié)合前文和后文的上下文信息,拼接前向和反向RNN的隱藏狀態(tài),共同優(yōu)化權(quán)重。
  6. 隨時(shí)間反向傳播: Loss是每個(gè)時(shí)間步的損失之和
  7. RNN的局限性: 存在梯度爆炸或者梯度消失問題,無法解決長(zhǎng)距離依賴問題。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容