说明
以广告点击的案例继续MultiArmed Bandit的学习。
内容
1 概要
样例假设存在5个广告,通过伯努利分布来模拟广告的点击可能。
adA = BernoulliBandit(0.004)
adB = BernoulliBandit(0.016)
adC = BernoulliBandit(0.02)
adD = BernoulliBandit(0.028)
adE = BernoulliBandit(0.031)
这是一个假设-验证的过程。其中广告E的概率期望最高,是3.1%。
2 BernoulliBandit
定义高光
class BernoulliBandit(object):def __init__(self, p):self.p = pdef display_ad(self):reward = np.random.binomial(n=1, p=self.p)return reward
adA = BernoulliBandit(0.004)
adB = BernoulliBandit(0.016)
adC = BernoulliBandit(0.02)
adD = BernoulliBandit(0.028)
adE = BernoulliBandit(0.031)ads = [adA, adB, adC, adD, adE]
要几十次才能出一个1
adE.display_ad()
1
程序解读,chatgpt做的挺好
3 测试阶段:找到最好的广告
在测试阶段,随机的选取一个广告,然后增量的更新奖励值
n_test = 10000
n_prod = 90000
n_ads = len(ads)
Q = np.zeros(n_ads) # Q, action values
N = np.zeros(n_ads) # N, total impressions
total_reward = 0
avg_rewards = [] # Save average rewards over time# A/B/n test
for i in range(n_test):ad_chosen = np.random.randint(n_ads)R = ads[ad_chosen].display_ad() # Observe rewardN[ad_chosen] += 1Q[ad_chosen] += (1 / N[ad_chosen]) * (R - Q[ad_chosen])total_reward += Ravg_reward_so_far = total_reward / (i + 1)avg_rewards.append(avg_reward_so_far)best_ad_index = np.argmax(Q) # Find the best action
print("The best performing ad is {}".format(chr(ord('A') + best_ad_index)))The best performing ad is E(有时候甚至是D)
跑完之后,Q,N的样子大致如下。所以Q就是代表了核心的动作价值。
其中,核心的Q增量计算逻辑如下:
4 生产阶段:使用最好的广告进行持续实验
生产部分是接着测试持续进行的,所以avg_reward_so_far
后面的次数是在n_test基础上叠加的。
ad_chosen = best_ad_index
for i in range(n_prod):R = ads[ad_chosen].display_ad()total_reward += Ravg_reward_so_far = total_reward / (n_test + i + 1)avg_rewards.append(avg_reward_so_far)
5 画图展示
import pandas as pd
df_reward_comparison = pd.DataFrame(avg_rewards, columns=['A/B/n'])import cufflinks as cf
import plotly.offline
cf.go_offline()
cf.set_config_file(world_readable=True, theme="white")
# cf.set_config_file(world_readable=True, theme="green")df_reward_comparison['A/B/n'].iplot(title="A/B/n Test Avg. Reward: {:.4f}".format(avg_reward_so_far),xTitle='Impressions', yTitle='Avg. Reward')
6 结论
- 1 仍然是从bandit开始,我们可以把模型、策略、规则视为一个bandit,在训练结束时,我们应该有一个default p。
- 2 注意增量更新的方式
- 3 测试(选择)-生产(应用)的过程几乎是无缝衔接的
- 4 可以用产生候选-实测-误差估计-修正候选的方式进行长期迭代