这一组方法适合新手理解“离线强化学习里最像监督学习”的思路:直接根据数据集中已有的状态和动作来学策略。
先把它理解成“照着老师给的标准答案学动作”。BC 直接学动作,BC_NB 则更重视高质量轨迹里的样本。
BC:把状态当输入,把数据集里的动作当标签,训练一个策略网络。
BC_NB:在 BC 基础上给样本加权,让高回报轨迹中的样本更重要。
适合用来做入门基线,因为训练流程清楚、结果容易解释。
通俗理解:
可以把 BC 看成“照着老师示范做动作”:网页把每条状态当作题目,把数据集里对应的动作当作标准答案。BC_NB 会额外看看这段轨迹最后表现好不好,好样本会被看得更重。
技术对应:
BC 主要读取 observations 和 actions;BC_NB 额外读取 rewards 与 terminals,并根据 episode return 构造 sample weights,让高回报轨迹在损失中占更大权重。
通俗理解:
网络就像一个动作预测器:输入机器人当前姿态和速度等状态信息,输出 6 个动作数值,告诉 HalfCheetah 每个关节大概要怎么发力。
技术对应:
两者都使用 MLP 策略网络,隐藏层默认 256,256,ReLU 负责非线性表达,输出层经过 tanh 将动作限制在 [-1, 1],与环境动作范围匹配。
通俗理解:
训练时就是不断比较“模型给出的动作”和“数据里的动作”差多少。BC_NB 的区别是:来自高回报轨迹的样本,错一点会被罚得更明显。
技术对应:
BC 使用普通动作回归损失;BC_NB 先计算每个样本自己的 MSE 或 SmoothL1 损失,再乘以 sample weight,最后做加权平均。
通俗理解:
这些设计都是为了让训练别忽上忽下:先把状态数值整理到相近范围,再限制梯度过大,学习率也会慢慢变小。
技术对应:
两者都包含状态标准化、梯度裁剪、权重衰减和余弦退火学习率;BC 还支持 SmoothL1Loss 与可选 LayerNorm,减少异常样本和尺度差异带来的影响。
| data_path | 数据集路径 |
|---|---|
| batch_size | 批大小 |
| lr | 学习率 |
| num_epochs | 训练轮数 |
| hidden_layers | 隐藏层结构 |
| seed | 随机种子 |
| val_ratio | 验证集比例 |
| output_dir | 输出目录 |
| BC.use_layernorm | 是否使用 LayerNorm |
|---|---|
| BC.use_smooth_l1 | 是否使用 SmoothL1Loss |
| BC_NB.loss_type | 逐样本损失类型,支持 mse / smooth_l1 |
| BC_NB.weight_temperature | 控制样本权重差异程度 |
| BC_NB.min_weight / max_weight | 限制样本权重上下界 |
| action_clip_eps | 动作截断稳定项 |
建议先理解常用参数,再看进阶参数。
定义训练参数并将配置写入 train_config.json。
读取 observations/actions,切分训练集与验证集。
MLP 策略网络,输出动作。
完成训练、验证、最佳模型保存和日志导出。
根据 rewards 与 terminals 计算 episode return,并得到样本权重。
先算逐样本损失,再结合权重进行训练。
| 对比项 | BC | BC_NB |
|---|---|---|
| 核心思路 | 普通行为克隆,直接回归动作 | 加权行为克隆,优先学习高回报轨迹样本 |
| 输入字段 | observations, actions | observations, actions, rewards, terminals |
| 损失方式 | 普通回归损失 | 逐样本损失 × sample weights |
| 典型参数 | use_layernorm, use_smooth_l1 | loss_type, weight_temperature, min_weight, max_weight |
| 适用理解 | 适合作为最基础基线 | 适合展示“在基线上做改进”的思路 |