跳转到内容

工业基准控制任务

任务概述

工业基准环境示例

工业基准(Industrial Benchmark,IB)是一个专为强化学习设计的基准环境,旨在模拟真实工业控制场景中的复杂特性,例如风力发电、燃气轮机控制、化学反应器,能够有效测试强化学习算法在复杂工业环境中的表现。

环境特性

工业基准环境具有以下典型特征:

  • 高维连续空间:状态和动作空间均为连续高维向量
  • 延迟奖励机制:奖励信号具有时间延迟特性
  • 复杂噪声模式:包含多种类型的系统噪声和干扰
  • 多目标优化:需要同时满足多个相互关联的控制目标
  • 高度随机性:系统行为具有显著的不确定性

环境规格

参数规格
动作空间连续3维向量 Continuous(3,)
观察空间180维向量 Shape (180,)
奖励类型即时奖励 + 延迟奖励
环境类型连续控制

动作空间详解

动作空间由连续的3维向量组成,每个维度对应不同的控制变量。详细的动作空间定义和约束条件请参考 NeoRL 研究文档

观察空间详解

观察空间是一个180维的向量,其构成方式如下:

  • 基础观测:每个时间步的原始观测为6维向量
  • 历史拼接:数据集自动将前29帧的历史观测数据与当前帧拼接
  • 最终维度180=6×30(当前帧 + 29帧历史)

这种设计能够为模型提供足够的历史信息来理解系统的动态特性。详细的观察空间定义请参考 NeoRL 研究文档

任务目标

工业基准控制任务的核心目标是让系统的各项关键指标维持在预定的目标值附近,具体包括:

  • 性能指标:确保系统运行在最优性能区间
  • 稳定性指标:维持系统状态的稳定性
  • 效率指标:优化资源消耗和运行效率
  • 安全指标:确保系统运行在安全范围内

详细的奖励函数设计和目标指标定义请参考 工业基准任务奖励函数

训练流程

REVIVE 是一个基于历史数据的离线强化学习工具。在工业基准控制任务上使用 REVIVE 的完整流程如下:

1. 数据准备阶段

收集历史决策数据

  • 收集工业基准任务的历史运行数据
  • 进行数据预处理和清洗

2. 模型构建阶段

构建决策流图和训练数据

  • 结合业务场景和历史数据构建 决策流图
  • 决策流图使用 .yaml 文件描述业务数据的交互逻辑
  • 训练数据使用 .npz.h5 文件存储决策流图中定义的节点数据

定义奖励函数

  • 根据任务目标设计 奖励函数
  • 奖励函数指导控制策略优化,确保系统指标维持在目标范围内

3. 模型训练阶段

开始模型训练

  • 完成决策流图、训练数据和奖励函数定义后
  • 使用 REVIVE 进行虚拟环境模型训练
  • 基于训练好的虚拟环境进行策略模型训练

4. 部署测试阶段

上线测试

  • 将训练好的策略模型部署到实际环境
  • 进行性能验证和效果评估
  • 根据测试结果进行模型优化

数据准备

我们使用 NeoRL 数据集中的工业基准数据作为训练数据源。该数据集包含了丰富的工业控制场景数据,能够有效支持模型训练。详细的数据集信息请参考 NeoRL 研究文档

决策流图配置

工业基准任务的训练过程涉及异构决策流图的加载,需要为虚拟环境训练和策略训练分别配置不同的决策流图。

虚拟环境训练配置

以下是用于 虚拟环境模型训练.yaml 配置文件:

yaml
metadata:
    graph:
        # 虚拟环境训练时不包含动作节点
        #action:
        #- obs
        current_next_obs:
        - obs
        - action
        next_obs:
        - obs
        - current_next_obs

    columns:
    # 观察空间定义(180维)
    - obs_0:
        dim: obs
        type: continuous
    - obs_1:
        dim: obs
        type: continuous
    ...
    - obs_179:
        dim: obs
        type: continuous

    # 当前时刻的下一时刻观察(6维)
    - obs_0:
        dim: current_next_obs
        type: continuous
    - obs_1:
        dim: current_next_obs
        type: continuous
    ...
    - obs_5:
        dim: current_next_obs
        type: continuous

    # 动作空间定义(3维)
    - action_0:
        dim: action
        type: continuous
    - action_1:
        dim: action
        type: continuous
    - action_2:
        dim: action
        type: continuous

    expert_functions:
        next_obs:
        'node_function' : 'expert_function.next_obs'

