原文来源
:
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)
重新启动具有给定
difficulty
和
seed
的环境。
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()函数在刺激度向量中计算肌肉的活动量
根据这些活动量来驱动肌肉收缩
计算由于肌肉活动量而产生的力矩