在現代技術領域演算法決策最佳化已成為核心競爭力。Meta透過廣告位置最佳化提升點選率,Netflix利用縮圖最佳化提升使用者參與度,亞馬遜依靠產品推薦系統提升銷售額——這些最佳化的背後都採用了基於Beta分佈的湯普森取樣演算法。
在各類決策系統中,探索與利用的平衡是一個根本性挑戰。例如推薦系統是繼續使用已驗證有效的選項,還是嘗試潛在更優的新選項?湯普森取樣透過Beta分佈提供瞭解決這一難題的數學框架。
貝葉斯推理基礎
在深入Beta分佈和湯普森取樣之前,需要先理解貝葉斯推理的核心概念。
貝葉斯推理是一種統計推理方法,其核心是運用貝葉斯定理來根據新的觀測資料不斷更新假設的機率分佈。
貝葉斯定理的基本形式為:
後驗機率 ∝ 似然度 × 先驗機率
其中:
- 先驗機率:表示在獲取新資料前對引數的初始機率估計
- 似然度:代表在給定引數條件下觀測到當前資料的機率
- 後驗機率:結合新資料後對引數的更新估計
共軛先驗分佈
在貝葉斯統計中,如果後驗分佈與先驗分佈屬於同一分佈族,則稱該先驗分佈為似然函式的共軛先驗。這一性質使得機率更新的計算大為簡化。
Beta分佈是二項分佈和伯努利分佈的共軛先驗。當先驗採用Beta分佈,似然函式為二項分佈或伯努利分佈時,後驗分佈仍然是Beta分佈。這種共軛性質使得線上學習過程中的機率更新變得高效可行。
Beta分佈的數學基礎
Beta分佈是定義在[0,1]區間上的連續機率分佈,特別適合對機率和比例進行建模。
核心引數
Beta分佈由兩個形狀引數控制:
- α (alpha):可理解為觀測到的成功次數加1
- β (beta):可理解為觀測到的失敗次數加1
這兩個引數決定了分佈的形狀特徵:
- α值增大會使分佈向1偏移,表示成功機率增加
- β值增大會使分佈向0偏移,表示失敗機率增加
分佈特徵
Beta分佈的形狀由α和β的相對大小決定:
- α > β:分佈偏向1,表示成功機率較高
- β > α:分佈偏向0,表示失敗機率較高
- α = β:分佈關於0.5對稱
機率密度函式
Beta分佈的PDF雖然涉及複雜的伽瑪函式,但其形狀完全由α和β兩個引數決定,這使得它在實際應用中便於操作和理解。
Beta分佈的統計特性
理解Beta分佈的均值和方差對於評估機率估計的可靠性至關重要。這些統計量為決策系統提供了重要的定量依據。
均值(期望值)
Beta分佈的均值計算公式為:
μ = α / (α + β)
此均值反映了基於當前觀測資料對成功機率的最優估計。
方差
Beta分佈的方差計算公式為:
σ² = [α × β] / [(α + β)² × (α + β + 1)]
方差表徵了對均值估計的不確定性程度。較小的方差意味著對機率估計具有更高的置信度。
統計特性的應用意義
隨著觀測資料的累積(即α和β之和增大),方差會逐漸減小,這反映了隨著資料量增加,對引數估計的不確定性降低。這一特性在實際決策系統中具有重要意義,它提供了估計可靠性的量化指標。
湯普森取樣的工作機制
湯普森取樣是一種解決探索-利用權衡問題的機率演算法。它透過從機率分佈中取樣來做出決策,既保證了對已知良好選項的利用,又維持了對潛在更優選項的探索。
演算法流程
初始化階段
為確保公平起點,系統對每個選項進行如下初始化:
- 賦予一次虛擬成功和一次虛擬失敗
- 初始狀態下α = β = 1,表示完全不確定性
- 為每個選項維護成功(α)和失敗(β)計數
決策過程
1、預測生成
- 基於每個選項的歷史資料(α, β值)
- 從對應的Beta分佈中進行隨機取樣
- 取樣值反映了當前對該選項效果的估計
2、選項選擇
- 選擇取樣值最高的選項
- 這種選擇機制自然地平衡了探索和利用
3、結果觀察
- 記錄選中選項的實際效果(成功=1,失敗=0)
4、引數更新
- 根據觀察結果更新相應選項的α或β值
- 成功則α加1,失敗則β加1
5、迭代執行
- 不斷重複上述過程
- 系統逐步學習各選項的真實效果
透過這個過程,湯普森取樣演算法能夠:
- 自適應地調整各選項的選擇機率
- 在探索新選項和利用已知好選項之間取得平衡
- 隨著資料累積,逐步收斂到最優策略
這種演算法設計既保證了理論上的收斂性,又具有實際系統中所需的計算效率。下面我們透過具體示例詳細說明這一機制的運作過程。
湯普森取樣例項分析
透過具體例項來理解湯普森取樣的實際運作機制。考慮一個包含三個備選項(A、B、C)的決策系統。
初始狀態設定:每個選項的初始引數均為:
- α = 1(初始虛擬成功)
- β = 1(初始虛擬失敗)這種設定體現了系統對所有選項的無偏初始化。
第一輪決策
取樣過程生成以下值:
- 選項A:0.6
- 選項B:0.3
- 選項C:0.8
系統選擇取樣值最高的選項C。實際投放後獲得正向反饋(成功),隨後更新選項C的引數為:α = 2,β = 1。
第二輪決策
新一輪取樣生成:
- 選項A:0.4
- 選項B:0.7
- 選項C:0.9
系統再次選擇選項C。這次獲得負向反饋(失敗),更新引數為:α = 2,β = 2。
長期行為特徵
隨著決策次數增加,系統呈現出以下特性:
- 表現較好的選項獲得更多選擇機會
- 系統保持對低展示量選項的週期性探索
- 在利用已知優勢選項和發現潛在更優選項之間形成動態平衡
複雜場景應用分析
考慮一個執行一段時間後的實際場景:
選項A的狀態:
- 成功次數:10
- 失敗次數:5
- 當前成功率:0.67(10/15)
選項B的狀態:
- 成功次數:2
- 失敗次數:2
- 當前成功率:0.50(2/4)
這種情況下的系統行為展現了湯普森取樣的核心優勢:
- 即使選項A具有更好的歷史表現,選項B仍有被選中的機會
- 系統認識到選項B的資料量較小,其真實效能仍具有較大不確定性
- 保持適度探索以防止過早收斂到次優解
機率計算基礎
成功率計算
基本計算公式:
成功率 = 成功次數 / (成功次數 + 失敗次數)
例項計算:對於8次成功、2次失敗的情況:成功率 = 8 / (8 + 2) = 0.80 = 80%
Beta分佈引數設定
引數計算規則:
α = 觀測到的成功次數 + 1
β = 觀測到的失敗次數 + 1
例如,對於8次成功、2次失敗的情況:
- α = 8 + 1 = 9
- β = 2 + 1 = 3
這種引數設定方式(加1平滑)確保了分佈的良好性質,避免了極端情況下的退化現象。
系統實現示例
初始狀態示例,新選項的引數設定:
起始引數:
α = 1(無先驗成功)
β = 1(無先驗失敗)
初始成功率估計 = 1/(1+1) = 0.50
首次成功後的更新:
新α = 2(原始值1 + 成功次數1)
β保持不變 = 1
更新後成功率 = 2/(2+1) = 0.67
此實現方式保證了系統在起始階段的探索性,同時能夠快速響應初始反饋。
多選項場景的實踐分析
下面透過一個完整的多選項決策過程,詳細說明系統的動態行為特徵。
三個選項的演進過程
對於選項A的完整記錄:
第一次投放(成功):
α = 2 (1+1), β = 1
估計成功率:2/3 ≈ 0.67
第二次投放(成功):
α = 3, β = 1
估計成功率:3/4 = 0.75
第三次投放(失敗):
α = 3, β = 2
估計成功率:3/5 = 0.60
這個序列展示了系統如何根據反饋動態調整其對選項A效能的估計。注意成功率的變化反映了系統對新資訊的敏感性。
選項B的記錄:
第一次投放(失敗):
α = 1, β = 2
估計成功率:1/3 ≈ 0.33
第二次投放(成功):
α = 2, β = 2
估計成功率:2/4 = 0.50
選項B的資料展示了系統如何從不利的早期結果中恢復,保持對潛在改善的探索可能。
選項C的初始狀態:
尚未獲得投放機會:
α = 1, β = 1
估計成功率:1/2 = 0.50
保持原始引數設定,等待探索機會。這種狀態對於新引入的選項是典型的。
不確定性分析
考慮兩個資料量差異顯著的選項:
大資料量選項A:
15次成功,5次失敗
α = 16 (15+1)
β = 6 (5+1)
成功率:16/22 ≈ 0.73 (73%)
資料基礎:21次觀測
估計可信度:高
小資料量選項B:
3次成功,1次失敗
α = 4 (3+1)
β = 2 (1+1)
成功率:4/6 ≈ 0.67 (67%)
資料基礎:4次觀測
估計可信度:低
這兩個選項雖然成功率相近,但由於觀測量的差異,系統對它們的處理策略會有明顯不同。選項B會獲得相對更多的探索機會,這反映了系統在置信度較低時傾向於收集更多資訊。
決策系統的實際應用
在實際執行中,系統需要同時處理多個選項:
選項A:10次成功,5次失敗
α = 11, β = 6
成功率 = 11/17 ≈ 0.65 (65%)
選項B:2次成功,2次失敗
α = 3, β = 3
成功率 = 3/6 = 0.50 (50%)
選項C:1次成功,4次失敗
α = 2, β = 5
成功率 = 2/7 ≈ 0.29 (29%)
在某一輪次的取樣中可能出現:
選項A取樣值:0.70(接近其實際成功率0.65)
選項B取樣值:0.85(由於不確定性產生較高值)
選項C取樣值:0.25(接近其實際成功率0.29)
此輪選擇B的決策表明,系統在利用已知資訊的同時,仍然保持對資料較少選項的適度探索。這種行為有助於防止系統過早地固化在可能的次優解上。
實驗效果的長期評估
透過對1000次投放的跟蹤分析:
選項A結果:
80次成功,920次失敗
α = 81, β = 921
最終成功率:81/1002 ≈ 0.081 (8.1%)
選項B結果:
150次成功,850次失敗
α = 151, β = 851
最終成功率:151/1002 ≈ 0.151 (15.1%)
這個長期實驗資料揭示了選項B(15.1%)相對於選項A(8.1%)具有顯著的效能優勢。這種結果驗證了系統在探索過程中成功識別出更優選項的能力。
湯普森取樣的完整實現與分析
下面我們將透過Python程式碼展示湯普森取樣演算法的完整實現過程。程式碼包含了必要的初始化、取樣、更新等核心功能,並提供了視覺化分析工具。
# 匯入必要的資料處理和視覺化庫
importnumpyasnp
importmatplotlib.pyplotasplt
fromscipy.statsimportbeta
# 設定真實點選率(CTR)
# 在實際應用中這些值是未知的,這裡僅用於模擬
true_ctrs= {
'A': 0.04, # 方案A的真實CTR為4%
'B': 0.06 # 方案B的真實CTR為6%
}
# 初始化每個方案的狀態引數
# 包含:alpha(成功計數+1)、beta(失敗計數+1)
# clicks(總點選數)、impressions(總展示次數)
campaigns= {
'A': {'alpha': 1, 'beta': 1, 'clicks': 0, 'impressions': 0},
'B': {'alpha': 1, 'beta': 1, 'clicks': 0, 'impressions': 0}
}
# 模擬引數設定
total_emails=10000 # 總投放次數
selection_history= [] # 記錄每次選擇的方案
estimated_ctrs_history= {'A': [], 'B': []} # 記錄CTR估計值的歷史
# 主模擬迴圈
foriinrange(total_emails):
# 第1步:從每個方案的Beta分佈中取樣
sampled_theta= {}
forcampaignincampaigns:
alpha=campaigns[campaign]['alpha']
beta_param=campaigns[campaign]['beta']
# 基於當前引數從Beta分佈中取樣
# 這個取樣值代表對真實CTR的當前估計
sampled_theta[campaign] =np.random.beta(alpha, beta_param)
# 第2步:選擇取樣值最高的方案
# 這是湯普森取樣的核心決策機制
selected_campaign=max(sampled_theta, key=sampled_theta.get)
selection_history.append(selected_campaign)
campaigns[selected_campaign]['impressions'] +=1
# 第3步:模擬使用者互動
# 在實際系統中,這裡會是真實的使用者反饋
# 這裡使用真實CTR進行模擬
success=np.random.rand() <true_ctrs[selected_campaign]
# 第4步:根據反饋更新引數
ifsuccess:
campaigns[selected_campaign]['clicks'] +=1
campaigns[selected_campaign]['alpha'] +=1 # 增加成功計數
else:
campaigns[selected_campaign]['beta'] +=1 # 增加失敗計數
# 第5步:記錄當前的CTR估計值
forcampaignincampaigns:
alpha=campaigns[campaign]['alpha']
beta_param=campaigns[campaign]['beta']
estimated_ctr=alpha/ (alpha+beta_param)
estimated_ctrs_history[campaign].append(estimated_ctr)
# 輸出最終結果分析
print("\n=== 最終結果 ===")
print("\n最終CTR估計值:")
forcampaignincampaigns:
estimated_ctr=campaigns[campaign]['alpha'] / (campaigns[campaign]['alpha'] +campaigns[campaign]['beta'])
print(f"方案 {campaign}: {estimated_ctr:.4f}")
print("\n方案選擇分佈:")
forcampaignincampaigns:
print(f"方案 {campaign}: {campaigns[campaign]['impressions']} 次選擇")
print("\n總點選數統計:")
forcampaignincampaigns:
print(f"方案 {campaign}: {campaigns[campaign]['clicks']} 次點選")
# 視覺化分析1:CTR估計值的收斂過程
plt.figure(figsize=(12,6))
plt.plot(estimated_ctrs_history['A'], label='方案A的估計CTR',
alpha=0.7, linewidth=2)
plt.plot(estimated_ctrs_history['B'], label='方案B的估計CTR',
alpha=0.7, linewidth=2)
plt.axhline(y=true_ctrs['A'], color='blue', linestyle='--',
label='方案A的真實CTR', alpha=0.5)
plt.axhline(y=true_ctrs['B'], color='orange', linestyle='--',
label='方案B的真實CTR', alpha=0.5)
plt.xlabel('投放次數')
plt.ylabel('點選率估計值(CTR)')
plt.title('CTR估計值隨時間的演變')
plt.grid(True, alpha=0.3)
plt.legend()
plt.tight_layout()
plt.show()
# 視覺化分析2:方案選擇的分佈情況
plt.figure(figsize=(8,5))
campaigns_selected= [selection_history.count('A'), selection_history.count('B')]
campaign_names= ['方案A', '方案B']
plt.bar(campaign_names, campaigns_selected, color=['blue', 'orange'],
alpha=0.7, edgecolor='black')
plt.xlabel('方案')
plt.ylabel('選擇次數')
plt.title('方案選擇分佈')
plt.grid(True, axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
執行結果:
=== 最終結果 ===
最終CTR估計值:
方案A:0.0412
方案B:0.0618
方案選擇分佈:
方案A:580次選擇
方案B:9420次選擇
總點選數統計:
方案A:23次點選
方案B:581次點選
這個實現展示了幾個關鍵的技術要點:
- 狀態維護:系統為每個方案維護alpha和beta引數,這些引數隨著反饋不斷更新,反映了系統對各個方案效能的動態評估。
- 取樣機制:使用numpy的random.beta函式從Beta分佈中進行取樣,這是演算法在探索與利用之間權衡的核心機制。
- 決策過程:透過比較取樣值選擇最優方案,這種基於隨機取樣的決策方式自然地平衡了探索與利用。
- 引數更新:根據反饋結果更新引數,使系統能夠持續學習和適應。
- 結果分析:透過視覺化展示CTR估計值的收斂過程和方案選擇的分佈情況,直觀地反映了演算法的效能。
實驗結果表明,系統成功地識別出了效能更好的方案B(真實CTR為6%),並在探索過程中逐漸將更多的資源分配給它。這種自適應的資源分配策略正是湯普森取樣演算法的核心優勢。
透過觀察CTR估計值的收斂曲線,我們可以看到系統在早期經歷了一個探索階段,隨後逐漸收斂到真實的CTR值。這個過程很好地展示了演算法如何在保持適度探索的同時,逐步發現和利用更優的選項。
這個實現為線上決策系統提供了一個可靠的框架,可以根據具體應用場景進行相應的調整和擴充套件。例如可以新增時間衰減因子來處理非平穩環境,或者擴充套件到多目標最佳化場景。
https://avoid.overfit.cn/post/9423af7a03534afea00f84416e926d0d
作者:Raj Arun