how to

RL 285

Dec 2, 2025
notesjulyfun2407
7 Minutes
1281 Words

https://rail.eecs.berkeley.edu/deeprlcourse-fa23/

符号

  • 𝐽(𝜃): 策略的累积奖励的期望,需要最大化

  • 顺序: 𝑠1𝑎1𝑠2

  • 𝜏: 轨迹,表示所有 𝑠,𝑎

  • 𝜋(𝑎|𝑠):状态 𝑠 下采取 𝑎 的概率

  • 𝑉𝜋(𝑠)𝔼𝜋[𝐺𝑡|𝑆𝑡=𝑠] 状态价值函数 state-value function,即还不确定 𝑎

  • 𝑄𝜋(𝑠,𝑎)=𝔼𝜋[𝐺𝑡|𝑆𝑡=𝑠,𝐴𝑡=𝑎] 动作价值函数 action-value function,即确定了 𝑎

    • 𝑉𝜋(𝑠)=𝑎𝐴𝜋(𝑎|𝑠)𝑄𝜋(𝑠,𝑎)
    • 𝑠𝜋𝑎𝑖𝑃𝑠

FAQ

log 何时来的?

  • default
  • 从右往左看. 𝑟 导数怎么传递到 𝜃 上的?

强化学习类型

  • Policy Gradient: 求 𝔼[𝑟]𝜃 的导数.
    • 训练:
      • Actor: 输入 [机械臂状态,观测]
      • 输出 [动作] 或者 [动作的概率分布]
    • 推理: 一样
  • Value Based (DQN): 直接训练一个 Q / V,取最大值对应的动作索引 (no explicit policy)
  • Actor-Critic: 有 A 有 Q
  • Model-based: 有模型自行估计 𝑠 经过 𝑎 如何转移 ( learn 𝑝(𝑠𝑡+1|𝑠𝑡,𝑎𝑡) )

On-off policy

  • off-policy: able to improve the policy without generating new samples from that policy

  • on-policy: any time the policy is changed (even a little bit) we need to generate new samples.

  • (and there is offline-RL)

Lec5 Policy Gradients

  • https://rail.eecs.berkeley.edu/deeprlcourse-fa23/deeprlcourse-fa23/static/slides/lec-5.pdf
  • Maximum likehood 仅仅让 𝜃 朝着“这批动作出现概率最大”的方向演进.
  • default
  • default
  • [later, qm] 这不是模仿学习么,哪儿来的代码
1
logits = policy(states)
2
loss_fn = torch.nn.CrossEntropyLoss()
3
loss = loss_fn(logits, actions) # 离散动作
4
loss.backward()
5
gradients = [p.grad for p in policy.parameters()]
  • 问题:奖励方差大,训练效率低下。好轨迹梯度可能为 0(累积奖励 0),有效奖励信号丢失.

例子:高斯 policy

这里距离是马氏距离,用协方差使得距离评估更准.

  • default

两种优化

  • 换种形式: reward to go:
    • default
  • 等等先换一个话题,我们求一个 baseline 𝑏 并改写奖励为 default ,目的是使梯度方差最小。推导出最优的 𝑏 为:
    • default
    • 其中: default
  • 结合以上两个优化,得到:
  • default

为什么 PG 必须是 on-policy

上述公式是对 𝜃 求导,𝜃 必须是最新的,求的梯度才有意义。导致训练效率很低. 当然你可以多采样几次,相当于 batch 大很多.

importance sampling

  • 这个公式就是 IS: 𝐸𝑥𝑝(𝑥)[𝑓(𝑥)]=𝐸𝑥𝑞(𝑥)[𝑝(𝑥)𝑞(𝑥)𝑓(𝑥)]
  • default
  • default
  • [ok]
    • [grep] 注意上图 Π 那个概率在下图这里已经改写为乘积完毕的形式 𝜋𝜃(𝑠𝑖,𝑡,𝑎𝑖,𝑡).
  • default
  • 最后还是改用自动求导了,因为显示计算 log 那一项开销太大. 而 log 那一项正好对应平方误差.

优化的梯度下降?

  • 能直接走到最好的 𝜃吗?
  • default
  • 上图第一个方法“参数距离约束”依赖于参数的具体形式,不好。
  • 上图 KL 散度: default 通过采样计算.
  • default
1
# states: (B, S_dim) -> logits: (B, A_dim)
2
logits_old = policy_old(states)
3
logits_new = policy_new(states)
4
5
# 将 logits 转换为概率分布. 连续动作用 Normal 代替 Categorical
6
dist_old = torch.distributions.Categorical(logits=logits_old)
7
dist_new = torch.distributions.Categorical(logits=logits_new)
8
9
# 对所有样本取平均,得到最终的 KL 散度值
10
kl_divergence = torch.distributions.kl.kl_divergence(dist_new, dist_old).mean()
  • 进一步:通过 Fisher 信息矩阵近似展开 KL 散度:
  • default
  • 可以通过采样来估计 𝐹.
  • default
  • WHY this formula? see: [ai]
    • default
  • default
  • 上图两种训练方法。选择 𝛼: natural gradient. 选择 𝜀: trust region policy optimization
  • Lec5 end!