策略训练配置

以下是用于 策略模型训练.yaml 配置文件:

yaml
metadata:
    graph:
        # 策略训练时包含动作节点
        action:
        - obs
        current_next_obs:
        - obs
        - action
        next_obs:
        - obs
        - current_next_obs

    columns:
    # 观察空间定义(180维)
    - obs_0:
        dim: obs
        type: continuous
    - obs_1:
        dim: obs
        type: continuous
    ...
    - obs_179:
        dim: obs
        type: continuous

    # 当前时刻的下一时刻观察(6维)
    - obs_0:
        dim: current_next_obs
        type: continuous
    - obs_1:
        dim: current_next_obs
        type: continuous
    ...
    - obs_5:
        dim: current_next_obs
        type: continuous

    # 动作空间定义(3维)
    - action_0:
        dim: action
        type: continuous
    - action_1:
        dim: action
        type: continuous
    - action_2:
        dim: action
        type: continuous

    expert_functions:
        next_obs:
        'node_function' : 'expert_function.next_obs'

奖励函数设计

工业基准任务的奖励函数基于疲劳度和消耗量两个关键指标设计:

python
import torch
from typing import Dict

def get_reward(data: Dict[str, torch.Tensor]) -> torch.Tensor:
    """
    工业基准任务奖励函数

    Args:
        data: 包含观察和下一时刻观察的字典

    Returns:
        计算得到的奖励值
    """
    obs = data["obs"]
    next_obs = data["next_obs"]

    # 处理单样本和批量样本
    single_reward = False
    if len(obs.shape) == 1:
        single_reward = True
        obs = obs.reshape(1, -1)
    if len(next_obs.shape) == 1:
        next_obs = next_obs.reshape(1, -1)

    # 定义奖励系数
    CRF = 3.0  # 疲劳度系数
    CRC = 1.0  # 消耗量系数

    # 提取关键指标
    fatigue = next_obs[:, 4]      # 疲劳度指标
    consumption = next_obs[:, 5]  # 消耗量指标

    # 计算成本(负奖励)
    cost = CRF * fatigue + CRC * consumption
    reward = -cost

    # 返回适当格式的奖励
    if single_reward:
        reward = reward[0].item()
    else:
        reward = reward.reshape(-1, 1)

    return reward

奖励函数说明

  • 疲劳度惩罚:系数为3.0,鼓励系统减少疲劳累积
  • 消耗量惩罚:系数为1.0,优化资源使用效率
  • 负奖励设计:将成本转换为负奖励,最小化成本即最大化奖励
  • 批量处理:支持单样本和批量样本的奖励计算

模型训练

REVIVE 提供了完整的训练代码和数据集。完成 REVIVE 安装后,可以按照以下步骤进行训练:

环境准备

  1. 切换到示例目录:
bash
cd examples/task/IB
  1. 确认数据文件存在:
bash
ls data/
# 应该包含:ib.npz, ib_env.yaml, ib_policy.yaml, ib_reward.py, config.json

训练命令

1. 虚拟环境模型训练

bash
python train.py \
    -df data/ib.npz \
    -cf data/ib_env.yaml \
    -rf data/ib_reward.py \
    -rcf data/config.json \
    -vm tune \
    -pm None \
    --run_id ib

2. 策略模型训练

bash
python train.py \
    -df data/ib.npz \
    -cf data/ib_policy.yaml \
    -rf data/ib_reward.py \
    -rcf data/config.json \
    -vm None \
    -pm tune \
    --run_id ib

训练监控

训练过程中可以使用 TensorBoard 监控训练进度:

bash
tensorboard --logdir logs/ib

然后在浏览器中访问 http://localhost:6006 查看训练曲线和指标。

训练结果

训练完成后,您可以在 logs/ib 目录下找到训练日志和模型。

模型测试

训练完成后,可以使用提供的 Jupyter Notebook 脚本对训练好的策略进行性能测试和评估。

测试脚本

详细的使用方法请参考 测试策略 Notebook