Transformer 結構

目錄

  • 一、Transformer 的整體結構
  • 二、Input Encoding
  • 三、Transformer Block
    • 3.1 Encoder
      • 3.1.1 Attention
      • 3.1.2 Self-attention
      • 3.1.3 Multi-head Attention
    • 3.2 Decoder
      • 3.2.1 Masked Multi-head Attention
  • 四、Transformer 的優缺點

遇到看不明白的地方,歡迎在評論中留言吶,一起討論,一起進步!
在這里插入圖片描述
前提知識:注意力機制
本文參考:
【清華NLP】劉知遠團隊大模型公開課全網首發|帶你從入門到實戰
【官方雙語】Transformer模型最通俗易懂的講解,零基礎也能聽懂!
全網最透徹的注意力機制的通俗原理與本質【推薦】
【Transformer系列(2)】注意力機制、自注意力機制、多頭注意力機制、通道注意力機制、空間注意力機制超詳細講解

之前我們已經了解了 RNN,它是一個順序計算模型無法并行處理。這就導致了計算機的并行資源被浪費。而 RNN 變體 GRU 或者 LSTM 仍然需要注意力機制。RNN 這樣“笨”,那我們是否能不要它呢?答案是肯定的,論文 Attention is all you need (NeurIPS 2017) 給了我們答案。在這篇文章中,作者提出了一個非常強大的模型結構來進行機器翻譯的任務,這個結構就是接下來要介紹的 Transformer。

一、Transformer 的整體結構

Transformer 同樣是一個編碼器-解碼器的模型。下圖中的紅色框表示編碼器(encoder)部分,藍色框表示解碼器(decoder)部分。
在這里插入圖片描述


我們現在從下往上來看這個過程。首先第一層(下圖紅框內容)是輸入層,輸入層需要將文本序列切分成一個個小的單元(這個單元我們叫 token),然后通過 Embedding 轉換為向量表示。
在這里插入圖片描述
這里有兩點不同于 RNN:
1、Transformer 會使用 byte pair encoding(BPE) 的方式來對文本進行切分。
2、在每個位置會加上一個 token 的位置向量,即 positional encoding,用來表示 token 在文本序列中的一個位置。


我們再來看 Transformer 的主體部分(下圖紅框內容),它是由多個 encoder blocks(編碼器塊)和多個 decoder blocks(解碼器塊)堆疊而成的。

在 encoder blocks 和 decoder blocks 之間,存在一些差異。然而,不同的 encoder block 之間和不同的 decoder block 之間的結構完全一致,只有參數有所不同。
在這里插入圖片描述


最后來看模型的輸出層,其實就是通過一個線性層的變換和一個 Softmax 來輸出一個在詞表上的概率分布。這與之前 RNN 輸出層基本是一致的。在訓練過程中,我們也是通過在詞表這樣一個維度通過計算交叉熵來計算 loss。
在這里插入圖片描述
以上就是 Transformer 的整體結構,接下來我們逐個部分進行講解。

二、Input Encoding

在這里插入圖片描述

輸入層使用 Byte-Pair Encoding 對輸入進行切分,具體細節可以參考之前的博客 BPE (Byte-Pair Encoding) Tokenization 。

我們知道一個 token 出現在文本中的位置是非常重要的。
在這里插入圖片描述

Transformer 提出了一個顯式建模位置關系的一個方法:通過在原有的 embedding 上加上一個位置向量來讓同一個單詞在不同位置有不同的表示,進而讓模型進行區分。

我們首先假設通過 BPE 和 embedding 得到的向量的維度為 d d d,而位置編碼也需要一個維度為 d d d 向量。
在這里插入圖片描述

Transformer 采用了一個基于三角函數的一個方法來得到對應的一個位置向量:

在這里插入圖片描述
p o s pos pos 表示當前 token 在句子中的位置,是一個從 0 0 0 到 序列長度之間的數。
i i i 表示當前這個位置在 embedding 中的 index,是一個從 0 0 0 d / 2 d/2 d/2 之間的數。

下圖展示的是一個長度為 10 10 10 個 token,編碼向量維度 d = 64 d=64 d=64 的位置編碼可視化。我們可以看到相同維度的編碼(就是每個豎線)其實是一個周期的正弦或者余弦函數,而相同位置的編碼(就是每個橫線)對應著不同周期的正弦和余弦函數。
在這里插入圖片描述

根據三角函數的性質我們知道,不同位置的位置編碼向量之間的差別取決于它們之間的相對位置。

