专栏名称: 雷克世界
赛迪研究院(CCID)主办的新媒体平台,每天跟你聊聊机器人、人工智能、智能制造领域的那些你想知道的事……
目录
相关文章推荐
51好读  ›  专栏  ›  雷克世界

NIPS 2017斯坦福赛题大公开:「学会奔跑」,强化学习模拟人类肌肉骨骼模型

雷克世界  · 公众号  · 机器人  · 2017-07-23 10:01

正文


原文来源crowdai.org、GitHub

「机器人圈」编译:嗯~阿童木呀



概况


欢迎来到“学会奔跑”(Learning to Run),这是此届NIPS比赛新添的议程NIPS 2017 Competition Track中所要面对的5个官方赛题之一,你需要开发一个控制器,使一个基于生理学的人体模型尽可能快地跨越一个复杂的障碍物。你将获得一个人体肌骨骼模型和一个基于物理学的模拟环境,在其中,你可以合成物理上和生理学上都十分准确的运动。而潜在的障碍则包括诸如台阶,或光滑的地板等外部障碍,以及诸如肌肉无力或运动噪音等内部障碍。在比赛中,分数评定标准是你在一定时间内穿过障碍物路线的距离。


我们的目标是:


用深度强化学习来解决医学领域的问题。


在强化学习研究中推广开源工具(物理模拟器、强化学习环境和比赛平台,所有这些都是开源的)。


在计算复杂、且具有随机性和高维度动作空间的环境中鼓励进行强化学习研究。


你的任务是创建一个函数f,它采用当前状态观察(一个41维向量),并以最大化奖励的方式返回肌肉刺激作用(一个18维矢量)。而你的总奖励是最后一次迭代后,骨盆在x轴上的位置减去使用韧带力的惩罚。韧带是防止你的关节过于弯曲的组织——过度使用这些组织将导致受伤,所以我们想避免这个问题。总奖励中的惩罚等于韧带在试验中产生的力的总和除以1000。


点击此处获取挑战中数据集部分的入门指南。如果你已经做好准备,就让我们开启此次挑战的大门吧。




旅程开启

为了模拟物理和生物力学,我们使用OpenSim——一个用于肌肉骨骼模拟的生物力学物理环境。


需要Anaconda来运行我们的模拟环境。Anaconda将创建一个具有所有必需的库的虚拟环境,以避免与操作系统中的库有所冲突。你可以从这里获取Anaconda。而在接下来的文章中,我们假设Anaconda已成功安装。


我们支持Windows、Linux和Mac OSX(均为64位)系统。如果想要安装我们的模拟器,你首先需要使用OpenSim包创建一个conda环境。


在Windows系统上,打开命令提示符并键入:


conda create -n opensim-rl -c kidzik opensim git python=2.7
activate opensim-rl

在Linux / OSX系统上,运行:


conda create -n opensim-rl -c kidzik opensim git python=2.7
source activate opensim-rl

这些命令将在你的计算机上创建一个安装了所有必要的模拟库的虚拟环境。接下来,你需要安装我们的python强化学习环境。类型(在所有平台上可用):


conda install -c conda-forge lapack git
pip install git+https://github.com/stanfordnmbl/osim-rl.git

如果命令python -c "import opensim"运行顺利,你的工作就完成了!否则,请参阅我们的常见问题部分。


请注意,source activate opensim-rl会激活Anaconda虚拟环境。每次打开新终端时,都需要重新键入。


基本用法


要执行该模拟的200次迭代,请输入python解释器,并运行以下命令:


from osim.env import RunEnv

env = RunEnv(visualize=True)
observation = env.reset(difficulty = 0)for i in range(200):
    observation, reward, done, info = env.step(env.action_space.sample())


函数env.action_space.sample()返回肌肉活动的随机向量,因此在本示例中,肌肉将会随机激活(红色表示活动肌肉,蓝色为非活动肌肉)。显然,使用这种技术,走不了太远。


你的目标是构建一个控制器,即一个从状态空间(当前位置,关节的速度和加速度)到动作空间(肌肉刺激)的函数,这将使得能够在固定的时间内尽可能快地完成从建模到执行。假设你训练了一个从观察(模型的当前状态)映射到动作(肌肉刺激)的神经网络,即你有一个函数action = my_controller(observation),然后


# ...total_reward = 0.0for i in range(200):    # make a step given by the controller and record the state and the reward
    observation, reward, done, info = env.step(my_controller(observation))
    total_reward += reward    if done:        break# Your reward isprint("Total reward %f" % total_reward)


其实有很多种方法可以用来构造函数my_controller(observation)。我们将通过使用keras-rl来演示如何使用DDPG(深度确定性策略梯度)算法来实现它。如果你已经有了训练强化学习模型的经验,你可以跳过下一节转到评估部分。


训练你的第一个模型

下面我们介绍如何使用keras-rl训练基本的控制器。首先你需要安装一个额外的包:


conda install keras -c conda-forge
pip install git+https://github.com/matthiasplappert/keras-rl.git
git clone http://github.com/stanfordnmbl/osim-rl.git

