我正在研究Sutton的第2章第7節& Barto的強化學習:介紹,它涉及多臂強盜問題中的梯度方法。 (我意識到第二版是一個草案,看起來這些章節稍微有所變化,但是我的文件有第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)}
通知我跑10萬次迭代,這對我似乎應該是矯枉過正。這是我在這個問題上的第一次嘗試,所以我的直覺可能會被忽略,但我試圖設置它以使算法易於找到最佳選擇。所以我期望的是這個過程會收斂於具有最高期望值的分佈的行爲,並且在迭代過程中將繼續觸發它。但是,當我打印出相對於由土匪每個可能的行動的結果,這是我所看到的:
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。
所以,我的問題:爲什麼這個土匪錯過了最佳選擇?這只是一個例子,當我運行該程序時,這發生在一個相當一致的基礎上。我的直覺是否與我期望的土匪行爲有關,或者我是否錯誤地編寫了這種算法?
非常感謝,我會嘗試這些建議。 –