---
# System prepended metadata

title: Train LLM

---

# Train LLM
# 訓練種類
- **從零開始訓練**
Building specialized LLMs entirely from domain-specific data. 有研究同時使用通用資料和領域資料混合，從頭開始訓練了一個大型語言模型，
- **持續預訓練**
在已有的LLM基礎上，用特定領域數據進行進一步的預訓練。 是一種在保持既有所學的同時 ，又能有效適應新領域的方法，也就是說在已有基礎能力的模型上加強模型在特定domain 的知識；一般而言使用 10B~100B tokens的資料來繼續做 pretraining。在 Continual pretraining 的過程中，最害怕的其實就是模型在學新知識的過程中把舊的知識接連忘掉，也就是所謂的 Forgetting 問題。
- **基礎大模型微調**
在一個通用模型的基礎上做 instruction tuning（SFT)，這種做法的優點是可以快速看到不錯的結果，但要建立訓練資料集也要花費不少時間。
- **通用大型語言模型+向量知識庫**
領域知識庫加上通用大型語言模型，針對通用大型語言模型見過的知識比較少的領域，利用向量資料庫等方式根據問題在領域知識庫中找到相關內容，再利用通用大模型強大的摘要和問答的能力產生回應。
## Pretraining
模型一開始是完全空白，對世界毫無知識，連英文單詞都無法構成，使用下一個詞預測(next token prediction)的訓練方式，使用大量零散的文字資料進行預訓練，通常從網路抓取而來的「無標籤」資料。
使用自主監督學習法(self-supervised learning)

預訓練後模型學會:
- 語言結構
- 基礎常識
Fine-tuning 是在預訓練取得基礎語言能力後，使用標註資料訓練模型在特定任務上的專業知識。
預訓練得到通用基礎能力，Fine-tuning 將模型專業化

# pretraining stage ->文字接龍
1. 準備大量任何形式的語料庫
2. tokenization
將句子斷開成小塊(最小的輸入單位)，可以用簡單的編碼像是
```python
stoi = { ch:i for i,ch in enumerate(chars) }
itos = { i:ch for i,ch in enumerate(chars) }
encode = lambda s: [stoi[c] for c in s] # encoder: take a string, output a list of integers
decode = lambda l: ''.join([itos[i] for i in l]) # decoder: take a list of integers, output a string

print(encode("hii there"))
print(decode(encode("hii there")))
```
output
```
[46, 47, 47, 1, 58, 46, 43, 56, 43]
hii there
```
或是Google使用[sentencepiece](https://github.com/google/sentencepiece)，OpenAI使用[tiktoken](https://github.com/openai/tiktoken)
3. 建立訓練/驗證資料集
建立文字接龍，但我們並不會整個同時餵進模型，會切成一個個block可以想像成段落
- batch_size
how many independent sequences will we process in parallel?
- block_size
what is the maximum context length for predictions?

```python
x = train_data[:block_size]
y = train_data[1:block_size+1]
for t in range(block_size):
    context = x[:t+1]
    target = y[t]
    print(f"when input is {context} the target: {target}")
```
```
when input is tensor([18]) the target: 47
when input is tensor([18, 47]) the target: 56
when input is tensor([18, 47, 56]) the target: 57
when input is tensor([18, 47, 56, 57]) the target: 58
when input is tensor([18, 47, 56, 57, 58]) the target: 1
when input is tensor([18, 47, 56, 57, 58,  1]) the target: 15
when input is tensor([18, 47, 56, 57, 58,  1, 15]) the target: 47
when input is tensor([18, 47, 56, 57, 58,  1, 15, 47]) the target: 58
```
5. 使用可以產生序列的model
Transformer, RNN, LSTM, Mamba ...
6. 計算分類loss
softmax
7. 優化器
8. 梯度傳播梯度更新

# fine tuning stage
use QA pairs
# Tokenization
切字

# Note
1.<SOS>、<BOS>、<GO>：代表一個序列的開始。

2.<EOS>：代表一個序列的結束，作為判斷終止的標簽。

3.<MASK>：用於遮蓋句子中的一些單詞。

4.<UNK>：未知字符，代表詞典中沒有的詞。

5.<SEP>: 用於分隔兩個輸入句子，例如輸入句子 A 和 B，要在句子 A，B 後面增加 <SEP> 標志。

6.<CLS> ：放在句子的首位，表示句子的開始，就是classification的意思，通常會在bert等模型出現。

7.<PAD>：補全字符，例如要將句子處理為特定的長度，我們就要在句子前後補<PAD>。

# reference
[客製化的大型語言模型 (LLM) — 針對特定領域做 Continual pre-training](https://medium.com/@albertchen3389/%E5%AE%A2%E8%A3%BD%E5%8C%96%E7%9A%84%E5%A4%A7%E5%9E%8B%E8%AA%9E%E8%A8%80%E6%A8%A1%E5%9E%8B-llm-%E9%87%9D%E5%B0%8D%E7%89%B9%E5%AE%9A%E9%A0%98%E5%9F%9F%E5%81%9A-continual-pre-training-0a961a0161b9)
[大神](https://www.youtube.com/watch?v=kCc8FmEb1nY)
