0 前言
官方文档:https://skrl.readthedocs.io/en/latest/api/models.html
模型(或智能体模型)是指智能体的策略、值函数等的表示,智能体使用这些策略、值函数等来做出决策。智能体可以有一个或多个模型,它们的参数由优化算法来调整。
1 继承 Model类
# 导入类型提示相关模块
from typing import Optional, Union, Mapping, Sequence, Tuple, Any
# 导入强化学习环境库(OpenAI Gym的继任者)
import gymnasium
# 导入PyTorch深度学习框架
import torch
# 从skrl库中导入PyTorch模型基类
from skrl.models.torch import Model
# 定义自定义模型类,继承自skrl的Model基类
class CustomModel(Model):
def __init__(self,
# 观测空间:可以是整数、整数序列或gymnasium.Space对象
observation_space: Union[int, Sequence[int], gymnasium.Space],
# 动作空间:可以是整数、整数序列或gymnasium.Space对象
action_space: Union[int, Sequence[int], gymnasium.Space],
# 设备:可选参数,指定模型运行的设备(CPU/GPU)
device: Optional[Union[str, torch.device]] = None) -> None:
"""自定义强化学习模型
:param observation_space: 观测/状态空间或形状。模型的`num_observations`属性将包含该空间的大小
:type observation_space: int, sequence of int, gymnasium.Space
:param action_space: 动作空间或形状。模型的`num_actions`属性将包含该空间的大小
:type action_space: int, sequence of int, gymnasium.Space
:param device: 分配或将要分配PyTorch张量的设备(默认:`None`)。如果为None,将自动选择可用设备(优先使用CUDA)
:type device: str or torch.device, optional
"""
# 调用父类构造函数初始化基础属性
super().__init__(observation_space, action_space, device)
# =====================================
# - 此处应定义自定义属性和初始化操作
# 例如神经网络层、初始化方法等
# =====================================
def act(self,
# 输入字典:包含状态等输入数据
inputs: Mapping[str, Union[torch.Tensor, Any]],
# 角色标识:用于区分不同功能的模型实例
role: str = "") -> Tuple[torch.Tensor, Union[torch.Tensor, None], Mapping[str, Union[torch.Tensor, Any]]]:
"""根据输入状态生成动作
:param inputs: 模型输入字典,常见键包括:
- "states": 用于决策的环境状态
- "taken_actions": 已采取的动作(可选)
:type inputs: dict,值通常为torch.Tensor
:param role: 模型的角色标识(例如区分策略模型和值函数模型)
:type role: str, optional
:return: 元组包含:
1. 动作张量
2. 动作对数概率(随机策略)或None(确定性策略)
3. 额外信息字典
:rtype: tuple[torch.Tensor, torch.Tensor或None, dict]
"""
# ==============================
# - 此处应实现具体的动作生成逻辑
# 示例步骤:
# 1. 从inputs中获取状态
# 2. 通过网络前向传播
# 3. 计算动作及概率
# ==============================
# 示例伪代码:
# states = inputs["states"]
# action_logits = self.net(states)
# action_dist = torch.distributions.Categorical(logits=action_logits)
# actions = action_dist.sample()
# return actions, action_dist.log_prob(actions), {}
# 当前未实现具体逻辑,需要补充
raise NotImplementedError("act方法需要具体实现")
该部分给出继承自Model类各种不同的模型,总结为下述表格
模型分类 | 作用域 | 训练的模型 | 具体算法模型 |
---|---|---|---|
Tabular model(表格模型) | 离散 | EpilonGreedyPolicy | Q-learning、SARSA |
Categorical model(分类模型) | 离散 | MLP、CNN、RNN、GRU、LSTM(输入是状态输出是离散动作概率分布) | 根据具体情况来看动作空间是连续的还是离散的以及states的输入是什么 |
Multi-Categorical model(多分类模型) | 离散 | MLP、CNN、RNN、GRU、LSTM(输入是状态输出是离散动作概率分布) | 根据具体情况来看动作空间是连续的还是离散的以及states的输入是什么 |
Gaussian mode(高斯模型) | 连续 | MLP、CNN、RNN、GRU、LSTM(输入是状态输出是动作,但这里会根据高斯分布做采样) | 根据具体情况来看动作空间是连续的还是离散的以及states的输入是什么 |
Multi-Gaussian mode(多元高斯模型) | 连续 | MLP、CNN、RNN、GRU、LSTM(输入是状态输出是动作,但这里会根据高斯分布做采样) | 根据具体情况来看动作空间是连续的还是离散的以及states的输入是什么 |
Deterministic Model(确定性模型) | 连续 | MLP、CNN、RNN、GRU、LSTM(输入是状态输出是动作,不做采样是确定的。) | 根据具体情况来看动作空间是连续的还是离散的以及states的输入是什么 |
Shared model(共享模型) | 在共享参数时使用 | 比如critic-actor模型的策略网络和价值网络一样 |
2 基于Model instantiators的模型实例化
该API接口可以通过参数设置直接实例化模型,可以通过指定输入、隐藏层和激活函数来指定。
network=[
{
"name": <NAME>, # container name
"input": <INPUT>, # container input (certain operations are supported)
"layers": [ # list of supported layers
<LAYER 1>,
...,
<LAYER N>,
],
"activations": [ # list of supported activation functions
<ACTIVATION 1>,
...,
<ACTIVATION N>,
],
},
]
具体的实例化
models = {} #这是一个字典
models["q_network"] = deterministic_model(observation_space=env.observation_space,
action_space=env.action_space,
device=device,
clip_actions=False,
network=[{
"name": "net",
"input": "STATES",
"layers": [64, 64],
"activations": "relu",
}],
output="ACTIONS")
models["target_q_network"] = deterministic_model(observation_space=env.observation_space,
action_space=env.action_space,
device=device,
clip_actions=False,
network=[{
"name": "net",
"input": "STATES",
"layers": [64, 64],
"activations": "relu",
}],
output="ACTIONS")