Hw1

1.1 Given

default show: default

1.2

default

  • holy!
  • The Off-policy policy gradient: 这张图简单易懂:
  • default

2 Editing Code

如何可视化: tensorboard --logdir=/home/julyfun/Documents/GitHub/homework_fall2023/hw1/data/q1_bc_ant_HalfCheetah-v4_2 3-11-2025_00-00-06/

  • Ant-v4:
1
Eval_AverageReturn : 4795.3828125
2
Train_AverageReturn : 4681.891673935816
3
Training Loss : 0.0011749982368201017
  • Walker-2d 只有 2d 物理
1
Eval_AverageReturn : 998.958740234375
2
Train_AverageReturn : 5383.310325177668
3
Training Loss : 0.01655399613082409

走的不太行,能往前冲一点

  • HalfCheetah
1
Eval_AverageReturn : 4070.5146484375
2
Train_AverageReturn : 4034.7999834965067
3
Training Loss : 0.004244370386004448

default

  • Hopper
1
Eval_AverageReturn : 1542.371826171875
2
Train_AverageReturn : 3717.5129936182307
3
Training Loss : 0.010719751007854939

看视频跳的还可以 default 关于这个 Hopper 任务, batchsize: (我本来还想搞 N 条轨迹来实验,但是这个专家数据只有若干个 s-a pair,没法搞) default

default

3. Dagger

  • Walker-2d
  • 这里 batch_size default=1000 参数不用调,因为 train 的时候只拿出前 train_batch_size=100 个. 是公平的.
1
Eval_AverageReturn : 998.958740234375
2
Eval_StdReturn : 488.8404541015625
3
Train_AverageReturn : 5383.310325177668
4
Train_StdReturn : 54.15251563871789
5
Training Loss : 0.01655399613082409
6
7
********** Iteration 1 ************
8
Eval_AverageReturn : 5408.2431640625
9
Eval_AverageEpLen : 1000.0
10
Train_AverageReturn : 1130.504150390625
11
Train_StdReturn : 583.0662231445312
12
Training Loss : 0.022556820884346962
13
14
********** Iteration 2 ************
15
Eval_AverageReturn : 5389.76708984375
4 collapsed lines
16
Eval_StdReturn : 0.0
17
Train_AverageReturn : 5411.14599609375
18
Train_StdReturn : 0.0
19
Training Loss : 0.012993226759135723
  • 实验时在默认命令上尽量少改动.

  • Walker2d DAGGER: default

  • 强制不收集新数据: if itr == 0: => if itr == 0 or True: (后来我改了其他代码,可以 no_dagger 多轮执行) default

  • no-dagger Step 0: 会 terminate default

  • DAgger Step 9: default

  • Hopper DAgger: default

  • Hopper no dagger default

  • DAgger Step 9: default

Lec6 Actor Critic

  • https://www.youtube.com/watch?v=wr00ef_TY6Q&list=PL_iWQOsE6TfVYGEGiAOMaOzzv41Jfm_Ps&index=21
  • https://rail.eecs.berkeley.edu/deeprlcourse-fa23/deeprlcourse-fa23/static/slides/lec-6.pdf
  • 为什么加入 baseline 项可以减少方差呢?
    • 因为 Q(s, a) - V(s) 可以分离出动作 𝑎 本身的价值,降低梯度波动.
    • 我的理解是对于完美的 Q 来说减了 V 也不会降低方差了.
  • default
  • 我们发现 A(优势函数)只需要 fit V.
  • default
  • 如何定义 𝑉𝜋 呢? 下面这个公式更好,但是这需要从同一个 𝑠𝑡 出发多次采样,除了仿真以外是不可能的!
  • 所以我们采用上面那个公式.
  • default
  • 第一版训练方法出炉!
  • default
  • Can we do better? 直接用 V 估计之后的收益,尽管一开始不准.
    • Lower variance, Higher bias! (“because it’s using b hat instead of a single sample estimator”, 或者说 𝑉(𝑠𝑡+1) 是一个期望而不是一个采样. )
  • default
  • [bookmark] https://www.youtube.com/watch?v=KVHtuwVhULA&list=PL_iWQOsE6TfVYGEGiAOMaOzzv41Jfm_Ps&index=23&t=12s
Article title:RL 285
Article author:Julyfun
Release time:Dec 2, 2025
Copyright 2025
Sitemap