廣西備案工信部網(wǎng)站營銷型網(wǎng)站內(nèi)容
第一章:人工智能之不同數(shù)據(jù)類型及其特點梳理
第二章:自然語言處理(NLP):文本向量化從文字到數(shù)字的原理
第三章:循環(huán)神經(jīng)網(wǎng)絡(luò)RNN:理解 RNN的工作機制與應(yīng)用場景(附代碼)
第四章:循環(huán)神經(jīng)網(wǎng)絡(luò)RNN、LSTM以及GRU 對比(附代碼)
第五章:理解Seq2Seq的工作機制與應(yīng)用場景中英互譯(附代碼)
第六章:深度學(xué)習(xí)架構(gòu)Seq2Seq-添加并理解注意力機制(一)
第七章:深度學(xué)習(xí)架構(gòu)Seq2Seq-添加并理解注意力機制(二)
本文主要是分析Seq2Seq 架構(gòu)本身具有的缺點,并分析針對長序列輸入時,導(dǎo)致信息丟失這一問題,造成這個問題的原因,以及針對這一問題,通過引入注意力機制,如何來解決這一問題。
一、Seq2Seq簡介
Seq2Seq(Sequence to Sequence)模型是一種深度學(xué)習(xí)架構(gòu),主要用于處理輸入和輸出均為可變長度序列的任務(wù),如機器翻譯、文本摘要和語音識別等?。其核心結(jié)構(gòu)包含兩部分,編碼器(Encoder)?和 解碼器(Decoder)?,如下圖所示,輸入是英文單詞 ‘like’ 翻譯成中文 ‘喜歡’
- 編碼器(Encoder)?:通常由RNN、LSTM或GRU等循環(huán)神經(jīng)網(wǎng)絡(luò)構(gòu)成,負(fù)責(zé)將輸入序列逐步編碼為一個固定長度的上下文向量(Context Vector),該向量綜合了輸入序列的整體語義信息?。
- 解碼器(Decoder)?:同樣基于循環(huán)神經(jīng)網(wǎng)絡(luò),接收編碼器生成的上下文向量作為初始輸入,逐步生成輸出序列的每個元素。訓(xùn)練時常用“教師強制”(Teacher Forcing)方法,即將前一步的真實輸出作為當(dāng)前步的輸入以提高穩(wěn)定性?。
Seq2Seq模型的特點在于處理變長序列時無需嚴(yán)格對齊輸入與輸出的長度,例如將中文句子翻譯為英文時,輸出長度可靈活變化?。
二、普通 Seq2Seq 的局限性
普通 Seq2Seq 模型將輸入序列壓縮為 單一的上下文向量(Encoder 的最后一個隱藏狀態(tài),就是上圖中的Context Vector),存在以下問題:
- 信息瓶頸:長序列輸入時,單一向量難以保留所有細(xì)節(jié),即整個輸入序列被壓縮成一個固定大小的向量上下文向量,可能導(dǎo)致信息丟失。
- 長距離依賴丟失:解碼器無法靈活關(guān)注輸入序列的不同部分。
- 速度慢:訓(xùn)練速度較慢且難以并行化。
在Seq2Seq模型中,編碼器將整個輸入序列壓縮成一個固定大小的向量(即上下文向量或語義向量),然后解碼器使用這個向量來生成輸出序列。這種做法存在幾個潛在的問題,尤其是當(dāng)處理較長的輸入序列時,可能會導(dǎo)致信息丟失。
輸入序列太長,為什么會導(dǎo)致信息丟失?
-
固定維度限制:無論輸入序列有多長,上下文向量的維度都是固定的。這意味著如果輸入序列非常長,編碼器需要將大量信息壓縮到一個有限維度的空間里。這就像試圖將一本書的內(nèi)容壓縮進(jìn)一句話中一樣,不可避免地會丟失一些細(xì)節(jié)和細(xì)微差別。
-
信息覆蓋問題:對于某些復(fù)雜的任務(wù),如長文本翻譯或?qū)υ捪到y(tǒng),源序列可能包含多個主題、觀點或重要細(xì)節(jié)。由于上下文向量的容量有限,編碼器可能無法有效地表示所有這些信息,從而導(dǎo)致關(guān)鍵信息被忽略或覆蓋。
舉例說明
假設(shè)我們有一個中文句子“我喜歡吃魚,特別是新鮮的鮭魚,它富含Omega-3脂肪酸,對心臟健康有益”,我們要將其翻譯成英文。
-
沒有注意力機制的情況:編碼器嘗試將這句話的所有信息壓縮成一個固定大小的向量。然而,這句話包含了多個部分的信息——個人偏好(喜歡)、食物類型(魚)、具體種類(鮭魚)、營養(yǎng)成分(Omega-3脂肪酸)以及健康益處(對心臟健康有益)。如果輸入序列過長或者信息過于復(fù)雜,那么單一的上下文向量很可能無法承載這么多不同的信息點。結(jié)果,在解碼階段,解碼器可能難以準(zhǔn)確地再現(xiàn)原句的所有細(xì)節(jié),可能會遺漏一些重要的內(nèi)容,例如忘記提及“Omega-3脂肪酸”或是“對心臟健康有益”。
-
有注意力機制的情況:在這種情況下,每當(dāng)解碼器準(zhǔn)備生成下一個單詞時,它不僅依賴于前一時刻的狀態(tài),還能夠通過注意力機制直接訪問輸入序列的不同部分。這樣,即使輸入序列很長,解碼器也能夠根據(jù)當(dāng)前生成的內(nèi)容需求,選擇性地關(guān)注最相關(guān)的信息。比如,在生成關(guān)于鮭魚營養(yǎng)價值的部分時,它可以特別關(guān)注與“Omega-3脂肪酸”相關(guān)的輸入部分;而在提到飲食喜好時,則可以更側(cè)重于“我喜歡吃魚”這部分的信息。因此,注意力機制大大提高了模型處理長距離依賴關(guān)系的能力,并且減少了信息丟失的可能性。
固定大小的上下文向量在處理長或復(fù)雜序列時面臨信息丟失的風(fēng)險,因為它們不能完全捕捉并保留原始輸入序列中的全部信息。引入注意力機制是解決這一問題的有效方法之一。
三、注意力機制的核心思想
注意力機制 允許解碼器在每個時間步動態(tài)關(guān)注輸入序列的 相關(guān)部分,而非依賴單一向量。其核心流程如下:
- 編碼器輸出 所有時間步的隱藏狀態(tài)(而非僅最后一步)。
- 解碼時,計算解碼器當(dāng)前狀態(tài)與所有編碼器狀態(tài)的 相似度,生成注意力權(quán)重。
- 根據(jù)權(quán)重 加權(quán)求和編碼器狀態(tài),生成動態(tài)上下文向量。
- 將動態(tài)上下文向量與解碼器輸入結(jié)合,預(yù)測當(dāng)前輸出。
四、實現(xiàn)步驟
4.1 編碼器處理輸入序列
- 輸入序列: X = ( x 1 , x 2 , … , x T ) \mathbf{X} = (x_1, x_2, \dots, x_T) X=(x1?,x2?,…,xT?)
- 編碼器輸出:所有時間步的隱藏狀態(tài) { h 1 , h 2 , … , h T } \{h_1, h_2, \dots, h_T\} {h1?,h2?,…,hT?}
4.2 計算注意力權(quán)重
在解碼器的第 t t t 步:
-
解碼器當(dāng)前隱藏狀態(tài): s t ? 1 s_{t-1} st?1?(上一步的隱藏狀態(tài))
-
編碼器所有隱藏狀態(tài): { h 1 , h 2 , … , h T } \{h_1, h_2, \dots, h_T\} {h1?,h2?,…,hT?}
-
計算相似度(注意力分?jǐn)?shù)):
e t i = score ( s t ? 1 , h i ) e_{ti} = \text{score}(s_{t-1}, h_i) eti?=score(st?1?,hi?)
常用相似度計算方式:- 點積(Dot Product): e t i = s t ? 1 ? h i e_{ti} = s_{t-1}^\top h_i eti?=st?1??hi?
- 加性(Additive): e t i = v ? tanh ? ( W s s t ? 1 + W h h i ) e_{ti} = \mathbf{v}^\top \tanh(\mathbf{W}_s s_{t-1} + \mathbf{W}_h h_i) eti?=v?tanh(Ws?st?1?+Wh?hi?)
-
歸一化為權(quán)重:
α t i = exp ? ( e t i ) ∑ j = 1 T exp ? ( e t j ) \alpha_{ti} = \frac{\exp(e_{ti})}{\sum_{j=1}^T \exp(e_{tj})} αti?=∑j=1T?exp(etj?)exp(eti?)?
4.3 生成動態(tài)上下文向量
c t = ∑ i = 1 T α t i h i \mathbf{c}_t = \sum_{i=1}^T \alpha_{ti} h_i ct?=∑i=1T?αti?hi?
4.4 結(jié)合上下文向量生成輸出
- 拼接解碼器狀態(tài)與上下文向量:
s ~ t = tanh ? ( W c [ s t ? 1 ; c t ] + b c ) \tilde{s}_t = \tanh(\mathbf{W}_c [s_{t-1}; \mathbf{c}_t] + \mathbf_c) s~t?=tanh(Wc?[st?1?;ct?]+bc?) - 預(yù)測輸出概率分布:
p ( y t ∣ y < t , X ) = Softmax ( W o s ~ t + b o ) p(y_t | y_{<t}, \mathbf{X}) = \text{Softmax}(\mathbf{W}_o \tilde{s}_t + \mathbf_o) p(yt?∣y<t?,X)=Softmax(Wo?s~t?+bo?)
4.5 數(shù)學(xué)公式總結(jié)
對于解碼器的第 t t t 步:
Attention?Weights: α t i = Softmax ( score ( s t ? 1 , h i ) ) Context?Vector: c t = ∑ i = 1 T α t i h i Decoder?Output: p ( y t ∣ y < t , X ) = Softmax ( W o ? tanh ? ( W c [ s t ? 1 ; c t ] + b c ) ) \begin{aligned} \text{Attention Weights:} \quad & \alpha_{ti} = \text{Softmax}(\text{score}(s_{t-1}, h_i)) \\ \text{Context Vector:} \quad & \mathbf{c}_t = \sum_{i=1}^T \alpha_{ti} h_i \\ \text{Decoder Output:} \quad & p(y_t | y_{<t}, \mathbf{X}) = \text{Softmax}(W_o \cdot \tanh(W_c [s_{t-1}; \mathbf{c}_t] + b_c)) \end{aligned} Attention?Weights:Context?Vector:Decoder?Output:?αti?=Softmax(score(st?1?,hi?))ct?=i=1∑T?αti?hi?p(yt?∣y<t?,X)=Softmax(Wo??tanh(Wc?[st?1?;ct?]+bc?))?
4.6 理解點積(Dot Product)
點積(Dot Product),也被稱為內(nèi)積(Inner Product),是向量之間的一種二元運算,在數(shù)學(xué)、物理學(xué)以及工程學(xué)中有著廣泛的應(yīng)用。
對于兩個維數(shù)相同的向量 a = [ a 1 , a 2 , . . . , a n ] \mathbf{a} = [a_1, a_2, ..., a_n] a=[a1?,a2?,...,an?] 和 b = [ b 1 , b 2 , . . . , b n ] \mathbf = [b_1, b_2, ..., b_n] b=[b1?,b2?,...,bn?],
它們的點積定義為:
a ? b = ∑ i = 1 n a i b i = a 1 b 1 + a 2 b 2 + . . . + a n b n \mathbf{a} \cdot \mathbf = \sum_{i=1}^{n} a_i b_i = a_1b_1 + a_2b_2 + ... + a_nb_n a?b=∑i=1n?ai?bi?=a1?b1?+a2?b2?+...+an?bn?
即,兩個向量的點積等于對應(yīng)元素相乘后的和。
幾何解釋
點積還有一個重要的幾何意義,即兩個向量的點積等于它們的模長乘積與它們之間夾角余弦值的乘積:
a ? b = ∣ a ∣ ∣ b ∣ cos ? θ \mathbf{a} \cdot \mathbf = |\mathbf{a}| |\mathbf| \cos{\theta} a?b=∣a∣∣b∣cosθ
這里, ∣ a ∣ |\mathbf{a}| ∣a∣ 和 ∣ b ∣ |\mathbf| ∣b∣ 分別表示向量 a \mathbf{a} a 和 b \mathbf b 的長度(或稱為模),而 θ \theta θ 是兩向量之間的夾角。通過這個公式,我們可以看出點積可以用來計算兩個向量之間的角度,或者判斷它們是否正交(如果點積為零,則兩向量垂直)。
在機器學(xué)習(xí)和深度學(xué)習(xí)領(lǐng)域,點積常用于衡量向量間的相似度。例如,在注意力機制中,它被用來計算查詢向量與鍵向量之間的匹配程度。
4.7 理解加性(Additive)
在深度學(xué)習(xí)和自然語言處理的上下文中,“加性”(Additive)通常指的是“加性注意力機制”,這是一種用于序列到序列(Seq2Seq)模型中的注意力計算方法。與點積注意力(Dot-Product Attention)不同,加性注意力使用了一個小型的前饋神經(jīng)網(wǎng)絡(luò)來計算輸入序列中每個位置的注意力分?jǐn)?shù)。
加性注意力機制的工作原理
其主要思想是通過一個小型的兩層前饋神經(jīng)網(wǎng)絡(luò)來計算注意力權(quán)重,這個過程可以分解為以下幾個步驟:
-
輸入準(zhǔn)備:對于解碼器中的每一個時間步 t t t,我們考慮編碼器的所有隱藏狀態(tài) { h 1 , h 2 , . . . , h n } \{h_1, h_2, ..., h_n\} {h1?,h2?,...,hn?} 和當(dāng)前解碼器的隱藏狀態(tài) s t ? 1 s_{t-1} st?1?。
-
能量計算:將編碼器的每個隱藏狀態(tài) h i h_i hi? 和解碼器隱藏狀態(tài) s t ? 1 s_{t-1} st?1? 作為輸入,傳遞給一個小的前饋神經(jīng)網(wǎng)絡(luò)。這個網(wǎng)絡(luò)通常包含一層或多層,并使用tanh作為激活函數(shù)。具體來說,計算能量值 e t i e_{ti} eti? 的公式如下:
e t i = v T tanh ? ( W [ h i ; s t ? 1 ] ) e_{ti} = v^T \tanh(W[h_i; s_{t-1}]) eti?=vTtanh(W[hi?;st?1?])
其中, W W W 是權(quán)重矩陣, v v v 是輸出向量, [ h i ; s t ? 1 ] [h_i; s_{t-1}] [hi?;st?1?] 表示向量拼接操作。
-
注意力權(quán)重計算:對上述得到的能量值進(jìn)行Softmax變換,以確保所有注意力權(quán)重之和為1。即,
α t i = exp ? ( e t i ) ∑ j exp ? ( e t j ) \alpha_{ti} = \frac{\exp(e_{ti})}{\sum_j \exp(e_{tj})} αti?=∑j?exp(etj?)exp(eti?)? -
上下文向量生成:根據(jù)計算出的注意力權(quán)重對編碼器的所有隱藏狀態(tài)進(jìn)行加權(quán)求和,得到上下文向量 c t c_t ct?:
c t = ∑ i α t i h i c_t = \sum_i \alpha_{ti} h_i ct?=∑i?αti?hi?
-
結(jié)合上下文向量與解碼器狀態(tài):最后,上下文向量 c t c_t ct? 被用來輔助解碼器預(yù)測下一個詞,通常會與當(dāng)前解碼器的狀態(tài)結(jié)合起來。
加性注意力 vs 點積注意力
- 復(fù)雜度:加性注意力通常比點積注意力更復(fù)雜,因為它需要額外的參數(shù)和非線性變換(如tanh激活函數(shù))。然而,它也提供了更大的靈活性來捕捉輸入之間的復(fù)雜關(guān)系。
- 適用場景:點積注意力在高維度空間中更加高效,因為它的計算可以直接利用矩陣乘法加速;而加性注意力可能更適合于那些需要更多非線性處理的任務(wù)或數(shù)據(jù)集。
下一篇《深度學(xué)習(xí)架構(gòu)Seq2Seq-添加并理解注意力機制(二)》使用中文翻譯成英文的案例,“我喜歡吃魚” 翻譯為 “I like eating fish” 的簡單例子,通過具體的數(shù)字,模擬模型推理過程,來輔助解釋上面這一套公式。