我們最終就是將 BPEPE 按照位置相加得到的向量輸入到 Transformer 主體部分中。
在這里插入圖片描述

三、Transformer Block

3.1 Encoder

在這里插入圖片描述

Encoder 整體是由兩大塊組成的,分別是 Multi-Head Attention 網絡(下面橙色部分)和 Feed-Forward 網絡(上面藍色部分,本質上是一個帶激活函數的兩層 MLP 全連接,大家應該比較熟悉了)。

圖中的 Nx 表示 N 個模塊(block)可以堆疊在一起組成一個更深的神經網絡,在原始論文中, Encoder 端一共堆疊了 6 個模塊。

除此之外,這里附加了兩個小技巧:

1、殘差連接(Residual connection)(如圖左側的兩個箭頭)

殘差連接主要用于解決深層神經網絡中的梯度消失和梯度爆炸問題。它通過在網絡中添加跨層的直接連接,將上一層的輸出與下一層的輸入相加,從而將梯度從較深的層傳遞到淺層,使得網絡更易于訓練。具體而言,殘差連接可以使用以下公式表示:
y = F ( x ) + x y = F(x) + x y=F(x)+x其中, x x x 代表上一層的輸入, F ( x ) F(x) F(x) 代表上一層經過一系列操作后的輸出, y y y 代表當前層的輸出。通過將 x x x 直接添加到 F ( x ) F(x) F(x) 上,實現了梯度的直接傳遞。
殘差連接最早被引入到深度殘差網絡(ResNet)中,該網絡在 2015 年的 ImageNet 比賽中取得了優秀的成績。自此以后,殘差連接成為了深度學習中的重要組件,被廣泛用于各種網絡結構的設計中,例如DenseNet、Highway Network等。
深入了解可以參考論文:
Deep residual learning for image recognition. He et al. CVPR 2016.

2、層歸一化(Layer normalization)(見圖中兩處黃色部分)

Layer normalization 的主要思想是對每個神經網絡層的輸入進行歸一化,使得其均值為 0,方差為
1。具體而言,給定一個輸入向量 x x x,Layer normalization 的計算公式如下: LayerNorm ( x ) = scale ? ( x ? mean variance + epsilon ) + bias \text{{LayerNorm}}(x) = \text{{scale}} \cdot \left(\frac{{x - \text{{mean}}}}{{\sqrt{{\text{{variance}} + \text{{epsilon}}}}}}\right) + \text{{bias}} LayerNorm(x)=scale?(variance+epsilon ?x?mean?)+bias其中,mean 和
variance 分別表示輸入向量 x x x 的均值和方差,epsilon 是一個小的正數防止除以零的情況,scale 和 bias
是可學習的參數。 通過將輸入向量 x x x 進行歸一化,Layer normalization 可以使得每個神經網絡層的輸入具有類似的分布。
深入了解可以參考論文:
Layer normalization. Ba et al. arXiv 2016.

我們主要關注 Multi-Head Attention 部分,下面我們對這部分詳細介紹一下。

3.1.1 Attention

我們先回顧一下前講的注意力機制:給定一個 query 向量和一組 value 向量,注意力機制基于 query 向量對 value 向量進行一個加權平均。

而 Transformer 給定的是一個 query 向量和一組 key-value 向量對。其中,query 向量和 key 向量的維度都是 d k d_k dk?,而 value 向量的維度是 d v d_v dv?

不同于之前用 query 向量和 value 向量來計算注意力分數,我們這里采用 query 向量和 key 向量的點積來計算注意力分數

這里的輸出同樣是對 value 向量進行一個加權平均。
A ( q , K , V ) = ∑ i e q ? K i ∑ j e q ? K j V i = softmax ( q K T ) V A(q,K,V)=\sum_i{\frac{e^{q\cdot K_i}}{\sum_j{e^{q\cdot K_j}}}V_i}=\text{softmax}(qK^T)V A(q,K,V)=i?j?eq?Kj?eq?Ki??Vi?=softmax(qKT)V

大家可以借助淘寶的例子來進行理解:

在這里插入圖片描述

而多個 query 向量可以通過矩陣 Q Q Q 來表示:
A ( Q , K , V ) = softmax ( Q K T ) V A(Q,K,V)=\text{softmax}(QK^T)V A(Q,K,V)=softmax(QKT)V

為了控制注意力權重的大小和梯度的穩定性,這里進一步通過 query 向量的長度 d k d_k dk? 進行縮放(scale):
A ( Q , K , V ) = softmax ( Q K T d k ) V A(Q,K,V)=\text{softmax}(\frac{QK^T}{\sqrt{d_k}})V A(Q,K,V)=softmax(dk? ?QKT?)V


