圖解gpt之Transformer架構與設計原理

Transformer架構。它不僅僅是一個模型,更是一種范式,徹底改變了我們理解和處理自然語言的方式。

2017年,谷歌大腦團隊發表了一篇劃時代的論文,題目就叫《Attention is All You Need》。這標題本身就充滿了力量,宣告了注意力機制的崛起。這篇論文的核心動機,就是要解決當時序列到序列模型,比如RNN、LSTM,在處理長文本時遇到的長距離依賴問題。簡單說,就是讓模型能記住前面說的,才能更好地理解后面的內容。Transformer的出現,直接把NLP的水平拉上了一個臺階,催生了像BERT、GPT這樣的大模型,甚至可以說,沒有Transformer,就沒有今天的ChatGPT。這就是Transformer的經典架構圖。

在這里插入圖片描述

大家可以看到,它主要由兩大部分組成:編碼器和解碼器。

  • 輸入的文本首先經過詞嵌入,變成向量表示,然后加上位置編碼,告訴模型每個詞在句子中的位置。
  • 這些信息進入編碼器和解碼器,內部充滿了多層自注意力機制和前饋網絡,中間還穿插了殘差連接和層歸一化來穩定訓練。
  • 解碼器的輸出經過線性變換和Softmax,得到最終的預測結果。

看起來復雜,但邏輯清晰。Transformer的核心思想是Seq2Seq,也就是序列到序列,這在機器翻譯、文本摘要等任務中很常見。它的任務是把一個輸入序列,比如英文句子,轉換成一個輸出序列,比如中文句子。Transformer的創新在于,它用編碼器和解碼器這兩個獨立模塊來完成這個任務。編碼器負責吃透輸入序列,把信息壓縮成一個濃縮的表示;解碼器則拿著這個表示,一步步生成輸出序列。最關鍵的是,它拋棄了RNN和LSTM那種一個詞一個詞慢慢處理的串行方式,轉而使用并行計算的注意力機制,這大大提升了效率。

注意力機制

注意力機制是Transformer的靈魂所在。它允許模型在處理一個詞時,不僅關注它本身,還能同時關注序列中其他所有詞,根據它們的重要性分配不同的權重。這就像我們閱讀時,會關注關鍵詞,忽略一些無關緊要的詞。Transformer內部有三種主要的注意力機制:

  • 自注意力,讓模型在同一個序列內部,比如編碼器內部,自己跟自己對話,找出關聯;
  • 多頭注意力,相當于開了多個視角,從不同角度觀察;
  • 編碼器-解碼器注意力,讓解碼器能夠回頭看看編碼器處理過的輸入序列,獲取上下文信息。

我們先來看最核心的自注意力機制。它的核心思想是計算一個詞和序列中所有其他詞的關聯度。具體怎么做呢?

  1. 把每個詞的向量投影到三個空間:Q, K, V,分別代表查詢、鍵和值。
  2. 計算每個詞的查詢向量Q和所有詞的鍵向量K的相似度,用點積來衡量,再除以一個縮放因子,防止梯度爆炸,得到注意力分數。
  3. 用softmax函數把這些分數變成概率,也就是注意力權重,保證所有權重加起來等于1。
  4. 用這些權重去加權對應的值向量V,得到最終的上下文表示。

這個過程讓模型能同時看到所有詞,而不是像RNN那樣只能看一個詞。自注意力子層的內部結構中可以看到,核心是多頭自注意力模塊,它后面跟著一個Add & Norm層。這個Add & Norm層包含了殘差連接和層歸一化。殘差連接讓信息可以直接跳過幾層,避免信息丟失,還能加速訓練層歸一化則是在每一層內部對數據進行歸一化,讓模型訓練更穩定,不容易過擬合。注意,編碼器和解碼器的自注意力子層略有不同,解碼器需要額外的后續掩碼,防止它在生成當前詞的時候,偷看未來的信息。

多頭注意力

一個注意力頭可能還不夠,就像看問題可能需要多角度思考一樣。所以,Transformer引入了多頭注意力機制。它把自注意力機制復制了多個,比如8個,每個頭都像一個獨立的觀察者,從不同的角度、不同的子空間去關注輸入序列。每個頭有自己的注意力權重,然后把所有頭的注意力結果拼接起來,再通過一個線性層整合,得到最終的輸出。這樣做的好處是,模型能同時捕捉到序列的局部和全局特征,表達能力大大增強。

在這里插入圖片描述

