大模型Decoder-Only深入解析

Decoder-Only整體結構

我們以模型Llama-3.1-8B-Instruct為例,打印其結構如下(后面會慢慢解析每一部分,莫慌):

LlamaForCausalLM((model): LlamaModel((embed_tokens): VocabParallelEmbedding(num_embeddings=128256, embedding_dim=4096, org_vocab_size=128256, num_embeddings_padded=128256, tp_size=1)(layers): ModuleList((0-31): 32 x LlamaDecoderLayer((self_attn): LlamaAttention((qkv_proj): QKVParallelLinear(in_features=4096, output_features=6144, bias=False, tp_size=1, gather_output=False)(o_proj): RowParallelLinear(input_features=4096, output_features=4096, bias=False, tp_size=1, reduce_results=True)(rotary_emb): Llama3RotaryEmbedding(head_size=128, rotary_dim=128, max_position_embeddings=131072, base=500000.0, is_neox_style=True)(attn): RadixAttention())(mlp): LlamaMLP((gate_up_proj): MergedColumnParallelLinear(in_features=4096, output_features=28672, bias=False, tp_size=1, gather_output=False)(down_proj): RowParallelLinear(input_features=14336, output_features=4096, bias=False, tp_size=1, reduce_results=True)(act_fn): SiluAndMul())(input_layernorm): RMSNorm()(post_attention_layernorm): RMSNorm()))(norm): RMSNorm())(lm_head): ParallelLMHead(num_embeddings=128256, embedding_dim=4096, org_vocab_size=128256, num_embeddings_padded=128256, tp_size=1)(logits_processor): LogitsProcessor()(pooler): Pooler()
)

Decoder-Only處理流程

我們以Llama-3.1-8B-Instruct模型為例,結合一個具體的聊天對話場景,詳細說明Decoder-Only模型的處理流程,從用戶輸入到最終輸出回答。整個過程會逐步拆解,并標注每個步驟的輸入輸出形狀(假設batch_size=1,seq_len=10,hidden_dim=4096,詞表大小=128000)。

1. 用戶輸入與聊天模板處理

場景:用戶問:“如何做西紅柿炒雞蛋?”
模型需求:需要根據歷史對話和當前問題生成回答。

聊天模板處理
  • 輸入文本text:原始用戶輸入(如“如何做西紅柿炒雞蛋?”)
  • 模板化prompt:模型需要將輸入包裝成特定格式的prompt,例如:
    [系統指令]:你是一個烹飪助手,請回答以下問題。
    [用戶]:如何做西紅柿炒雞蛋?
    [助手]:
    
  • 作用:模板化prompt讓模型明確任務目標(如回答問題),并模擬對話上下文。

輸入輸出形狀

  • 輸入文本長度:假設為10個字符(實際長度取決于具體輸入)。
  • 模板化后的prompt長度:假設為30個字符(包含系統指令、用戶問題和占位符)。

2. Tokenizer處理:從prompt到input_ids

步驟

  1. Tokenization:將模板化prompt拆分為模型能理解的Token(如“西紅柿”→“西紅柿”,“炒”→“炒”)。
  2. 映射到input_ids:每個Token被映射為對應的ID(例如,“西紅柿”→1234,“炒”→5678)。

示例
假設模板化Prompt被拆分為10個Token,其input_ids為:

[101, 1234, 5678, 8901, 2345, 6789, 102, 3456, 7890, 102]

(其中101和102是特殊標記,如<BOS><EOS>,表示開始和結束)

輸入輸出形狀

  • input_ids的形狀為 (batch_size, seq_len)(1, 10)
  • attention_mask(可選)的形狀為 (1, 10),標記哪些位置是有效Token(1)或填充(0)。

3. 嵌入層:input_ids → hidden_states

步驟

  1. Token Embedding:將input_ids映射為高維向量(如4096維)。
  2. Positional Encoding:添加位置信息,讓模型知道每個Token在序列中的位置。

示例

  • input_ids [101, 1234, 5678, ...] → 隱藏狀態 hidden_states 的形狀為 (1, 10, 4096)
  • 每個Token對應的向量包含其語義和位置信息(例如,“西紅柿”對應的食物相關特征,以及它在句子中的位置)。

輸入輸出形狀

  • hidden_states 的形狀為 (batch_size, seq_len, hidden_dim)(1, 10, 4096)

