一、什么是 LLM?
LLM,全稱為 Large Language Model(大語言模型),是一種基于神經網絡(主要是 Transformer 結構)的大規模自然語言處理(NLP)模型。其核心能力在于理解、生成、翻譯和總結自然語言,已廣泛應用于問答系統、機器翻譯、對話機器人、代碼生成、文本創作等場景中。
LLM 的基本任務:給定一段文本,預測接下來的 token(語言片段),也可以理解為:LLM 是一種基于上下文預測下一個 token 的概率分布的模型。
一個典型的 LLM“7B 模型”表示擁有 70 億參數(billion),使用 float32 存儲時,模型大小約為 28GB(7B × 4 字節)。模型規模常見有 0.5B、1B、7B、13B、33B、65B,甚至超過 100B。
二、LLM 模型結構
總體看,LLM 結構有以下幾種:
- Decoder-only 架構(主流 LLM,如 GPT-4、LLaMA、PaLM):骨干結構由多個 Decoder 層堆疊而成,且每個 Decoder 層包含自注意力機制和前饋網絡,用于從左到右生成文本。
- Encoder-only 架構(如 BERT):這類模型僅使用 Transformer 的 Encoder,用于理解文本而非生成。
- Encoder-Decoder 架構(如 T5、BART):這類 LLM 同時使用了 Transformer 的 Encoder 和 Decoder,Encoder 處理輸入(如源文本),Decoder 生成輸出(如翻譯結果)
當前 GPT、LLaMA 等主流模型采用 Decoder-only 架構堆疊組成,通過自回歸方式生成文本。一個典型的 Transformer Decoder 層包括以下組件:
- Self-Attention(自注意力層):對輸入序列進行全局信息建模,使模型捕捉上下文關系。
- Feed Forward Network(前饋網絡,FFN):通過兩層全連接神經網絡實現非線性變換。
- Layer Normalization + 殘差連接:保證訓練穩定性與深層信息流通。
- 多層堆疊:一個 LLM 通常包含幾十甚至上百層的 Decoder。每一層都會基于當前輸入和之前的 token 信息進行信息融合與加工,形成更深層次的語言理解能力。
傳統 Transformer:每個解碼器塊使用固定的前饋網絡 MoE 架構:通過 Router 動態選擇部分專家網絡,提升模型容量同時減少計算量。
圖片來源:https://blog.csdn.net/LLM88888888/article/details/147580799
三、Token 與 Tokenizer 理論
token 是指文本中的一個詞或者子詞,經過 Tokenizer(分詞器)將原始文本拆解為子詞、單詞或字符,同時保留語義和結構信息。
tokenizer 將字符串分為一些 sub-word token string,再將 token string 映射到 id,并保留來回映射的 mapping。
embeddings 將 token id 編碼成向量,例如下面 bert 示例中:ID=101 → 向量 [0.1, 0.2, …, 0.5] (bert 768 維)
四、bert 實操解讀
代碼如下:
# 注意,需要 pip install transformers 安裝 transformers 庫
from transformers import BertTokenizer, BertModel sentence = "Hello, my son is cuting."# 問題1:'bert-base-uncased'從哪來,有哪些內容?
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
# 問題2:return_tensors='pt'有什么作用?
encoded_input = tokenizer(sentence, return_tensors='pt')
print("encoded_input: ", encoded_input)
# encoded_input: {'input_ids': tensor([[ 101, 7592, 1010, 2026, 2365, 2003, 3013, 2075, 1012, 102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}# 問題3:分詞encoded_input表示什么?
model = BertModel.from_pretrained("bert-base-uncased")
output = model(**encoded_input)
print("output: ", output)
print(output.last_hidden_state.shape) # torch.Size([1, 10, 768]),輸出形狀為 [1, seq_len, hidden_size]
print(output.pooler_output.shape) # torch.Size([1, 768])
# 問題4:bertmodel輸出是什么?怎么理解?
問題 1:'bert-base-uncased’從哪來,有哪些內容?
運行目錄:
.
├── 1_code_run.py
└── bert-base-uncased├── config.json├── pytorch_model.bin├── tokenizer_config.json├── tokenizer.json└── vocab.txt
所需文件到:https://huggingface.co/google-bert/bert-base-uncased/tree/main 中獲取。
- tokenizer.json:存儲分詞器的核心映射規則(token 與 ID 對應關系等 ),用于文本轉 token ID。
- tokenizer_config.json:配置分詞器的參數(如詞表路徑、模型類型等 ),讓 BertTokenizer 能正確初始化。
- vocab.txt:詞表文件,記錄模型可識別的所有基礎 token,是分詞和編碼的基礎。
- config.json:存儲模型的架構配置(層數、隱藏層維度、注意力頭數等 ),用于構建 BertModel 的網絡結構。
- pytorch_model.bin:PyTorch 格式的模型權重文件,加載后為模型提供推理 / 訓練所需參數。
使用 from_pretrained 時,只要本地路徑(或緩存路徑)包含這些文件,transformers 庫會自動加載,無需手動逐個指定,把這些文件放在本地對應模型名的文件夾(如 bert-base-uncased 命名的文件夾),然后 from_pretrained 傳入該文件夾路徑即可。
問題 2:return_tensors='pt’有什么作用?
BertTokenizer 默認返回的是 Python 列表,而 PyTorch 模型需要 torch.Tensor 類型的輸入,在調用分詞器時,添加 return_tensors=‘pt’ 參數,可以強制返回 PyTorch 張量。
問題 3:分詞 encoded_input 表示什么?
- input_ids:token 對應的編號
- token_type_ids:句子類型(如問句/答句)
- attention_mask:是否為有效 token 的掩碼
問題 4:bertmodel 輸出是什么?怎么理解?
output: BaseModelOutputWithPoolingAndCrossAttentions(last_hidden_state=tensor([[[ 0.1343, 0.2069, -0.1056, ..., -0.3678, 0.3318, 0.4747],[ 0.7642, 0.0530, 0.3679, ..., -0.0856, 0.6686, -0.0110],...,[ 0.6652, 0.3903, -0.0479, ..., 0.0236, -0.5730, -0.3705]]],grad_fn=<NativeLayerNormBackward0>), pooler_output=tensor([[-8.4724e-01, -3.6394e-01, -7.2207e-01, 6.6477e-01, 4.1991e-01,2.4143e-02, 8.3331e-01, 2.9624e-01, -5.0529e-01, -9.9998e-01,...,8.8765e-01, 8.4602e-01, -3.0099e-01, 4.3198e-01, 5.7014e-01,-4.6997e-01, -6.4236e-01, 9.0241e-01]], grad_fn=<TanhBackward0>), hidden_states=None, past_key_values=None, attentions=None, cross_attentions=None)
前面有介紹到:BERT 是 Encoder-only 架構,僅使用 Transformer 的 Encoder,用于理解文本而非生成。
- last_hidden_state
- 維度一般是 [batch_size, sequence_length, hidden_size](示例里 batch_size=1 ,因單條輸入;sequence_length 是句子分詞后 token 數量;hidden_size 是模型隱藏層維度,BERT-base 通常為 768 )。
- 含義:模型對輸入序列中每個 token 編碼后的向量表示。比如句子分詞后有 5 個 token,就對應 5 個向量,每個向量維度是 hidden_size,可用于細粒度的 token 級任務(例如,文本分類時可取特定位置的 token 向量做分類依據)。
- 示例里的 tensor([[[ 0.1343, 0.2069, -0.1056, …, -0.3678, 0.3318, 0.4747], … ]]) ,就是每個 token 經 BERT 編碼后的高維語義向量。
- pooler_output:維度是 [batch_size, hidden_size] (示例里 batch_size=1 ),表示對整個輸入序列的全局語義總結,可用于句子級任務(如文本分類、情感分析,輸入分類器判斷類別)。
- hidden_states:值為 None ,默認 BERT 不會輸出各層(如 embedding 層、各 Transformer 層 )的隱藏狀態。若初始化模型時設 output_hidden_states=True ,會輸出從輸入到各層的隱藏狀態列表,可用于分析模型各層對語義的加工過程。
- past_key_values:值為 None ,用于增量解碼(如文本生成場景 ),默認不輸出。若開啟相關配置,會保存前一步注意力鍵值對,加速后續 token 生成。
- attentions:值為 None ,默認不輸出注意力權重。若設 output_attentions=True ,會輸出各層注意力頭的權重,可分析模型關注輸入序列的哪些部分,輔助調試和理解模型聚焦點。
- cross_attentions:值為 None ,BERT 是 Encoder 結構,無交叉注意力(一般 Decoder 或 Encoder-Decoder 結構有 ),所以這兒無輸出。
型關注輸入序列的哪些部分,輔助調試和理解模型聚焦點。
5. cross_attentions:值為 None ,BERT 是 Encoder 結構,無交叉注意力(一般 Decoder 或 Encoder-Decoder 結構有 ),所以這兒無輸出。
后續會對 LLM 推理具體過程進行介紹~