强化学习的钟摆平衡问题我没有太多的研究。系统中似乎有许多状态,输出(电机速度)应该是一个连续的变量,它不能很好的工作,强化学习得到不同的速度,甚至产生更快、不变、更慢的离散状态。
问题在于,通过使用传统的深度学习中常见的梯度下降方法,我们试图以这样一种方式“解决”神经网络的权重问题,神经网络学习了系统的传递函数如何工作,即预测给定输入系统的输出,而不是试图找到一个策略。虽然这在建模像钟摆的物理系统如何工作的过程中是显然有用的,从这一方面来说它在给定当前状态变量的条件下预测了下一个时间层的方向/速度,但它可能无法想出一个如何达到某种理想状态的策略,特别是当前状态(比如说钟摆完全颠倒)已经远离理想状态180度了。更不要说,一旦它一路摇摆起来,它就必须悬在那里。
我开始怀疑使用随机梯度下降(SGD)/反向传播来训练网络来完成任务的想法,因为可能存在太多的局部最小值。另外,我认为Atari论文中描述的强化学习算法实质上是将记忆元件引入前馈网络系统。这篇论文的主要贡献是使用卷积网络处理视频游戏图像,并且使反向传播一直工作在通过卷积从期望的奖励中提取特征,所以它可以在GPU上非常快地工作。我认为更正确的方法是忍受困难,并使用可以包含反馈和记忆元件的循环神经网络来进行基于任务的训练。这可能会造成用随机梯度下降(SGD)/反向传播来训练循环神经网络非常困难。我们甚至都不知道我们希望神经网络在当前输入状态下产生什么样的输出。
来源:维基百科
晚上,我一直在阅读利用遗传算法训练神经网络的方法。德克萨斯大学和瑞士人工智能实验室在递归神经网络(RNN)方面的工作似乎深入研究了这个领域,奇怪的是,我还没有听说斯坦福大学或多伦多大学(我的母校!)的大部分工作或者纽约大学所有关于深度学习的传言。
我在德克萨斯州的NN实验室的这些幻灯片上找到了一个很好的介绍。挖掘一些较老的论文出版物,我发现John Gomez的论文非常有帮助,写得很好,而作为以前没有实施过遗传算法的人,本文中的伪代码揭示了这些东西是如何工作的。
我意识到,这些方法可能优于强化学习或者需要一系列复杂行为的策略、基于搜索的反向传播。即使是最简单的神经进化算法(“传统神经进化”),没有多余的花里胡哨的普通算法,也许能够解决许多有趣的问题。这个简单的算法做的是:
交叉和变异的例子
这是传统神经进化(CNE)算法的要点。它解决了一个很大的问题,我们可以很容易地定义和评价目标,而不必担心反向传播和用什么目标值来训练。我们可以简单地使用上面的算法为每个时间层生成一个电机速度并为神经网络提供当前的方向/速度的状态,并且观察它搜索解空间,找到一个令人满意的方案。我在包含许多局部最大值的系统中更喜欢这个方法,所以对于随机梯度下降(SGD),你最终会得到局部最大值,而神经进化(NE)算法有更大的可能性找到一个更好的局部甚至全局最大值。另外,使用传统神经进化(CNE)复合循环神经网络结构相对简单。
在文献中,传统神经进化(CNE)仍然存在许多问题,其中算法实际上失去了多样性,也收敛到局部极大解,而这个子领域的大量工作是寻找更先进的算法(在上文中,ESP和NEAT是命名)。
我会试着去攻击convnet.js,并实现一个简单的、可以训练神经网络获得一些分数的传统神经进化(CNE)训练器,然后把它用来测试钟摆问题是否会被这些方法攻击。