通过进化算法教生物力学模型学会走路


通过进化算法教生物力学模型学会走路



让人形模型采用真实肌肉方式行走
本文中的源代码可在 这个GitHub 库 中找到
(https://github.com/normandipalo/learn-to-walk-with-genetic-algs)
2017 NIPS 中有一项挑战是 《学习跑步》:如题所示, 该任务需设计并开发一个可以控制人体生物力学模型行走的学习算法 。 算法中的执行器(与大多数机器人问题不同)是一组腿部肌肉,每条腿由9块肌肉组成 。 发布挑战的作者修改了OpenSIM环境,使其适应增强学习的设定,从而增加一个奖励信号 。
有些事情变得非常糟糕(或非常正确).
许多参赛者设计了端到端的深度强化学习算法,这些算法在近年来在连续控制任务中表现相当优异 。 但这些模型也通常需要大量算力和计算时间以学习成功的策略,一般在多台机器上并行效果更好 。
【通过进化算法教生物力学模型学会走路】我决定用我的方法尝试一下这个挑战 。 我实现并扩展一个相当轻量级的方法,该方法是我最近为机器人操控开发的,具体来说是进化算法结合神经网络控制器 。 采用这些算法的好处是不需要求导、可高度并行同时可获得与深度RL算法相似的结果,参见OpenAI上相关的文章 。 问题在于,运动是完全随机,因而较难估计学习的内容及方式,但我仍希望尝试一下这种方法 。
开始几步,像婴儿学步 。
…重要的是不要仅保留表现最佳的模型,因为模型会卡在一些局部最小的地方(很难离开这些点) 。
进化算法被用于数值优化问题,算法通过相关的目标函数优化其参数 。 那在本题中,这些参数和目标函数又应该是什么?从经验出发:腿部以周期方式运动 。 肌肉运动服从周期性、正弦时间规律,但很难手工实现这个规律 。 如何构造一个周期性函数?这里引入傅里叶级数 。 我们知道傅里叶级数(采用正弦余弦的累加)可估算出任意周期函数 。 不过理论上,他们可以有无限项 。 我设计了一个(截取)部分项的傅里叶级数,用以构造肌肉运动 。 这里只用了前4项余弦序列,于是就产生了8个参数:4个权重值乘以4个不同频率相位的余弦值 。 这样就位每块肌肉构造了周期性函数 。 每条腿有9块肌肉,我采用了9组周期性函数,这里假定另一条腿也采用同样的运动方式,可用同样的函数构造,不过相位差了180o 。 遗传算法,通过修改调整这些参数(相较神经网络参数,数量已经非常少了),从而优化目标函数的结果,显而易见这就是最终激烈函数,比如机器人行走多少距离后摔倒 。
经过一天训练后的行走模式
参数从白噪音中采样得到,进行随机修改 。 但如果某个采样方向手有了性能提升,参数会沿这个方向进一步移动,知道不再有性能上的提升 。 我并行跑了3个模型,因为对于一台笔记本来说计算量已经很大了 。 性能最好的权重被保存到一个参数文件中 。 当执行了几个批次后,训练又从性能最好的前3个参数组重新开始演算 。 这样就允许算法去更好的探索不同的行为:重要的是不要仅探索当前最优的模型,因为这个模型可能被卡在一个局部最优很难逃离,而性能较差的模型经过一段时间的训练却可以通过微调其他行为超过当前最优的模型 。 确实,经过一系列模拟行走后,从最优的3个模型中重新启动是成功学到行走模式的关键 。 在没有先验知识的情况下,模型可以学到像人一样的运动行为,已经相当不简单 。
在相对短的训练时间和较差的硬件条件下(Intel Core 2 Duo CPU),模型可以成功的走出若干步 。 其他深度增强学习模型显然获得了更好的效果,但需要很长的训练时间和强大的硬件 。 我的目标不是真正与这些模型竞争,而是表明如何用遗传算法及少于100个参数的模型,快速在低配笔记本上获得行走模式 。

推荐阅读