ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于Python的强化学习智能决策作业:从Q-learning到DQN实践指南

基于Python的强化学习智能决策作业:从Q-learning到DQN实践指南 简介基于Python的智能决策技术强化学习作业设计源码是一套面向高校课程作业与入门开发者的完整实践项目。项目围绕智能体与环境的交互机制实现状态值函数更新、策略迭代优化与动作选择等核心算法并通过模块化测试和解决方案文件验证算法的正确性与效率帮助学习者从理论走向落地。资源包共111个文件以32个Python源文件为算法主体辅以24个测试文件、24个解决方案文件、14个布局文件、8个配置文件及5个XML数据/配置文档整体压缩包约861KB结构清晰便于按功能模块检索和复用。目前已有339人学习下载适合需要完成强化学习作业或快速构建智能决策原型的读者。通过该项目学习者不仅能获得可直接运行的源码还能理解测试用例设计与异常处理思路掌握从配置管理到版本控制的完整项目组织方式为后续深入强化学习或参与相关竞赛打下基础。1. 基于Python实现的智能决策技术强化学习作业不是跑个Demo就能交差最近后台总有人问一个问题“老师只给了一个题目‘基于Python实现的智能决策技术强化学习作业设计源码’让我自己设计环境、自己写算法、还得交源码怎么下手”这个问题很有代表性。很多同学以为强化学习作业就是调一个现成的DQN往Gym里一扔跑出曲线就完事。实际上“智能决策”四个字才是这题的灵魂要在不确定环境下让智能体学会做序列决策并拿出可以复现、可以答辩的Python代码。这篇文章是我做过多次课程作业和指导后整理的一套自底向上的方案适合正在写智能决策作业的学生也适合想补强化学习入门实践的工程师。按这个路径走能少踩一半的坑。2. 设计作业前先想清楚用哪个环境、哪类算法、怎么评智能决策效果2.1 环境选型从FrozenLake到CartPole作业场景怎么选作业第一步不是写代码是选环境。常见做法是直接用Gym但环境选不好后面所有工作都会变味。我一般第一节课会给学生两个底线要求状态和动作都要能可视化环境里必须有一层“不确定性”否则题目里的“智能决策”体现不出来。首选是FrozenLake。它状态离散、动作离散而且冰面打滑会让动作以一定概率偏移完美对应“不确定条件下的决策”。其次是CartPole状态连续、动作离散适合做深度强化学习算法的切入点。如果你想冲高分我建议加一个自定义GridWorld自己控制风场和障碍物参数让智能体在随机扰动下学会绕路这样报告里能讲的故事就太多了。环境对比表如下环境状态空间动作空间不确定性来源适合算法作业风险FrozenLake离散16离散4滑冰导致转移概率不确定Q-learning, Sarsa太简单需加扩展CartPole连续4离散2物理动力学不确定DQN训练慢易掉进超参数坑CliffWalking离散48离散4悬崖惩罚Sarsa / Q-learning适合对比在线/离线策略自定义GridWorld离散离散自己加风、障碍全部工作量可控答辩加分选环境最大的原则是让老师能看懂“决策”发生在哪。我建议作业选FrozenLake做baseline再用CartPole做深度强化学习扩展。如果你要冲高分就加一个自定义GridWorld把风场写成参数用表格方法解释“为什么智能体能避障”用深度强化学习解释“为什么状态多了之后表格方法扛不住”。另外别忘了Python环境本身。不用纠结Python安装版本3.8到3.11都能跑通这套方案但Gym的接口很折磨人。0.21以前env.reset()返回一个值0.26以上返回(state, info)env.step从返回4个值变成5个值。作业代码一定要做版本兼容不能只在你的电脑上跑通。后面避坑章会专门讲一次。2.2 算法选型Q-learning先立baseline再往深度强化学习扩展算法选型上我强烈建议“一条主线、两个台阶”。先做表格型Q-learning当baseline再扩展到一个深度强化学习算法通常是DQN。很多作业只交一个DQN结果训练不稳定、报告写不清楚答辩被问“为什么要用神经网络”就哑火。Q-learning是离线策略算法它更新时用的目标是最优策略下的Q值而不是当前行为策略产生的数据所以天然适合“智能决策”这个主题。Sarsa是在线策略算法训练时对风险更保守。这里有个常见的对比做法在CliffWalking环境里Q-learning学到的是最短但偶尔掉悬崖的路线Sarsa学到的往往是最安全但更长的路线。把这条结论写进报告比贴十张训练曲线都有说服力。理论部分不用长篇大论。David Silver的强化学习课程里MDP和贝尔曼方程那几章足够把作业里的Q(s,a) ← Q(s,a) α(r γ max Q(s,a) - Q(s,a))讲清楚。但报告里必须把这条更新式和你的代码逐行对应上不能只贴公式。比如更新时done之后为什么要让next_q0这就对应贝尔曼方程中终结状态没有未来收益。深度强化学习算法不要贪多一个DQN就够。它的核心机制是经验回放、目标网络、奖励缩放我会在第4章给最小实现。如果你想在答辩时展示视野可以在“未来工作”里提一句“基于模型强化学习会先学一个环境模型再在模型内部做规划但模型不准确时决策会连锁崩盘所以作业里选择无模型方法”。这句话能镇场但也别跑题。2.3 评估指标回合收益、成功率与置信区间曲线怎么画作业最容易翻车的地方不是训练而是评估。很多同学最后画一条学习曲线横轴是episode纵轴是reward看起来很美一问发现是单次运行出来的——换个随机种子结果就完全不一样。靠谱做法是固定5个随机种子训练把每一轮评估得到的收益记录下来画均值±标准误的强化学习置信区间曲线。这里要区分两件事训练日志和评估曲线。训练日志是训练过程中每一步的即时收益波动大、包含探索噪声只能用来判断有没有发散评估曲线才是智能决策质量的证据。评估时要把探索关掉用np.argmax(q[state])或者网络输出最大Q值对应的动作在测试环境里跑多个episode取平均。在FrozenLake和GridWorld里我还会加一个成功率指标就是到达目标的概率。表格方法训练到最后平均收益还行但成功率只有0.8能不能拿高分取决于你用什么指标解释。报告里放两张图一张是跨种子的收益置信区间曲线一张是成功率曲线。两张图加起来老师一眼就能看出你的方案是稳定收敛还是碰运气。3. 搭建作业代码框架把“智能决策”拆成四个模块3.1 目录结构与模块职责代码不能全塞在一个main.py里这不是排版问题是逻辑问题。智能决策本身是一条闭环链路环境感知、决策、更新、评估。模块化目录既方便你调试也方便老师看源码时快速抓住结构。我一般会这样组织assignment_drl/ ├── envs/ # 环境封装暴露统一接口 │ ├── __init__.py │ └── grid_world.py ├── agents/ # 算法实现Q-learning和DQN各自独立 │ ├── __init__.py │ ├── q_learning.py │ └── dqn_agent.py ├── utils/ # 日志、画图、评估辅助函数 │ ├── __init__.py │ ├── logger.py │ └── plot.py ├── train_q.py # 训练入口一表格方法 ├── train_dqn.py # 训练入口二深度强化学习 ├── evaluate.py # 固定种子评估输出置信区间曲线 └── requirements.txt逻辑说明envs里只放环境agents里只放算法train_*.py负责组织训练循环evaluate.py单独做评估。这里最核心的约定是“接口统一”无论是GridWorld还是Gym环境都只暴露reset和step两个方法算法代码不感知环境内部实现。这样Q-learning和DQN可以共享同一套训练循环和评估脚本。很多作业翻车就是因为评估逻辑写在训练脚本里跑一个seed要重训一遍模型。3.2 环境交互层让Python代码只暴露step和reset自定义环境的常见做法是继承gym.Env但作业里不继承也能写。关键是实现一个带随机性的GridWorld让“智能决策”有实际意义。下面是我常用的一个最小实现# envs/grid_world.py import numpy as np class GridWorld: def __init__(self, size5, wind_prob0.1): self.size size self.wind_prob wind_prob self.action_space [0, 1, 2, 3] # 上右下左 self.state (0, 0) self.goal (size - 1, size - 1) def reset(self): self.state (0, 0) return self._state_idx() def step(self, action): # 有 wind_prob 概率动作漂移随机换一个方向 if np.random.rand() self.wind_prob: action np.random.choice(self.action_space) row, col self.state moves [(-1, 0), (0, 1), (1, 0), (0, -1)] dr, dc moves[action] row min(max(row dr, 0), self.size - 1) col min(max(col dc, 0), self.size - 1) self.state (row, col) done (self.state self.goal) reward 1.0 if done else 0.0 return self._state_idx(), reward, done, {} def _state_idx(self): row, col self.state return row * self.size col逻辑说明wind_prob就是不确定性来源智能体明明选了“右”却可能在概率下漂移到“上”。有了这层随机性Q-learning才能体现出它学习到的不是一条固定路径而是一个带风险权衡的决策策略。没有这层随机性问题就退化成普通的搜索答辩时会被直接问倒。参数说明size控制网格大小5以下收敛太快7以上训练要几千个episode作业取5或6合适。wind_prob建议0.1到0.2太小学不到鲁棒策略太大智能体会觉得所有动作都不可控曲线很难看。3.3 智能决策核心Q-learning表格更新逻辑表格方法的核心是更新规则。很多代码把更新和训练循环混在一起结果调参时哪个参数要改都分不清。我一般拆出一个QLearningAgent让决策和更新放在类内部# agents/q_learning.py import numpy as np class QLearningAgent: def __init__(self, state_num, action_num, lr0.1, gamma0.99, epsilon0.3): self.q np.zeros((state_num, action_num)) self.lr lr # 学习率控制Q值更新步长 self.gamma gamma # 折扣因子控制未来收益权重 self.epsilon epsilon # 探索率控制随机动作比例 def choose_action(self, state): if np.random.rand() self.epsilon: return np.random.randint(self.q.shape[1]) return int(np.argmax(self.q[state])) def update(self, state, action, reward, next_state, done): best_next np.max(self.q[next_state]) td_target reward (0 if done else self.gamma * best_next) self.q[state, action] self.lr * (td_target - self.q[state, action])逻辑说明td_target是当前动作拿到的即时奖励加上未来最优收益的折扣值。done时必须让next_q为0否则智能体会以为掉下悬崖之后还有下一步收益训练曲线会持续不收敛。choose_action里用了epsilon-greedy探索训练初期靠它到处试错后期需要把epsilon调小。参数说明lr0.1在离散小状态空间里够用如果训练震荡就把lr降到0.05。gamma0.99适合需要长距离绕路的GridWorld如果你的环境只有几步远gamma可以降到0.9收敛更快。epsilon0.3是初始值后面要在训练循环里做衰减。训练入口也很简单但要固定随机种子。我习惯这样写# train_q.py 片段 import numpy as np from envs.grid_world import GridWorld from agents.q_learning import QLearningAgent seed 0 np.random.seed(seed) env GridWorld(size5, wind_prob0.15) agent QLearningAgent(25, 4, lr0.1, gamma0.99, epsilon0.3) for eps in range(2000): state env.reset() total_reward 0 done False while not done: action agent.choose_action(state) next_state, reward, done, _ env.step(action) agent.update(state, action, reward, next_state, done) state next_state total_reward reward agent.epsilon max(0.01, 0.3 * (1 - eps / 2000))逻辑说明每个episode从起点出发不断选择动作、执行、更新直到到达目标或掉坑。epsilon线性衰减到0.01让智能体从“探索为主”逐渐切换为“利用为主”。注意np.random.seed(seed)必须在环境实例化之前设置否则环境内部随机数状态不可复现。3.4 可视化与评估脚本画强化学习置信区间曲线评估脚本独立于训练脚本这是我一直强调的底线。训练产出的日志只是中间状态评估才代表最终决策质量。置信区间曲线本质上是在回答一个问题换一个随机种子你的方案还能不能复现下面是画图工具函数# utils/plot.py import numpy as np import matplotlib.pyplot as plt def plot_confidence_curve(records, label, window20): # records shape: (seed_num, episode_num) smoothed np.zeros_like(records) for i in range(records.shape[0]): for j in range(records.shape[1]): lo max(0, j - window 1) smoothed[i, j] records[i, lo:j1].mean() mean smoothed.mean(axis0) se smoothed.std(axis0) / np.sqrt(records.shape[0]) plt.plot(mean, labellabel) plt.fill_between(range(len(mean)), mean - se, mean se, alpha0.3)逻辑说明先对每个种子的训练序列做滑动平均消除逐回合的剧烈波动再跨种子求均值和标准误。fill_between画的就是置信区间带。很多作业只画一条均值线答辩时容易被问“稳定性多少”有了这个色带稳定性一目了然。参数说明window是滑动窗口大小一般20到50窗口太小曲线还是毛糙窗口太大早期细节丢失。records的行数是种子数建议至少5个少于3个画出来的区间没有统计意义。画图前记得把训练和评估分开记录别把带探索噪声的训练奖励当成评估指标。评估脚本里固定种子的顺序也容易踩坑。比如这样写# evaluate.py 片段 import random import numpy as np import torch def set_seed(seed): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) def evaluate_agent(agent, env, episodes100): agent.epsilon 0.0 # 关闭探索纯利用 rewards [] successes 0 for _ in range(episodes): state env.reset() done False total 0 while not done: action agent.choose_action(state) state, reward, done, _ env.step(action) total reward rewards.append(total) if total 1: successes 1 return np.mean(rewards), successes / len(rewards)逻辑说明agent.epsilon0.0是评估的关键否则智能体会在测试时做随机动作把决策能力稀释掉。评估跑100个episode是常规做法取平均收益和成功率两个指标最后跨种子汇总。这套脚本通用于Q-learning和DQN只要算法类实现同样的choose_action接口。4. 从表格走向深度强化学习把DQN塞进作业的边界条件4.1 为什么表格方法不够DQN的决策边界在哪Q-learning在离散状态空间里表现不错但状态一旦连续Q表就爆了。CartPole的观察值有4个连续量每个维度可能有无数取值你不可能建一张覆盖所有状态的查表。深度强化学习算法的作用就是用一个神经网络去近似Q函数输入状态输出每个动作的Q值。作业里为什么要做这个扩展因为题目挂着“智能决策技术”只交表格方法虽然能及格但拿不了高分。DQN几乎是默认的加分项它用到的经验回放、目标网络这两个机制本身就能说明你理解深度强化学习里的两个痛点样本相关性和训练不稳定。但也要说清楚边界。DQN只在状态连续或状态空间巨大的环境下才值得用在FrozenLake上强行用深度强化学习就是给自己找麻烦状态太少神经网络学到的表示没有意义训练反而比表格方法更慢、更不稳定。深度强化学习算法的训练过程本身就接近一个黑匣子同一个代码换一个随机种子可能完全两个走势所以评估必须用多个种子做置信区间不能拿一次跑通就下结论。这里顺带提一句答辩话术“基于模型强化学习会先学一个转移模型来模拟下一步状态再在模拟环境中做规划但如果模型学偏了决策会基于幻觉状态崩掉。作业里我选择无模型方法是为了避开模型误差带来的连锁放大约束。”如果把这句话讲清楚说明你对比过两条路线老师很难从这个问题上找到漏洞。4.2 经验回放与目标网络的最小可用实现DQN的完整代码不短但作业里不需要超大型工程。最小可用版本需要三个组件一个Q网络、一个经验缓冲区、一个定期同步的目标网络。下面是我会用到的核心实现主体用PyTorch# agents/dqn_agent.py import random import numpy as np import torch import torch.nn as nn import torch.optim as optim class QNet(nn.Module): def __init__(self, state_dim, action_dim): super().__init__() self.net nn.Sequential( nn.Linear(state_dim, 64), nn.ReLU(), nn.Linear(64, 32), nn.ReLU(), nn.Linear(32, action_dim) ) def forward(self, x): return self.net(x) class DQNAgent: def __init__(self, state_dim, action_dim, lr1e-3, gamma0.99, buffer_size10000, batch_size64, target_update_freq100): self.policy_net QNet(state_dim, action_dim) self.target_net QNet(state_dim, action_dim) self.target_net.load_state_dict(self.policy_net.state_dict()) self.optimizer optim.Adam(self.policy_net.parameters(), lrlr) self.buffer [] self.counter 0 self.gamma gamma self.batch_size batch_size self.target_update_freq target_update_freq self.buffer_size buffer_size def choose_action(self, state, epsilon0.0): if np.random.rand() epsilon: return np.random.randint(self.policy_net.net[-1].out_features) with torch.no_grad(): state_t torch.FloatTensor(np.array([state])) q self.policy_net(state_t) return int(q.argmax().item()) def add_transition(self, s, a, r, s2, done): self.buffer.append((s, a, r, s2, done)) if len(self.buffer) self.buffer_size: self.buffer.pop(0) def update(self): batch random.sample(self.buffer, self.batch_size) states, actions, rewards, next_states, dones zip(*batch) states torch.FloatTensor(np.array(states)) actions torch.LongTensor(actions).unsqueeze(1) rewards torch.FloatTensor(rewards).unsqueeze(1) next_states torch.FloatTensor(np.array(next_states)) dones torch.FloatTensor(dones).unsqueeze(1) q_values self.policy_net(states).gather(1, actions) with torch.no_grad(): next_q self.target_net(next_states).max(1, keepdimTrue)[0] td_target rewards (1 - dones) * self.gamma * next_q loss nn.MSELoss()(q_values, td_target) self.optimizer.zero_grad() loss.backward() self.optimizer.step() self.counter 1 if self.counter % self.target_update_freq 0: self.target_net.load_state_dict(self.policy_net.state_dict())逻辑说明choose_action在测试时传入epsilon0.0和表格方法的评估逻辑保持一致。update里最关键的是td_target的计算dones作为掩码强制终结状态的未来收益为0这和Q-learning的done处理是对齐的。目标网络每隔target_update_freq次更新同步一次避免训练过程中目标不断飘导致发散。参数说明网络结构64-32在CartPole这种低维状态上完全够用不要盲目加深层数越多越容易震荡。buffer_size10000对应CartPole的样本量足够如果换复杂环境经验回放容量要加大到10万级。target_update_freq100是一个比较稳的间隔。batch_size64是常见中间值。如果你追求更稳可以把更新改成Double DQN形式用policy_net选动作索引再让target_net取该动作的Q值其它代码几乎不动。4.3 训练脚本参数表学习率、探索率、回放容量怎么设深度强化学习的调参有很强的玄学成分但作业里不需要做极端调优关键是让每个参数都能在报告里说清楚。我用一个集中配置来管理参数训练脚本只负责读取参数推荐值作用调参信号学习率 lr1e-3更新步长损失震荡大就降到1e-4gamma0.99对未来奖励的折扣步数周期长就加大初始 epsilon0.5~1.0探索强度曲线不升就提高最终 epsilon0.01收敛后最小探索过小容易早熟回放容量1e4打破样本相关数据不足就加大batch_size64每步更新的样本量过大波动大过小不稳定target_update_freq100目标网络同步频率过大抖动过小学得慢训练循环里有一个容易被忽视的细节不要每一步都立刻做update。经验回放的本质是等缓冲区里攒够了样本再随机采样所以训练初期要跳过前batch_size步。否则缓冲区太稀疏采样出的batch里全是同一条轨迹经验回放就失去了意义。还有一个常见做法是“训练时阶段性评估”。每个训练episode结束后暂停训练关闭探索让当前策略在测试环境里跑20到50个回合记录平均收益。这样画出来的评估曲线才是平滑的。如果能看到曲线先升后稳说明调参方向对了。# train_dqn.py 片段 env gym.make(CartPole-v1) agent DQNAgent(env.observation_space.shape[0], env.action_space.n) batch_size 64 for eps in range(1000): state, _ env.reset() done False while not done: epsilon max(0.01, 1.0 * (1 - eps / 1000)) action agent.choose_action(state, epsilon) next_state, reward, done, _, _ env.step(action) agent.add_transition(state, action, reward, next_state, done) state next_state if len(agent.buffer) batch_size: agent.update() if eps % 50 0: avg_reward evaluate_agent(agent, env, episodes50) print(fepisode {eps}, avg_reward{avg_reward:.2f})逻辑说明这里用了新版Gym接口env.reset()返回两个值env.step返回五个值如果你还在用0.21版第一行要写成state env.reset()。epsilon从1.0线性衰减到0.01前期充分探索后期收敛利用。if eps % 50 0做的是阶段性评估评估结果才是论文和报告里可用的曲线数据。作业里不建议追求达到环境的满分阈值能稳定到CartPole的200分附近就已经足够讲清楚一个完整的深度强化学习闭环。如果你时间充裕可以再做一组消融实验关掉目标网络、关掉经验回放对比曲线差多少。这组实验能证明你对深度强化学习算法的理解不是停留在调包层面。5. 避坑作业里最常见的5个翻车现场与排查方法5.1 训练曲线不升反降偶尔还崩出NaN现象前几百episode收益还在上升后面突然跌到0或者loss直接变成NaN整个训练白跑。原因学习率过大Q值更新步长太长导致震荡发散另一个常见原因是奖励无界时TD目标越来越大最后爆掉。深度强化学习算法对奖励尺度很敏感这是很多人第一次跑深度强化学习时绕不过去的血泪经验。解决把学习率从1e-3降到1e-4同时给奖励做裁剪reward np.clip(reward, -1, 1)。还要检查输入到神经网络的状态是不是做了归一化。CartPole原始状态值范围不大但如果你换自定义环境状态没有归一化网络很容易在训练中产生梯度爆炸。先打印每一步的loss如果loss出现NaN基本就是这个原因。5.2 测试时忘了关掉探索智能体看起来像个新手现象训练收益曲线很高loss也正常但测试时智能体频繁随机乱动成绩远低于训练时的表现。原因choose_action里用的还是epsilon-greedy而epsilon在测试时没有设为0。这是最低级也最高频的翻车点。很多同学训练时用一个函数测试时直接复用忘记把探索开关关掉。解决在评估函数第一行写agent.epsilon 0.0或者给choose_action增加epsilon参数测试时显式传0。深度强化学习里同理测试时不要加随机扰动直接用argmax选动作。这个小动作会在答辩演示时救你一命因为老师经常喜欢现场跑一次测试脚本。5.3 固定随机种子只固定了Python还不够现象同一个seed跑两次评估曲线依然不一样完全没办法复现。原因很多人只写了np.random.seed(seed)但环境内部有独立的随机状态PyTorch也有自己的随机生成器三者必须一起设置。新版Gym环境还要在env.reset(seedseed)时传种子否则环境每次reset仍然重新采样。解决训练和评估脚本开头统一调用import random import numpy as np import torch def set_seed(seed): random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed_all(seed)然后在创建环境时设置env.reset(seedseed)。注意要保证算法类内部如果用到np.random也要受全局种子影响。这是“可复现”三个字的底线不然老师没法验证你的源码。5.4 置信区间曲线画出来像个飘带没法写结论现象不同种子之间的收益差异极大置信区间上下包住一半画布曲线图看起来像一条飘带报告里根本没法分析。原因深度强化学习的训练方差本来就大只跑3个种子画出来的置信区间自然很宽更常见的错误是直接把单个episode的收益作为一次采样点而单episode收益方差极大均值意义不大。解决提高种子数到5到10个同时每次评估时用当前策略在测试环境跑多个episode取平均值再把多个种子的均值汇总画图。一次评估里的episode数建议50以上。这样每个采样点已经是对策略稳定性的估计画出来的置信区间才是策略本身的方差不是单次运气。5.5 把训练日志当测试指标报告里的图没有说服力现象报告里贴的曲线横轴episode、纵轴reward但数值起伏特别大而且没有说明是训练过程还是评估过程答辩时被问“这个图代表什么”支支吾吾。原因把训练过程里的即时奖励当成最终指标了。训练过程中智能体还在探索动作带有随机性记录的收益既受策略影响也受探索噪声影响不能代表真实决策能力。解决训练脚本只负责产生checkpoint模型和训练日志评估必须用单独的evaluate.py每个固定间隔关闭探索跑多个测试episode。报告里明确标注“评估曲线”和“训练日志”两条线都可以画但不要把训练日志当成最终的决策质量结论。答辩时能区分这两个概念说明你真的理解了评估闭环。6. 进阶用法把作业从“能跑”做到“能答辩”如果你已经跑通了上面所有代码下一步不是继续调参而是做一个能守住答辩的对比实验。我的习惯是同一个环境、同一组随机种子把Q-learning、Sarsa、DQN三个算法跑一遍最后输出一张对比表。这张表比任何代码都能说明问题因为它把“智能决策”落到了可量化的效果上。对比表模板大致这样算法平均收益成功率收益方差Q-learning0.820.780.12Sarsa0.740.860.08DQN9.51.000.30数值需要你自己跑出来后填写但结论方向可以预期在带风场的GridWorld里Sarsa成功率不一定最高但收益方差更小在CartPole里DQN能用单次episode达到数百步收益上限远高于表格方法。把表格和训练曲线放在一起就是一份很扎实的作业报告。答辩时如果被追问深度强化学习方向还能做什么可以提一句“作业里用的是无模型方法未来可以延伸到基于模型强化学习先学转移模型再做规划也可以用iQL这类离线强化学习算法在没有在线交互数据时直接利用已有轨迹。”这句话点到即可不要展开因为你的作业主体已经足够闭环。我做这类项目时有过一个印象很深的教训有次给一个学生调DQN单种子跑出来的曲线特别漂亮我当时以为收敛了换了一个种子发现完全不收敛。后来我养成一个习惯所有实验先写评估脚本再写训练脚本所有算法对比固定5个种子起步低于3个种子的曲线一律不进报告。这个习惯最后帮我避了很多坑。做智能决策强化学习作业最怕的不是算法太难而是把“跑出来的Demo”当成“做完了的作业”。环境选型、算法主线、代码模块、多种子评估、对比实验这五步走完你手上的这套Python源码才算真正站得住。希望帮到你。本文还有配套的精品资源点击获取
返回列表