這張圖更直觀地展示了多頭注意力的工作原理。你可以看到多個并行處理的注意力頭,每個頭都處理著不同的輸入,計算出不同的注意力權重。這些權重被用來加權對應的值向量,然后所有頭的輸出被拼接在一起,最后通過一個線性層整合。這種多角度的并行處理方式,使得Transformer能夠處理非常復雜的信息,這也是它在處理長文本時表現出色的原因之一。

解碼器在生成目標序列的時候,不能只看它自己生成的,還得回頭看看輸入的源序列。這時候就需要編碼器-解碼器注意力機制。它的原理是:解碼器把自己當前的注意力狀態作為查詢,去問編碼器:輸入序列里,哪些詞跟我的當前狀態最相關?編碼器會給出回答,也就是用注意力權重來加權它的輸出向量。這樣,解碼器就能在生成每個詞的時候,都回顧一下輸入序列,確保翻譯或生成的內容是基于原始輸入的。

Transformer中的注意力掩碼和因果注意力。在注意力機制中,我們希望告訴模型,哪些信息是當前位置最需要關注的;同時也希望告訴模型,某些特定信息是不需要被關注的,這就是注意力掩碼的作用。

  • 填充注意力掩碼(PaddingAttentionMask):當處理變長序列時,通常需要對較短的序列進行填充,使所有序列具有相同的長度,以便進行批量處理。填充的部分對實際任務沒有實際意義,因此我們需要使用填充注意力掩碼來避免模型將這些填充位置考慮進來。填充注意力掩碼用于將填充部分的注意力權重設為極小值,在應用softmax時,這些位置的權重將接近于零,從而避免填充部分對模型輸出產生影響。在Transformer的編碼器中,我們只需要使用填充注意力掩碼。
  • 后續注意力掩碼(SubsequentAttentionMask),又稱前瞻注意力掩碼(Look-aheadAttentionMask):在自回歸任務中,例如文本生成,模型需要逐步生成輸出序列。在這種情況下,為了避免模型在生成當前位置的輸出時,
    提前獲取未來位置的信息,需要使用前瞻注意力掩碼。前瞻注意力掩碼將當前位置之后的所有位置的注意力權重設為極小值,這樣在計算當前位置的輸出時,模型只能訪問到當前位置之前的信息,從而確保輸出的自回歸性質。在Transformer的解碼器中,不僅需要使用填充注意力掩碼,還需要使用后續注意力掩碼。

Transformer架構

現在我們來看看輸入是怎么進入Transformer的。

嵌入和位置編碼

首先是文本序列,比如一句話。第一步是詞嵌入,就是把每個詞變成一個固定長度的向量,比如512維。這個向量包含了這個詞的語義信息。

但是,Transformer是并行處理的,它不知道每個詞在句子中的位置。所以,第二步是添加位置編碼,給每個位置的詞向量加上一個表示位置信息的向量,這樣模型就能區分句子中不同位置的詞了。位置編碼是Transformer的一個關鍵創新點。因為RNN是按順序處理的,所以它天然知道哪個詞在前面哪個在后面。但Transformer是并行的,它需要顯式地告訴模型每個詞的位置。最常用的方法是正弦和余弦函數編碼。這種方法的好處是,它能平滑地表示位置,而且能保留相對位置信息,比如第i個詞和第i加1個詞的關系。當然,也有其他方法,比如讓模型自己學習位置編碼,但正弦編碼是原始論文中采用的。這個位置編碼就像給每個詞都貼上了一個坐標標簽。

編碼器

編碼器的內部結構非常規整,它是由多個完全相同的層堆疊起來的。每一層都包含兩個核心組件:

一個是多頭自注意力,另一個是前饋神經網絡。輸入的詞向量和位置編碼首先進入第一層的多頭自注意力,然后經過殘差連接和層歸一化。這個過程的輸出再進入前饋神經網絡,同樣經過殘差連接和層歸一化。這一層的處理完成后,結果進入下一層,重復這個過程。這種層層堆疊的設計,讓編碼器能夠逐步深入地提取輸入序列的特征,最終得到一個高質量的上下文表示。

我們再仔細看看這個多頭自注意力和Add & Norm層。多頭注意力負責并行計算,捕捉不同信息。Add & Norm層是關鍵,它包含了殘差連接和層歸一化。殘差連接保證了信息能夠順暢地傳遞下去,即使經過很多層,原始信息也不會丟失太多,還能加速梯度傳播,讓深層網絡更容易訓練。層歸一化則是在每一層內部穩定數據分布,讓模型訓練更穩定,不容易發散。這兩個技術的組合,是Transformer能夠構建深層網絡的基礎。

