transformer模型初理解

模型介紹

在 Transformer 之前,主流的序列模型是 **RNN(循環神經網絡)**

工作方式類似「逐字閱讀」:處理序列時,必須從第一個詞開始,一個接一個往后算(比如翻譯時,先看 “我”,再看 “愛”,再看 “你”,不能同時看三個詞)。

這種串行計算有兩個致命問題:

  1. 推理速度慢:因為無法實現并行計算,對于長文章來說,處理效率極低
  2. 長距離依賴差:比如一句話的開頭和結尾有邏輯關聯(如 “小明…… 他……”),但 RNN隔得太遠就會 “記不清”。

對于翻譯任務來說,文字之間存在語法關系,如果只是按照串行方式進行翻譯,最終得到的翻譯序列會是一個語法混亂的序列

而 Transformer 徹底拋棄了循環結構,改用 注意力機制 實現「并行計算」,同時能直接捕捉任意兩個詞之間的關聯(無論距離多遠)。這就是它能在 NLP 任務中碾壓前任的核心原因。

整體模塊介紹

模塊由兩部分組成:編碼器、解碼器,一個模型中含有n個結構相同的編碼器和解碼器(可以自己定義數量)
在這里插入圖片描述

以翻譯任務為例:

編碼器負責對原始文字序列的語義特征進行提取

解碼器負責預測原始文字序列對應的目標文字序列

分模塊解析

編碼器

在這里插入圖片描述

輸入部分
編碼器的原始輸入是一段文字序列,比如"我愛你"

在輸入部分有兩個關鍵預處理步驟,分別是:

  1. 詞嵌入(Embedding)
  2. 位置編碼(Positional Encoding
詞嵌入(Embedding)
這部分是將原始輸入序列轉變成計算機能理解的詞**向量,**如 “我”→ [0.2, 0.5, -0.1]),讓計算機能理解;

要注意的是,在初始時,詞向量是隨機生成的,并將隨機數定格在某個范圍內,在訓練時會經過反向傳播動態調整詞向量

對于"我愛你",初始時可能會轉變成[[0.2, 0.5, -0.1],[0.1, 0.3, -0.2],[0.5, 0.2, -0.2]]

位置編碼(Positional Encoding):
為每個詞向量生成**"位置信息",原因是**Transformer 并行處理,本身不知道詞的順序,加入位置編碼后可以在訓練過程中逐漸學習到每個詞的先后順序關系

位置編碼的生成公式

pos表示的是當前詞在整個輸入序列中的位置,例如"我"的pos為0,“愛”的pos為1

2i2i+1中的i表示的是某個詞向量的第i個維度,以上面的例子,一個詞被分為了512個維度。

而2i表示為偶數的維度,2i+1表示為奇數的維度


為什么要這樣做呢,因為這個公式蘊含著詞匯之間的相對關系

所以在訓練調整權重時,模型能根據輸入向量之間的數學關系來學習他們之間的位置關系


在計算完位置編碼后,將詞向量與位置編碼進行相加,得到的新向量就是編碼器的第二個模塊注意力機制的輸入

多頭自注意力機制
自注意力機制是 Transformer 的靈魂,作用是:**讓輸入序列中的每個詞,都能 “看到” 其他詞,并計算它們之間的關聯度**。

舉個例子:輸入 “貓坐在墊子上,它很舒服”,“它” 指的是 “貓”,自注意力會讓 “它” 重點關注 “貓”,而不是 “墊子” 或 “舒服”。

自注意力機制的計算步驟是這樣的:

核心是三個變量的計算:Q(Query)、K(Key)、V(Value)可以類比成查字典:

  • 你想查 “它” 指什么(這是 Query);
  • 字典里的每個詞都有自己的 “標簽”(如 “貓” 的標簽是 “動物”,這是 Key);
  • 查到后得到的解釋(如 “貓是一種動物”,這是 Value)。

