# Decoder Only 的語言模型 ## 前言 - 前面提到 經典的Transformer 模型,採用 Encoder-Decoder 架構 - Encoder 將輸入的文本 轉換成好多個帶有上下文語意的向量 文本 -> 切成 詞 Token -> Encoder -> 生成 contextual vector - Decoder 再根據 Encoder 產出的文本向量 以及 自己已經產生的token,去預測下一個token應該要是什麼 ## 使用 Decoder Only transformer 的模型 PT、LLaMA、Qwen ![0cad60e3-cec7-4bfa-9ad1-356b6d181f7c_1640x862](https://hackmd.io/_uploads/Sy2_4ooKWx.png) ## 以流程走一次 Decoder Only 如何產生文本 ### 1. 輸入一句話(Prompt) 假設使用者輸入: ``` 天空為什麼是藍色 ``` tokenize(假設每字一 token),產生8個token: ``` [天, 空, 為, 什, 麼, 是, 藍, 色] t1 t2 t3 t4 t5 t6 t7 t8 ``` --- ### 2. Token → Embedding 每個 token 先轉為向量: 透過可學習的Embedding層 ``` 天 → e1 空 → e2 為 → e3 什 → e4 麼 → e5 是 → e6 藍 → e7 色 → e8 ``` 再加上 **position embedding**:加入位置資訊 ``` x1 = e1 + p1 x2 = e2 + p2 ... x8 = e8 + p8 ``` 形成模型輸入矩陣: ``` X = [x1, x2, x3, x4, x5, x6, x7, x8] ``` --- ### 3. 輪流進入 Transformer layers 在 decoder-only 中使用 **causal self-attention**。 attention mask: ``` t1 → 看 t1 t2 → 看 t1 t2 t3 → 看 t1 t2 t3 ... t8 → 看 t1 ... t8 ``` 所以 hidden states 會變成: ``` h1, h2, h3, h4, h5, h6, h7, h8 ``` 重要的是: ``` h8 = 整句語意 ``` 因為它可以看到全部 token。 --- ### 4. 用最後一個 token 預測下一個 token Transformer 輸出會經過: ``` Linear layer Softmax ``` 得到下一 token 機率: ``` P(token | 天空為什麼是藍色) ``` 例如: | token | probability | | ----- | ----------- | | 因 | 0.35 | | 因為 | 0.22 | | 這 | 0.05 | 模型選擇: ``` 因 ``` --- ### 5. 把新 token 接到序列 序列變成: ``` 天空為什麼是藍色 因 ``` token: ``` [天 空 為 什 麼 是 藍 色 因] t1 t2 t3 t4 t5 t6 t7 t8 t9 ``` --- ### 6. 再跑一次 Transformer 整個序列重新計算: ``` t1 → 看 t1 t2 → 看 t1 t2 ... t9 → 看 t1 ... t9 ``` 此時: ``` h9 = 理解問題 + 已生成回答 ``` 會根據理解的問題 + 已生成回答重新計算語意 並 預測下一個字: ``` P(token | 天空為什麼是藍色 因) ``` 可能輸出: ``` 為 ``` --- ### 7. 不斷重複生成 序列逐步變成: ``` 天空為什麼是藍色 因 為 大 氣 中 的 瑞 利 散 射 ``` 流程循環: ``` 輸入序列 ↓ Transformer ↓ 預測下一 token ↓ append token ↓ 再跑一次 ``` 直到: * 生成 `<EOS>`,End Of Sequence 或 * 達到最大 token --- ### 8. 一句話總結 decoder-only LLM 的運作可以簡化為: ``` 整個 prompt → 計算語意 ↓ 預測下一 token ↓ 加入序列 ↓ 重新計算語意 ↓ 再預測下一 token ``` 也就是: ``` context → next token prediction ``` --- ## 直接依模型架構圖解釋 ![0cad60e3-cec7-4bfa-9ad1-356b6d181f7c_1640x862](https://hackmd.io/_uploads/Sy2_4ooKWx.png) 1. 最下方為 Input Token Vectors,文本token先被轉成向量 2. 中間 + 號 - 文本token 加到 position embedding - 加入額外的位置資訊 3. Position Embedding 與 波浪符號 - 透過 Rotary Position Embedding(RoPE) 讓模型了結文字在序列中的順序與相對位置 - 將每個token看作一個複數(complex number,帶角度的那個),根據為製作角度旋轉 - ```位置越後面 → 向量旋轉角度越大``` 4. Decoder Block(疊很多層) - 逐漸產生 富有上下文的 token - 從一開始的輸入 token語意 與 位置資訊,逐漸變成: - 語法資訊 - 長距離的依賴 - 上下文語意 - 任務的資訊 5. 單一的 Decoder Block (Pre-LN) 1. Layer Norm 1. Masked Self-Attention 1. 殘差相加(Residual Add) 1. Layer Norm 1. FFNN 1. 殘差相加(Residual Add)