神经网络如何根据无法直接控制的外部条件从测试输出中学习
How can a Neural Network learn from testing outputs against external conditions which it can not directly control
为了简化问题并希望得到答案,我将提供一个稍微简化的版本来说明我正在尝试做的事情。
设置固定条件:
- 房间允许的最大氧气量 = 100,000 单位
- 房间内要维持的目标氧气量 = 100,000 单位
- 每秒最大 Air 处理周期 == 每秒 3.0 个周期(最小值为 0.3)
- 每秒使用的能量(瓦特)是这个公式:(100w * cycles_per_second)SQUARED
- 每 "cycle" 添加到空气中的最大氧气 = 100 个单位(最少 0 个单位)
- 1 人每秒消耗 10 个单位的 O2
- 房间最多可入住 100 人(最少 1 人)
- 每个周期都处理输入,每个周期都可以更改输出 - 但是,如果输出作为输入反馈回来,它只会影响下一个周期。
假设我有这些输入:
- 一个。房间内的当前氧气(范围:为简单起见,0 到 1000 单位 - 可以归一化)
- 乙。房间当前入住率(最大容量时 0 到 100 人)OR/AND 可以更改为房间内所有人每秒使用的总 O2(每秒 0 到 1000 单位)
- C。当前每秒空气处理周期(每秒 0.3 到 3.0 个周期)
- D.当前使用的能量(就是上面的每秒电流周期*100然后平方)
- E.当前每个循环添加到空气中的氧气(0 到 100 单位)
(可能的输出反馈为输入?):
- F.之前对每秒周期的更改(+ 或 - 每秒 0.0 到 0.1 个周期)
- G。以前的周期每个周期添加 O2 单位(每个周期从 0 到 100 个单位)
- H.先前对当前最大容纳人数的更改(0 到 100 人)
以下是我的程序可以执行的操作(输出):
- 每秒改变周期 increment/decrement(每秒 0.0 到 0.1 个周期)
- 更改每个周期添加的 O2 单位(从每个周期 0 到 100 个单位)
- 更改当前最大入住人数(0 到 100 人)-(基本上允许强制减少入住人数,然后使其恢复到最大值)
该计划的目标是维持体内平衡:
- 室内氧气接近 100,000 单位
- 永远不允许空间降到 0 个氧气单位。
- 允许每个房间目前最多容纳 100 人,并尽可能长时间地入住,而无需强行移走人员(因为房间内的氧气会随着时间的推移而耗尽,接近 0 单位时,应将人员从房间移走至最低限度,然后允许随着越来越多的 02 被添加回房间,最多可以恢复到 100)
- 并且理想情况下使用维持上述两个条件所需的最小能量(瓦特)。例如,如果房间的 O2 降至 90,000 单位,而房间内目前有 10 人(每秒使用 100 单位的 O2),那么 运行ning 将以每秒 3.0 周期(90 千瓦)和每秒 100 个单位,每秒补充 300 个单位(消耗的 100 个单位中有 200 个单位过剩),超过 50 秒补充 10,000 个单位的不足,总共使用 4500 千瓦。 - 更理想的是 运行 以每秒 2.0 周期(40 千瓦)表示,这将在 100 秒内每秒生产 200 个单位(比消耗单位多出 100 个单位)以补充 10,000 个单位的不足,并且共使用4000千瓦。
注意:入住率可能会根据无法控制的外部因素每秒波动(假设人们自由进出房间)。系统唯一的控制是强制将人从房间中移除 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 结构要容易得多。这是可以做到的,但它涉及尝试所有可能的行动。就你的算法所知,最好的行动可能是通过杀死氧气消耗者将氧气消耗者的数量永久减少到零,然后以很少的能量维持氧气水平而获得巨额奖励。当算法对问题一无所知时,它将不得不尝试一切以发现效果。
为了简化问题并希望得到答案,我将提供一个稍微简化的版本来说明我正在尝试做的事情。
设置固定条件:
- 房间允许的最大氧气量 = 100,000 单位
- 房间内要维持的目标氧气量 = 100,000 单位
- 每秒最大 Air 处理周期 == 每秒 3.0 个周期(最小值为 0.3)
- 每秒使用的能量(瓦特)是这个公式:(100w * cycles_per_second)SQUARED
- 每 "cycle" 添加到空气中的最大氧气 = 100 个单位(最少 0 个单位)
- 1 人每秒消耗 10 个单位的 O2
- 房间最多可入住 100 人(最少 1 人)
- 每个周期都处理输入,每个周期都可以更改输出 - 但是,如果输出作为输入反馈回来,它只会影响下一个周期。
假设我有这些输入:
- 一个。房间内的当前氧气(范围:为简单起见,0 到 1000 单位 - 可以归一化)
- 乙。房间当前入住率(最大容量时 0 到 100 人)OR/AND 可以更改为房间内所有人每秒使用的总 O2(每秒 0 到 1000 单位)
- C。当前每秒空气处理周期(每秒 0.3 到 3.0 个周期)
- D.当前使用的能量(就是上面的每秒电流周期*100然后平方)
- E.当前每个循环添加到空气中的氧气(0 到 100 单位)
(可能的输出反馈为输入?):
- F.之前对每秒周期的更改(+ 或 - 每秒 0.0 到 0.1 个周期)
- G。以前的周期每个周期添加 O2 单位(每个周期从 0 到 100 个单位)
- H.先前对当前最大容纳人数的更改(0 到 100 人)
以下是我的程序可以执行的操作(输出):
- 每秒改变周期 increment/decrement(每秒 0.0 到 0.1 个周期)
- 更改每个周期添加的 O2 单位(从每个周期 0 到 100 个单位)
- 更改当前最大入住人数(0 到 100 人)-(基本上允许强制减少入住人数,然后使其恢复到最大值)
该计划的目标是维持体内平衡:
- 室内氧气接近 100,000 单位
- 永远不允许空间降到 0 个氧气单位。
- 允许每个房间目前最多容纳 100 人,并尽可能长时间地入住,而无需强行移走人员(因为房间内的氧气会随着时间的推移而耗尽,接近 0 单位时,应将人员从房间移走至最低限度,然后允许随着越来越多的 02 被添加回房间,最多可以恢复到 100)
- 并且理想情况下使用维持上述两个条件所需的最小能量(瓦特)。例如,如果房间的 O2 降至 90,000 单位,而房间内目前有 10 人(每秒使用 100 单位的 O2),那么 运行ning 将以每秒 3.0 周期(90 千瓦)和每秒 100 个单位,每秒补充 300 个单位(消耗的 100 个单位中有 200 个单位过剩),超过 50 秒补充 10,000 个单位的不足,总共使用 4500 千瓦。 - 更理想的是 运行 以每秒 2.0 周期(40 千瓦)表示,这将在 100 秒内每秒生产 200 个单位(比消耗单位多出 100 个单位)以补充 10,000 个单位的不足,并且共使用4000千瓦。
注意:入住率可能会根据无法控制的外部因素每秒波动(假设人们自由进出房间)。系统唯一的控制是强制将人从房间中移除 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 结构要容易得多。这是可以做到的,但它涉及尝试所有可能的行动。就你的算法所知,最好的行动可能是通过杀死氧气消耗者将氧气消耗者的数量永久减少到零,然后以很少的能量维持氧气水平而获得巨额奖励。当算法对问题一无所知时,它将不得不尝试一切以发现效果。