BC / BC_NB

这一组方法适合新手理解“离线强化学习里最像监督学习”的思路:直接根据数据集中已有的状态和动作来学策略。

选择算法对

小白先看

先把它理解成“照着老师给的标准答案学动作”。BC 直接学动作,BC_NB 则更重视高质量轨迹里的样本。

BC:把状态当输入,把数据集里的动作当标签,训练一个策略网络。

BC_NB:在 BC 基础上给样本加权,让高回报轨迹中的样本更重要。

适合用来做入门基线,因为训练流程清楚、结果容易解释。

方法流程

  1. 读取 HDF5 数据集。
  2. 划分训练集与验证集。
  3. 根据训练集计算状态标准化参数。
  4. 构建 MLP 策略网络。
  5. 执行训练、验证并保存最佳模型。
  6. 输出日志、评估汇总与曲线图。

核心设计

数据处理

通俗理解:
可以把 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动作截断稳定项

建议先理解常用参数,再看进阶参数。

代码块讲解

AIcodes/BC.py -> Config / build_config_from_args

定义训练参数并将配置写入 train_config.json。

AIcodes/BC.py -> load_dataset

读取 observations/actions,切分训练集与验证集。

AIcodes/BC.py -> BCPolicy

MLP 策略网络,输出动作。

AIcodes/BC.py -> train_one_epoch / train_bc

完成训练、验证、最佳模型保存和日志导出。

AIcodes/BC_NB.py -> build_sample_weights

根据 rewards 与 terminals 计算 episode return,并得到样本权重。

AIcodes/BC_NB.py -> per_sample_loss

先算逐样本损失,再结合权重进行训练。

输入输出与产物

输入

  • 代码文件:AIcodes/BC.py、AIcodes/BC_NB.py
  • 数据文件:halfcheetah_medium-v2.hdf5
  • 命令行参数:学习率、轮数、隐藏层、输出目录等

输出与产物

  • checkpoints/BC/ 或 checkpoints/BC_NB/
  • best_model.pt
  • train_config.json
  • training_log.csv
  • evaluation_summary.csv
  • train_val_loss.png / train_test_loss.png / lr_curve.png

Base / NB 对比

对比项BCBC_NB
核心思路普通行为克隆,直接回归动作加权行为克隆,优先学习高回报轨迹样本
输入字段observations, actionsobservations, actions, rewards, terminals
损失方式普通回归损失逐样本损失 × sample weights
典型参数use_layernorm, use_smooth_l1loss_type, weight_temperature, min_weight, max_weight
适用理解适合作为最基础基线适合展示“在基线上做改进”的思路

小结

  • 建议先看 BC:它最像监督学习,把状态当输入、把数据集里的动作当标准答案,重点是理解“模仿已有数据”。
  • 再看 BC_NB:它在 BC 基础上加入样本权重,让高回报轨迹里的样本更重要,适合理解“好样本应该多学一点”。
  • 这一组适合作为离线强化学习入门基线,因为训练流程清楚,结果主要看动作预测误差和训练/验证曲线。
  • 如果要做算法对比,可以把 BC 看成基础版本,把 BC_NB 看成“在基础模仿上加入轨迹质量判断”的改进版本。