JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

純解碼器藍圖

為何幾乎每個現代大型語言模型都是一疊相同的解碼器區塊——以及殘差流與正規化位置如何把它撐起來。

一種形狀勝出

2017 年最初的 Transformer有兩半:一個編碼器(encoder)一次讀完整段輸入,一個解碼器(decoder)一次寫一個 token 的輸出。現代通用大型語言模型把編碼器丟掉了。純解碼器架構只保留負責寫的那一半,並用它處理所有事——讀你的提示詞就是在寫它早已知道的 token。GPT、Llama、Mistral、Qwen、DeepSeek:撇開品牌,它們都是同一種形狀。

這種極簡設計為何勝出?因為它只做一件事——下一個 token 預測——並在訓練時於每個位置同時進行。每個 token 只能往看,由因果遮罩(causal masking)強制執行,因此對一句話做一次前向傳遞,就能在每個位置產生一個預測目標。這種訓練效率,比任何巧妙模組都更是純解碼器堆疊吞下整個領域的安靜原因。

仅解码器的大语言模型以自回归方式生成——每个预测出的词元都被反馈回去以预测下一个。

循环示意图:模型输出一个词元,将其追加到输入,再预测下一个。

這個堆疊重複得無聊

現代大型語言模型是一疊相同的區塊——8B 模型有 32 個,最大的有 80 個以上。Token 以嵌入向量進入,往上流過每一個區塊,再以詞彙表上的 logits 離開。每個區塊只做兩件事:在 token 之間混合資訊(注意力),然後單獨轉換每個 token(前饋網路)。沒別的了。能力住在深度裡,而不在任一層的巧思裡。

一个解码器块——归一化、注意力、残差相加、前馈——在整个堆叠中原样重复。

Transformer 块示意图:归一化、注意力分支、残差相加,再前馈分支。

殘差流是主幹道

想像一根寬管子筆直穿過每個區塊——殘差流(residual stream)。區塊從不覆寫它;它從管子讀取,算出一個小更新,再把更新回去。注意力加上它的貢獻,前饋層加上自己的貢獻,而原始訊號在旁邊原封不動地繼續流。這個 `x = x + sublayer(x)` 模式,正是百層模型能訓練起來的原因:梯度有一條不間斷的路徑回到輸入。

x_{\ell+1} = x_{\ell} + F_{\ell}\!\left(\mathrm{norm}(x_{\ell})\right)

每个块从残差流中读取,在归一化的分支上计算一个小更新,再把它加回去——从不覆盖。

for block in blocks:           # the entire model, conceptually
    x = x + attention(norm(x))  # mix across tokens, add to the stream
    x = x + feedforward(norm(x))# transform each token, add to the stream
logits = unembed(norm(x))       # final read-out over the vocabulary
純解碼器迴圈。注意 `norm` 套在分支上、而非主幹流上——這就是前置正規化(pre-norm)。

在前面正規化,不是在後面

你把正規化層放在哪裡,結果關係極大。2017 年的設計用後置正規化(post-norm,加進主幹流後才正規化)。每個認真的現代模型都用前置正規化(pre-norm):對每個子層的輸入做正規化,讓殘差主幹道保持原樣。正規化位置決定了一個深層模型是訓練得平滑、還是在頭一千步就 loss 爆炸。

而正規化器本身也變簡單了。經典的 LayerNorm同時做重新置中(減去平均值)與重新縮放。現代堆疊用 RMSNorm,完全跳過減平均,只除以均方根(root-mean-square)。它更便宜,而且經驗上那個置中幾乎沒在做事。下一篇我們會解剖 RMSNorm 與區塊的其餘部分。

把兩端綁起來

兩層夾住整個堆疊:底部一張嵌入表把 token ID 變成向量,頂部一個解嵌入(unembedding)矩陣把最終向量變成詞彙分數。權重綁定常讓這兩者是同一個矩陣——輸入與輸出嵌入共享——這在較小模型裡省下一大塊參數,並把『意義進』與『意義出』的幾何綁在一起。

在堆叠底部,嵌入表把词元 ID 映射为向量;权重绑定可以把同一张表复用为顶部的反嵌入矩阵。

示意图:通过查找表把词元 ID 转换为嵌入向量。