我正在阅读 Sutton 的“强化学习,介绍”的最新草稿,然后我来到了 Gradient Bandit Algorithm(第 29 页)。我在理解如何计算基线时遇到了一些麻烦。书上说:
"是包括时间在内的所有奖励的平均值,可以按照第 2.4 节中的描述递增地计算“
2.4 节简要解释了如何使用这个公式递增地计算样本平均值:. 所以我用它来计算平均奖励,但我没有得到书中显示的结果。
这些是书籍结果:
这些是我的:
这是我的代码 [它很简洁,我保证 :)]:
def GradientBandit(bandits, iterations, step_size, no_baseline=False):
k = len(bandits)
H = np.zeros(k)
P = np.ones(k) / k
N = np.zeros(k)
is_optimal = np.zeros(iterations)
avg_reward = 0
for t in range(1, iterations + 1):
A = np.argmax(P)
R = bandits.reward(A)
avg_reward = avg_reward + (1.0 / t) * (R - avg_reward)
baseline = 0.0 if no_baseline else avg_reward
H[A] = H[A] + step_size * (R - baseline) * (1 - P[A])
for a in range(k):
if a != A:
H[a] = H[a] - step_size * (R - baseline) * P[a]
aux_exp = np.exp(H)
P = aux_exp / np.sum(aux_exp)
is_optimal[t - 1] = int(bandits.is_optimal(A)) * 1.0
return P, is_optimal
我不确定我是否误解了基线的计算方式......起初我认为它可能是每个动作的基线,但后来在公式证明中他们声明基线不能依赖于在为了正确导出梯度。我错了吗?。
我的结果在两个方面都很糟糕:首先,无基线算法没有学到任何东西。其次,它在最佳动作中几乎没有达到 47% 左右,而书本上的结果则超过了 80%。
bandits 测试平台是一个 10-bandit 问题,其中真实的预期奖励按照第 2 章的建议移动了 4 个单位(即:设置每个 bandit 的平均值 = gaussian(mean=4))。结果是 1000 步运行 2000 次的平均值。如果动作等于所有老虎机的最大平均值,则 is_optimal 检查返回 true。