自学内容网 自学内容网

大论文记录

基础知识回顾

1.强化学习(Agent、Environment)

在 RL 中,代理通过不断与环境交互、以试错的方式进行学习,在不确定性下做出顺序决策,并在探索(新领域)和开发(使用从经验中学到的知识)之间取得平衡。   (探索利用问题)

已经使用stable_baseline3做过一些列实验,sb3这个库相对简单,但是训练起来感觉并不是很好;

ElegantRL 在 Actor-Critic 框架下实现 DRL 算法,其中 Agent(又名 DRL 算法)由 Actor 网络和 Critic 网络组成。由于代码结构的完整性和简单性,用户能够轻松自定义自己的代理。

该开源库的框架很清楚的描述了运行流程,Run.py来实现Agent和Environment的交互;

ElegantRL 的文件结构如图 1 所示:

  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代理的两个主要步骤:

  1. 初始化
  • 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 循环将在满足条件时终止,例如,达到目标分数、最大步数或手动中断。


原文地址:https://blog.csdn.net/weixin_45302337/article/details/142684254

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!