首页 > 解决方案 > 神经网络如何从无法直接控制的外部条件的测试输出中学习

问题描述

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

设置固定条件:

可以说我有这些输入:

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

以下是我的程序可以采取的行动(输出):

  1. 通过递增/递减(每秒 0.0 到 0.1 个周期)改变每秒周期数
  2. 更改每个周期添加的 O2 单位(从每个周期 0 到 100 个单位)
  3. 更改当前最大入住人数(0 到 100 人)-(基本上允许强制减少入住人数,然后使其正常化回最大人数)

该计划的目标是保持以下平衡:

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

我的问题:

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

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

代码:

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

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

标签: swiftmachine-learningneural-networkartificial-intelligencerecurrent-neural-network

解决方案


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

我建议看看模型预测控制。如果不出意外,您应该研究那里的问题是如何形成的。或者甚至可能只是普通的旧PID 控制。用很少的状态变量为这个过程建立一个好的动态模型似乎真的很容易。

您可能在该模型中有一些未知参数需要“在线”学习。但是一个简单的 PID 控制器已经可以容忍和补偿一些不确定性。与从头开始学习一般的因果结构相比,微调一些参数要容易得多。它可以做到,但它涉及尝试所有可能的操作。就您的算法所知,最好的行动可能是通过杀死氧气消耗者将其永久减少到零,然后以很少的能量维持氧气水平而获得巨大的回报。当算法对问题一无所知时,它将不得不尝试一切以发现效果。


推荐阅读