神经网络如何根据无法直接控制的外部条件从测试输出中学习

How can a Neural Network learn from testing outputs against external conditions which it can not directly control

为了简化问题并希望得到答案,我将提供一个稍微简化的版本来说明我正在尝试做的事情。

设置固定条件:

假设我有这些输入:

(可能的输出反馈为输入?):

以下是我的程序可以执行的操作(输出):

  1. 每秒改变周期 increment/decrement(每秒 0.0 到 0.1 个周期)
  2. 更改每个周期添加的 O2 单位(从每个周期 0 到 100 个单位)
  3. 更改当前最大入住人数(0 到 100 人)-(基本上允许强制减少入住人数,然后使其恢复到最大值)

该计划的目标是维持体内平衡:

注意:入住率可能会根据无法控制的外部因素每秒波动(假设人们自由进出房间)。系统唯一的控制是强制将人从房间中移除 and/or 通过及时更改下一个周期允许的最大容量来防止新人进入房间(假设系统可以做到这一点)。我们不希望系统仅仅因为它每秒只能支持 30 人运行全功率输出足够的氧气而永久降低容量。我们有大量可用的 O2,需要一段时间才能耗尽到危险水平,并且需要系统强制减少容量。

我的问题:

有人可以向我解释我如何配置这个神经网络,以便它可以通过监视所需的结果从它采取的每个动作(循环)中学习。我在这里面临的挑战是,我找到的关于该主题的大多数文章都假设您知道正确的输出答案(即:我知道 A、B、C、D、E 输入都是特定值,那么输出 1 应该增加 0.1 个周期每秒)。

但我想要的是满足我在上面的目标中列出的条件。因此,每次程序执行一个循环并假设它决定尝试增加每秒的循环数时,结果是可用 O2 的下降量低于前一个循环,或者现在正在增加回到 100,000,然后该输出可以被认为比减少每秒循环数或保持当前每秒循环数更正确。我在这里进行了简化,因为有多个变量会产生 "ideal" 结果 - 但我想我已经说明了我所追求的。

代码:

对于这个测试练习,我使用了一个名为 Swift-AI 的 Swift 库(特别是它的 NeuralNet 模块:https://github.com/Swift-AI/NeuralNet

因此,如果您想定制与该库相关的响应,这会有所帮助,但不是必需的。我更多的只是在寻找如何设置网络的逻辑,然后将其配置为根据我上面列出的条件对自身进行初始和迭代重新训练。我假设在经过足够多的周期和不同的条件后的某个时刻,它会有适当的权重设置来处理任何未来的条件,并且重新训练的影响会越来越小。

这是一个控制问题,不是预测问题,所以你不能只使用监督学习算法。 (正如您所注意到的,您没有通过反向传播直接学习的目标值。)您仍然可以使用神经网络(如果您真的坚持)。看看 reinforcement learning。但是如果你已经知道当你采取像强迫人们离开这样的行动时氧气水平会发生什么变化,为什么你会通过数百万次反复试验的评估来了解这么简单的事实,而不是将其编码到模型中?

我建议看看model predictive control. If nothing else, you should study how the problem is framed there. Or maybe even just plain old PID control。用很少的状态变量为这个过程建立一个好的动力学模型似乎真的很容易。

您可能需要了解该模型中的一些未知参数 "online"。但是一个简单的 PID 控制器已经可以容忍和补偿一定程度的不确定性。 fine-tune 几个参数比从头开始学习一般的 cause-effect 结构要容易得多。这是可以做到的,但它涉及尝试所有可能的行动。就你的算法所知,最好的行动可能是通过杀死氧气消耗者将氧气消耗者的数量永久减少到零,然后以很少的能量维持氧气水平而获得巨额奖励。当算法对问题一无所知时,它将不得不尝试一切以发现效果。