[TOC]
关键代码
q_pred = self.model(s0).gather(1, a0).squeeze()
with torch.no_grad():
if self.use_dbqn:
acts = self.model(s1).max(1)[1].unsqueeze(1)
q_target = self.target_model(s1).gather(1, acts).squeeze(1)
else:
q_target = self.target_model(s1).max(1)[0]
if self.use_done:
q_target = r1 + self.gamma * (1 - d1) * q_target
else:
q_target = r1 + self.gamma * q_target
loss = self.loss_func(q_pred, q_target)
测试环境主要参数
参数名 | 参数值 |
---|---|
gym环境名 | CartPole-v0 |
测试回合数 | 10000次 |
Hidden Layer 大小 | 32 |
Hidden Layer 层数 | 2 |
Replay Memory 大小 | 10000 |
学习 Batch 大小 | 128 |
学习率 | 1e-3 |
Gamma | 0.99 |
-
DQN使用done参数
python -m dqn_done_test.dqn --exp-name=with-done-test --use-done=True
-
DQN不使用done参数
python -m dqn_done_test.dqn --exp-name=without-done-test --use-done=False
-
DBQN(Double-Q Learning)使用done参数
python -m dqn_done_test.dqn --exp-name=dbqn-with-done-test --use-done=True --use-dbqn=True
-
DBQN(Double-Q Learning)不使用done参数
python -m dqn_done_test.dqn --exp-name=dbqn-without-done-test --use-done=False --use-dbqn=True
-
DQN使用done参数与否(橙色使用done参数,蓝色未使用done参数)
tips: 使用done参数时,测试耗时53分钟,不使用done参数时,测试耗时3分钟。
-
DBQN(Double-Q Learning)使用done参数与否(浅蓝色使用done参数,红色未使用done参数)
tips: 使用done参数时,测试耗时54分钟,不使用done参数时,测试耗时3分钟。
在DQN算法中,done参数还是需要使用的。如果自己实现的DQN算法,在训练时难以收敛,可以看看done参数是否参与了训练。网上关于RL算法的实现有很多(有一些没有target model,有一些不用replay memory),质量参差不齐,参考时需谨慎。
tips: 橙色DQN,浅蓝色DBQN。
PG算法中,Model的最后一个activation是softmax,softmax函数需要指定其生效的dim。
class Model(nn.Module):
...
def forward(self, obs):
obs = torch.tanh(self.fc1(obs))
action_prob = F.softmax(self.fc2(obs), dim=1)
return action_prob
在learn时需要根据一系列的obs来计算一系列的prob,所以dim的参数值应当为1,如上面的代码片段。那么在predict时就需要将单个的obs变换成一个二维数组再进行运算。
class Agent:
...
def predict(self, obs):
obs = torch.FloatTensor(obs).unsqueeze(0)
prob = self.model(obs).squeeze(0)
...
def learn(self, obs_list, act_list, reward_list):
...
prob_list = self.model(obs_list)
...
环境 | 说明 | 特点 |
---|---|---|
CartPole-v0 | 模型越差,episode的时间越短 | |
MountainCar-v0 | 模型越差,episode的时间越长 |
实现完算法,需要测试正确性时,先用episode短的环境测试,同时结合tensorboard,将训练过程中的reward、回合的步数等信息统计出来,有利于快速判断算法是否收敛。