keras-rl是一款可以与OpenAI兼容的优秀软件包,可让你快速构建你的第一个模型!


从这个存储库转到scripts子目录


cd osim-rl/scripts

一共有两个脚本:


example.py用于使用DDPG算法训练(和测试)agent。


submit.py将结果提交到crowdAI.org


训练


python example.py --visualize --train --model sample

测试


关于步态的示例(尽可能地走):


python example.py --visualize --test --model sample

试验继续


请注意,训练该模型是需要一些时间的。你可以在线查找许多教程,框架和课程。我们特别推荐:


强化学习教学与课程:


加州大学伯克利分校Sergey Levine 讲授的深度强化学习课程


在Karpathy的博客上的关于强化学习的介绍


Tambet Matiisen对于强化学习的介绍


David Silver的关于强化学习的课程


关于深度强化学习的全面资源列表


算法的框架和实现:


RLLAB


modular_rl


keras-RL


OpenSim和生物力学:


OpenSim Documentation



肌肉模型


描述OpenSim的相关论文


描述Simbody(多体动力学引擎)的相关论文


当然,这份清单并不详尽。如果你还发现有一些资源特别适合本教程,请告诉我们!


评估

你的任务是创建一个采用当前状态observation(一个41维向量)的函数f,并以最大化奖励的方式返回肌肉刺激action(一个18维矢量)。而你的总奖励是最后一次迭代后,骨盆在x轴上的位置减去使用韧带力的惩罚。韧带是防止你的关节过于弯曲的组织——过度使用这些组织将导致受伤,所以我们想避免这个问题。总奖励中的惩罚等于韧带在试验中产生的力的总和除以10000


在每次迭代之后,你得到的奖励等于骨盆x轴在这次迭代中的变化减去在该迭代中使用的韧带力的大小。


你可以在本地机器上测试你的模型。而在最终提交的时候,你需要与远程环境进行交互:crowdAI会向你发送当前的observation,而你需要发回在给定状态下执行的操作。同时,还将在三个不同的难度级别下对你的成果进行评估。详情请参阅环境的细节


提交

假设你的控制器是已训练的,并作为函数my_controller(observation)返回一个action,你可以通过与环境的交互来将它提交给crowdAI:


import opensim as osim
from osim.http.client import Client
from osim.env import RunEnv
# Settings

remote_base = "http://grader.crowdai.org:1729"

crowdai_token = "[YOUR_CROWD_AI_TOKEN_HERE]"

client = Client(remote_base)
# Create environment

observation = client.env_create(crowdai_token)
# IMPLEMENTATION OF YOUR CONTROLLER

# my_controller = ... (for example the one trained in keras_rl)

while True: [observation, reward, done, info] = client.env_step(my_controller(observation), True)
print(observation)
if done: observation = client.env_reset()
if not observation:
breakclient.submit()


[YOUR_CROWD_AI_TOKEN_HERE]上,你可以从crowdai.org网站上的个人资料页面上放置你的相关资料。


请注意,在提交过程中,环境将重新启动。由于环境是随机的,你需要提交三个试验——这样我们就可以确保你的模型是具有鲁棒性的。


规则

为了避免训练环境出现过度拟合,前十名参赛者将按照要求在第二轮挑战中重新提交他们的解决方案。第二轮的环境具有与以往相同的结构,但它们将使用不同的种子进行初始化。而最终排名将基于第二轮的结果。


附加规则:


你不能使用外部数据集(例如,人体走动的运动学)


组织者保留根据需要修改挑战规则的权利。


环境细节

在创造环境的时候,你需要使用:


 from osim.env import RunEnv

 env = RunEnv(visualize = True)


参数:


visualize——打开和关闭视觉效果器


RunEnv的相关方法

reset(difficulty = 2, seed = None)


重新启动具有给定difficultyseed的环境。


difficulty = 0代表没有障碍物,difficulty = 1、2、3表示的是随机定位的障碍物(固定在地面上的球)个数,值为2与值为1大致相同,但同时能够增加腰部肌肉的力量(这个肌肉可以帮助弯曲模型中的髋关节)。肌肉力量设定为z * 100%,其中z为标准变量,平均值为1,标准偏差为0.1。


seed——代表的是随机数生成器的起始种子。如果种子是None,则种子的种植计划将持续。


你的解决方案将在difficulty = 2的环境中进行评定,其实你可以先在difficulty = 0 时候训练你的模型,然后再用较高的difficulty系数进行再训练。

step(action)

进行一次模拟迭代。


action——对应于肌肉刺激的,范围在[0,1]之间的长度为18的连续值列表。


该函数返回:


observation——对应于模型当前状态的长度为41的实际值列表。变量将在“模型的物理学原理”一节中说明。


reward——在上一次迭代中获得的奖励。奖励的计算方法为骨盆沿x轴位置的变化减去使用韧带的惩罚。有关详细信息,请参阅“模型的物理性原理”部分。


done——指示所进行的移动是否是环境中的最后一步。如果达到1000次迭代或骨盆高度低于0.65米,则会发生这种情况。


info——与OpenAI兼容,目前未使用。


模型的物理和生物力学原理