4. Decoder Block處理:逐層計算

核心流程

  1. Masked Self-Attention(帶掩碼的自注意力)

    • 每個Token只能看到自己及之前的Token(防止“偷看”未來內容)。
    • 例如,在生成“西紅柿炒雞蛋”時,模型會先處理“西紅柿”,再處理“炒”,確保生成邏輯連貫。
  2. 前饋網絡(FFN)

    • 對每個Token的隱藏狀態進行非線性變換,增強表達能力。

示例

  • 假設模型有32層Decoder Block,每層都會更新 hidden_states
  • 最終的 hidden_states 保留了完整的上下文信息(如“西紅柿炒雞蛋”的步驟描述)。

輸入輸出形狀

  • 每層Decoder Block的輸入輸出形狀不變,仍為 (1, 10, 4096)

5. LM Head:從hidden_states到下一個詞

步驟

  1. 線性層:將最后一個Token的隱藏狀態(形狀為 (1, 10, 4096))映射到詞表維度(128000)。
    • 例如,對最后一個位置(seq_len=9)的隱藏狀態取值:hidden_states[:, 9, :] → 形狀 (1, 4096)
  2. Softmax:將輸出轉換為概率分布(每個詞的概率)。

示例

  • 假設模型預測下一個詞是“步驟一”,其ID為9876,則概率分布中9876的值最高。

輸入輸出形狀

  • 線性層輸出形狀:(1, 128000)
  • 概率分布形狀:(1, 128000)

6. 采樣策略:從概率分布到下一個詞

方法

  • Top-k采樣:從概率最高的前k個詞(如k=50)中隨機選一個。
  • Greedy Search:直接選概率最高的詞(如“步驟一”)。

示例

  • 模型選擇“步驟一”作為下一個詞,并將其ID(9876)添加到 input_ids 中。
  • 新的 input_ids 變為:[101, 1234, 5678, ..., 9876](長度+1)。

輸入輸出形狀

  • 新的 input_ids 形狀為 (1, 11)

7. 迭代生成:重復步驟3-6直到完成

流程

  1. 將新的 input_idshidden_states 送回Decoder Block。
  2. 重復計算,逐步生成完整回答(如“步驟一:熱鍋涼油…”)。
  3. 直到生成終止標記(如<EOS>)或達到最大長度(如2048 Token)。

示例

  • 生成完整回答后,input_ids 的長度可能變為200(假設生成190個新Token)。
  • 最終的 input_ids 包含原始Prompt和生成的回答。

8. Tokenizer反向處理:從input_ids到用戶文本

步驟

  1. 將生成的 input_ids(含prompt和回答)截取回答部分(去掉prompt)。
  2. 使用Tokenizer將 input_ids 轉換回自然語言文本(如“步驟一:熱鍋涼油…”)。

輸入輸出形狀

  • 截取后的 input_ids 形狀為 (1, 190)
  • 最終輸出文本長度取決于生成內容(如“步驟一:熱鍋涼油…”)

總結流程圖

用戶輸入 → 模板化Prompt → Tokenizer → input_ids (1,10)  → 嵌入層 → hidden_states (1,10,4096)  → Decoder Block ×32 → hidden_states (1,10,4096)  → LM Head → 概率分布 (1,128000)  → 采樣 → 新input_ids (1,11)  → 重復生成 → input_ids (1,200)  → Tokenizer反向 → 用戶文本

LlamaForCausalLM結構分析

以模型Llama-3.1-8B-Instruct為例,將一部分子結構信息折疊起來,將顯示如下:

LlamaForCausalLM((model): LlamaModel((embed_tokens): VocabParallelEmbedding(num_embeddings=128256, embedding_dim=4096, org_vocab_size=128256, num_embeddings_padded=128256, tp_size=1)(layers): ModuleList((0-31): 32 x LlamaDecoderLayer(...))(norm): RMSNorm())(lm_head): ParallelLMHead(num_embeddings=128256, embedding_dim=4096, org_vocab_size=128256, num_embeddings_padded=128256, tp_size=1)(logits_processor): LogitsProcessor()(pooler): Pooler()
)

可以看到LlamaForCausalLM主要由幾個關鍵部分組成:model, lm_head, logits_processorpooler。這幾個組件作用各不相同,我們現在來介紹一下他們。

