# Decoder Only 的語言模型
## 前言
- 前面提到 經典的Transformer 模型,採用 Encoder-Decoder 架構
- Encoder 將輸入的文本 轉換成好多個帶有上下文語意的向量
文本 -> 切成 詞 Token -> Encoder -> 生成 contextual vector
- Decoder 再根據 Encoder 產出的文本向量 以及 自己已經產生的token,去預測下一個token應該要是什麼
## 使用 Decoder Only transformer 的模型
PT、LLaMA、Qwen

## 以流程走一次 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
```
---
## 直接依模型架構圖解釋

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)