0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

基于 Transformers 的編碼器-解碼器模型

深度學習自然語言處理 ? 來源:深度學習自然語言處理 ? 2023-06-16 16:53 ? 次閱讀

基于 transformer 的編碼器-解碼器模型是 表征學習 和 模型架構(gòu) 這兩個領域多年研究成果的結(jié)晶。本文簡要介紹了神經(jīng)編碼器-解碼器模型的歷史,更多背景知識,建議讀者閱讀由 Sebastion Ruder 撰寫的這篇精彩 博文。此外,建議讀者對 自注意力 (self-attention) 架構(gòu) 有一個基本了解,可以閱讀 Jay Alammar 的 這篇博文 復習一下原始 transformer 模型。

本文分 4 個部分:

背景 - 簡要回顧了神經(jīng)編碼器-解碼器模型的歷史,重點關注基于 RNN 的模型。

編碼器-解碼器 - 闡述基于 transformer 的編碼器-解碼器模型,并闡述如何使用該模型進行推理。

編碼器 - 闡述模型的編碼器部分。

解碼器 - 闡述模型的解碼器部分。

每個部分都建立在前一部分的基礎上,但也可以單獨閱讀。這篇分享是第三部分 編碼器。

編碼器

如前一節(jié)所述, 基于 transformer 的編碼器將輸入序列映射到上下文相關的編碼序列:

仔細觀察架構(gòu),基于 transformer 的編碼器由許多 殘差注意力模塊 堆疊而成。每個編碼器模塊都包含一個 雙向 自注意力層,其后跟著兩個前饋層。這里,為簡單起見,我們忽略歸一化層 (normalization layer)。此外,我們不會深入討論兩個前饋層的作用,僅將其視為每個編碼器模塊 的輸出映射層。雙向自注意層將每個輸入向量 與全部輸入向量 相關聯(lián)并通過該機制將每個輸入向量 提煉為與其自身上下文相關的表征: 。因此,第一個編碼器塊將輸入序列 (如下圖淺綠色所示) 中的每個輸入向量從 上下文無關 的向量表征轉(zhuǎn)換為 上下文相關 的向量表征,后面每一個編碼器模塊都會進一步細化這個上下文表征,直到最后一個編碼器模塊輸出最終的上下文相關編碼 (如下圖深綠色所示)。

我們對 編碼器如何將輸入序列 "I want to buy a car EOS" 變換為上下文編碼序列這一過程進行一下可視化。與基于 RNN 的編碼器類似,基于 transformer 的編碼器也在輸入序列最后添加了一個 EOS,以提示模型輸入向量序列已結(jié)束 。

1e20e638-0c1f-11ee-962d-dac502259ad0.png

上圖中的 基于 transformer 的編碼器由三個編碼器模塊組成。我們在右側(cè)的紅框中詳細列出了第二個編碼器模塊的前三個輸入向量: , 及 。紅框下部的全連接圖描述了雙向自注意力機制,上面是兩個前饋層。如前所述,我們主要關注雙向自注意力機制。

可以看出,自注意力層的每個輸出向量 都 直接 依賴于 所有 輸入向量 。這意味著,單詞 “want” 的輸入向量表示 與單詞 “buy” (即 ) 和單詞 “I” (即 ) 直接相關。 因此,“want” 的輸出向量表征, 即 ,是一個融合了其上下文信息的更精細的表征。

我們更深入了解一下雙向自注意力的工作原理。編碼器模塊的輸入序列 中的每個輸入向量 通過三個可訓練的權(quán)重矩陣 ,, 分別投影至 key 向量 、value 向量 和 query 向量 (下圖分別以橙色、藍色和紫色表示):

請注意,對每個輸入向量 ) 而言,其所使用的權(quán)重矩陣都是 相同 的。將每個輸入向量 投影到 query 、 key 和 value 向量后,將每個 query 向量 ) 與所有 key 向量 進行比較。哪個 key 向量與 query 向量 越相似,其對應的 value 向量 對輸出向量 的影響就越重要。更具體地說,輸出向量 被定義為所有 value 向量的加權(quán)和 加上輸入向量 。而各 value 向量的權(quán)重與 和各個 key 向量 之間的余弦相似度成正比,其數(shù)學公式為 ,如下文的公式所示。關于自注意力層的完整描述,建議讀者閱讀 這篇 博文或 原始論文。

好吧,又復雜起來了。我們以上例中的一個 query 向量為例圖解一下雙向自注意層。為簡單起見,本例中假設我們的 基于 transformer 的解碼器只有一個注意力頭 config.num_heads = 1 并且沒有歸一化層。

