DreamerV2作为基于模型的强化学习算法,在Atari游戏测试中展现出显著性能提升。相比V1版本,其核心创新点主要体现在世界模型架构和训练目标的改进上。让我们先看整体架构变化:
V1版本使用连续高斯分布表示潜在状态z_t,而V2改为离散分类分布(categorical distribution)。具体实现为:
python复制class CategoricalDistribution:
def __init__(self, logits, num_classes):
self.logits = logits # shape [B,T,num_classes]
self.num_classes = num_classes
def sample(self):
return torch.multinomial(F.softmax(self.logits, dim=-1), 1)
这种改变带来三个优势:
注意:离散类别数通常设为32,这是经过大量实验验证的平衡点。太少会导致表征能力不足,太多会增加训练难度。
V1版本对先验(prior)和后验(posterior)使用统一的KL权重β,而V2将其解耦:
python复制kl_loss = β_prior * KL(prior||posterior) + β_post * KL(posterior||prior)
典型参数设置:
这种分离控制使得:
新增的折扣预测网络结构如下:
python复制class DiscountPredictor(nn.Module):
def __init__(self, hidden_size):
super().__init__()
self.net = nn.Sequential(
nn.Linear(hidden_size, 32),
nn.ELU(),
nn.Linear(32, 1),
nn.Sigmoid() # 输出范围[0,1]
)
def forward(self, h, z):
return self.net(torch.cat([h, z], dim=-1))
对应的损失函数扩展为:
$$
\mathcal{L}{\text{world}} = \underbrace{\mathbb{E}[\sum_t -\log p(x_t)]}{\text{重建损失}} + \underbrace{\mathbb{E}[\sum_t -\log p(r_t)]}{\text{奖励预测}} + \underbrace{\mathbb{E}[\sum_t -\log p(\gamma_t)]}{\text{折扣预测}} + \text{KL项}
$$
实际训练时采用分层抽样策略:
关键技巧:
python复制class ActorCritic(nn.Module):
def __init__(self, z_dim, action_dim):
super().__init__()
self.actor = nn.Sequential(
nn.Linear(z_dim, 256),
nn.ELU(),
nn.Linear(256, action_dim)
)
self.critic = nn.Sequential(
nn.Linear(z_dim, 256),
nn.ELU(),
nn.Linear(256, 1)
)
def forward(self, z):
logits = self.actor(z)
value = self.critic(z)
return torch.distributions.Categorical(logits=logits), value
在潜在空间展开的想象轨迹具有以下特点:
损失函数组合:
$$
\mathcal{L}{\text{policy}} = \underbrace{-\hat{A} \log \pi(a|z)}{\text{策略梯度}} + \underbrace{0.5(v - v_{\text{target}})^2}{\text{价值损失}} + \underbrace{0.01 \mathcal{H}[\pi]}{\text{熵正则}}
$$
Atari游戏标准处理流程:
python复制def preprocess(frame):
frame = cv2.resize(frame, (64, 64))
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
frame = frame.astype(np.float32) / 255.0
return frame
重要:必须保持预处理与原始论文一致,否则会影响世界模型的训练效果。
关键参数经验值:
| 参数 | Atari值 | 连续控制值 |
|---|---|---|
| 潜在类别数 | 32 | 64 |
| 想象步长 | 15 | 20 |
| 批次大小 | 1024 | 512 |
| 策略更新次数 | 100 | 200 |
| 熵系数 | 0.01 | 0.001 |
训练不稳定:
策略收敛慢:
重建图像模糊:
在Atari 100k基准测试中,DreamerV2相比V1的改进效果:
| 游戏 | V1得分 | V2得分 | 提升幅度 |
|---|---|---|---|
| Breakout | 42.1 | 78.3 | 86% |
| Pong | 18.2 | 20.9 | 15% |
| Seaquest | 58.7 | 125.4 | 114% |
调优实践经验:
对于动作空间大的游戏(如Montezuma's Revenge),建议:
对于高维观测环境(如Procgen),需要:
训练时间优化技巧:
我在实际实现中发现几个关键点: