UNREAL(UNsupervised REinforcement and Auxiliary Learning)算法
UNREAL算法是2016年11月DeepMind提出的最新深度增强学习算法,在A3C算法的基础上对性能和速度进行进一步提升,在Atari游戏上取得了人类水平8.8倍的成绩,并且在第一视角的3D迷宫环境Labyrinth上也达到了87%的人类水平,成为当前最好的深度增强学习算法。
A3C算法充分使用了Actor-Critic框架,是一套完善的算法,因此,我们很难通过改变算法框架的方式来对算法做出改进。UNREAL算法在A3C算法的基础上,另辟蹊径,通过在训练A3C的同时,训练多个辅助任务来改进算法。UNREAL算法的基本思想来源于我们人类的学习方式。人要完成一个任务,往往通过完成其他多种辅助任务来实现。比如说我们要收集邮票,可以自己去买,也可以让朋友帮忙获取,或者和其他人交换的方式得到。UNREAL算法通过设置多个辅助任务,同时训练同一个A3C网络,从而加快学习的速度,并进一步提升性能。
在UNREAL算法中,包含了两类辅助任务:第一种是控制任务,包括像素控制和隐藏层激活控制。像素控制是指控制输入图像的变化,使得图像的变化最大。因为图像变化大往往说明智能体在执行重要的环节,通过控制图像的变化能够改善动作的选择。隐藏层激活控制则是控制隐藏层神经元的激活数量,目的是使其激活量越多越好。这类似于人类大脑细胞的开发,神经元使用得越多,可能越聪明,也因此能够做出更好的选择。另一种辅助任务是回馈预测任务。因为在很多场景下,回馈r并不是每时每刻都能获取的(比如在Labyrinth中吃到苹果才能得1分),所以让神经网络能够预测回馈值会使其具有更好的表达能力。在UNREAL算法中,使用历史连续多帧的图像输入来预测下一步的回馈值作为训练目标。除了以上两种回馈预测任务外,UNREAL算法还使用历史信息额外增加了价值迭代任务,即DQN的更新方法,进一步提升算法的训练速度。
UNREAL算法本质上是通过训练多个面向同一个最终目标的任务来提升行动网络的表达能力和水平,符合人类的学习方式。值得注意的是,UNREAL虽然增加了训练任务,但并没有通过其他途径获取别的样本,是在保持原有样本数据不变的情况下对算法进行提升,这使得UNREAL算法被认为是一种无监督学习的方法。基于UNREAL算法的思想,可以根据不同任务的特点针对性地设计辅助任务,来改进算法。
以上内容摘自原文:http://geek.csdn.net/news/detail/138103
代码:
https://github.com/miyosuda/unreal
Replicating UNREAL algorithm described in Google Deep Mind's paper "Reinforcement learning with unsupervised auxiliary tasks."
https://arxiv.org/pdf/1611.05397.pdf
Implemented with TensorFlow and DeepMind Lab environment.
seekavoid_arena_01
stairway_to_melon
All weights of convolution layers and LSTM layer are shared.
Score plot of DeepMind Lab "seekavoid_arena_01" environment.
First, dowload and install DeepMind Lab
$ git clone https://github.com/deepmind/lab.git
Then build it following the build instruction. https://github.com/deepmind/lab/blob/master/docs/build.md
Clone this repo in lab directory.
$ cd lab
$ git clone https://github.com/miyosuda/unreal.git
Add this bazel instrution at the end of lab/BUILD
file
package(default_visibility = ["//visibility:public"])
Then run bazel command to run training.
bazel run //unreal:train --define headless=osmesa
To show result after training, run this command.
bazel run //unreal:display --define headless=osmes