BC算法实现

This commit is contained in:
2026-02-02 01:18:18 +08:00
parent 265b0eade1
commit 21c046aef0
25 changed files with 632 additions and 322 deletions

52
Algorithm/bc.py Normal file
View File

@@ -0,0 +1,52 @@
"""
Behavior Cloning (BC) 算法:仅包含损失与单 epoch 训练/评估逻辑。
数据加载、环境评估、日志与保存由训练脚本 (train_bc.py) 负责。
"""
import torch
def bc_loss(policy, states, actions):
"""
BC 损失:负对数似然 -E[log pi(a|s)]。
states: (B, state_dim), actions: (B, action_dim), 均在 policy 所在 device 上。
"""
log_pi = policy.evaluate_log_pi(states, actions)
return -log_pi.mean()
def train_bc_epoch(policy, train_loader, optimizer, device):
"""
训练一个 epoch返回平均 train loss。
policy 与 optimizer 由调用方管理,本函数只做前向、损失、反向与 step。
"""
policy.train()
total_loss = 0.0
n_batches = 0
for states, actions in train_loader:
states = states.to(device)
actions = actions.to(device)
loss = bc_loss(policy, states, actions)
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
n_batches += 1
return total_loss / n_batches if n_batches else 0.0
def eval_bc_epoch(policy, val_loader, device):
"""
在验证集上评估一个 epoch返回平均 val loss无梯度
"""
policy.eval()
total_loss = 0.0
n_batches = 0
with torch.no_grad():
for states, actions in val_loader:
states = states.to(device)
actions = actions.to(device)
log_pi = policy.evaluate_log_pi(states, actions)
loss = -log_pi.mean().item()
total_loss += loss
n_batches += 1
return total_loss / n_batches if n_batches else 0.0