这个项目把数据、训练、策略执行和评估放进同一个可检查的小任务,先确认学习循环的含义。它使用有限状态的一维积分器,省略惯性、视觉、关节和接触,因此是具身学习前的算法实验,不能代表完整机器人或视觉动作策略。

任务与对照条件

位置状态是整数[-5,5],动作是左移一步、不动或右移一步,目标为零。成功奖励1,其余步骤奖励-0.04;最多20步,成功立即终止。训练使用奇数起点,测试使用偶数起点;测试时有15%概率动作无效,策略下一步可根据新状态重新反馈。

训练与测试的初始条件分开,但偶数状态会出现在训练轨迹中,因此这不是未见状态泛化测试。本任务目标是检查策略是否能学到反馈规律。测试扰动也很有限,不能外推到连续状态、复杂物理或跨设备迁移。

四个对照分别是解析的朝目标移动策略、均匀随机策略、行为克隆和从零训练的REINFORCE。解析策略已知规则,不花训练样本;BC有专家标签;RL只有交互奖励。它们使用的信息不同,不能仅比较最终分数就评价样本效率。

下载与运行

下载learning_lab.py和requirements.txt,放在同一目录。需要Python 3与NumPy;记录使用的依赖版本:

python -m pip install -r requirements.txt
python learning_lab.py --seed 7
python learning_lab.py --seed 11
python learning_lab.py --seed 19

脚本在内存中生成120个专家episode,前96个用于BC训练、其余24个用于验证;没有下载数据或使用真人/真机演示。策略是每个离散状态对应三个动作logits的表格softmax。BC用交叉熵更新;REINFORCE用状态基线减少方差,每批32个episode,共300批、9600个训练episode,有限任务中使用gamma=1。

BC的验证交叉熵检查动作预测,最终评价另用闭环200个episode。脚本还用有限差分检查softmax交叉熵梯度,并验证固定状态下策略score的期望为零,帮助检查基线推导,而不依赖“训练曲线看上去正常”。

已执行的结果

2026-10-24在Python 3.12.14、NumPy 2.3.5、CPU上执行。每个种子独立重新训练并测试:

种子BC验证交叉熵RL交互步数随机策略成功数经典/BC/RL成功数
70.024804998193/200均为200/200
110.0277450381100/200均为200/200
190.029095042787/200均为200/200

记录:种子7、种子11、种子19。种子7中三个确定策略的测试平均步数均为3.46,因为最终选出的贪心动作相同;没有证据说明学习策略优于经典规则。200次全成功也只是这组有限条件的观察,不是成功率为100%的保证。运行耗时受设备及并发负载影响,不作为性能基准。

PyTorch对照怎样使用

learning_torch.py使用同目录中的learning_lab.py定义环境,通过nn.Embedding表达状态对应的logits,用交叉熵和Categorical.log_prob完成自动求导。PyTorch版和NumPy版随机数生成器不同,不应期待训练轨迹逐项一致。

PyTorch文件只做语法检查,未执行训练。读者可按PyTorch官方安装页选择与系统兼容的CPU版本,再运行python learning_torch.py;本项目不需要GPU或大模型。训练循环的基本接口见官方优化教程。

完成标准与扩展

先重现三组数值结果,检查损失有限、梯度检查通过,并能解释训练预算、数据划分与测试判据。再改变动作失效概率、起点分布或训练预算,保持独立测试条件,记录成功数、步数、回报及失败状态。

下一层可把积分器替换为带速度的质量块,将状态改为[位置,速度],并重新定义动作与专家策略;只保留位置会引入部分可观测性。迁移到机械臂项目时,还需要处理连续动作、轨迹、碰撞和接触,而不是只增加网络层数。

Diffusion Policy、ACT、VLA的公开模型推理按视觉动作策略章节的限定复现步骤进行,本项目未运行这些模型,也没有采集实物数据或完成sim-to-real。