前饋神經網絡,簡稱FFN,是編碼器和解碼器層中的第二個關鍵組件。它的作用是對多頭注意力的輸出進行進一步的非線性變換,就像給信息做了一個更復雜的加工。通常是一個簡單的兩層網絡,中間夾著一個ReLU激活函數。特別注意的是,這里的前饋網絡是逐位置的,也就是對序列中的每個詞獨立地應用同一個FFN,而不是把整個序列展平了再處理。這樣保證了每個位置的處理是獨立的,不會互相干擾,也保持了序列的順序信息。

經過編碼器層層處理后,我們得到了一個輸出序列,這個序列里的每一個向量,都包含了它所代表的那個詞,以及它在整個輸入序列中的上下文信息。這個信息是通過注意力機制,特別是自注意力機制,從長距離的依賴關系中提取出來的。這個序列就是編碼器的最終成果,它將被傳遞給解碼器,作為解碼器生成目標序列的唯一依據。可以說,編碼器的質量,直接決定了整個Transformer模型的性能上限。

解碼器

解碼器的輸入有點特殊。它不僅要接收來自編碼器的信息,還要自己接收一部分目標序列。這個目標序列的接收方式,通常被稱為向右位移。這是什么意思呢?在訓練時,我們通常會用真實的答案來喂給解碼器,這就是所謂的教師強制。為了讓解碼器學會生成下一個詞,我們會把目標序列向右移動一位,然后在開頭補上一個起始符號,比如sos。比如,目標是I love you,那么解碼器的輸入就是sos I love you。這樣,解碼器在預測I的時候,能看到的是sos,預測love的時候能看到的是sos和I,以此類推,模擬了真實的生成過程。

解碼器的內部結構也和編碼器類似,是多層堆疊的。每一層主要包含三個部分

首先是解碼器自注意力,它處理的是解碼器自身的輸入序列,比如目標序列的前綴,而且這里必須使用后續掩碼,防止它偷看未來。

然后是編碼器-解碼器注意力,它把解碼器自注意力的結果作為查詢,去問編碼器:輸入序列里哪些詞跟我的當前狀態相關?

最后,同樣是一個前饋神經網絡,以及殘差連接和層歸一化。通過這些步驟,解碼器將編碼器的上下文信息和自身生成的序列信息結合起來。

解碼器自注意力層的作用,是讓解碼器在生成當前詞的時候,能夠回顧之前已經生成的詞序列。這非常關鍵,因為解碼器的輸出是逐步生成的,它必須記住之前生成了什么。為了實現這個,我們使用了后續掩碼。這個掩碼的作用是,當計算當前詞的注意力時,強制模型的注意力權重只落在之前生成的詞上,而對后面要生成的詞,權重接近于0。這樣就保證了生成過程的自回歸特性,模型在生成每個詞時,都是基于之前已知的信息。

編碼器-解碼器注意力層是連接編碼器和解碼器的橋梁。它的工作機制是,解碼器把自己的注意力狀態作為查詢,去問編碼器:輸入序列里,哪些詞跟我的當前狀態最相關?編碼器會給出回答,也就是用注意力權重來加權它的輸出。這樣,解碼器在生成每個詞的時候,就能同時考慮到輸入序列和它已經生成的詞序列。這使得它在生成目標序列時,能夠充分利用輸入信息,生成更準確、更符合語境的翻譯或摘要。

輸出層

解碼器經過所有層的處理后,會輸出一個序列,每個位置的輸出是一個向量,這個向量包含了詞匯表中所有詞的概率。為了得到最終的預測結果,我們還需要一個輸出層。這個輸出層通常由一個線性層和一個Softmax層組成。線性層負責把解碼器的輸出向量映射到詞匯表大小,得到每個詞的原始分數。

然后,Softmax函數把這些分數轉換成概率分布,保證所有概率加起來等于1。這樣,我們就能得到每個位置的詞,以及它在詞匯表中每個詞的概率。在實際應用中,比如機器翻譯,通常會選擇概率最高的那個詞作為最終的輸出。Transformer的應用遠不止于機器翻譯。它在文本摘要、文本分類、問答系統、命名實體識別等領域都取得了巨大的成功。

  • 在文本摘要任務中,它可以生成簡潔的摘要;在文本分類任務中,它可以判斷情感傾向或主題類別;
  • 在問答系統中,它能從文檔中找到答案。
  • 甚至在計算機視覺、語音識別、推薦系統等領域,我們也看到了Transformer的身影。

