[英]Q-learning, what is the effect of test episodes count on convergence?
在以下代碼中,這是通過Q學習解決FrozenLake 4x4的代碼。 在培訓部分,為什么我們要播放20集測試環境,而不是每個循環只播放1集? 我嘗試了兩次迭代:
在測試環境中進行20次迭代時,代理在16000次嘗試中收斂。
在進行1次測試環境迭代時,代理會在不到1000次嘗試中收斂。
import gym
import collections
from tensorboardX import SummaryWriter
ENV_NAME = "FrozenLake-v0"
GAMMA = 0.9
ALPHA = 0.2
TEST_EPISODES = 20
class Agent:
def __init__(self):
self.env = gym.make(ENV_NAME)
self.state = self.env.reset()
self.values = collections.defaultdict(float)
def sample_env(self):
action = self.env.action_space.sample()
old_state = self.state
new_state, reward, is_done, _ = self.env.step(action)
self.state = self.env.reset() if is_done else new_state
return (old_state, action, reward, new_state)
def best_value_and_action(self, state):
best_value, best_action = None, None
for action in range(self.env.action_space.n):
action_value = self.values[(state, action)]
if best_value is None or best_value < action_value:
best_value = action_value
best_action = action
return best_value, best_action
def value_update(self, s, a, r, next_s):
best_v, _ = self.best_value_and_action(next_s)
new_val = r + GAMMA * best_v
old_val = self.values[(s, a)]
self.values[(s, a)] = old_val * (1-ALPHA) + new_val * ALPHA
def play_episode(self, env):
total_reward = 0.0
state = env.reset()
while True:
_, action = self.best_value_and_action(state)
new_state, reward, is_done, _ = env.step(action)
total_reward += reward
if is_done:
break
state = new_state
return total_reward
if __name__ == "__main__":
test_env = gym.make(ENV_NAME)
agent = Agent()
writer = SummaryWriter(comment="-q-learning")
iter_no = 0
best_reward = 0.0
while True:
iter_no += 1
s, a, r, next_s = agent.sample_env()
agent.value_update(s, a, r, next_s)
reward = 0.0
for _ in range(TEST_EPISODES):
reward += agent.play_episode(test_env)
reward /= TEST_EPISODES
writer.add_scalar("reward", reward, iter_no)
if reward > best_reward:
print("Best reward updated %.3f -> %.3f" % (best_reward, reward))
best_reward = reward
if reward > 0.80:
print("Solved in %d iterations!" % iter_no)
break
writer.close()
在此示例中, TEST_EPISODES
用於更改求解標准。 在TEST_EPISODES = 1
的情況下,只要最近的游戲得分> 0.80,便認為該游戲已解決;在TEST_EPISODES = 20
的情況下,最近20輪的平均得分必須> 0.80,才能考慮該游戲已解決。
由於該游戲具有隨機動作,即每次在相同狀態下執行相同動作時,您不會獲得相同結果,因此您提高TEST_EPISODES
的速度TEST_EPISODES
,該解決方案的TEST_EPISODES
就越強。 在TEST_EPISODES = 1
情況下,如果該腳本只是碰巧在第一次嘗試中就隨機找到了目標,則該腳本將認為該游戲已解決,但是在模型較差的情況下連續執行20次的可能性大大降低。
相對於首次達到目標的速度,對於此類問題,大量事件的平均值通常是更好的指標。 想象一下,如果您必須在這種環境下工作並且您的生活取決於安全地實現目標,那么您可能希望它學習直到分數閾值非常接近1。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.