具體計算如下:

  1. 生成Q、K、V:給每個詞向量(上一步的輸入)乘上三個不同的線型層矩陣這3個線型層矩陣在初始時為隨機值,隨著訓練過程動態調整
  2. 計算注意力得分:用 Query 和每個詞的 Key 做 “匹配度” 計算(用「縮放點積」:Q?K / √d,d 是向量維度,防止值太大);
  3. 歸一化得分:用 softmax 把得分變成 0-1 的權重(總和為 1),表示 “關注程度”;得分越大,說明詞向量與這個key最為匹配 ,舉例子也就是貓坐在墊子上,它很舒服”,“它” 指的是 “貓”,所以“貓”這個key得分會更高
  4. 加權求和:用第三步的得分乘以每個詞的V向量,再進行累加,得到該詞的「注意力輸出」(即 “綜合了其他詞信息的新向量”)。

前饋神經網絡
這一個部分是為了**對每個詞的注意力輸出做獨立的特征處理(和其他詞無關)。**

結構是:兩層線性變換 + ReLU 激活,公式可以簡化為:
FFN(x) = max(0, x·W1 + b1) · W2 + b2
作用類似 “特征提純”:把注意力捕捉到的關聯信息,進一步轉化為更有效的特征。

在此之后還有兩個部分

  1. 殘差連接:每個子層的輸出 = 子層輸入 + 子層計算結果(如注意力輸出)。作用是解決深層網絡的 “梯度消失”,讓模型更容易訓練。 “梯度消失”會使得模型訓練不動,權重無法修改
  2. 層歸一化:對每個詞的向量做歸一化(讓均值為 0,方差為 1)。作用是穩定訓練過程中的數值波動,讓模型收斂更快。

對于transformer模型而言,可能有n個編碼器,這n個編碼器結構完全一樣,但是內部權重不一樣。沒個編碼器都有自己初始的線型層矩陣(3個),都獨享矩陣參數。且一個編碼器的輸入是上一個編碼器的輸出。

編碼器的多層結構設計目的是逐步提煉和抽象輸入序列的特征(從低級特征到高級特征),而獨立的線性層矩陣是實現這一目標的關鍵:

  • 第一層可能更關注基礎的語法關系(如主謂、動賓),其會學習 “如何提取語法相關的 Q、K 特征”(比如讓動詞的 Q 更易匹配主語的 K)。
  • 第二層則更關注全局語義(如整個句子的場景或邏輯),其會學習 “如何提取語義相關的 Q、K 特征”(比如讓 “貓” 的 Q 更易匹配 “墊子” 的 K,因為它們共同構成 “貓坐在墊子上” 的場景)。

如果多層共享同一套線性層矩陣,模型就無法針對不同抽象層次的特征進行專門優化,難以實現 “逐層遞進” 的特征提取。

最后一個編碼器的output最作為input進入n個解碼器


解碼器

在這里插入圖片描述

解碼器也由 N 個相同的層堆疊,每個層比編碼器多一個子層,共 3 個子層:

  1. 掩碼多頭自注意力(Masked Multi-Head Self-Attention);
  2. 編碼器 - 解碼器注意力(Encoder-Decoder Attention);
  3. 前饋神經網絡(和編碼器的一樣)。

在解碼器的輸入部分,可分為兩種情況:

  1. 第一種是在訓練時,輸入部分是目標序列經過embedding以及位置編碼轉換后的向量以及編碼器最后一層的注意力機制模塊的K和V向量(這一部分會在解碼器的第二個部分作為輸入),這個目標序列怎么理解呢,加入我的編碼器的輸入原始序列是"我愛你",那么目標序列就是"i love you",訓練時為了并行計算,會把整個輸出序列(如 “I love you”)喂進去,但必須 “遮住” 每個詞后面的內容(比如計算 “I” 的注意力時,只能看到 “I”,看不到 “love” 和 “you”)。