可以說,Transformer已經成為一種通用的序列建模框架,其影響力還在不斷擴展。總結一下Transformer的優勢。

  • 它最大的優勢就是能夠高效地處理長距離依賴,這得益于注意力機制。它擁有強大的表達能力,能夠捕捉到序列中復雜的模式。
  • 它支持并行計算,大大提高了訓練和推理的效率
  • 它具有良好的可擴展性,可以適應不同的任務和規模。
  • 它的通用性很強,不僅在NLP領域,還在其他領域展現出強大的潛力

理論講完了,我們來看看如何將這些組件組裝起來,構建一個完整的Transformer模型。

參考附件,Transformer.ipynb

我們已經了解了transformer架構的起源、核心思想、關鍵組件以及內部結構。從注意力機制到多頭注意力,從位置編碼到掩碼機制,再到編碼器-解碼器的層層遞進,Transformer以其獨特的架構和強大的能力,徹底改變了NLP的研究格局。它不僅催生了BERT、GPT等一系列革命性模型,也深刻影響了整個AI領域的發展方向。可以說,Transformer是現代AI技術發展的一個重要里程碑。

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

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

相關文章

HCIP:MPLS靜態LSP的配置及抓包

目錄 一、MPLS的簡單的一些知識點 1.MPLS的概述: 2.MPLS工作原理: 3.MPLS的核心組件: 4. MPLS標簽 5.MPLS標簽的處理 6.MPLS轉發的概述: 7.MPLS的靜態LSP建立方式 二、MPLS的靜態LSP的實驗配置 1.配置接口的地址和配置OS…

Azure DevOps 管道部署系列之一本地服務器

Azure DevOps 是一個幫助改進 SDLC(軟件開發生命周期)的平臺。 在本文中,我們將使用 Azure Pipelines 創建自動化部署。 Azure DevOps 團隊將 Azure Pipelines 定義為“使用 CI/CD 構建、測試和部署,適用于任何語言、平臺和云平臺”。 在這里,我將解釋如何在 Azure Dev…

深入剖析網絡協議:七層協議與四層協議詳解

在計算機網絡的世界中,數據的傳輸與交互離不開協議的規范。其中,七層協議和四層協議是網絡通信架構的核心概念,它們如同網絡世界的 “交通規則”,保障著數據準確、高效地在不同設備間流轉。本文將深入解讀七層協議與四層協議&…

回頭看,FPGA+RK3576方案的功耗性能優勢

作者:Hello,Panda 各位朋友,大家好,熊貓君這次開個倒車,在這個廣泛使用Xilinx(Altera)高端SoC的時代,分享一個“FPGAARM”實現的低功耗高性能傳統方案。 圖1 瑞芯微RK3576電路 當前&#xff0c…

打造極致計算器:HTML+Tailwind+DaisyUI實戰

一、計算器總體描述 創建一個在線計算器來實現基礎數學運算功能,通過單一頁面集成數字按鈕、運算符按鈕和顯示結果區域,界面采用簡潔直觀的布局設計,按鈕排列合理且提供即時運算反饋,確保計算邏輯準確和良好的按鍵響應體驗&#x…

基于mediapipe深度學習的虛擬畫板系統python源碼

目錄 1.前言 2.算法運行效果圖預覽 3.算法運行軟件版本 4.部分核心程序 5.算法仿真參數 6.算法理論概述 7.參考文獻 8.算法完整程序工程 1.前言 虛擬畫板系統基于計算機視覺與深度學習技術,通過攝像頭捕獲用戶手部動作,利用 MediaPipe框架實現手…

開源的JT1078轉GB28181服務器

JT1078轉GB28181流程 項目地址: JT1078轉GB28181的流媒體服務器: https://github.com/lkmio/lkm JT1078轉GB28181的信令服務器: https://github.com/lkmio/gb-cms 1. 創建GB28181 UA 調用接口: http://localhost:9000/api/v1/jt/device/add 請求體如下&#xf…

元器件基礎學習筆記——雙極結型晶體管 (BJT)

一、概述 1.1 基本結構 雙極結型晶體管(Bipolar Junction Transistor)由發射極(Emitter)、基極(Base)和集電極(Collector)三個摻雜程度不同的半導體區域組成,分別對應有…

Python 在金融中的應用- Part 1

早在2018年,我開始對資本市場產生興趣。理解資本市場的基本理論對財富積累至關重要。我開始閱讀所有經典著作,如《聰明的投資者》和《證券分析》。在這一系列文章中,我想與讀者分享在Python編程語言背景下理解金融理論的旅程。在文章的第一大部分,我們將專注于金融模型的線…

css使用scoped之后樣式失效問題

