主流大語言模型中Token的生成過程本質是串行的
flyfish
1. 串行生成
-
自回歸模型的核心邏輯:
大模型(如GPT-2)采用自回歸架構,每個Token的生成必須基于已生成的完整歷史序列。例如,生成“今天天氣很好”時:輸入:<start> 輸出1:"今" → 輸入更新:<start>今 輸出2:"天" → 輸入更新:<start>今天 輸出3:"天" → 輸入更新:<start>今天天 ...(重復或亂碼可能因模型困惑導致)
每個Token的生成必須依賴前一步的結果,形成嚴格的鏈式依賴。
-
計算與生成的分離:
雖然模型內部的矩陣運算(如注意力計算)通過GPU并行加速,但生成順序必須嚴格串行。例如:- 第1步:計算第一個Token的概率分布(基于空輸入)。
- 第2步:將第一個Token加入輸入,計算第二個Token的概率分布。
- 依此類推,無法跳過或提前生成后續Token。
例如:
# 假設模型需生成 "ABC"
步驟1:生成A(依賴空輸入)
步驟2:生成B(依賴A)
步驟3:生成C(依賴A+B)
即使步驟1和步驟2的計算在硬件層面并行,生成順序仍必須是A→B→C。
2. 優化方法的局限性
Beam Search等算法通過維護多個候選序列提升效率,但本質仍是串行生成:
# Beam Search示例(Beam Size=2)
步驟1:生成2個候選("今", "天")
步驟2:基于每個候選生成下一個Token(如"今天" → "氣","天天" → "氣")
步驟3:依此類推,每次擴展候選序列的長度
每個候選序列的Token仍需按順序生成,無法并行生成整個序列。
import torch
from transformers import GPT2LMHeadModel, GPT2Tokenizer# 加載 GPT-2 模型和分詞器
model_path = r"gpt2"tokenizer = GPT2Tokenizer.from_pretrained(model_path)
model = GPT2LMHeadModel.from_pretrained(model_path)input_text = "Once upon a time"
input_ids = tokenizer.encode(input_text, return_tensors='pt')# 使用 top - k 采樣生成文本
output = model.generate(input_ids,max_length=20,top_k=50,temperature=0.7
)generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print("生成的文本:", generated_text)
生成的文本: Once upon a time, the world was a place of great beauty and great danger. The world was
import torch
from transformers import GPT2LMHeadModel, GPT2Tokenizer# 加載 GPT-2 模型和分詞器
model_path = r"gpt2"tokenizer = GPT2Tokenizer.from_pretrained(model_path)
model = GPT2LMHeadModel.from_pretrained(model_path)# 輸入文本
input_text = "Once upon a time"
# 對輸入文本進行分詞
input_ids = tokenizer.encode(input_text, return_tensors='pt')# 初始化生成的序列
generated_sequence = input_ids# 定義最大生成長度
max_length = 20print("順序生成的 token:")
for step in range(max_length):# 使用模型進行預測with torch.no_grad():outputs = model(generated_sequence)logits = outputs.logits[:, -1, :] # 獲取最后一個 token 的預測結果# 選擇概率最大的 tokennext_token_id = torch.argmax(logits, dim=-1).unsqueeze(0)# 將生成的 token 添加到序列中generated_sequence = torch.cat([generated_sequence, next_token_id], dim=-1)# 解碼并打印生成的 token 及其位置next_token = tokenizer.decode(next_token_id[0].item())print(f"步驟 {step + 1}: 生成 token '{next_token}',當前序列長度: {generated_sequence.shape[1]}")# 解碼并打印完整的生成序列
generated_text = tokenizer.decode(generated_sequence[0], skip_special_tokens=True)
print("\n完整生成的文本:", generated_text)
順序生成的 token:
步驟 1: 生成 token ',',當前序列長度: 5
步驟 2: 生成 token ' the',當前序列長度: 6
步驟 3: 生成 token ' world',當前序列長度: 7
步驟 4: 生成 token ' was',當前序列長度: 8
步驟 5: 生成 token ' a',當前序列長度: 9
步驟 6: 生成 token ' place',當前序列長度: 10
步驟 7: 生成 token ' of',當前序列長度: 11
步驟 8: 生成 token ' great',當前序列長度: 12
步驟 9: 生成 token ' beauty',當前序列長度: 13
步驟 10: 生成 token ' and',當前序列長度: 14
步驟 11: 生成 token ' great',當前序列長度: 15
步驟 12: 生成 token ' danger',當前序列長度: 16
步驟 13: 生成 token '.',當前序列長度: 17
步驟 14: 生成 token ' The',當前序列長度: 18
步驟 15: 生成 token ' world',當前序列長度: 19
步驟 16: 生成 token ' was',當前序列長度: 20
步驟 17: 生成 token ' a',當前序列長度: 21
步驟 18: 生成 token ' place',當前序列長度: 22
步驟 19: 生成 token ' of',當前序列長度: 23
自回歸架構是許多大語言模型順序生成Token的根本原因,并且其鏈式依賴特性確實有助于確保生成過程的邏輯連貫性。
自回歸架構與Token生成
-
自回歸機制:
- 在自回歸模型中,比如GPT系列模型,生成下一個Token的過程依賴于前面已經生成的所有Token。具體來說,生成第 t t t個Token時,模型會基于前 t ? 1 t-1 t?1個Token來計算概率分布,然后從中采樣或選擇最有可能的下一個Token。
- 這種鏈式依賴關系(即每個Token的生成依賴于之前的全部或部分Token)保證了文本生成的邏輯一致性和連貫性。
-
串行生成 vs 并行生成:
- 串行生成:傳統的大語言模型如GPT系列,在推理階段通常是逐個Token串行生成的。這是因為每個新Token的生成都需要利用到之前所有已生成的Token作為上下文輸入,這種依賴關系限制了并行處理的可能性。
- 嘗試并行化:盡管存在一些研究和方法試圖提高生成效率,例如通過投機解碼(Speculative Decoding)或者使用多個模型同時預測不同位置的Token,但這些方法并沒有完全改變基本的自回歸生成機制。大多數情況下,核心的Token生成步驟仍然是串行進行的,因為當前Token的生成必須等待前面的Token確定下來才能開始。
3. 數學本質的"自相關性"
自回歸(Autoregressive)模型中的"自",自回歸的核心在于當前輸出僅依賴于自身歷史輸出。用數學公式表示為:
x t = ? 1 x t ? 1 + ? 2 x t ? 2 + ? + ? p x t ? p + ? t x_t = \phi_1 x_{t-1} + \phi_2 x_{t-2} + \dots + \phi_p x_{t-p} + \epsilon_t xt?=?1?xt?1?+?2?xt?2?+?+?p?xt?p?+?t?
- 自相關性:模型通過自身序列的滯后項( x t ? 1 , x t ? 2 x_{t-1}, x_{t-2} xt?1?,xt?2?等)預測當前值
- 內生性:所有變量均來自同一序列,區別于普通回歸模型中的外生變量
例如,股票價格預測模型中, x t x_t xt?(今日股價)僅依賴于過去5天的股價( x t ? 1 x_{t-1} xt?1?到 x t ? 5 x_{t-5} xt?5?),而非外部因素如新聞、財報等。
4. 生成過程的"自我迭代"
在自然語言處理中,這種"自"特性體現為:
- 鏈式生成:每個Token的生成必須基于已生成的Token序列
- 因果掩碼:Transformer架構中,每個位置i的注意力被限制在1到i-1的位置
- 動態更新:每生成一個Token,模型的內部狀態(隱藏層激活值)會被更新
以GPT-2生成句子為例:
輸入:"今天天氣"
生成過程:
1. 預測第一個Token:"很"(基于"今天天氣")
2. 預測第二個Token:"好"(基于"今天天氣很")
3. 預測第三個Token:"啊"(基于"今天天氣很好")
5. 與其他模型的對比
模型類型 | 是否"自"依賴 | 典型應用場景 |
---|---|---|
自回歸模型 | 僅依賴自身歷史 | 文本生成、時間序列預測 |
非自回歸模型 | 不依賴自身歷史 | 圖像超分辨率、語音識別 |
混合模型 | 部分依賴自身歷史 | 對話系統(結合外部知識) |