1. model:核心解碼器結構

(1) embed_tokens:詞嵌入層
  • 作用:將輸入的Token ID(如“西紅柿”→ID=1234)映射為4096維的向量,表示Token的語義和位置信息。
  • 技術細節
    • 使用VocabParallelEmbedding(并行詞嵌入,僅需了解,無需深入),支持分布式訓練。
    • 詞表大小為128256,覆蓋多語言和特殊符號(如<BOS><EOS>)。
  • 輸入輸出形狀
    • 輸入:(batch_size, seq_len)(1, 10)(假設輸入10個Token)
    • 輸出:(batch_size, seq_len, hidden_dim)(1, 10, 4096)
(2) layers:32層Decoder Block
  • 核心結構
    • 多頭注意力(MHA):通過Grouped-Query Attention (GQA) 提高推理效率(Llama 3.1新增)。
      • 查詢(Q)、鍵(K)、值(V)的維度:d_model=4096num_heads=32head_dim=128
      • GQA機制:將K/V頭數減少為num_key_value_heads=8,降低計算開銷。
    • 前饋網絡(MLP):使用SwiGLU激活函數(Sigmoid + Gated Linear Unit),替代傳統ReLU。
      • 輸入:4096維 → 中間層:11008維 → 輸出:4096維。
    • 歸一化:每層使用RMSNorm(均方根歸一化),穩定訓練并加速收斂。
  • 輸入輸出形狀
    • 每層輸入/輸出:(1, 10, 4096)(與輸入形狀一致)
(3) norm:最終歸一化層
  • 作用:對32層Decoder Block的輸出進行最后一次歸一化,確保數值穩定性。
  • 技術細節
    • 使用RMSNorm,無需計算均值,直接對向量的模長標準化。
    • 公式:hidden_states = hidden_states / sqrt(variance + ε),其中ε=1e-6

2. lm_head:語言模型頭部

  • 作用:將最終的隱藏狀態(hidden_dim=4096)映射為詞表大小(vocab_size=128256)的概率分布,預測下一個詞。
  • 技術細節
    • 使用ParallelLMHead(并行線性層),加速大規模詞表的計算。
    • 參數量:4096 × 128256 ≈ 5.16B(占模型總參數量的約76%)。
  • 輸入輸出形狀
    • 輸入:(1, 4096)(取最后一個位置的隱藏狀態)
    • 輸出:(1, 128256)(每個詞的概率值)

3. logits_processor:概率分布處理器

  • 作用:對lm_head輸出的概率分布進行后處理,控制生成策略。
  • 常用功能
    • 溫度調節(Temperature):降低溫度(<1)使輸出更確定,升高溫度(>1)增加多樣性。
    • Top-k/Top-p采樣:從概率最高的k個詞或累積概率達p的詞中隨機選擇,平衡質量和多樣性。
    • 重復懲罰(Repetition Penalty):抑制重復生成相同詞(如避免“西紅柿西紅柿”)。
  • 輸入輸出形狀
    • 輸入:(1, 128256)(原始概率分布)
    • 輸出:(1, 128256)(處理后的概率分布)

4. pooler:池化層

  • 作用:將整個序列的隱藏狀態壓縮為固定長度的向量,用于下游任務(如分類、相似度計算)。
  • 技術細節
    • 默認取第一個Token(如<BOS>)的隱藏狀態作為全局表示。
    • 或使用平均池化/最大池化,但Llama 3.1通常直接取<BOS>
  • 輸入輸出形狀
    • 輸入:(1, 10, 4096)(全序列隱藏狀態)
    • 輸出:(1, 4096)(固定長度的全局向量)

總結:組件協同工作流程

  1. 輸入處理:用戶輸入文本 → 模板化Prompt → embed_tokens(1, 10, 4096)
  2. 特征提取:32層Decoder Block → hidden_states(1, 10, 4096)
  3. 歸一化norm → 穩定輸出
  4. 生成預測
    • lm_head(1, 128256) 概率分布
    • logits_processor → 調整概率分布
    • 采樣生成下一個詞 → 更新 input_ids
  5. 迭代生成:重復步驟1-4,直到生成終止標記(<EOS>)或達到最大長度。
  6. 任務適配pooler 提取全局向量 → 用于分類、相似度等任務。
  • model:像一個廚師,逐步處理食材(Token)并調整火候(注意力機制)。
  • lm_head:廚師的“味覺”,決定下一步該加什么調料(預測下一個詞)。
  • logits_processor:廚房的“規則制定者”,確保菜譜不重復且口味可控。
  • pooler:食客的“總結筆記”,用一句話概括整道菜的風味(全局語義)。

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

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

