---
# System prepended metadata

title: Decoder Only 的語言模型
tags: [模型論文]

---

# 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）