1e43c89c-0c1f-11ee-962d-dac502259ad0.png

圖左顯示了上個例子中的第二個編碼器模塊,右邊詳細可視化了第二個輸入向量 的雙向自注意機制,其對應輸入詞為 “want”。首先將所有輸入向量 投影到它們各自的 query 向量 (上圖中僅以紫色顯示前三個 query 向量), value 向量 (藍色) 和 key 向量 (橙色)。然后,將 query 向量 與所有 key 向量的轉(zhuǎn)置 ( 即 ) 相乘,隨后進行 softmax 操作以產(chǎn)生 自注意力權(quán)重 。 自注意力權(quán)重最終與各自的 value 向量相乘,并加上輸入向量 ,最終輸出單詞 “want” 的上下文相關表征, 即 (圖右深綠色表示)。整個等式顯示在圖右框的上部。 和 的相乘使得將 “want” 的向量表征與所有其他輸入 (“I”,“to”,“buy”,“a”,“car”,“EOS”) 的向量表征相比較成為可能,因此自注意力權(quán)重反映出每個輸入向量 對 “want” 一詞的最終表征 的重要程度。

為了進一步理解雙向自注意力層的含義,我們假設以下句子: “ 房子很漂亮且位于市中心,因此那兒公共交通很方便 ”。 “那兒”這個詞指的是“房子”,這兩個詞相隔 12 個字。在基于 transformer 的編碼器中,雙向自注意力層運算一次,即可將“房子”的輸入向量與“那兒”的輸入向量相關聯(lián)。相比之下,在基于 RNN 的編碼器中,相距 12 個字的詞將需要至少 12 個時間步的運算,這意味著在基于 RNN 的編碼器中所需數(shù)學運算與距離呈線性關系。這使得基于 RNN 的編碼器更難對長程上下文表征進行建模。此外,很明顯,基于 transformer 的編碼器比基于 RNN 的編碼器-解碼器模型更不容易丟失重要信息,因為編碼的序列長度相對輸入序列長度保持不變, 即 ,而 RNN 則會將 壓縮到 ,這使得 RNN 很難有效地對輸入詞之間的長程依賴關系進行編碼。

除了更容易學到長程依賴外,我們還可以看到 transformer 架構(gòu)能夠并行處理文本。從數(shù)學上講,這是通過將自注意力機制表示為 query 、 key 和 value 的矩陣乘來完成的:

輸出 是由一系列矩陣乘計算和 softmax 操作算得,因此可以有效地并行化。請注意,在基于 RNN 的編碼器模型中,隱含狀態(tài) 的計算必須按順序進行: 先計算第一個輸入向量的隱含狀態(tài) ; 然后計算第二個輸入向量的隱含狀態(tài),其取決于第一個隱含向量的狀態(tài),依此類推。RNN 的順序性阻礙了有效的并行化,并使其在現(xiàn)代 GPU 硬件上比基于 transformer 的編碼器模型的效率低得多。

太好了,現(xiàn)在我們應該對:
a) 基于 transformer 的編碼器模型如何有效地建模長程上下文表征,以及
b) 它們?nèi)绾斡行У靥幚黹L序列向量輸入這兩個方面有了比較好的理解了。

現(xiàn)在,我們寫一個 MarianMT 編碼器-解碼器模型的編碼器部分的小例子,以驗證這些理論在實踐中行不行得通。

關于前饋層在基于 transformer 的模型中所扮演的角色的詳細解釋超出了本文的范疇。Yun 等人 (2017) 的工作認為前饋層對于將每個上下文向量 映射到目標輸出空間至關重要,而單靠 自注意力 層無法達成這一目的。這里請注意,每個輸出詞元 都經(jīng)由相同的前饋層處理。更多詳細信息,建議讀者閱讀論文。

我們無須將 EOS 附加到輸入序列,雖然有工作表明,在很多情況下加入它可以提高性能。相反地,基于 transformer 的解碼器必須把 作為第 0 個目標向量,并以之為條件預測第 1 個目標向量。

fromtransformersimportMarianMTModel,MarianTokenizer
importtorch

tokenizer=MarianTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-de")
model=MarianMTModel.from_pretrained("Helsinki-NLP/opus-mt-en-de")

embeddings=model.get_input_embeddings()

#createidsofencodedinputvectors
input_ids=tokenizer("Iwanttobuyacar",return_tensors="pt").input_ids