項目中的vue代碼原本用的style標簽來寫css&#xff0c;現在想改成<style langscss scoped>&#xff0c;但是改完之后發現樣式不對&#xff1a; 原來是&#xff1a; 將style改成scoped之后變成了&#xff1a;檢查發現是之前定義的一些變量無法被識別&#xff0c;導致這些樣…

基于 GitLab CI + Inno Setup 實現 Windows 程序自動化打包發布方案

在 Windows 桌面應用開發中&#xff0c;實現自動化構建與打包發布是一項非常實用的工程實踐。本文以我在開發PackTes項目時的為例&#xff0c;介紹如何通過 GitLab CI 配合 Inno Setup、批處理腳本、Qt 構建工具&#xff0c;實現版本化打包并發布到共享目錄的完整流程。 項目地…

能源領域新興技術論壇:EMQ 實時數據引擎構建工業智能中樞

5 月 26 日&#xff0c;由沙特阿美亞洲公司主辦的能源領域新興技術論壇在上海順利舉行。本次論壇聚焦智能工廠、無人機與機器人、可靠性與完整性、先進材料四大技術賽道&#xff0c;吸引了來自全球的能源企業、技術供應商及行業專家。 作為業內知名的 MQ AI 實時數據與智能產…

【計算機網絡】第2章:應用層—DNS

目錄 一、PPT 二、總結 DNS&#xff08;域名系統&#xff09;詳解 &#xff08;一&#xff09;DNS核心概念 &#xff08;二&#xff09;DNS查詢過程&#xff08;重點?&#xff09; &#xff08;三&#xff09;DNS資源記錄&#xff08;RR&#xff09;類型…

PHP HTTP 完全指南

PHP HTTP 完全指南 引言 PHP 作為一種流行的服務器端腳本語言,廣泛應用于各種Web開發項目中。HTTP(超文本傳輸協議)是互聯網上應用最為廣泛的網絡協議之一,用于在Web服務器和客戶端之間傳輸數據。本文將詳細介紹 PHP 在 HTTP 通信中的應用,幫助開發者更好地理解和利用 P…

C++測開,自動化測試,業務(第一段實習)

目錄 &#x1f33c;前言 一&#xff0c;實習經歷怎么寫簡歷 &#x1f339;業務理解 &#x1f382;結構化表達 二&#xff0c;實習 &#x1f982;技術和流程卡點 &#x1f511;實習收獲 / 代碼風格 三&#xff0c;測試理論&#xff0c;用例設計&#xff0c;工具鏈 &…

NodeJS全棧開發面試題講解——P5前端能力(React/Vue + API調用)

? 5.1 如何使用 React/Vue 發起后端請求&#xff1f;用什么庫&#xff1f; 面試官您好&#xff0c;在實際項目中我們通常使用 axios、fetch 或框架提供的封裝庫發起后端請求。 &#x1f527; 常用庫對比&#xff1a; 庫框架適配優點axios通用默認支持攔截器、取消請求、請求體…

【C/C++】cmake實現Release版本禁用調試接口技巧

在 C 中通過 CMake 實現部分接口在 Release 版本不生效&#xff0c;可以通過條件編譯結合 CMake 的構建類型判斷來實現。以下是詳細步驟&#xff1a; 1. 在 CMakeLists.txt 中定義配置相關宏 # 設置構建類型&#xff08;可選&#xff0c;但推薦顯式設置&#xff09; if(NOT C…

Spring Boot中的WebSocket技術實現

WebSocket協議基礎 WebSocket作為現代實時通信的核心技術,通過全雙工TCP通道實現了接近實時的數據傳輸能力。該協議主要包含以下核心特性: 協議特點與通信機制 全雙工通信:與HTTP等傳統協議不同,WebSocket允許客戶端和服務端同時發送和接收數據,消除了請求-響應模式的限…

無法發布到PowerBI?試試拆分它

無法發布到PowerBI&#xff1f;試試拆分它 在進行PowerBI發布時&#xff0c;可能會遇到如下兩種無法發布到PowerBI的情況&#xff1a; 第一種&#xff0c;文件太大&#xff0c;無法發布&#xff0c;如圖&#xff1a; 第二種&#xff1a;遠程主機強迫關閉了一個現有的連接&…

光伏功率預測 | LSTM多變量單步光伏功率預測(Matlab完整源碼和數據)

光伏功率預測 | MATLAB實現基于LSTM長短期記憶神經網絡的光伏功率預測 目錄 光伏功率預測 | MATLAB實現基于LSTM長短期記憶神經網絡的光伏功率預測效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 光伏功率預測 | LSTM多變量單步光伏功率預測&#xff08;Matlab完整源碼和…