在訓練階段,我已經知道原始序列對應的目標序列是什么,所以會隨機初始化一個**[目標序列長度??模型向量維度]**的矩陣作為解碼器的輸入

舉例:
目標序列為:[我, 愛, 機器學習]
移位后輸入:[<sos, 我, 愛, 機器學習](解碼器需要基于此預測[我, 愛, 機器學習, ])

  1. 第二種是在推理時,模型不知道完整目標序列,需要自回歸生成:每次生成一個詞,將其拼接到 “已生成序列” 后,作為下一次的輸入,直到生成<eos結束。所以它的輸入部分是上一次的輸出(最原始的輸入是開頭符)拼接到"已生成序列"之后再加上編碼器最后一層的注意力機制模塊的K和V向量

舉例:

● 第 1 步輸入:[<sos] → 生成 “我”
● 第 2 步輸入:[<sos, 我] → 生成 “愛”
● 第 3 步輸入:[<sos, 我, 愛] → 生成 “機器學習”
● 第 4 步輸入:[<sos, 我, 愛, 機器學習] → 生成,結束

掩碼多頭自注意力
計算方式與編碼器的自注意力機制是一樣的,但是多了個**掩碼**,也就是說,在輸入的矩陣中,在計算注意力得分時,當前詞是看不到后面詞的K和V的,會將他們設置為0,**這樣的話,在計算得分時就不會將當前詞后面的詞的特征考慮進來,防止模型參考后面的句子來預測當前詞。**方便與推理時邏輯保持一致。
編碼器 - 解碼器注意力
這個注意力的作用是:**讓解碼器 “關注” 編碼器輸出的上下文向量(即輸入序列的信息)。**

計算方式和自注意力類似,但 Q、K、V 的來源不同:

  • Query(Q):來自解碼器第一層(掩碼注意力)的輸出;
  • Key(K)和 Value(V):來自編碼器的最終輸出(上下文向量)

最終會得到一個注意力得分向量

前饋神經網絡(和編碼器的一樣)
所做的工作與編碼器一樣,是為了**對每個詞的注意力輸出做獨立的特征處理(和其他詞無關)。**

也有殘差連接和歸一化兩個步驟

輸出處理
解碼器的最終輸出是一個 512 維的向量(論文中如此設置),需要轉換成 “下一個詞的概率”:
  1. 經過一個線性層:把 512 維向量映射到 “詞表大小” 維度(比如詞表有 10000 個詞,就變成 10000 維);
  2. 經過 softmax:把 10000 維向量變成概率分布(每個值在 0-1 之間,總和為 1);
  3. 取概率最大的詞作為輸出,然后把這個詞再喂回解碼器,重復生成下一個詞,直到生成 “結束符”。

至此,整個從輸入到輸出的流程就結束了,在進行完一輪epoch后,會計算損失然后進行反向傳播修改各個矩陣參數權重。

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

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

相關文章

驅動開發系列66 - glCompileShader實現 - GLSL中添加內置函數

一&#xff1a;概述 本文介紹如何為 GLSL 語言中增加一個內置函數&#xff0c;以https://registry.khronos.org/OpenGL/extensions/ARB/ARB_shader_texture_image_samples.txt擴展為例&#xff0c;介紹下添加textureSamples內置函數的過程。

指針的應用學習日記

Git常見的命令&#xff1a;%h 簡化哈希 %an 作者名字 %ar 修訂日期(距今) %ad修訂日期 %s提交說明指針簡介指針(Pointer)是C語言的一個重要知識點&#xff0c;其使用靈活、功能強大&#xff0c;是C語言的靈魂。 指針與底層硬件聯系緊密&#xff0c;使用指針可操作數據的地址&am…

KMM跨平臺叛逃實錄:SwiftUI與Compose Multiplatform共享ViewModel的混合開發框架(代碼復用率85%)

