过去三个月我一直在开发一个模糊逻辑SDK,现在到了需要大幅优化引擎的阶段了。
与大多数基于“效用”或“需求”的AI系统一样,我的代码通过在世界各地放置各种广告,将这些广告与不同代理的属性进行比较,并根据每个代理的情况对广告进行“评分”。
这反过来会为大多数单一代理的模拟产生高度重复的图表。然而,如果考虑到多个代理,系统会变得非常复杂,我的电脑模拟起来会变得非常困难(因为代理之间可以相互广播广告,形成一个NP算法)。
下图:系统在单一代理的三个属性上的重复性计算示例:
上图:系统在三个属性和八个代理上的计算示例:
(开始时崩溃,之后不久恢复。这是我在图像上能展示的最佳示例,因为恢复过程通常非常缓慢)
从这两个示例中可以看出,即使代理数量增加,系统仍然高度重复,因此浪费了宝贵的计算时间。
我一直在尝试重新架构程序,以便在高度重复的时期,Update函数只需持续重复线图即可。
虽然我的模糊逻辑代码确实可以预测系统的崩溃和稳定,但这对我的CPU负担极大。我考虑使用机器学习可能是最佳途径,因为一旦系统初始设置完成,不稳定期似乎总是持续相同的时间长度(然而,它们发生在“半”随机的时间点。我说半随机,是因为通常可以通过图表上显示的明显模式轻松注意到;然而,像不稳定期的长度一样,这些模式在不同设置之间差异很大)。
显然,如果不稳定期的时间长度相同,一旦我知道系统何时崩溃,就很容易判断它何时会达到平衡。
关于这个系统的补充说明,并非所有配置在重复期间都是100%稳定的。
图表中非常清楚地显示了这一点:
因此,机器学习解决方案需要一种方法来区分“伪”崩溃和完全崩溃。
使用机器学习解决方案的可行性如何?有人能推荐一些最适合的算法或实现方法吗?
至于可用资源,分数代码完全不适合并行架构(由于代理之间的紧密联系),所以如果我需要专门使用一两个CPU线程来进行这些计算,那就这样吧。(我宁愿不使用GPU,因为GPU正在处理程序中与AI无关的部分)。
虽然这可能不会产生太大影响,但代码运行的系统在执行期间还有18GB的RAM可用。因此,使用可能高度依赖数据的解决方案肯定是可行的。(虽然除非必要,我更希望避免这样做)
回答:
是的,我也不能确定StackExchange上是否有更适合讨论这个话题的地方,但我会尝试一下,因为我在这方面有一些经验。
这是在控制系统工程中经常遇到的问题,通常被称为黑盒时间序列建模问题。它是“黑盒”,因为你不知道里面到底是什么。你给它一些输入,你可以测量一些输出。给定足够的数据,一个足够简单的系统,以及适当的建模技术,通常可以近似系统的行为。
许多用于此的建模技术都围绕着获取一定数量的过去输入和/或测量,并尝试预测下一个时间点的测量值。这通常被称为自回归模型。
根据你试图建模的系统的复杂性,非线性自回归外生模型可能是更好的选择。这可以采用神经网络或径向基函数的形式,再次以过去n个时间测量值作为输入,并给出下一个测量值的预测作为输出。
查看你的数据,应用类似的技术,可以轻松构建振荡行为的简单模型。关于你的崩溃或伪崩溃建模,我认为这可以通过使用足够复杂的模型来捕捉,但可能更困难。
所以,让我们举一个简单的例子,尝试说明你如何构建某种振荡行为的自回归模型。
对于一个系统,我们采用一个带有频率的简单正弦波,并加入一些高斯噪声。这可以用测量值,某个频率
,和在某个离散时间点k的高斯噪声
来表示。
使用这个,我们可以生成几秒钟的数据测量值。有了这些,我们然后构建一个包含两个数组的数据集。第一个包含任何时间步长的历史测量值,第二个包含任何给定时间步长的测量值
。
如果我们使用维基百科文章中的线性模型,自回归模型的参数可以通过使用线性最小二乘法的线性回归找到。
将这个模型的结果直接与数据集进行比较,对于这个玩具问题很容易获得准确的结果。如果只需要预测未来一步,并且在进行下一个预测之前再次收集真实测量值,预测中的误差不会累积。这有时被称为进行开环预测。
闭环预测是你只给模型一个初始测量值。之后,你使用自己的预测作为后续预测的输入。预测中的噪声可能会累积,使长期预测不准确。虽然这些长期预测可能不准确,但这并不意味着结果不会相似或足够好。我对上面的玩具系统做了一些尝试,我的闭环预测往往低估了振幅,并且经常导致正确频率的衰减振荡。
如果出现这样的问题,你可以向模型添加更多历史样本作为输入,给它更多的训练数据,或者使用更非线性的模型。
在上面的玩具问题中,只有一个值被建模。在你的图表中,似乎有多个来自代理的数据“通道”,并且它们以某种方式相互作用。为了建模这种行为,你可以将每个通道的n个历史值作为输入包含在你的模型中,并将输出设为每个通道的预测。
请告诉我是否需要进一步澄清,以更好地解决你的问题。如果有兴趣,我也可以分享我在玩具问题上使用的matlab代码。