CS285-Deep Reinforcement learning-Homework
project
- https://github.com/igormolybog/cs285-project # Reward function adaptation: maze env
- https://github.com/xd00099/CS285-DeepReinforcementLearning-Berkeley 作业答案
- https://github.com/xd00099/RL-Final-Project 强化学习 课设
- https://github.com/FelipeMarcelino/CS285-Berkeley-Reinforcement-Learning?tab=readme-ov-file
- https://github.com/bri25yu/rl
- https://github.com/bowieshi/UCB_CS285?tab=readme-ov-file
- https://gitee.com/kin-zhang/drl-hwprogramm/blob/solution/hw2/solution.md
- https://github.com/oldboy818/CS285
- https://github.com/Gkbinqi/CS106L
- https://github.com/Light-yzc/CS285-Fall23
- https://github.com/Bubble252/CS85_hw 有答案

HW1
python cs285/scripts/run_hw1.py --expert_policy_file cs285/policies/experts/Ant.pkl --env_name Ant-v4 --exp_name bc_ant --n_iter 1 --expert_data cs285/expert_data/expert_data_Ant-v4.pkl --video_log_freq -1
Q1
主要是上课讲的 行为克隆的误差

Q1.1


Q1.2
Q3
1. Analysis 理论题(写在报告里)
问题场景:离散 MDP,horizon 为 T,有 expert policy π*,你学到一个模仿策略 π_θ。
他们给了一个条件:在 expert 访问到的状态分布下,模仿策略出错的概率(选到和 expert 不同的 action)平均不超过 ε。
你要证明两件事:
(1) 证明状态分布的差异界
因为你在 expert 的状态分布上出错概率最多 ε,所以整个 rollout 过程中,自己的状态分布和 expert 的状态分布不会差太多,差距在 O(Tε) 量级。
Hints 里说了:
- 课堂证明的是更强的条件(每个状态都 ≤ ε),现在只给了「期望」版,你要把它转成期望,再用 Union bound。
这部分是推导过程 + 最后不等式,写在报告里。
(2) 证明回报差距的量级
定义了回报:
[
J(\pi) = \sum_{t=1}^T \mathbb{E}{s_t \sim p\pi} [r(s_t)], \quad |r(s_t)| \le R_{\max}
]
你要分两种情况讨论:
-
(a) 奖励只在最后一步有(t < T 时 r(s_t)=0)
证明:
[
J(\pi^*) - J(\pi_\theta) = O(T\varepsilon)
]直觉:前面时间步错一点会影响到最后的状态分布,但整体差距仍是 O(Tε)。
-
(b) 奖励每一步都可能有
证明:
[
J(\pi^*) - J(\pi_\theta) = O(T^2\varepsilon)
]直觉:
-
每一步状态分布都有 O(tε) 级别的误差;
-
把所有时间步累加,会出现 T²。
-
👉 这部分是纯理论推导题,写数学步骤和结论在报告中。
2. Editing Code 要改哪些代码(你基本已经做完了)
作业要求:把带 TODO 的地方补完,主要是这三个文件:
-
scripts/run_hw1.py-
填
run_training_loop里 BC 和 DAgger 的逻辑(你已经有了):-
迭代训练循环
-
第 0 轮用专家数据(BC)
-
后面几轮用环境 rollouts + expert relabel(DAgger)
-
从 replay buffer 里 sample batch 做训练
-
logging(Eval_AverageReturn 等)
-
-
-
policies/MLP_policy.py-
实现:
-
forward:给定 obs 输出一个Normal(mean, std)的分布(你已经写成了 mean_net + logstd) -
update:做 supervised learning,用 expert 的 (s, a) 数据最大化 log π(a|s)(你用的是 -log_prob 的 sum) -
额外你补的
get_action:从分布中 sample 动作,用在sample_trajectory里。
-
-
-
infrastructure/utils.py-
实现
sample_trajectory:-
reset env
-
循环:
-
调
policy.get_action(ob)得到 action -
env.step(ac)得到 next_ob, reward, done -
存进 list(obs, acs, rewards, next_obs, terminals, image_obs)
-
到 done 或到 max_path_length 就结束
-
-
-
这个你也已经写了。
-
你现在代码能成功跑 Ant-v4 BC,说明「Editing Code」这一步 已经基本完成 ✅
3. Behavioral Cloning(实验 + 报告)
这一节是「只用 expert 数据做监督学习」的实验部分。
3.1 运行 BC,并比较两个任务
要求你:
-
选择两个环境:
-
一个环境上,BC 能达到 expert 性能的 ≥30%;
-
另一个环境上,BC 效果明显差(比如远低于 expert)。
官方示例命令(Ant)是:
python cs285/scripts/run_hw1.py \ --expert_policy_file cs285/policies/experts/Ant.pkl \ --env_name Ant-v4 --exp_name bc_ant --n_iter 1 \ --expert_data cs285/expert_data/expert_data_Ant-v4.pkl \ --video_log_freq -1 -
-
设置 eval 批量:
-
要让
eval_batch_size > ep_len,这样每次 eval 会收集多条轨迹,而不是只 1 条。 -
比如
ep_len=1000, eval_batch_size=5000,那么 Eval_AverageReturn/StdReturn 就是约 5 条 traj 的均值和标准差。
-
-
跑实验,记录结果:
-
对每个环境:
-
训练一次 BC(可能可以换多种种子,取平均更稳)
-
从 log/TensorBoard 里拿
Eval_AverageReturn和Eval_StdReturn。
-
-
把结果整理成一个表格(Table 1),写在报告里:
- 列:环境名、Expert 回报、BC 回报均值、BC Std、ep_len、eval_batch_size、网络结构(n_layers, size)、训练步数等。
-
-
在文字里简要说明:
-
哪个任务 BC 有效、哪个任务不行;
-
同样的超参下,对比它们表现差异。
-
3.2 调一个超参数并画性能曲线
你要选 一个会影响 BC 性能的超参数,例如:
-
训练的 gradient steps 数量(
num_agent_train_steps_per_iter或者n_iter,如果你扩展了 BC 为多轮) -
使用的 expert 数据量(比如只用一部分 expert_data)
-
网络大小(n_layers / size)
-
学习率(learning_rate)
然后:
-
固定一个环境(比如 Ant-v4 或者作业要求中的某个),只改变这一个超参数。
-
对每个超参数取值:
-
跑一遍 BC
-
记录 Eval_AverageReturn,StdReturn
-
-
在报告里画一张图(Figure 1):
-
x 轴:超参数的不同取值(比如数据量、训练轮数)
-
y 轴:BC 的平均回报(可以加误差棒显示 Std)
-
-
图的 caption 里写明:
-
选的是哪个超参数
-
选择它的理由
-
其他超参大致保持一致
-
4. DAgger(实验 + 学习曲线)
这一节是基于你同一套代码,通过改参数开启 DAgger。
4.1 运行 DAgger
给了一个示例命令:
python cs285/scripts/run_hw1.py \
--expert_policy_file cs285/policies/experts/Ant.pkl \
--env_name Ant-v4 --exp_name dagger_ant --n_iter 10 \
--do_dagger --expert_data cs285/expert_data/expert_data_Ant-v4.pkl \
--video_log_freq -1
关键区别:
-
加上
--do_dagger,并且n_iter > 1(比如 10):-
第 0 轮:用 expert_data 做 BC 预训练
-
后面的迭代:在环境里用当前 policy 采集数据,再用 expert relabel(DAgger)
-
你要对之前 BC 用过的两个环境都跑 DAgger。
4.2 画 DAgger 的学习曲线
对每个环境,你要画一张图(Figure 2),横轴是 DAgger 的 iteration:
-
x 轴:DAgger iteration(0,1,2,..., n_iter-1)
-
y 轴:该 iteration 的 Eval_AverageReturn(加 error bar 表示 Std)
并且在图上画三条 “横线” 作为对比:
-
Expert 的平均回报(可以用给你的 expert policy 直接跑几条轨迹估一下)
-
纯 BC 的平均回报(只训练初始 BC,不做 DAgger)
-
每一轮 DAgger 后 policy 的平均回报(点 / 线)
图的 caption 里说明:
-
用的是哪个 task(环境);
-
网络结构、训练步数、expert 数据量等(简述即可);
-
简要评论:DAgger 是否明显改善了 BC,收敛情况如何。
5. Extra Credit: SwitchDAgger(可选加分)
这一部分是理论题拓展,不是代码。你可以做也可以不做:
-
定义了一个 SwitchDAgger 算法,允许在 rollout 中途把控制权交给 expert。
-
问题让你一步步证明:
-
对 C(π̃_n) 建立递推式;
-
推出 C(π̃_n) ≤ T n α ε;
-
再用 Chernoff bound 证明 C(π_n) 的上界;
-
最后得到 C(π_N) = O(T ε log(1/ε))。
-
如果你做了,要把推导写在报告里,对应 5.1–5.4。
6. Discussion(几句就行)
简单回答两个问题(写在报告末尾):
-
每一部分大概花了多少时间(代码、理论、跑实验……可以概略写)。
-
对作业的反馈:难/易、哪里不清楚、哪里可以改进等等。
7. Turning it in 提交方式
你要提交两样东西:
7.1 报告 PDF
内容包括:
-
Section 1 理论题的回答(1.1, 1.2)
-
Behavioral Cloning 表格(Table 1)
-
超参数实验图(Figure 1)
-
DAgger 学习曲线图(Figure 2)
-
如果做了 SwitchDAgger,附上 5.1–5.4 推导
-
Discussion 问题答案(6.1, 6.2)
7.2 代码 + log(zip)
作业希望你的 submit.zip 结构大概是:
submit.zip
run_logs/
q1_... # BC 的实验日志文件夹(例如 q1_bc_ant_...)
q2_... # DAgger 的实验日志文件夹
cs285/ # 全部 .py 代码(你填好的)
README.md # 写清楚怎么运行你的实验命令
注意:
-
交日志的时候 不要开视频记录(
--video_log_freq -1),否则文件很大。 -
Mac 用户不能用右键 Compress,要用命令行
zip去掉.DS_Store,以免 autograder 出问题。
如果你想要我帮你做的下一步
我可以帮你:
-
一起设计两个任务(“BC 可以”和“BC 不行”的那对环境),顺便帮你写好报告里的表格模板;
-
帮你写一段 报告里的中文解释(比如「我们观察到在 Ant-v4 中,BC 能达到…」这种文字);
-
帮你整理一份 README 模板,把你现在用的命令(比如 Ant 的 BC 命令)填好。
你可以直接跟我说:
帮我选环境 + 写一个表格/图该怎么组织
我就按你现在已经跑通的 Ant-v4 帮你搭好一整套框架。