在這里插入圖片描述
上圖完整地展示了 attention 的一個過程:

  • 首先 Q Q Q V V V 進行一個矩陣乘法,得到對應的一個注意力分數;
  • 然后通過縮放系數 1 d k \frac{1}{\sqrt{d_k}} dk? ?1? 對注意力分數進行放縮
  • Mask 這個部分我們將在 decoder 部分使用
  • 接著再通過 SoftMax 函數將注意力分數轉換為一個概率分布
  • 隨后通過與對應的 V V V 矩陣進行一個矩陣乘法就可以對 V V V 實現加權平均,得到我們最后的輸出

3.1.2 Self-attention

自注意力機制希望每個 token 能夠自主地選擇應該關注這句話中的哪些 token 并進行信息的整合,對應的 Q 、 K 、 V Q、K、V QKV 三個矩陣其實都是通過文本的表示向量乘上一個變換矩陣得到的。

對于第一層的 Transformer Block 來說,文本的表示向量其實就是我們前面提到的詞表向量和對應位置編碼的一個求和。

而對于非第一層的 Transformer Block 來說,文本的表示向量其實就是前面一層的輸出。

自注意力機制的關鍵點在于, Q 、 K 、 V Q、K、V QKV 是同一個東西,或者三者同源,不是輸入語句和輸出語句之間的注意力機制,而是輸入語句內部元素之間或者輸出語句內部元素之間發生的注意力機制。

注意力機制的 Q Q Q K K K 是不同來源的。 例如,在 Encoder-Decoder 模型中, K K K是 Encoder 中的元素,而 Q Q Q 是 Decoder 中的元素。
自注意力機制的 Q Q Q K K K 則都是來自于同一組元素。 例如,在 Encoder-Decoder 模型中, Q Q Q K K K 都是 Encoder 中的元素,相互之間做注意力匯聚。

3.1.3 Multi-head Attention

在上述單個 attention 的基礎上,Transformer 為了進一步增強模型的一個表示能力,采用了多個結構相同但參數不同的注意力模塊,組成了一個多頭的注意力機制,其中每個注意力頭的計算方式都和前面介紹的完全一致,只不過每個頭都有一個自己的權重矩陣 W i Q W_i^Q WiQ? W i K W_i^K WiK? W i V W_i^V WiV?(分別對應下圖下方的 Linear 位置)。
在這里插入圖片描述
每個注意力頭通過前面介紹的方式得到自己的輸出:
h e a d i = A ( Q W i Q , K W i K , V W i V ) head_i=A(QW_i^Q,KW_i^K,VW_i^V) headi?=A(QWiQ?,KWiK?,VWiV?)
然后我們將這些輸出在維度層面進行一個拼接,然后通過一個線性層進行整合就得到了 Multi-head Attention 的一個輸出。
MultiHead ( Q , K , V ) = Concat ( h e a d 1 , . . . , h e a d h ) W O \text{MultiHead}(Q,K,V)=\text{Concat}(head_1,...,head_h)W^O MultiHead(Q,K,V)=Concat(head1?,...,headh?)WO

最后這個輸出就會通過殘差連接和正則化之后輸入到后面的前饋神經網絡(2-layer feed-forward network)。

在這里插入圖片描述

3.2 Decoder

在這里插入圖片描述

對于 Decoder 端,大體上和 Encoder 端是一致的,但是有兩個簡單的修改:

1、最開始并不是 Multi-head Attention,而是 Masked Multi-head Attention
掩碼操作可以避免模型在預測當前位置時使用未來位置的信息。具體而言,模型在預測第 i i i 個位置時,將第 i i i 個位置及其后續位置的注意力權重設置為一個很小的值,表示這些位置的信息被遮蓋。

2、Multi-head Attention 的輸入 Q Q Q 來自 Decoder,即 Masked Multi-head Attention 的輸出向量經過殘差連接和正則化之后的輸出,而 K K K V V V 來自于 Encoder 最后一層的輸出
這個部分類似于我們最開始講的端到端模型中的注意力機制,它是為了幫助 Decoder 端每一步的生成都可以關注和整合每個 Encoder 端每個位置的信息。

和 Encoder block 一樣,這樣的 Decoder block 也可以進行堆疊,如上圖我右方標記了“Nx”。在原論文中,Decoder block 也是一共堆疊了 6 層。

3.2.1 Masked Multi-head Attention

