OpenAI-人工反馈的深度学习
rl-teacher是“Deep Reinforcement Learning from Human Preferences”的实现。
这个系统允许你教一个强化学习行为的新行为,即:
1. 该行为没有预定义的回报函数
2. 人类可以确认但不能证明的行为
训练模拟机器人做任何你想做的非常有趣!例如,在MuJoCo“Walker”环境中,agent通常会对向前移动进行奖励,但你可能希望教会它跳芭蕾舞:
想要看我们agent circus的其他技术,你可以使用rl-teacher自己训练一个agent。
这个存储库有什么?
- 一个可以插入任何agent的奖励预测器,并且他可以学习预测人类教师将会批准哪些动作。
- 通过奖励预测器指定的函数学习的几个agent的示例。
- 人可以用来提供反馈的web应用,提供用于训练的奖励预测数据。web应用界面如下。
结合OpenAI gym的一组集合,这些组件实现了“ Deep RL from Human Preferences”完整的系统描述。
安装
获取MuJoCo许可证,并在系统上安装二进制文件。为了MuJoCo能够安装良好的文档,以及获得一种测试MuJoCo正在处理系统的简单方法,建议你采用mujoco-py安装。
设置一个使用python 3.5 的conda环境。
复制rl-teacher到你想要的存储库。(例如:~/rl-teacher)。
然后执行以下操作将rl-teacher代码安装到你的环境中:
cd ~/rl-teacher
pip install-e .
pip install-e human-feedback-api
pip install-e agents/parallel-trpo[tf]
pip install-e agents/pposgd-mpi[tf]
用法
基线RL
运行以下命令直接从hard-coded reward函数进行基线强化学习。这完全不需要人为反馈,但这是一个MuJoCo正在工作,RL-agent配置正确,可以自己成功学习的好的测试方法。
python rl_teacher/teach.py-p rl-e ShortHopper-v1-n base-rl
默认情况下,这将写入tensorboard文件~/tb/rl-teacher/base-rl。启用tensorboard如下:
$ tensorboard--logdir ~/tb/rl-teacher/ Starting TensorBoard b'47' at http://0.0.0.0:6006 (Press CTRL+C to quit)
浏览浏览器中的http://0.0.0.0:6006查看你的学习曲线,如下所示:
合成标记
接下来,我们将使用两部分的培训计划(训练单独的奖励预测,和使用RL进行奖励预测),然而,不同于收集真实的人的反馈,我们将从hard-coded的奖励函数中产生合成反馈环境。这为我们提供了从奖励预测和学习从真正的奖励另一种全面的检查和有用的比较。
我们指定-p synth使用合成预测变量,而不是上面的-p rl。我们将使用相同的环境(-e ShortHopper-v1),给这个运行一个新的名称(-n syn-1400),并请求1400个合计标记(-l 1400)。
python rl_teacher/teach.py-p synth-l1400 -e ShortHopper-v1-n syn-1400
你的tensorboard曲线应如下所示(从棕色合成标记学习):
如果你想知道如何计算合成标记可以阅读SyntheticComparisonCollector中的代码。该系统使用指数递减的标记率,切线处理期望的的标记总数:
人为标记
根据人的反馈来训练agent ,你将运行两个独立的进程:
1. agent培训的进程。这与我们上面运行的命令非常相似。
2. 一个web应用程序,这将向你展示短视频的剪辑轨迹,并询问你评估哪个剪辑更好。
配置human-feedback-api网络应用程序
首先你需要创建django。这将本地目录中创建一个db.sqlite3。
python human-feedback-api/manage.py migrate
python human-feedback-api/manage.py collectstatic
启动网络应用程序
python human-feedback-api/manage.py runserver0.0.0.0:8000
你现在应该能够通过任何浏览器输入网址http://127.0.0.1:8000/来打开网络应用程序。那里什么都没有,但是当你运行你的agent,它将创建一个让你添加标记的实验。
创建一个GCS储存库渲染轨迹片段
训练过程会生成为你提供反馈的渲染轨迹片段。存储在Google云端存储(GCS)中,因此你需要设置GCS存储库。
如果你尚未设置GCS,请创建一个新的GCS帐户并设置一个新项目。然后,使用以下命令创建一个存储库来托管媒体,并将这个新的存储库设置为publicly-readable(可公开读取)。
export RL_TEACHER_GCS_BUCKET="gs://rl-teacher-<YOUR_NAME>"
gsutil mb $RL_TEACHER_GCS_BUCKET
gsutil defacl ch-u AllUsers:R $RL_TEACHER_GCS_BUCKET
运行你的agent
现在我们准备用人的反馈训练一个agent。
运行以下命令启动agent的培训。agent开始在环境中采取随机行动,并生成示例轨迹段以供标记:
$ python rl_teacher/teach.py-p human--pretrain_labels175 -e Reacher-v1-n human-175
Using TensorFlow backend.
No label limit given. We will request one label every few seconds
Starting random rollouts to generate pretraining segments. No learning will take place...
-------- Iteration1 ----------
Averagesum of true rewards per episode: -10.5385
Entropy: 2.8379
KL(old|new): 0.0000
Surrogate loss: 0.0000
Frames gathered: 392
Frames gathered/second: 213857
Time spent gathering rollouts: 0.00
Time spent updating weights: 0.32
Total time: 0.33
Collected10/875 segments
Collected20/875 segments
Collected30/875 segments
...
一旦训练过程生成了它想要你标注的轨迹的视频,就会把这些视频上传到GCS:
... Copying media to gs://rl-teacher-catherio/d659f8b4-c701-4eab-8358-9bd532a1661b-right.mp4in a background process Copying media to gs://rl-teacher-catherio/9ce75215-66e7-439d-98c9-39e636ebb8a4-left.mp4in a background process ...
同时agent的培训将被暂停,等待你的反馈:
0/175 comparisons labeled. Please add labels w/ the human-feedback-api. Sleeping...
向agent提供反馈
此时,你可以点击活动的实验进入标记界面。点击Active Experiment下的链接
一旦你在标记界面,你会看到很多对片段。指出每一对中哪一个显示更好的行为,无论你试图教agent做什么。(首先,你可以尝试教导助臂夹如何逆时针旋转,或者自己想要的其他任务!)
一旦你完成175项预训练比较的标记,我们就会在最初的比较上训练预测的收敛。之后,它将每隔几秒钟请求进行一次额外比较。
如果你看到空白屏幕,说明这个片段还没有准备好显示。过几分钟刷新一下页面。或点击“Can’t tell”尝试别的片段。
你提供的反馈越多,你的agent就能越好地完成任务。
使用远程服务器进行agent培训
我们建议在具有多个CPU的服务器上运行agent,以便更快地进行培训。
如果你正在远程服务器上运行,则可能需要登录到你的gcloud帐户。
如果你在没有显示的Linux服务器上运行,则应遵循下面的说明。这不仅仅是为了可视化agent的进度 ,而是将各个部分呈现给人标记。
在Xorg或XDummy的linux上去头视频的表现
如果你在没有物理显示器的机器上运行,则需要安装XDummy。以下说明已在Ubuntu 14.04 LTS上进行了测试。
安装要求:
sudo apt-get update && sudo apt-get install-y
ffmpeg
libav-tools
libpq-dev
libjpeg-dev
cmake
swig
python-opengl
libboost-all-dev
libsdl2-dev
xpra
安装Xdummy:
curl-o/usr/bin/Xdummy https://gist.githubusercontent.com/nottombrown/ffa457f020f1c53a0105ce13e8c37303/raw/ff2bc2dcf1a69af141accd7b337434f074205b23/Xdummy
chmod+x/usr/bin/Xdummy
开始Xdummy显示:
Xdummy
测试视频渲染工作衔接:
DISPLAY=:0 python rl_teacher/tests/video_render_test.py
agent马戏团
右边是经过培训的agent,根据人的反馈做特技; 在左边是传统的RL训练的。所有视频都是优选出的。猎豹训练使用了PPO,所有其他的agent使用了TRPO。
正常走路 芭蕾舞
正常的助臂夹 不正常的助臂夹
正常的单腿跳 后空翻式单腿跳
正常的猎豹 跳踢踏舞的猎豹
- 如何用容器实现生产级Redis sharding集群一键交付
- Hadoop旧mapreduce的map任务切分原理
- 解读Neo4j全新的Python驱动程序
- MySQL 5.7 X Plugin:流水线技术vs.并行查询技术
- 在下函数式编程,有何贵干?
- 基于Keras/Python的深度学习模型Dropout正则项
- 揭秘深度强化学习
- Swoole-2.0.1-Alpha 已发布,提供PHP原生协程支持
- Google核心技术之——PageRank算法scala实现
- 代码审查拯救世界?
- Kafka实战:从RDBMS到Hadoop,七步实现实时传输
- Apache NiFi 1.0.0测试版:邮件路由应用新型ListenSMTP
- 为什么我坚持使用 JavaScript 函数声明
- NewSQL数据库大对象块存储原理与应用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- beego(一) beego 入门
- javascript预编译(执行期的上下文)
- Elasticsearch评分相关度算法解析
- Netty入门教程——认识Netty
- Linux下的包过滤软件:iptables剖析
- rxjs fromEvent的实现
- rxjs switchMap的实现原理
- rxjs里scan operator的执行研究
- rxjs pipe和map组合的一个实际例子的单步调试
- Win10+Python2.7.14+cocos2d-x-3.17.2+VS2017环境搭建
- VUE-001-在表格单元格(el-table-column)中添加超链接访问
- 关于vue的title标签中出现的htmlWebpackPlugin.options.title
- dotnet tool 工具安装提示 Could not find a part of the path 安装失败
- dotnet core 进行 XML 序列化抛出 XmlSerializers dll 文件找不到
- C# dotnet 高性能多线程工具 ExecuteOnceAwaiter 只执行一次的任务