如何为强化学习创建自定义环境

人工智能 强化学习 环境
2021-11-07 06:35:37

我是一个从事大学项目的强化学习新手。该项目与优化硬件功率有关。我在 Linux 发行版 (16.04) 中运行专有软件。目标是使用强化学习并优化系统的功能(尽可能减少软件的性能下降)。

为此,我需要为我的强化学习创建一个自定义环境。通过阅读不同的材料,我可以理解我需要将我的软件作为一个自定义环境,我可以从中检索state功能。Action空间可能包含更改 Linux 电源的指令(我可以使用一些预定义的电源选项集)。

专有软件是蜂窝网络,state变量包括latencythroughput要控制电源action space可以使用rapl-tools来控制 CPU 电源。

我刚开始从事这个项目,一切似乎都很模糊。完成这项工作的最佳方法是什么?是否有一些教程或材料可以帮助我弄清楚。我对为强化学习创建自定义环境的理解是否正确?

1个回答

该答案假定您的“专有软件”是真实环境的模拟或控制器。


是的,您很可能需要编写软件以某种标准方式将您的环境表示为强化学习 (RL) 环境。根据细节,这可能很简单,也可能非常复杂。

RL 中的环境通常必须具有以下特征,才能与 RL 代理软件交互:

  • 状态表示。这通常是与真实环境中的传感器读数相匹配的对象或数据数组。状态具有马尔可夫属性对 RL 很重要,这样价值预测才能准确。对于某些环境,这意味着从观察中计算派生值,或者将来自传感器的最后几次观察的组合历史表示为状态。

    • 状态可以保存在环境的内部表示中,这是一种典型的面向对象方法,也可以作为参数传递给其他函数。

    • 一个简单的状态可能只是一个固定大小的数字数组,代表环境的重要特征,在与神经网络一起使用时方便地在 -1 和 1 之间缩放。

  • 动作表示。

    • 一个简单的动作表示可以只是一个整数,它标识从 0 开始选择了 N 个动作中的哪一个。这允许在检查值函数估计时进行基本的索引查找。
  • 奖励功能。这是问题定义的一部分,您可能希望将该代码作为环境的一部分或代理的一部分或介于两者之间的某个位置,具体取决于它改变的可能性 - 例如,如果您想运行多个优化的实验控制的不同方面但在相同的环境中,您可以制作一个完全独立的奖励计算模块,您可以将其与代理和环境代码在较高级别结合起来。

  • 时间步长函数。这应该采取行动选择,并且应该更新一个时间步的状态 - 返回下一个状态和立即奖励。如果环境是真实的,那么代码将进行实际更改(例如移动机械臂),可能等待时间步过去,然后读取传感器以获取下一个状态并计算奖励。如果环境是模拟的,那么代码应该调用一些内部模型来计算下一个状态。这个函数应该调用你为你的任务提供的专有软件。

如果可用的操作取决于当前状态,那么其代码可以存在于环境模拟或代理中,或者是代理可以调用​​的一些辅助函数,因此它可以在选择之前过滤操作。

如果您使用 Python,为了帮助使其更具体,并遵循现有设计,请参阅“如何在 OpenAI 中创建新的健身房环境?” 关于堆栈溢出。Open AI 环境都遵循相同的环境定义约定,这有助于编写代理来解决它们。我还建议找到一个与您的问题相似的 Open AI Gym 环境,看看它是如何工作的,并尝试训练一个代理来解决它。

可能仍有工作将您的环境与可以解决它的代理相匹配。这取决于您使用的代理软件。

即使您编写自己的代理软件,也有助于像这样分离环境代码。环境是要解决的问题,RL 代理是寻找解决方案的一种方式。将这些部分分开是一种有用的设计,可以让您尝试不同类型的代理并比较它们的性能。