Multi-head Attention 的基礎上, Masked Multi-head Attention 在注意力分數矩陣上進行了掩碼操作,即將這個矩陣的左對角線的上三角部分(不包括對角線)設置為 ? ∞ -∞ ?
在這里插入圖片描述
這樣的操作能讓我們在計算 SoftMax 之后 ? ∞ -∞ ? 對應的位置會變為 0,然后通過矩陣乘法我們會發現:第 i i i 個輸出(即 Output 的第 i i i 行)只考慮了前 i i i 個 value 向量(即 V 的前 i i i 行)
在這里插入圖片描述
這樣的操作就保證了 Decoder 端在文本生成的時候是順序生成的,不會出現我們在生成第 i i i 個位置的時候參考了第 i + 1 i+1 i+1 個輸入位置的信息。

四、Transformer 的優缺點

優點:

  • Transformer 是一個功能強大的模型,在許多自然語言處理 (NLP) 任務中已被證明是有效的。
  • Transformer 模型適用于并行計算,可以在大規模數據上進行高效的訓練和推理。
  • Transformer 的注意力機制被證明是一種有效的建模方法,在處理不同位置之間的關系時表現出色。
  • Transformer 模型的出現為最近的 NLP 進展提供了啟示,如 BERT 和 GPT,這些模型基于 Transformer 的架構取得了顯著的突破。

缺點:

  • 模型本身對于參數非常敏感,優化過程非常困難
  • 處理復雜度為 O ( n 2 ) O(n^2) O(n2),導致對于也別長的文本束手無策,通過設置 512 為最大輸入長度。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37078.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Incremental Player Build

*未解決,僅作記錄 Unity 版本 2021.3.15f1 問題 Unity 發布webgl 平臺卡在Incremental Player Build 界面。 解決 未找到明確原因,簡化工程路徑后發布成功。

Leetcode 矩陣問題

36題.有效的數獨 此類問題特點是給出行列的多種限定條件,數獨限制每行每列每個小九宮格元素范圍為1-9且不可重復 。解決此類問題最簡單的想法就是使用哈希set,記錄每行,每列,每個小九宮格已經出現的元素。在遍歷矩陣時提前做出是否…

S32K3 --- Wdg(內狗) Mcal配置

前言 看門狗的作用是用來檢測程序是否跑飛,進入死循環。我們需要不停地喂狗,來確保程序是正常運行的,一旦停止喂狗,意味著程序跑飛,超時后就會reset復位程序。 一、Wdg 1.1 WdgGeneral Wdg Disable Allowed : 啟用此參數后,允許在運行的時候禁用看門狗 Wdg Enable User…

技術干貨丨如何加速工業數字孿生應用落地?

什么是數字孿生? “孿生”概念最早可追溯至NASA的阿波羅項目,隨著數字化技術的進步,“孿生”概念應用從物理孿生向數字孿生發展。即“數字孿生”是對資產、進程或系統的一種數字化表示,并通過信息交互、數據同步等方式實現物理實體…

Java校園跑腿小程序校園代買幫忙外賣源碼社區外賣源碼

🔥校園跑腿與外賣源碼揭秘🔥 🚀 引言:為何需要校園跑腿與外賣源碼? 在快節奏的校園生活里,學生們對于便捷、高效的服務需求日益增長。校園跑腿和外賣服務成為了解決這一需求的熱門選擇。然而,…

C++ STL Iterator Adapter

1. std::back_insert_iterator 使用 // back_insert_iterator example #include <iostream> // std::cout #include <iterator> // std::back_insert_iterator #include <vector> // std::vector #include <algorithm> // std::copy…

獲取HTML元素的scrollHeight屬性

獲取HTML元素的scrollHeight屬性 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將深入探討如何使用JavaScript獲取HTML元素的scrollHeight屬性。scrol…

實時智能全托管-云器Lakehouse重新定義多維數據分析

導讀 本文將分享云器Lakehouse如何重新定義實時多維分析&#xff0c;幫助客戶實現實時、智能、全托管的數據平臺。主要內容包括以下幾大部分&#xff1a; 多維數據分析的發展趨勢和場景解析 技術解析&#xff1a;新一代數平臺Lakehouse如何支持實時分析需求 價值解析&#x…

【打工日常】docker部署一個開源、跨平臺、又低資源運行的監控平臺

一、項目介紹1.項目簡述Netdata是一個開源、跨平臺、又低資源運行的監控平臺。Netdata每秒收集指標,并將它們呈現在漂亮的低延遲儀表板中。它旨在在所有物理和虛擬服務器、云部署、Kubernetes集群和邊緣/IoT設備上運行,以監控您的系統、容器和應用程序。2.項目功能收集數據:…