KMM跨平臺叛逃實錄&#xff1a;SwiftUI與Compose Multiplatform共享ViewModel的混合開發框架&#xff08;代碼復用率85%&#xff09;一、架構革命&#xff1a;跨平臺統一狀態管理1.1 核心架構設計1.2 技術矩陣對比二、KMM共享ViewModel實現2.1 基礎狀態管理2.2 ViewModel核心架…

關于Android webview協議混淆

背景&#xff1a;android中引入的html頁面是http請求(web服務僅開放了80端口)&#xff0c;但html頁面引用的后端接口是https請求&#xff0c;則發生android中html頁面請求接口異常<請求無法發送到后端服務(status0)>。瀏覽器出于安全考慮&#xff0c;要求&#xff1a; 同…

Android Jetpack | Lifecycle

一.前言 本篇主線包含三點&#xff0c;Lifecycle的作用、簡單使用、核心原理&#xff08;包含核心類與源碼主線分析&#xff09;&#xff1b; 二.作用 官方文檔生命周期感知型組件可執行操作來響應另一個組件&#xff08;如 Activity 和 Fragment&#xff09;的生命周期狀態…

單片機編程架構

沒有最好的程序架構。 只要在項目中實現產品功能并穩定工作&#xff0c;且能在團隊內統一應用管理就是最優的程序架構。 一、單片機運行模型&#xff1a; 1.能分配時間的裸機代碼 2.FreeRTOS操作系統 代碼分層框架&#xff1a; 1.與板關聯的底層 2.《驅動底層的驅動層》《中間層…

114. 二叉樹展開為鏈表

題目&#xff1a;給你二叉樹的根結點 root &#xff0c;請你將它展開為一個單鏈表&#xff1a; 展開后的單鏈表應該同樣使用 TreeNode &#xff0c;其中 right 子指針指向鏈表中下一個結點&#xff0c;而左子指針始終為 null 。展開后的單鏈表應該與二叉樹 先序遍歷 順序相同。…

【Langchain系列三】GraphGPT——LangChain+NebulaGraph+llm構建智能圖數據庫問答系統

Langchain二次開發專欄 【Langchain系列一】常用大模型的key獲取與連接方式 【Langchain系列二】LangChain+Prompt +LLM智能問答入門 【Langchain系列三】GraphGPT——LangChain+NebulaGraph+llm構建智能圖數據庫問答系統 【Langchain系列四】RAG——基于非結構化數據庫的智能問…

【GNSS定位原理及算法雜記6】??????PPP(精密單點定位)原理,RTK/PPK/PPP區別討論

PPP 技術詳解&#xff1a;原理、流程與 RTK/PPK 對比 在高精度 GNSS 定位技術體系中&#xff0c;除了 RTK 和 PPK 以外&#xff0c;還有一類無需基站即可實現分米到厘米級定位的方法 —— PPP&#xff08;Precise Point Positioning&#xff0c;精密單點定位&#xff09;。它以…

LeetCode 837.新 21 點:動態規劃+滑動窗口

【LetMeFly】837.新 21 點&#xff1a;動態規劃滑動窗口 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/new-21-game/ 愛麗絲參與一個大致基于紙牌游戲 “21點” 規則的游戲&#xff0c;描述如下&#xff1a; 愛麗絲以 0 分開始&#xff0c;并在她的得分少于 k 分時…

Codeforces 盒裝蘋果

題目來源&#xff1a;問題 - 2107B - Codeforces 這道題其實只需要判斷兩個要點&#xff0c;首先判斷一下最大值-1后與最小值的差值是否>k&#xff0c;這里有個小細節&#xff0c;當有多個最大值時&#xff0c;可以先將一個最大值-1后再排序&#xff0c;判斷新數組最大值與最…

數據結構--------堆

