1. 隨機變量與概率分布:模型輸出的基礎
在LLM中,隨機變量最直觀的體現就是模型預測的下一個token。每個時刻,模型都會輸出一個概率分布,表示詞匯表中每個token可能是"下一個詞"的概率。
直觀理解
想象模型在處理句子"我喜歡北京的"后需要預測下一個詞。此時,模型會為詞匯表中的每個候選token分配一個概率:
- “天安門”:0.3
- “故宮”:0.25
- “美食”:0.2
- “文化”:0.15
- 其他詞:0.1
這個分布通過softmax函數從模型的logits輸出轉換而來:
# logits是模型輸出的未歸一化對數概率
logits = model(input_ids)[:, -1, :] # 獲取最后一個位置的logits
probabilities = torch.softmax(logits, dim=-1) # 轉換為概率分布
深層意義
概率分布不僅讓模型能夠進行采樣生成,還能反映模型的不確定性程度。分布的形狀(是否集中、平坦或有多個峰值)揭示了模型對當前預測的信心程度。
2. 條件概率:語言模型的核心
LLM是自回歸(autoregressive)模型,即通過計算條件概率 P ( x t ∣ x < t ) P(x_t | x_{<t}) P(xt?∣x<t?) 來生成序列。整個序列的聯合概率分解為一系列條件概率的乘積:
P ( x 1 , x 2 , … , x T ) = ∏ t = 1 T P ( x t ∣ x < t ) P(x_1, x_2, \dots, x_T) = \prod_{t=1}^T P(x_t | x_{<t}) P(x1?,x2?,…,xT?)=t=1∏T?P(xt?∣x<t?)
實際運作方式
當模型生成文本時,每一步都依賴于前面已生成的所有內容:
- 第一步: P ( x 1 ) P(x_1) P(x1?) - 生成第一個token(無條件)
- 第二步: P ( x 2 ∣ x 1 ) P(x_2|x_1) P(x2?∣x1?) - 基于第一個token生成第二個
- 第三步: P ( x 3 ∣ x 1 , x 2 ) P(x_3|x_1,x_2) P(x3?∣x1?,x2?) - 基于前兩個token生成第三個
以此類推,形成條件概率鏈。
例子說明
假設模型在生成一個句子:
- 首先生成"我"(假設概率為0.1)
- 然后基于"我"生成"喜歡"(條件概率為0.3)
- 接著基于"我喜歡"生成"學習"(條件概率為0.2)
整個序列"我喜歡學習"的聯合概率為:0.1 × 0.3 × 0.2 = 0.006
這種條件概率框架使LLM能夠捕捉語言的上下文依賴性,這是它們強大能力的關鍵所在。
3. 最大似然估計:訓練的統計基礎
LLM訓練的核心目標是最大化訓練數據的似然概率,等價于最小化負對數似然(即交叉熵損失):
L ( θ ) = ? ∑ t log ? P θ ( x t ∣ x < t ) \mathcal{L}(\theta) = -\sum_{t}\log P_\theta(x_t | x_{<t}) L(θ)=?t∑?logPθ?(xt?∣x<t?)
為什么使用對數?
對數變換有幾個重要優勢:
- 將乘法轉換為加法,避免小數值相乘導致的數值下溢
- 使優化過程更加穩定
- 與信息論中的交叉熵概念直接對應
訓練示例
考慮訓練過程中的一個小批量文本:“我愛北京天安門”:
def compute_loss(model, tokens):# tokens: [batch_size, sequence_length]logits = model(tokens[:, :-1]) # 預測除最后一個token外的所有位置targets = tokens[:, 1:] # 目標是下一個token# 計算每個位置的負對數似然loss = F.cross_entropy(logits.view(-1, vocab_size), targets.view(-1),reduction='none')# 返回平均損失return loss.mean()
通過最小化這個損失函數,模型參數θ將被調整以增大訓練數據的概率,從而"學習"語言的統計模式。
4. 期望與方差:衡量模型行為
期望值 E [ f ( X ) ] \mathbb{E}[f(X)] E[f(X)] 和方差 Var [ X ] \text{Var}[X] Var[X] 在LLM中有多種應用:
期望的應用
-
評估指標計算:計算平均驚訝度(negative log-likelihood)或平均困惑度
# 計算平均驚訝度 def average_surprisal(model, text):tokens = tokenize(text)log_probs = model.log_probs(tokens)return -log_probs.mean().item()
-
信息提取:在多次采樣中提取"穩定"信息
# 通過多次采樣獲取穩定答案 responses = [model.generate(prompt) for _ in range(10)]
方差的應用
-
不確定性量化:高方差表示模型對某些預測的不確定性高
# 計算預測方差 logits = model(input_ids) probs = F.softmax(logits, dim=-1) entropy = -torch.sum(probs * torch.log(probs), dim=-1) # 高熵≈高方差≈高不確定性
-
多樣性控制:在生成時,可以基于方差調整采樣策略
方差和期望共同幫助我們理解模型的統計行為,不僅在評估模型性能時有用,也為生成策略提供了理論指導。
5. 貝葉斯定理:從先驗到后驗
雖然傳統LLM訓練不直接使用貝葉斯方法,但貝葉斯思想在多個方面得到應用:
P ( θ ∣ D ) ∝ P ( D ∣ θ ) P ( θ ) P(\theta | D) \propto P(D | \theta)P(\theta) P(θ∣D)∝P(D∣θ)P(θ)
實際應用
-
參數正則化:權重衰減可看作對參數的高斯先驗
# L2正則化(權重衰減) loss = task_loss + weight_decay * sum(p.pow(2).sum() for p in model.parameters())
-
小樣本學習:少樣本(few-shot)提示可視為后驗更新
- 沒有示例時,模型使用先驗P(θ)
- 提供few-shot示例后,模型更新為后驗P(θ|少量示例)
-
推理校準:后驗調整可以改善模型預測
# 簡單的后驗校準示例 def calibrate_probabilities(probs, temperature=1.0, label_smoothing=0.0):# 溫度縮放scaled_logits = torch.log(probs) / temperaturecalibrated = F.softmax(scaled_logits, dim=-1)# 標簽平滑(混合均勻先驗)if label_smoothing > 0:uniform = torch.ones_like(calibrated) / calibrated.size(-1)calibrated = (1 - label_smoothing) * calibrated + label_smoothing * uniformreturn calibrated
貝葉斯框架為我們提供了整合先驗知識和更新置信度的強大工具,這在微調、遷移學習和不確定性建模中特別有價值。
6. 采樣方法:平衡確定性與創造性
生成文本時,我們需要從模型的概率分布中采樣。不同采樣策略影響生成文本的多樣性和質量:
溫度采樣
調整溫度T可以控制分布的平滑度:
P T ( x ) ∝ P ( x ) 1 / T P_T(x) \propto P(x)^{1/T} PT?(x)∝P(x)1/T
def temperature_sampling(logits, temperature=1.0):# temperature=0會變成貪婪搜索# temperature<1使分布更尖銳(更確定)# temperature>1使分布更平坦(更多樣)scaled_logits = logits / temperatureprobs = F.softmax(scaled_logits, dim=-1)next_token = torch.multinomial(probs, num_samples=1)return next_token
- 溫度接近0:貪婪搜索,總是選最高概率詞
- 溫度為1:保持原始分布
- 溫度大于1:增加低概率事件的采樣機會
Top-k與Nucleus采樣
這些方法通過截斷分布尾部來減少低質量樣本:
def top_k_sampling(logits, k=50):# 只保留概率最高的k個tokenvalues, indices = torch.topk(logits, k)probs = F.softmax(values, dim=-1)next_token = indices[torch.multinomial(probs, num_samples=1)]return next_tokendef nucleus_sampling(logits, p=0.9):# 保留累積概率達到p的最小token集合sorted_logits, sorted_indices = torch.sort(logits, descending=True)cumulative_probs = torch.cumsum(F.softmax(sorted_logits, dim=-1), dim=-1)# 找到第一個累積概率超過p的位置sorted_indices_to_keep = cumulative_probs <= p# 在某些情況下,我們至少保留一個tokenif torch.sum(sorted_indices_to_keep) == 0:sorted_indices_to_keep[0] = Trueindices_to_keep = sorted_indices[sorted_indices_to_keep]logits_to_keep = logits[indices_to_keep]probs = F.softmax(logits_to_keep, dim=-1)next_token = indices_to_keep[torch.multinomial(probs, num_samples=1)]return next_token
這些采樣方法直接影響生成文本的質量,是LLM應用中的關鍵決策點。溫度和采樣策略的選擇取決于任務要求:
- 事實性問答:低溫度,偏好確定性高的輸出
- 創意寫作:較高溫度,允許更多樣的輸出
- 代碼生成:通常使用較低溫度但帶nucleus采樣,平衡正確性和多樣性
7. 馬爾可夫性:序列依賴的表示
雖然Transformer架構理論上可以考慮任意長的上下文,但實際上,LLM仍然是一種強化版的馬爾可夫模型:當前token的生成依賴于固定長度窗口內的歷史。
馬爾可夫性與上下文窗口
標準馬爾可夫模型假設:
P ( x t ∣ x < t ) = P ( x t ∣ x t ? k , … , x t ? 1 ) P(x_t | x_{<t}) = P(x_t | x_{t-k}, \ldots, x_{t-1}) P(xt?∣x<t?)=P(xt?∣xt?k?,…,xt?1?)
LLM則擴展為:
P ( x t ∣ x < t ) = P ( x t ∣ x m a x ( 1 , t ? C ) , … , x t ? 1 ) P(x_t | x_{<t}) = P(x_t | x_{max(1,t-C)}, \ldots, x_{t-1}) P(xt?∣x<t?)=P(xt?∣xmax(1,t?C)?,…,xt?1?)
其中C是上下文窗口長度(如GPT-3為2048,Claude 3為200k+)。
有限記憶的影響
上下文窗口限制導致的問題包括:
- 無法引用超出窗口的信息
- 長文檔理解中的一致性挑戰
- 對長文本生成的連貫性約束
這種有限馬爾可夫性質啟發了許多改進方向,如長上下文模型、外部內存機制、檢索增強等。
8. 蒙特卡洛估計:基于采樣的評估
蒙特卡洛方法通過多次隨機采樣來估計統計特性,在LLM中有重要應用:
應用場景
-
不確定性估計:通過多次采樣估計預測的置信區間
def estimate_confidence_interval(model, prompt, n_samples=100):# 生成多個回答responses = [model.generate(prompt) for _ in range(n_samples)]# 分析回答的分布(例如,對于是/否問題)yes_count = sum(1 for r in responses if "是" in r[:10])confidence = max(yes_count, n_samples - yes_count) / n_samplesreturn confidence
-
多樣性度量:評估生成結果的多樣性
def measure_diversity(model, prompt, n_samples=10):responses = [model.generate(prompt) for _ in range(n_samples)]# 計算生成文本之間的平均相似度similarities = []for i in range(n_samples):for j in range(i+1, n_samples):sim = compute_similarity(responses[i], responses[j])similarities.append(sim)return sum(similarities) / len(similarities)
-
集成預測:整合多次預測結果以提高準確性
def ensemble_prediction(model, prompt, n_samples=10):predictions = [model.generate(prompt) for _ in range(n_samples)]# 可以通過投票、平均或更復雜的方法整合結果return most_common(predictions)
蒙特卡洛方法幫助我們更好地理解模型行為的統計特性,特別是在處理高度不確定或多樣化輸出的場景中。
9. 隨機過程與序列建模:統計依賴的捕捉
語言生成可視為一種離散時間隨機過程,LLM通過自注意力機制捕捉這一過程中的統計依賴:
自注意力與隨機過程
Transformer的自注意力機制計算:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk??QKT?)V
這實際上是在估計序列中各位置之間的統計依賴強度。注意力權重可以解釋為:位置j對預測位置i的影響程度。
深層統計依賴
LLM通過多層注意力捕捉復雜的統計依賴:
- 淺層可能關注局部語法模式
- 深層可能捕捉全局語義依賴
- 多頭注意力則并行捕捉不同類型的依賴關系
這種分層設計使LLM能夠學習句法、語義和篇章層面的統計規律,從而生成連貫且有意義的文本。
10. 校準:確保概率預測的可靠性
模型校準衡量預測概率與實際頻率的一致性:
校準重要性
假設模型以90%的置信度預測某些事實,如果模型校準良好,這些預測約90%應該是正確的。
def expected_calibration_error(probs, correct):"""計算預期校準誤差probs: 預測概率correct: 對應的正確與否標記(0/1)"""# 將概率分成幾個binn_bins = 10bins = np.linspace(0, 1, n_bins + 1)bin_indices = np.digitize(probs, bins) - 1ece = 0for bin_idx in range(n_bins):# 找到落在這個bin中的預測mask = bin_indices == bin_idxif not np.any(mask):continuebin_probs = probs[mask]bin_correct = correct[mask]# 計算這個bin中的平均概率和準確率avg_prob = np.mean(bin_probs)avg_acc = np.mean(bin_correct)# 加權絕對誤差ece += np.abs(avg_prob - avg_acc) * (np.sum(mask) / len(probs))return ece
校準方法
- 溫度縮放:通過除以溫度參數調整logits
- Platt縮放:學習線性變換校準概率
- 模型集成:多個模型預測結合可提高校準性
良好的校準對于許多應用至關重要,如醫療診斷、金融預測和自動決策系統,因為它們需要依賴模型不僅給出正確答案,還要準確報告自己的確定性。
11. 似然比與對比評估:模型比較的工具
似然比是比較兩個概率模型的強大工具:
P model1 ( x ) P model2 ( x ) \frac{P_{\text{model1}}(x)}{P_{\text{model2}}(x)} Pmodel2?(x)Pmodel1?(x)?
實際應用
-
對抗訓練:通過似然比區分真實vs生成文本
def discriminator_loss(real_data, generated_data, model1, model2):# 計算似然比,用于區分真實數據和生成數據real_log_probs_1 = model1.log_probs(real_data)real_log_probs_2 = model2.log_probs(real_data)real_ratio = torch.exp(real_log_probs_1 - real_log_probs_2)gen_log_probs_1 = model1.log_probs(generated_data)gen_log_probs_2 = model2.log_probs(generated_data)gen_ratio = torch.exp(gen_log_probs_1 - gen_log_probs_2)# 優化目標:增大真實數據的比值,減小生成數據的比值loss = -torch.mean(torch.log(real_ratio)) - torch.mean(torch.log(1 - gen_ratio))return loss
-
模型選擇:比較不同模型對數據的擬合能力
def compare_models(test_data, model_a, model_b):log_probs_a = model_a.log_probs(test_data)log_probs_b = model_b.log_probs(test_data)# 如果比值>1,則模型A更適合數據log_ratio = log_probs_a - log_probs_breturn log_ratio.mean()
-
傾向性得分:用于評估生成偏好
def calculate_preference_score(model, prompt_a, prompt_b):completion = model.generate(prompt_a)# 計算完成后的文本在兩個不同提示下的對數概率log_prob_a = model.conditional_log_prob(completion, prompt_a)log_prob_b = model.conditional_log_prob(completion, prompt_b)# 返回傾向性得分return log_prob_a - log_prob_b
似然比是評估和比較概率模型的強大工具,在模型選擇、假設檢驗和對抗學習中都有廣泛應用。
概率論視角的綜合應用
這些概率論概念不是孤立的,而是形成了一個連貫的理論框架,支撐著LLM的各個方面:
-
從訓練到推理的完整流:
- 模型定義:條件概率分布 P ( x t ∣ x < t ) P(x_t|x_{<t}) P(xt?∣x<t?)
- 訓練目標:通過最大似然估計優化參數
- 推理方法:通過各種采樣策略從概率分布中生成樣本
- 評估標準:困惑度、校準誤差等概率度量
-
不確定性的系統處理:
- 表示:概率分布的熵
- 傳播:通過采樣和蒙特卡洛方法
- 量化:方差、置信區間
- 通信:校準的概率輸出
-
概率框架的實際價值:
- 提供理論基礎解釋模型行為
- 指導采樣策略的選擇
- 啟發新的訓練和推理方法
- 評估模型性能的系統標準