Matlab中數組詳解

在MATLAB中&#xff0c;數組是最基本的數據類型&#xff0c;幾乎所有的數據運算都涉及數組操作。下面是對MATLAB中數組的詳細解釋和操作示例&#xff1a; 數組的創建 一維數組&#xff08;向量&#xff09;&#xff1a; 行向量&#xff1a;用方括號 [ ] 包含元素&#xff0c;元…

git log 過濾

git log命令主要用于查看Git版本演變歷史&#xff08;也就是提交歷史&#xff09;&#xff0c;同時根據追加的參數和選項不同&#xff0c;也會有不同的展示效果。 git log命令說明 git log官方文檔說明 git log用于查詢版本的歷史&#xff0c;命令形式如下&#xff1a; git…

嵌入式linux系統中面試過程經驗分享

大家好,今天主要給分享一下,如何在面試中介紹自己的項目經驗,希望對大家有所幫助。 在面試時,經過寒暄后,一般面試官會讓介紹項目經驗。常見的問法是,說下你最近的(或最拿得出手的)一個項目。 根據我們的面試經驗,發現有不少候選人對此沒準備,說起來磕磕巴巴,甚…

vscode在windows系統上進行C/C++環境配置

隨手筆記前言 vscode在windows系統上進行C/C環境配置 步驟如下 第一步 下載安裝VSCode 這應該是最簡單的一步&#xff0c;相信大家自己就可以完成。如果在vscode官網感覺下載特別慢的話&#xff0c;可以去試一下騰訊軟件中心&#xff0c;我都是在這個網頁上下載的。下載好之…

26、 MySQL數據庫基礎練習系列股票交易系統基礎查詢和復雜查詢

5、基礎查詢 -- 1、查詢用戶信息僅顯示姓名與手機號 SELECT username as 姓名,phone as 手機號 from users;-- 2、模糊查詢和explain語句 alter table stocks add index stock_name_index(stock_name); explain SELECT * from stocks where stock_name like %東吳證券%; -- 3、…

【AIGC X UML 落地】從UML語句到UML圖形的生成,來看Agent插件的制作

上篇我們講到如何通過多智能體實現自然語言繪制UML圖。 沒有看過的,可以去看下原文:《【AIGC X UML 落地】通過多智能體實現自然語言繪制UML圖》 其中有一個實現重點,就是如何將 PlantUML 語句生成 UML 圖片。在這里筆者是通過自定義 Agent 插件來實現這一流程。 本文,就此…

面試-javaIO機制

1.BIO BIO&#xff1a;是傳統的javaIO以及部分java.net下部分接口和類。例如&#xff0c;socket,http等&#xff0c;因為網絡通信同樣是IO行為。傳統IO基于字節流和字符流進行操作。提供了我們最熟悉的IO功能&#xff0c;譬如基于字節流的InputStream 和OutputStream.基于字符流…

Vue 項目運行時,報錯Error: Cannot find module ‘node:path‘

Vue 項目運行時&#xff0c;報錯Error: Cannot find module ‘node:path’ internal/modules/cjs/loader.js:883throw err;^Error: Cannot find module node:path Require stack: - D:\nodejs\node_modules\npm\node_modules\node_modules\npm\lib\cli.js - D:\nodejs\node_mo…

問題解決:python安裝依賴時網絡問題報錯

進行 pip install 時&#xff0c;安裝輪子訪問過慢而造成安裝失敗&#xff0c;有時候配置鏡像源仍會出現莫名其妙的問題&#xff0c;包括網絡代理問題等。看了一些解決方案&#xff0c;找出了一個最適合的方式&#xff0c;如下所示&#xff1a; pip install -i https://pypi.t…

linux 離線安裝docker

測試服務器&#xff1a;銀河麒麟V10 x86_64 注意&#xff1a;推薦使用國內的鏡像站下載&#xff0c;因為官網不掛梯子無法訪問&#xff0c;我用的是清華大學開源軟件鏡像站 一、下載離線包&#xff1a; 官網下載docker離線包 下載地址&#xff1a;https://download.docker.c…

使用VisualStudio2022制作安裝包

總體介紹 解決方案里面需要有三個項目: Winform程序, Setup Project , 自定義配置項目(安裝程序類) 1, Winform程序 就是你要打包的程序 2, Setup Project 就是制作安裝包的 3, 自定義配置項目(安裝程序類): 一個命令行項目里面只有一個安裝程序類,用來控制安裝后自動打開程序…