相關文章

web網頁,在線%電商,茶葉,商城,網上商城系統%分析系統demo,于vscode,vue,java,jdk,springboot,mysql數據庫

經驗心得 這也是幫之前一客戶加了幾個功能&#xff0c;需要掌握crud&#xff0c;前后端開發&#xff0c;前后端怎么對接&#xff0c;前后端通訊是以那種格式&#xff0c;把這些掌握后咱們就可以進行網站開發了。后端記好一定要分層開發&#xff0c;不要像老早一起所有代碼寫到一…

MybatisPlus-05.核心功能-條件構造器

一.條件構造器 我們前面使用的MP功能主要是根據id進行操作的&#xff0c;并未涉及到復雜查詢。而根據id所進行的增刪改查操作在MP中都有直接的封裝。但是遇到復雜的查詢條件時&#xff0c;如何使用MP進行操作是我們要考慮的問題。因此MP為我們提供了條件構造器。 在BaseMapper…

ES6從入門到精通:常用知識點

變量聲明ES6引入了let和const替代var。let用于聲明可變的塊級作用域變量&#xff0c;const用于聲明不可變的常量。塊級作用域有效避免了變量提升和污染全局的問題。let name Alice; const PI 3.1415;箭頭函數箭頭函數簡化了函數寫法&#xff0c;且自動綁定當前上下文的this值…

51單片機教程(十一)- 單片機定時器

11、單片機定時器 項目目標 通過定時器/計數器實現流水燈控制。知識要點 定時器的結構。TMOD和TCON;定時/計數器工作方式;定時/計數器編程步驟;1、項目分析 前面的流水燈的時間控制通過空循環語句來實現,定時不是很精確。本章通過用定時器來控制流水燈任務可以實現精確的時…

基于opencv的疲勞駕駛監測系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業多年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

Vue 2 和 Vue 3 區別

1. 響應式系統原理 Vue 2&#xff1a;利用Object.defineProperty()實現屬性攔截。存在局限性&#xff0c;無法自動監測對象屬性增減&#xff0c;需用Vue.set/delete&#xff1b;數組變異方法要重寫&#xff1b;深層對象遞歸轉換性能差。Vue 3&#xff1a;采用 ES6 Proxy代理對…

