RL 学习 - 2

@ShiKaiWi

今天开始学习具体的例子了:https://github.com/walkinglabs/hands-on-modern-rl/blob/main/code/chapter01_cartpole/2-pytorch_ppo.py

例子中充分展示了一个 cartpole 的强化学习的训练过程,代码流程简化如下:

model = ActorCritic()
optimizer = Adam(model.parameters(), lr=3e-4)
env = gym.make("CartPole-v1")

for iteration in range(40):
    # 第一步:收集经验数据(2048 步)
    transitions, bootstrap = collect_rollout(model, env, 2048)

    # 第二步:计算 GAE 优势
    advantages, returns = compute_gae(model, transitions, bootstrap)

    # 第三步:PPO 更新(同一批数据训练 10 个 epoch)
    metrics = ppo_update(model, optimizer, transitions, advantages, returns)

按照我的理解是:

  • 构建 env,用来模拟真实的外部环境,需要给出:

    • 初始 state
    • 状态转移函数
    • action 产生的 reward 计算
    • 终止判定
  • 初始化 model:

    • 设计网络的模型(比如这里的 ActorCritic)就是一个简单的小网络:
      • actor:[4x64 64x64 64x2]
      • critic:[4x64 64x64 64x1]
    • 为网络的模型进行初始化:这里 tricky 的地方也有很多,需要很多专业的知识
  • 训练:

    • 收集多步的经验数据
    • 计算 GAE 优势
    • PPO 更新网络(同时更新 Actor 和 Critic)

这里面的数学细节非常多,这些细节有非常多的那种数学设计和直觉理解的关联性我无法很好的理解,感觉这其间缺少了非常多的 DeepLearning 的常识。

另外,直觉上讲有一个疑惑:同时更新两个网络觉得非常奇怪,下面是 AI 的回答记录:

你觉得「同时更新两个网络奇怪」的本质原因

你潜意识觉得:

一个负责选动作,一个负责打分,同时一起训,会不会互相干扰、互相跑偏?

然而实际真相是:

  • 更新目标不一样
    • Actor:最大化累积奖励、受 Clip 约束
    • Critic:拟合真实回报、做回归损失
    • 两个网络 loss 分开、各司其职,只是共用同一批数据。
  • PPO 是「交替 + 联合」训练同一批轨迹数据:先用数据训 Critic,把价值估准再用估好的优势 A 去训 Actor不是乱一起瞎更新,是有先后、有分工,就算参数共享(同一个主干网络分出头),依然梯度隔离、任务分离,完全没问题。

Comments 0

No comments yet. Be the first!