#passinput_idstoencoder
encoder_hidden_states=model.base_model.encoder(input_ids,return_dict=True).last_hidden_state

#changetheinputslightlyandpasstoencoder
input_ids_perturbed=tokenizer("Iwanttobuyahouse",return_tensors="pt").input_ids
encoder_hidden_states_perturbed=model.base_model.encoder(input_ids_perturbed,return_dict=True).last_hidden_state

#compareshapeandencodingoffirstvector
print(f"Lengthofinputembeddings{embeddings(input_ids).shape[1]}.Lengthofencoder_hidden_states{encoder_hidden_states.shape[1]}")

#comparevaluesofwordembeddingof"I"forinput_idsandperturbedinput_ids
print("Isencodingfor`I`equaltoitsperturbedversion?:",torch.allclose(encoder_hidden_states[0,0],encoder_hidden_states_perturbed[0,0],atol=1e-3))

輸出:

Lengthofinputembeddings7.Lengthofencoder_hidden_states7
Isencodingfor`I`equaltoitsperturbedversion?:False

我們比較一下輸入詞嵌入的序列長度 ( 即 embeddings(input_ids),對應于 ) 和 encoder_hidden_states 的長度 (對應于)。同時,我們讓編碼器對單詞序列 “I want to buy a car” 及其輕微改動版 “I want to buy a house” 分別執(zhí)行前向操作,以檢查第一個詞 “I” 的輸出編碼在更改輸入序列的最后一個單詞后是否會有所不同。

不出意外,輸入詞嵌入和編碼器輸出編碼的長度, 即 和 ,是相等的。同時,可以注意到當最后一個單詞從 “car” 改成 “house” 后, 的編碼輸出向量的值也改變了。因為我們現(xiàn)在已經(jīng)理解了雙向自注意力機制,這就不足為奇了。

順帶一提, 自編碼 模型 (如 BERT) 的架構(gòu)與 基于 transformer 的編碼器模型是完全一樣的。 自編碼 模型利用這種架構(gòu)對開放域文本數(shù)據(jù)進行大規(guī)模自監(jiān)督預訓練,以便它們可以將任何單詞序列映射到深度雙向表征。在 Devlin 等 (2018) 的工作中,作者展示了一個預訓練 BERT 模型,其頂部有一個任務相關的分類層,可以在 11 個 NLP 任務上獲得 SOTA 結(jié)果。你可以從 此處 找到 transformers 支持的所有 自編碼 模型。
責任編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 解碼器
    +關注

    關注

    9

    文章

    1129

    瀏覽量

    40636
  • 編碼器
    +關注

    關注

    45

    文章

    3573

    瀏覽量

    133980
  • 數(shù)據(jù)

    關注

    8

    文章

    6808

    瀏覽量

    88743

原文標題:編碼器 | 基于 Transformers 的編碼器-解碼器模型

文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    怎么理解真正的編碼器解碼器?

      在進入關于編碼器解碼器的現(xiàn)實之前,讓我們對復用進行簡要的思考。通常我們會在需要將一些輸入信號一次一個地加載到一個單獨負載的應用程序中。選擇輸入信號中的一個輸入信號的過程稱為多路復用。這種操作
    發(fā)表于 09-01 17:48

    編碼器解碼器的區(qū)別是什么,編碼器用軟件還是硬件好

    編碼器指的是對視頻信號進行壓縮,解碼器主要是將壓縮的視頻信號進行解壓縮。目前做直播的很多都是采用的編碼器,客戶端可以采用解碼器或軟件播放
    發(fā)表于 08-02 17:23 ?3.4w次閱讀

    基于結(jié)構(gòu)感知的雙編碼器解碼器模型

    ,在常見端到端翻譯模型的基礎上,利用代碼抽象語法樹將源代碼的結(jié)構(gòu)信息嵌入到編碼器解碼器翻譯模型中,提出一種基于結(jié)構(gòu)感知的雙編碼器
    發(fā)表于 05-26 15:38 ?5次下載

    詳解編碼器解碼器電路:定義/工作原理/應用/真值表

    編碼器解碼器是組合邏輯電路,在其中,主要借助布爾代數(shù)實現(xiàn)組合邏輯。今天就大家了解一下編碼器解碼器電路,分別從定義,工作原理,應用,真值表幾個方面講述一下。
    的頭像 發(fā)表于 11-03 09:22 ?7062次閱讀
    詳解<b class='flag-5'>編碼器</b>和<b class='flag-5'>解碼器</b>電路:定義/工作原理/應用/真值表

    PyTorch教程10.6之編碼器-解碼器架構(gòu)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程10.6之編碼器-解碼器架構(gòu).pdf》資料免費下載
    發(fā)表于 06-05 18:12 ?0次下載
    PyTorch教程10.6之<b class='flag-5'>編碼器</b>-<b class='flag-5'>解碼器</b>架構(gòu)

    PyTorch教程-10.6. 編碼器-解碼器架構(gòu)

    -解碼器架構(gòu)(圖 10.6.1),它由兩個主要組件組成:一個 編碼器,它以可變長度序列作為輸入,以及一個 解碼器,作為一個條件語言模型,接收編碼
    的頭像 發(fā)表于 06-05 15:44 ?813次閱讀
    PyTorch教程-10.6. <b class='flag-5'>編碼器</b>-<b class='flag-5'>解碼器</b>架構(gòu)

    基于transformer的編碼器-解碼器模型的工作原理

    與基于 RNN 的編碼器-解碼器模型類似,基于 transformer 的編碼器-解碼器模型由一
    發(fā)表于 06-11 14:17 ?2094次閱讀
    基于transformer的<b class='flag-5'>編碼器</b>-<b class='flag-5'>解碼器</b><b class='flag-5'>模型</b>的工作原理

    基于 RNN 的解碼器架構(gòu)如何建模

    ? Vaswani 等人在其名作 Attention is all you need 中首創(chuàng)了?基于 transformer?的編碼器-解碼器模型,如今已成為自然語言處理 (natural
    的頭像 發(fā)表于 06-12 17:08 ?762次閱讀
    基于 RNN 的<b class='flag-5'>解碼器</b>架構(gòu)如何建模

    神經(jīng)編碼器-解碼器模型的歷史

    基于 transformer 的編碼器-解碼器模型是 表征學習 和 模型架構(gòu) 這兩個領域多年研究成果的結(jié)晶。本文簡要介紹了神經(jīng)編碼器-
    的頭像 發(fā)表于 06-20 15:42 ?802次閱讀
    神經(jīng)<b class='flag-5'>編碼器</b>-<b class='flag-5'>解碼器</b><b class='flag-5'>模型</b>的歷史

    詳解編碼器解碼器電路

    編碼器解碼器是組合邏輯電路,在其中,主要借助布爾代數(shù)實現(xiàn)組合邏輯。今天就大家了解一下編碼器解碼器電路,分別從定義,工作原理,應用,真值表幾個方面講述一下。
    的頭像 發(fā)表于 07-14 09:07 ?3002次閱讀
    詳解<b class='flag-5'>編碼器</b>和<b class='flag-5'>解碼器</b>電路

    視頻編碼器解碼器的應用方案

    視頻解碼器和視頻編碼器在數(shù)字通訊、音視頻壓縮領域有著廣泛的應用。視頻編碼器作為視頻源的發(fā)送端,若接收端如果是?PC?機或顯示設備就需要通過解碼器進行
    的頭像 發(fā)表于 08-14 14:38 ?1288次閱讀
    視頻<b class='flag-5'>編碼器</b>與<b class='flag-5'>解碼器</b>的應用方案

    YXC丨視頻編碼器解碼器的應用方案

    視頻解碼器和視頻編碼器是數(shù)字信號處理中常用的設備,它們在數(shù)據(jù)的傳輸和轉(zhuǎn)換中發(fā)揮著重要作用。
    的頭像 發(fā)表于 08-23 09:40 ?634次閱讀
    YXC丨視頻<b class='flag-5'>編碼器</b>與<b class='flag-5'>解碼器</b>的應用方案

    視頻編碼器解碼器的應用方案

    視頻解碼器和視頻編碼器是數(shù)字信號處理中常用的設備,它們在數(shù)據(jù)的傳輸和轉(zhuǎn)換中發(fā)揮著重要作用。
    的頭像 發(fā)表于 08-28 11:31 ?545次閱讀
    視頻<b class='flag-5'>編碼器</b>與<b class='flag-5'>解碼器</b>的應用方案

    信路達 解碼器/編碼器 XD74LS48數(shù)據(jù)手冊

    解碼器/編碼器?DIP164.75~5.25V封裝:DIP16_19.3X6.4MM
    發(fā)表于 08-19 15:57 ?2次下載

    信路達 解碼器/編碼器 XD74LS47數(shù)據(jù)手冊

    解碼器/編碼器DIP164.75~5.25V封裝:DIP16_19.3X6.4MM
    發(fā)表于 08-19 15:57 ?0次下載