mv重命名報錯:-bash:syntax error near unexpected token ‘(‘

文章目錄 一、報錯背景二、解決方法2.1、方法一&#xff1a;文件名加引號2.2、方法二&#xff1a;特殊字符前加\進行轉義 一、報錯背景 在linux上對一文件執行重命名時報錯。原因是該文件名包含空格與括號。 文件名如下&#xff1a; aa &#xff08;1).txt執行命令及報錯如下…

AWS 開源 Strands Agents SDK,簡化 AI 代理開發流程

最近&#xff0c;亞馬遜網絡服務&#xff08;AWS&#xff09;宣布推出 Strands Agents(https://github.com/strands-agents/sdk-python)&#xff0c;這一開源軟件開發工具包&#xff08;SDK&#xff09;采用模型驅動的方法&#xff0c;助力開發者僅用數行代碼即可構建并運行人工…

利用 AI 打造的開發者工具集合

如圖. 我利用 AI 開發了這個網站花了半個小時. 目前就上了 四個 我想到的工具。 大家可以自行體驗下&#xff1a;https://xiaojinzi123.github.io 本文并不是宣傳什么產品. 只是感概 Ai 真的改變我的工作方式啊. 雖然現在 AI 對于一些已有的項目進行更改代碼. 由于不了解業務,…

[自然語言處理]計算語言的熵

一、要求利用給定的中英文語料&#xff0c;分別計算英語字母、英語單詞、漢字、漢語詞的熵&#xff0c;并和已公開結果比較&#xff0c;思考漢語的熵對漢語編碼和處理的影響。二、實驗內容2.1 統計英文語料的熵1.代碼(1)計算英文字母的熵import math #計算每個英文字母的熵 def…

如何處理“協議異常”錯誤

在Java中&#xff0c;“協議異常”通常是指在網絡通信或者處理特定協議相關操作時出現的異常。以下是一些處理“協議異常”錯誤的方法&#xff1a;一、理解協議異常的類型和原因HTTP協議異常原因&#xff1a;在進行HTTP通信時&#xff0c;可能會因為請求格式錯誤、響應狀態碼異…

Spark 4.0的VariantType 類型以及內部存儲

背景 本文基于Spark 4.0 總結 Spark中的 VariantType 類型,用盡量少的字節來存儲Json的格式化數據 分析 這里主要介紹 Variant 的存儲,我們從VariantBuilder.buildJson方法(把對應的json數據存儲為VariantType類型)開始: public static Variant parseJson(JsonParser …

跨越十年的C++演進:C++20新特性全解析

跨越十年的C演進系列&#xff0c;分為5篇&#xff0c;本文為第四篇&#xff0c;后續會持續更新C23~ 前3篇如下&#xff1a; 跨越十年的C演進&#xff1a;C11新特性全解析 跨越十年的C演進&#xff1a;C14新特性全解析 跨越十年的C演進&#xff1a;C17新特性全解析 C20標準…

LeetCode--40.組合總和II

前言&#xff1a;如果你做出來了39題&#xff0c;但是遇到40題就不會做了&#xff0c;那我建議你去再好好縷清39題的思路&#xff0c;再來看這道題&#xff0c;會有種豁然開朗的感覺解題思路&#xff1a;這道題其實與39題基本一致&#xff0c;所以本次題解是借著39題為基礎來講…

Docker Desktop 安裝到D盤(包括鏡像下載等)+ 漢化

目錄 一、 開啟電腦虛擬化 1. 搜索并打開控制面板 2. 點擊程序 3. 點擊啟用或關閉 Windows 功能 4. 打開相關功能 5. 沒有Hyper-V的情況&#xff1a; 二、配置環境 1. 更新 WSL 到最新版 2. 設置 WSL 2為默認版本 3. 安裝 Ubuntu 三. WSL 遷移到D盤 1. 停止運行wsl…

基于 OpenCV 的圖像 ROI 切割實現

一、引言 在計算機視覺領域&#xff0c;我們經常需要處理各種各樣的圖像數據。有時候&#xff0c;我們只對圖像中的某一部分區域感興趣&#xff0c;例如在一張人物照片中&#xff0c;我們可能只關注人物的臉部。在這種情況下&#xff0c;將我們感興趣的區域從整個圖像中切割出…

Linux操作系統01

一、操作系統簡史 二、Linux誕生與分支 三、Linux內核與發行版 內核版本號&#xff1a;cat /proc/version 、 u name -a 操作系統內核漏洞 【超詳細】CentOS編譯安裝升級新內核_centos源碼編譯安裝新版本內核 ntfs-CSDN博客 四、虛擬機 五、Docker容器技術 典型靶場集成環境…

Chrome 下載文件時總是提示“已阻止不安全的下載”的解決方案

解決 Chrome 谷歌瀏覽器下載文件時提示“已阻止不安全的下載”的問題。 ? 前言 最近更新 Chrome 后&#xff0c;下載文件時總是提示“已攔截未經驗證的下載內容”、“已阻止不安全的下載”&#xff1a; ? 身為一個互聯網沖浪高手&#xff0c;這些提醒非常沒有必要&#x…

RocketMQ延遲消息是如何實現的?

RocketMQ的延遲消息實現機制非常巧妙&#xff0c;其核心是通過多級時間輪 定時任務 消息重投遞來實現的。以下是詳細實現原理&#xff1a; ? 一、延遲消息的核心設計 預設延遲級別&#xff08;非任意時間&#xff09; RocketMQ不支持任意時間延遲&#xff0c;而是預設了18個…

D3 面試題100道之(21-40)

這里是D3的面試題,我們從第 21~40題 開始逐條解答。一共100道,陸續發布中。 ?? 面試題(第 21~40 題) 21. D3 中的數據綁定機制是怎樣的? D3 的數據綁定機制通過 selection.data() 方法實現。它將數據數組與 DOM 元素進行一一對應,形成三種狀態: Update Selection:已…