Python 多武装土匪演习的反直觉结果

Python 多武装土匪演习的反直觉结果,python,machine-learning,gradient-descent,reinforcement-learning,Python,Machine Learning,Gradient Descent,Reinforcement Learning,我正在阅读萨顿和巴托的《强化学习:导论》第2章第7节,这本书涉及多武装匪徒问题中的梯度方法。(我意识到第二版是一个草稿,各部分似乎有点移动,但我的文件中有第2.7节标题为“梯度匪徒”。)我已经成功地使用了第2.3-2.5节中的方法,没有问题,但我一直在使用令人困惑的梯度方法获得结果。我将浏览我的代码并展示一个示例 在这里初始化所有内容: import random import math import numpy as np, numpy.random # number of arms (k)

我正在阅读萨顿和巴托的《强化学习:导论》第2章第7节,这本书涉及多武装匪徒问题中的梯度方法。(我意识到第二版是一个草稿,各部分似乎有点移动,但我的文件中有第2.7节标题为“梯度匪徒”。)我已经成功地使用了第2.3-2.5节中的方法,没有问题,但我一直在使用令人困惑的梯度方法获得结果。我将浏览我的代码并展示一个示例

在这里初始化所有内容:

import random
import math
import numpy as np, numpy.random

# number of arms (k) and step-size (alpha)
k = 10
alpha = 0.1

# initialize preference function (H), and reward distribution (R)
H = {i: 0 for i in range(k)}
R = {i: [random.uniform(-100,100), 1] for i in range(k)}
我使用固定的奖励分布,我使用字典来表示这些分布。我假设每个奖励都是由高斯函数描述的,因此我使用以下函数将行动映射到奖励:

def getReward(action, rewardDistribution):
  return random.gauss(rewardDistribution[action][0], rewardDistribution[action][1])
所谓的“偏好函数”
H
,用于确定行动概率,也由字典给出。我将这些选择分散在一个非常广泛的范围内,因为每个奖励都是由高斯分布描述的,标准偏差1位于-100和100之间。我这样做是因为我的直觉告诉我,这将使算法更难确定次优选择,但我发现相反的情况正在发生

此代码在每次迭代时选择我的操作:

def selectAction(policy):
  return np.random.choice(list(policy.keys()), p=list(policy.values()))
接下来是运行算法迭代的代码。请注意,
pi
是策略,并初始化为每个动作提供概率
1/k

avgReward = 0
for i in range(100000):
  pi = {i: math.exp(H[i])/sum([math.exp(H[j]) for j in range(k)]) for i in range(k)}
  A = selectAction(pi)
  R_A = getReward(A, R)
  avgReward += (R_A - avgReward)/(i + 1)
  H = {i: H[i] + alpha*(R_A - avgReward)*((i == A) - pi[i]) for i in range(k)}
请注意,我正在运行100000次迭代,对我来说,这似乎太过分了。这是我第一次尝试解决这个问题,所以我的直觉可能是错误的,但我试图设置它,使算法更容易找到最佳选择。因此,我所期望的是一个收敛于动作的过程,其分布具有最高的期望值,并且随着迭代的进行,将继续命中它。但是,当我打印出土匪每一次可能行动的结果时,我看到的是:

for i in range(k):
  print("Expected reward: " + str(R[i][0]) + " | Selection probability: " + str(pi[i]) + " | Preference: " + str(H[i]))

Expected reward: -50.62506110888989 | Selection probability: 3.617077909489526e-13 | Preference: -7.82992533515
Expected reward: 11.866419726345484 | Selection probability: 1.2337498052271344e-10 | Preference: -1.99777839484
Expected reward: 75.41139657867947 | Selection probability: 1.5933517476231946e-09 | Preference: 0.560588358966
Expected reward: -72.44467653824414 | Selection probability: 3.4267025247257986e-13 | Preference: -7.88399339198
Expected reward: -43.466561447399 | Selection probability: 1.5933517476231946e-09 | Preference: 0.560588358966
Expected reward: -75.99171566420297 | Selection probability: 1.5933517476231946e-09 | Preference: 0.560588358966
Expected reward: -82.11920932060593 | Selection probability: 3.120658098513757e-13 | Preference: -7.97754791911
Expected reward: 95.00643386364632 | Selection probability: 1.5933517476231946e-09 | Preference: 0.560588358966
Expected reward: 31.384022070017835 | Selection probability: 1.2605442916195123e-08 | Preference: 2.62887724114
Expected reward: 49.83925652065625 | Selection probability: 0.9999999808967586 | Preference: 20.8180143641
最后一个动作的预期奖励为49.8,强盗几乎每次都会选择它。这是10个选项中的第三好选项,但它忽略了一个预期回报为75.4的选项和另一个预期回报为95.0的选项


那么,我的问题是:为什么这个强盗错过了最佳选择?这只是一个例子,当我运行程序时,这是在一个相当一致的基础上发生的。我的直觉是否偏离了我应该期望bandit做什么,或者我是否错误地编码了这个算法?

问题是,许多武器(或动作;我使用武器,因为这是MAB问题中最常见的术语)在您当前的设置中甚至一次也没有发挥出来。您可以通过打印每个手臂的选择频率,轻松验证情况是否如此

这是因为你的奖励有一个相当高的绝对值。在关于单克隆抗体问题的文献中,它们通常假定在[0,1]或[-1,1]中有回报。这并不是严格必要的(虽然这是一些与算法的理论性能相关的证明……但这可能对您现在不感兴趣)。无论如何,有几种方法可以解决此问题:

1) 将首选项列表(
H
)初始化为高值,而不是
0s
。这与本书前面描述的epsilon-greedy的乐观初始化具有类似的效果,因为它促使算法在前面进行更多的探索

2) 大幅降低学习率的值
alpha
。尝试类似于
0.00001
,而不是
0.1
。这种变化的效果是,
H
中的首选项值以较小的速率远离
0
,因此,
pi
中的概率也以较小的速率远离初始的
1/k


3) 重新调整奖励值,例如,[-1,1](如果您不希望问题变得更复杂,这还需要适当减少奖励分布的标准偏差。

非常感谢。我将尝试这些建议。