基础知识回顾
1.强化学习(Agent、Environment)
在 RL 中,代理通过不断与环境交互、以试错的方式进行学习,在不确定性下做出顺序决策,并在探索(新领域)和开发(使用从经验中学到的知识)之间取得平衡。 (探索利用问题)
已经使用stable_baseline3做过一些列实验,sb3这个库相对简单,但是训练起来感觉并不是很好;
ElegantRL 在 Actor-Critic 框架下实现 DRL 算法,其中 Agent(又名 DRL 算法)由 Actor 网络和 Critic 网络组成。由于代码结构的完整性和简单性,用户能够轻松自定义自己的代理。
该开源库的框架很清楚的描述了运行流程,Run.py来实现Agent和Environment的交互;
ElegantRL 的文件结构如图 1 所示:
- Env.py:它包含代理与之交互的环境。
- 用于健身房环境修改的 PreprocessEnv 类。
- 以自建股票交易环境为例,进行用户自定义。
2. Net.py:有三种类型的网络:
- Q-Net,
- Actor Network、
- 评论家网络,
每个 API 都包括一个用于继承的基本网络和一组用于不同算法的变体。
3. Agent.py:它包含不同 DRL 算法的代理。
4. Run.py:提供训练和评估过程的基本功能:
- 参数初始化 /
- 训练环 /
- 计算器。
作为高级概述,文件之间的关系如下。在 Env.py 中初始化环境,在 Agent.py 中初始化代理。该代理是使用 Net.py 中的 Actor 和 Critic 网络构建的。在 Run.py 的每个训练步骤中,代理与环境交互,生成存储到 Replay Buffer 中的转换。然后,代理从 Replay Buffer 获取转换以训练其网络。每次更新后,评估器都会评估代理的性能,如果性能良好,则会保存代理。
该库每个DRL算法代理都遵循其基类中的层次结构
如图 2 所示,DQN 系列算法的继承层次结构如下:
- AgentDQN:标准 DQN Agent。
- AgentDoubleDQN:继承自 AgentDQN 的双 DQN 代理,具有两个用于减少高估的 Q-Net。
- AgentDuelingDQN:继承自 AgentDQN 的 Q 值计算不同 DQN 代理。
- AgentD3QN:AgentDoubleDQN 和 AgentDuelingDQN 的组合,继承自 AgentDoubleDQN。
class AgentBase: def init(self); def select_action(states); # states = (state, …) def explore_env(env, buffer, target_step, reward_scale, gamma); def update_net(buffer, max_step, batch_size, repeat_times); def save_load_model(cwd, if_save); def soft_update(target_net, current_net); class AgentDQN: def init(net_dim, state_dim, action_dim); def select_action(states); # for discrete action space def explore_env(env, buffer, target_step, reward_scale, gamma); def update_net(buffer, max_step, batch_size, repeat_times); def save_or_load_model(cwd, if_save); class AgentDuelingDQN(AgentDQN): def init(net_dim, state_dim, action_dim);class AgentDoubleDQN(AgentDQN): def init(self, net_dim, state_dim, action_dim); def select_action(states); def update_net(buffer, max_step, batch_size, repeat_times); class AgentD3QN(AgentDoubleDQN): # D3QN: Dueling Double DQN def init(net_dim, state_dim, action_dim);
在构建 DRL 代理时应用这样的层次结构可以有效地提高轻量级和有效性。用户可以在类似的流程中轻松设计和实施新代理。
基本上,一个智能体有两个基本功能,数据流如图所示:
- explore_env():它允许代理与环境交互并为训练网络生成转换。
- update_net() :它首先从 Replay Buffer 中获取一批 transitions,然后使用反向传播训练网络。
训练piple
train代理的两个主要步骤:
- 初始化:
- hyper-parameters 参数 args 的 Json 参数。
- env = PreprocessEnv() :创建一个环境(以 OpenAI gym 格式)。
- agent = AgentXXX() :为 DRL 算法创建代理。
- evaluator = Evaluator() :评估并存储经过训练的模型。
- buffer = ReplayBuffer() :存储过渡。
2. 然后,训练过程由 while 循环控制:
- agent.explore_env(...):代理在 Target Steps 中探索环境,生成转换,并将其存储到 ReplayBuffer 中。
- agent.update_net(...):代理使用 ReplayBuffer 中的批处理来更新网络参数。
- evaluator.evaluate_save(...):评估代理的性能,并保持经过训练的模型获得最高分。
while 循环将在满足条件时终止,例如,达到目标分数、最大步数或手动中断。