我决定使用神经网络来为我拥有的动画引擎创建行为。神经网络接收每个身体部位的3个vector3和1个欧拉角。第一个vector3是位置,第二个是速度,第三个是角速度。欧拉角表示身体部位的旋转。我有7个身体部位。每种数据类型包含3个浮点数。7*4*3 = 84,所以我的神经网络有84个输入。输出映射到角色的肌肉上。它们提供每个肌肉应施加的力量大小,总共有15个肌肉。
我同时运行15个网络,运行时间为10秒,通过计算最低能耗、最小的z和x方向移动,以及身体部位相对于其他部位的正确y位置(例如,hips.y > upperleg.y, upperleg.y > lowerleg.y等)来评估它们的适应度,然后通过遗传算法进行处理。我使用了每个隐藏层168个神经元,共有8个隐藏层。我试图让角色站直并尽量减少移动。我运行了3000代,但结果相差甚远。
神经网络和遗传算法是基于这个教程的C#版本。我将交叉方法从单点交叉改为混合交叉。
我有84个输入和15个输出。我的神经网络应该有多大?
回答:
你想解决的问题相当棘手,我怀疑任何“普通”的遗传算法(特别是那些使用固定网络架构的)能在合理的时间内解决它。我也不认为你能找到隐藏层中“正确的神经元数量”。
然而,如果你愿意花些时间,可以看看HyperNEAT for Locomotion Control in Modular Robots,它处理的是或多或少相同的问题。他们使用了一种称为HyperNEAT的相当先进的遗传算法技术,并报告了一些不错的结果。
HyperNEAT建立在NEAT(Neuroevolution of augmenting topologies)之上。NEAT不仅能进化ANN的权重,还能进化其结构。它从简单的网络开始,逐渐使其变得更加复杂,直到达到你的目标(或放弃)。
然后NEAT稍作修改,以便能够使用各种激活函数。这将使其在应用于一组点(例如,在坐标系中)时产生多种“模式”。这些模式可以具有一些有趣的特征,如完美/不完美的对称性或周期性。这种变体称为Compositional pattern-producing network或CPPN。这种技术的一个壮观应用是PicBreeder,在这里网络被用来“绘制”图片。
在HyperNEAT中,CPPNs被用来创建其他ANNs。新网络的隐藏层由所谓的基质表示,可以想象为将该层的neurons放置在一个2D/3D坐标系中。然后,对于每对可能的神经元(从输入层到所有隐藏层,从所有隐藏层到所有输出层),使用CPPN来确定权重。因此,我们有一个间接编码,它
- 本身很小
- 最终可以生成任意大的网络
- 还可以展示相当复杂的行为
- 现实/自然中出现的模式(再次,对称性、周期性行为)可以相对容易地出现。请注意,对于动画/有效的运动,这两者都非常有利(如果不是必须的)。
总的来说,这将给你一个机会来解决你的复杂问题。
如你所见,这种技术有各种层次,因此为自己实现它并不容易。幸运的是,有一些很好的实现,你可以在NEAT的主页上找到它们,还有很多其他文档、论文和教程。