目錄 二叉樹 樹的概念與結構 非樹形結構&#xff1a; 注意&#xff1a; 樹的相關術語 樹的表示 孩子兄弟表示法 樹形結構實際運用場景&#xff08;拓展&#xff09; 1. 文件系統管理 2. 數據庫與索引 3. 編程語言與數據結構 信息組織與展示 1. 思維導圖 2. 目錄與…

VSCode Cursor 大模型 插件擴展 Kilo Code 配置

1.1 概述 Kilo Code 是一個 VSCode Cursor 插件擴展&#xff0c;提供了對多種 AI 模型的支持&#xff0c;包括 Claude Code 和 Qwen3。通過正確配置 Kilo Code&#xff0c;可以在開發過程中獲得更好的 AI 輔助編程體驗。 Kilo使用文檔&#xff1a;https://kilocode.ai/docs/zh-…

深入解析:Unity、Unreal Engine與Godot引擎中的Uniform變量管理

在現代游戲開發中&#xff0c;Uniform變量是實現高質量圖形渲染的關鍵元素。不同游戲引擎對Uniform變量的管理方式有所不同&#xff0c;了解這些差異可以幫助開發者在選擇引擎時做出更明智的決策。本文將深入探討Unity、Unreal Engine和Godot引擎中Uniform變量的管理方式&#…

遨游旅游天地,開啟探索未知的夢幻之旅

你是否也懷揣著一顆對世界充滿好奇的心&#xff0c;渴望踏上探索旅游世界的奇妙旅程&#xff1f;旅游&#xff0c;是一場與未知的邂逅&#xff0c;是心靈的一次自由翱翔。想象一下&#xff0c;你置身于神秘莫測的撒哈拉沙漠。當夕陽的余暉灑在連綿起伏的沙丘上&#xff0c;那金…

SConscript 腳本入門教程

第一章&#xff1a;什么是 SCons 和 SConscript&#xff1f;核心概念SCons 是一個現代化的構建工具&#xff0c;用于自動化軟件構建過程&#xff0c;類似于 Make 但功能更強大、語法更簡潔。SConstruct&#xff1a;是 SCons 的主配置文件&#xff0c;通常在項目根目錄&#xff…

【深度學習】PyTorch從0到1——手寫你的第一個卷積神經網絡模型,AI模型開發全過程實戰

引言本次準備建立一個卷積神經網絡模型&#xff0c;用于區分鳥和飛機&#xff0c;并從CIFAR-10數據集中選出所有鳥和飛機作為本次的數據集。以此為例&#xff0c;介紹一個神經網絡模型從數據集準備、數據歸一化處理、模型網絡函數定義、模型訓練、結果驗證、模型文件保存&#…

云計算核心技術之容器技術

一、容器技術 1.1、為什么需要容器 在使用虛擬化一段時間后&#xff0c;發現它存在一些問題&#xff1a;不同的用戶&#xff0c;有時候只是希望運行各自的一些簡單程序&#xff0c;跑一個小進程。為了不相互影響&#xff0c;就要建立虛擬機。如果建虛擬機&#xff0c;顯然浪費就…

微信小程序通過uni.chooseLocation打開地圖選擇位置,相關設置及可能出現的問題

前言 uni.chooseLocation打開地圖選擇位置&#xff0c;看官方文檔介紹的比較簡單&#xff0c;但是需要注意的細節不少&#xff0c;如果沒有注意可能就無法使用該API或者報錯&#xff0c;下面就把詳細的配置方法做一下介紹。 一、勾選位置接口 ①在uniapp項目根目錄找到manif…

從財務整合到患者管理:德國醫療集團 Asklepios完成 SAP S/4HANA 全鏈條升級路徑

目錄 挑戰 解決方案 詳細信息 Asklepios成立于1985年&#xff0c;目前擁有約170家醫療機構&#xff0c;是德國大型私營診所運營商。Asklepios是希臘和羅馬神話中的醫神。 挑戰 Asklepios希望進一步擴大其作為數字醫療保健集團的地位。2020年9月&#xff0c;該公司與SNP合作…