神经网络能够自我优化以提高速度吗?

人工智能 神经网络 强化学习 开放式 马尔可夫属性
2021-10-20 10:59:40

我正在试验 OpenAI Gym 和强化学习。据我了解,环境是在等待agent做出决定,所以是这样的顺序操作:

decision = agent.decide(state)
state, reward, done = environment.act(decision)
agent.train(state, reward)

以这种顺序进行,马尔可夫属性得到满足:新状态是旧状态和动作的结果。但是,很多游戏不会等待玩家做出决定。游戏将继续运行,也许行动来得太晚了。

是否已经观察到,或者甚至有可能神经元网络调整其权重,以便 PC 更快地计算结果,从而做出“更好”的决定?例如,一个 AI 击败另一个,因为它更快。

在发布诸如“总是有相同数量的计算,所以这是不可能的”之类的答案之前,请注意存在缓存(一级缓存与 RAM)、分支预测以及其他可能的东西。

1个回答

是和否。

是的,可能达到这个结果。但我推荐另一种方法,而不是自我优化的神经网络:

1.不要让训练时间干扰。

如果您试图在环境运行时训练代理,那可能就是问题所在。训练时间通常比评估时间长得多。并且部署的模型通常不会训练,因此在生产中不会出现问题。

你可以做两件事:

1.1 在训练期间“暂停”游戏。

这可能看起来像“作弊”,但在您的代理人看来,他们实际上并没有在火车时间玩。再一次,它只是模拟它在生产中的表现。

但如果你不能暂停它:

1.2 在运行时禁用训练。

存储所有状态和决定。等到比赛结束,然后你训练整个批次。

专业棋手不会在闪电战挑战中学习。但是他们后来确实研究了自己的游戏,以从错误中吸取教训。

2. 优化超参数以提高速度。

您可以调整一些超参数(例如 NN 的大小)以寻找更快的模型。请记住,它仍然是一种始终在固定时间内运行的算法,但您可能会找到某种方法使其始终运行

2.1 使用机器学习进行优化

有一些元学习技术和其他方法,例如NEAT,可以自动搜索简单有效的拓扑。NEAT 已经奖励了最简单的架构,惩罚了复杂性(通常与速度有关),但您也可以强制它专门考虑运行时间。

3.另一个任务的另一个网络

您可以创建另一个短网络来决定下一步是准确还是快速。基于此结果,它将在精度或速度之间进行选择。这种选择可以是通过标记一个参数(如分支预测)甚至运行一个全新的算法:

NeedForSpeed = TimeEstimation(state)
#Sorry, I couldn't resist the pun!

if NeedForSpeed > 0.8
  decision = agent.instantReactionDecisionTree(state)
elif NeedForSpeed > 0.5
  decision = agent.decideStandard(state, branchPrediction=True )
elif NeedForSpeed > 0.2
  decision = agent.decideStandard(state)
else:
  decision = agent.DeepNN(state)

奖励:使用其他 ML 算法

一些算法具有直接影响时间 x 精度权衡的显式参数。

例如,MCST(蒙特卡洛斯搜索树)可以一直运行直到它探索所有可能性,但它通常会在之前完成,为您提供迄今为止找到的最佳解决方案。

因此,一种可能性是尝试其他方法而不是神经网络。