多智能体训练曲线上升,可能只是一个智能体拿到了更多奖励。先保留每个体的回合回报,再按任务定义汇总,才有依据判断协作是否改善。下面用自造日志演示一次核对,不把这些数字当作任何算法的训练成绩。
先写清楚纵轴是什么
回合回报是本回合各时间步奖励的累计。若记录折扣回报,需要同时写出折扣系数。PettingZoo 的 Parallel 接口逐步返回按智能体名称索引的 rewards 字典;它不会替你定义团队目标。两个人各得 10 分,团队总和是 20,个体均值是 10,二者的单位和解释不同。零和竞争任务的奖励之和还可能恒为零,不能据此判断策略没有进步。

| 回合 | 智能体 A | 智能体 B | 总和 | 最小个体回报 |
|---|---|---|---|---|
| 1 | 10 | 10 | 20 | 10 |
| 2 | 14 | 6 | 20 | 6 |
| 3 | 18 | 2 | 20 | 2 |
| 4 | 20 | 0 | 20 | 0 |
这组演示里团队总和始终 20,但最小个体回报从 10 降到 0。如果任务要求两个人公平完成工作,总和曲线会遮住退化;如果任务只要求团队产出,分工偏斜也不必自动判为错误。判断必须回到奖励定义。
用同一段日志计算三种指标
把下面内容保存为 curves.py,用 Python 3 执行 python curves.py。输入是每回合两个个体的累计奖励,行顺序对应同一回合,不能把两个不同实验的回合拼在一起。
rows = [(10, 10), (14, 6), (18, 2), (20, 0)]
for episode, values in enumerate(rows, 1):
total = sum(values)
mean = total / len(values)
worst = min(values)
print(episode, total, mean, worst)
assert [sum(v) for v in rows] == [20, 20, 20, 20]
assert [min(v) for v in rows] == [10, 6, 2, 0]
应看到四行的总和均为 20、均值均为 10.0,最后一列依次为 10、6、2、0。再保存原始日志和指标定义,以免以后只剩截图、无法还原计算。个体会中途退出的环境还要记录每个体存活步数;不能无说明地把缺失值当作零。
把训练探索和独立评估分开
训练回合的行为可能含探索,评估回合则使用约定的固定策略口径。横轴优先使用环境步数或实际采样量,并说明是联合 step 次数还是每个体动作数。更换奖励尺度、个体数量或最大回合长度后,曲线高度不能直接比较。固定评估场景、评估回合数和检查点,并用多个训练随机种子保留离散结果,才能讨论稳定性。
移动平均可辅助看趋势,但原始回报、失败次数和最低个体表现也应保留。窗口越大,短期失败越容易被掩盖。训练曲线不能替代未见场景测试;本例只验证聚合计算,没有训练策略,也不能证明某个框架优于另一个。
资料与核对依据
- https://pettingzoo.farama.org/api/parallel/
- https://spinningup.openai.com/en/latest/spinningup/rl_intro.html
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32970.html