该模型在OpenSim中实现,而是它依赖于Simbody物理引擎的。有一点值得注意,鉴于最近在无模型强化学习方面取得的成功,在此次挑战中,对于生物力学方面的专业知识的要求力度就没那么高了。


总而言之,agent是一个肌肉骨骼模型,包括每条腿的身体段,一个骨盆段,以及一个代表身体上半截的部分(躯干、头部、手臂)。这些身体段与关节相连(例如:膝盖和臀部),而这些关节的运动由肌肉刺激所控制的。模型中的肌肉有着复杂的路径(例如:肌肉可以穿过多个关节,且具有多余的肌肉)。肌肉执行器本身也是高度非线性的。例如,有一个一阶微分方程,将神经系统发送到肌肉(刺激点)的电信号与肌肉的激活点相关联(这描述了肌肉在给定的当前力量生成能力下,实际能够产生多少力量)。考虑到骨骼、关节和肌肉的肌肉骨骼结构,在模拟的每一步(对应于0.01秒),引擎设置为:


根据提供的step()函数在刺激度向量中计算肌肉的活动量


根据这些活动量来驱动肌肉收缩


计算由于肌肉活动量而产生的力矩


计算因接触地面而产生的力


计算关节和身体运动而产生的速度和所处位置


根据关节的力、速度和位置生成一个新的状态。


在每个动作中,以下18个肌肉处于运动状态(每条腿各9个):


腿筋(hamstrings)


股二头肌(biceps femoris)


臀大肌(gluteus maximus)


髂腰肌(iliopsoas)


股直肌(rectus femoris)


股(vastus)


腓肠肌(gastrocnemius)


比目鱼肌(soleus)


胫前肌(tibialis anterior),动作向量以相同的顺序对应于这些肌肉(首先是右腿的9个肌肉,然后是左腿的9个肌肉)。


观察值包含41个值:


骨盆位置(旋转,x,y)


骨盆速度(旋转,x,y)


每个踝关节、膝盖和髋关节的旋转(6个值)


每个脚踝、膝盖和髋部的角速度(6个值)


重心位置(2个值)


重心速度(2个值)


头、骨盆、躯干、左右脚趾、左右距骨的位置(x,y)(14个值)


左右腰强度:当difficulty < 2时,强度为1,否则将一个平均值为1,标准偏差为0.1的随机标准变量设为固定值


下一个障碍物:x距离骨盆的距离,中心相对于地面的y位置,半径。


有关模拟框架的更多详细信息,请参阅Delp和Scott L等人所著的 《OpenSim:创建和分析动态运动模拟的开源软件》;而有关我们使用的肌肉模型的更多信息,请参阅Thelen和D.G. 所著的《调整肌肉力学模型参数以模拟老年人的肌肉动态收缩》。


常见问题

“I'm getting 'version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference' error


如果你遇到此错误:


ImportError: /opensim-rl/lib/python2.7/site-packages/opensim/libSimTKcommon.so.3.6:
  symbol _ZTVNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEE, version
  GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference


尝试安装libgcc


我可以使用除了python以外的语言吗?


当然!你只需要设置自己的python grader并与之进行交互https://github.com/kidzik/osim-rl-grader。点击此处查看更多详细信息OpenAI http client


你有docker container?


是的,你可以使用https://hub.docker.com/r/stanfordnmbl/opensim-rl/,需要注意的一点是,将显示器连接到docker可能会很棘手,且它与系统是紧密相关的。然而,如果考虑到训练你的模型的话,显示器其实没那么必要——docker container可以方便地使用多台机器。


有些库处于缺失状态。运行环境需要什么呢?


大多数库默认存在于操作系统的主要分布中,或者由conda环境自动下载。然而,有时一些库仍然缺失。在Linux系统下可以安装最小的依赖集:


sudo apt install libquadmath0 libglu1-mesa libglu1-mesa-dev libsm6 libxi-dev libxmu-dev liblapack-dev


为什么没有能量约束?


关于此问题的答案请参阅https://github.com/stanfordnmbl/osim-rl/issues/34


此次挑战的重头戏——奖励政策

AWS 


截止到2017年8月13日,排行榜前100名表演者每人将获得价值300美元的AWS云信用额。为了有资格获得这些信用额度,你的电子邮件帐户与你在AWS上使用的电子邮件帐户必须相同,否则我们将无法对你的AWS账户进行信用记录(没有例外)。


奖品


顶级参赛者的奖品包括:


受邀在NIPS比赛书籍中发表文章。


获得参加2018年1月29日至30日在瑞士EPFL举行的第二次应用机器学习日(Applied Machine Learning Days)邀请函,旅行和住宿费用全免。


受邀在斯坦福大学进行研究演讲,旅行和住宿费用全免。


报销NIPS 2017所产生的旅行和住宿费用。


欢迎加入


中国人工智能产业创新联盟在京成立 近200家成员单位共推AI发展



关注“机器人圈”后不要忘记置顶

我们还在搜狐新闻、机器人圈官网、腾讯新闻、网易新闻、一点资讯、天天快报、今日头条、QQ公众号…

↓↓↓点击阅读原文查看中国人工智能产业创新联盟手册