## NLP 技術演進(RNN、LSTM、Transformer) RNN 透過隱藏狀態遞迴地傳遞資訊,能夠捕捉時間序列的結構,但面對長距離依賴時常會產生梯度消失的問題,且訓練過程難以進行有效平行化。為改善這些缺點,LSTM 導入門控機制(Gate mechanism)以增強記憶能力,但本質上仍受到序列處理順序的限制。 ![image](https://hackmd.io/_uploads/Skl6WE6nye.png) 直到 2017 年 Vaswani 等人提出 Transformer 架構以來,該模型迅速成為自然語言處理領域的核心技術,其基礎的自注意力(self-attention)機制使模型能有效捕捉序列中不同位置之間的相互關係,然而隨著應用場景的擴展,Transformer 在處理長序列時的計算與記憶體需求逐漸成為瓶頸,傳統自注意力的運算複雜度為 $𝑂(n^2)$,當輸入序列長度增加時,所需的運算資源會呈指數級成長,嚴重限制了模型的可擴展性。 更簡單的說,在推論(Inference)階段,Self-Attention 的計算量與記憶需求會隨序列長度線性甚至二次增加,而傳統 RNN 的需求則相對固定;在訓練階段,Self-Attention 結構因不依賴前面的輸出結果,能夠輕易實現大規模平行化;而 RNN 因其時間序列性質,不易平行化,進而限制了其訓練效率。 ![image](https://hackmd.io/_uploads/B1YcfVphkl.png) ## 是否能改善 RNN 訓練平行化呢?Linear attention 傳統 RNN 在每個時間步 $H_t$ 的狀態更新公式為 $H_t = f_{A,t}(H_{t-1}) + f_{B,t}(x_t)$,其中 $f_{A,t}$ 是對前一個隱藏狀態所做的變換,代表模型對過去記憶的「反饋」(Reflection),而 $f_{B,t}$ 則代表當下輸入所貢獻的新資訊,這樣的設計使得模型在每一步都能根據過去的狀態動態調整記憶,但也導致其無法進行平行運算。 Linear Attention 形式上保留了這種「狀態累積」的架構,但刻意省略了對過去狀態的變換,也就是移除了 $f_{A,t}$ ,將記憶的更新方式簡化為 $H_t = H_{t-1} + v_t k_t^{T}$,但寫入的規則是固定的線性疊加,不再進行動態轉換,也就避免了對 $H_{t-1}$ 的反覆運算。 另一方面,從 Self-Attention 的角度出發,傳統 Transformer 中每個位置的輸出會根據所有位置的資訊進行加權平均,這個加權通常是透過 softmax 計算注意力分數而來,然而 Linear Attention 則移除了這個 softmax 操作,改以可拆解的內積形式保留序列資訊,其核心思想是預先累積所有歷史資訊,然後用當前的查詢向量 $q_t$ 去擷取所需資訊。 ![image](https://hackmd.io/_uploads/ByZw8Ean1e.png) ## Linear attention 贏不過 Self attention 之處 Linear Attention 雖然使用類似記憶堆疊的方式來保存資訊,但在每個時間步上,僅透過固定的線性疊加方式更新記憶,無法像 Self-Attention 一樣針對查詢重新計算注意力權重,容易導致「記憶污染」──模型無法分辨哪些資訊仍重要,哪些應該被淡化。 ### 解方一:Retention Network(RetNet) RetNet 的設計在於引入一個可控制的記憶衰減項 𝛾: $H_t = \gamma H_{t-1} + v_t k_t^{T}$ 其中 𝛾 是一個介於 0 和 1 的係數,用來控制「保留多少前一刻的記憶」: * 𝛾 = 1:表示完全保留所有過去資訊 → 就是原本 Linear Attention。 * 𝛾 < 1 γ<1:則會逐步「遺忘」較久以前的內容。 這個設計讓模型具備類似「時間衰退」的特性,能自然地抑制過時的資訊,強化近期重要內容。 ### 解方二:Gated Retention Gated Retention 並不使用固定的 𝛾,而是讓模型針對每個時間步 𝑡,根據輸入自動學習一個動態權重: $\gamma_t = \sigma(W_{\gamma} x_t)$ 然後將這個 $\gamma_t$ 應用於記憶更新 $H_t = \gamma_t H_{t-1} + v_t k_t^{T}$