前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >详解深度强化学习展现TensorFlow 2.0新特性

详解深度强化学习展现TensorFlow 2.0新特性

作者头像
刀刀老高
发布于 2019-05-15 03:08:51
发布于 2019-05-15 03:08:51
6730
举报
文章被收录于专栏:奇点大数据奇点大数据

自TensorFlow官方发布其2.0版本新性能以来,不少人可能对此会有些许困惑。因此博主Roman Ring写了一篇概述性的文章,通过实现深度强化学习算法来具体的展示了TensorFlow 2.0的特性。

正所谓实践出真知。

TensorFlow 2.0的特性公布已经有一段时间了,但很多人对此应当还是一头雾水。

在本教程中,作者通过深度强化学习(DRL)来展示即将到来的TensorFlow 2.0的特性,具体来讲就是通过实现优势actor-critic(演员-评判家,A2C)智能体来解决经典的CartPole-v0环境。

虽然作者本文的目标是展示TensorFlow 2.0,但他先介绍了DRL方面的内容,包括对该领域的简要概述。

事实上,由于2.0版本的主要关注点是简化开发人员的工作,即易用性,所以现在正是使用TensorFlow进入DRL的好时机。

本文完整代码资源链接:GitHub:https://github.com/inoryy/tensorflow2-deep-reinforcement-learning

Google Colab:https://colab.research.google.com/drive/12QvW7VZSzoaF-Org-u-N6aiTdBN5ohNA

安装

由于TensorFlow 2.0仍处于试验阶段,建议将其安装在一个独立的(虚拟)环境中。我比较倾向于使用Anaconda,所以以此来做说明:

> conda create -n tf2 python=3.6> source activate tf2> pip install tf-nightly-2.0-preview # tf-nightly-gpu-2.0-preview for GPU version

让我们来快速验证一下,一切是否按着预测正常工作:

>>> import tensorflow as tf>>> print(tf.__version__)1.13.0-dev20190117>>> print(tf.executing_eagerly())True

不必担心1.13.x版本,这只是一个早期预览。此处需要注意的是,默认情况下我们是处于eager模式的!

>>> print(tf.reduce_sum([1, 2, 3, 4, 5]))tf.Tensor(15, shape=(), dtype=int32)

如果读者对eager模式并不熟悉,那么简单来讲,从本质上它意味着计算是在运行时(runtime)被执行的,而不是通过预编译的图(graph)来执行。读者也可以在TensorFlow文档中对此做深入了解:

https://www.tensorflow.org/tutorials/eager/eager_basics

深度强化学习

一般来说,强化学习是解决顺序决策问题的高级框架。RL智能体通过基于某些观察采取行动来导航环境,并因此获得奖励。大多数RL算法的工作原理是最大化智能体在一个轨迹中所收集的奖励的总和。

基于RL的算法的输出通常是一个策略—一个将状态映射到操作的函数。有效的策略可以像硬编码的no-op操作一样简单。随机策略表示为给定状态下行为的条件概率分布。

Actor-Critic方法

RL算法通常根据优化的目标函数进行分组。基于值的方法(如DQN)通过减少预期状态-动作值(state-action value)的误差来工作。

策略梯度(Policy Gradient)方法通过调整其参数直接优化策略本身,通常是通过梯度下降。完全计算梯度通常是很困难的,所以通常用蒙特卡洛(monte-carlo)方法来估计梯度。

最流行的方法是二者的混合:actor- critical方法,其中智能体策略通过“策略梯度”进行优化,而基于值的方法则用作期望值估计的引导。

深度actor- critical方法

虽然很多基础的RL理论是在表格案例中开发的,但现代RL几乎完全是用函数逼近器完成的,例如人工神经网络。 具体来说,如果策略和值函数用深度神经网络近似,则RL算法被认为是“深度的”。

异步优势(asynchronous advantage) actor- critical

多年来,为了解决样本效率和学习过程的稳定性问题,已经为此做出了一些改进。

首先,梯度用回报(return)来进行加权:折现的未来奖励,这在一定程度上缓解了信用(credit)分配问题,并以无限的时间步长解决了理论问题。

其次,使用优势函数代替原始回报。收益与基线(如状态行动估计)之间的差异形成了优势,可以将其视为与某一平均值相比某一给定操作有多好的衡量标准。

第三,在目标函数中使用额外的熵最大化项,以确保智能体充分探索各种策略。本质上,熵以均匀分布最大化,来测量概率分布的随机性。

最后,并行使用多个worker来加速样品采集,同时在训练期间帮助将它们去相关(decorrelate)。

将所有这些变化与深度神经网络结合起来,我们得到了两种最流行的现代算法:异步优势actor- critical算法,或简称A3C/A2C。两者之间的区别更多的是技术上的而不是理论上的:顾名思义,它归结为并行worker如何估计其梯度并将其传播到模型中。

有了这些,我将结束我们的DRL方法之旅,因为这篇博客文章的重点是TensorFlow 2.0特性。如果您仍然不确定主题,不要担心,通过代码示例,一切都会变得更加清晰明了。

使用TensorFlow 2.0实现Advantage Actor-Critic

让我们看看实现各种现代DRL算法的基础是什么:是actor-critic agent,如前一节所述。为了简单起见,我们不会实现并行worker,尽管大多数代码都支持它。感兴趣的读者可以将这作为一个练习机会。

作为一个测试平台,我们将使用CartPole-v0环境。虽然有点简单,但它仍然是一个很好的选择。

通过Keras模型API实现的策略和价值

首先,让我们在单个模型类下创建策略和价值预估神经网络:

import numpy as np

import tensorflow as tf

import tensorflow.keras.layers as kl

class ProbabilityDistribution(tf.keras.Model):

defcall(self, logits):

tf.squeeze(tf.random.categorical(logits, 1), axis=-1)

classModel(tf.keras.Model):def__init__(self, num_actions):

super().__init__('mlp_policy')

self.hidden1 = kl.Dense(128, activation='relu')

self.hidden2 = kl.Dense(128, activation='relu')

self.value = kl.Dense(1, name='value')

self.logits = kl.Dense(num_actions, name='policy_logits')

self.dist = ProbabilityDistribution()defcall(self, inputs):

x = tf.convert_to_tensor(inputs, dtype=tf.float32)

hidden_logs = self.hidden1(x)

hidden_vals = self.hidden2(x)

return self.logits(hidden_logs), self.value(hidden_vals)

defaction_value(self, obs)

value = self.predict(obs)

action = self.dist.predict(logits)

然后验证模型是否如预期工作:

import gymenv = gym.make('CartPole-v0')

model = Model(num_actions=env.action_space.n)

obs = env.reset()

value = model.action_value(obs[None, :])

print(action, value)

这里需要注意的是:

模型层和执行路径是分别定义的没有“输入”层,模型将接受原始numpy数组通过函数API可以在一个模型中定义两个计算路径模型可以包含一些辅助方法,比如动作采样在eager模式下,一切都可以从原始numpy数组中运行

Random Agent

现在让我们转到 A2CAgent 类。首先,让我们添加一个 test 方法,该方法运行完整的episode并返回奖励的总和。

classA2CAgent:def__init__(self, model):

self.model = model

deftest(self, env, render=True):

obs, done, ep_reward = env.reset(), False, 0

while not done:

action, _ = self.model.action_value(obs[None, :])

obs, reward, done, _ = env.step(action)

ep_reward += rewardif render: env.render()

return ep_reward

让我们看看模型在随机初始化权重下的得分:

agent = A2CAgent(model)

rewards_sum = agent.test(env)

print("%d out of 200" % rewards_sum)

离最佳状态还很远,接下来是训练部分!

损失/目标函数

正如我在DRL概述部分中所描述的,agent通过基于某些损失(目标)函数的梯度下降来改进其策略。在 actor-critic 中,我们针对三个目标进行训练:利用优势加权梯度加上熵最大化来改进策略,以及最小化价值估计误差。

import tensorflow.keras.losses as kls

import tensorflow.keras.optimizers as ko

class A2CAgent:def__init__(self, model):

termsself.params = {'value': 0.5, 'entropy': 0.0001}

self.model = modelself.model.compile( optimizer=ko.RMSprop(lr=0.0007)

loss=[self._logits_loss, self._value_loss] )

deftest(self, env, render=True):

def_value_loss(self, returns, value):

self.params['value']*kls.mean_squared_error(returns, value)

def_logits_loss(self, acts_and_advs, logits):

advantages = tf.split(acts_and_advs, 2, axis=-1)

cross_entropy = kls.CategoricalCrossentropy(from_logits=True)

actions = tf.cast(actions, tf.int32)

policy_loss = cross_entropy(actions, logits, sample_weight=advantages)

entropy_loss = cross_entropy(logits, logits)

return policy_loss - self.params['entropy']*entropy_loss

我们完成了目标函数!注意代码非常紧凑:注释行几乎比代码本身还多。

Agent Training Loop

最后,还有训练环路。它有点长,但相当简单:收集样本,计算回报和优势,并在其上训练模型。

classA2CAgent:def__init__(self, model):

self.params = {'value': 0.5, 'entropy': 0.0001, 'gamma': 0.99}

def train(self, env, batch_sz=32, updates=1000):

actions = np.empty((batch_sz,), dtype=np.int32)

rewards, dones, values = np.empty((3, batch_sz))

observations = np.empty((batch_sz,) + env.observation_space.shape)

ep_rews = [0.0]

next_obs = env.reset()

for update in range(updates):

for step in range(batch_sz):

observations[step] = next_obs.copy()

actions[step], values[step] = self.model.action_value(next_obs[None, :])

next_obs, rewards[step], dones[step], _ = env.step(actions[step])

ep_rews[-1] += rewards[step]

if dones[step]:

ep_rews.append(0.0)

next_obs = env.reset()

_, next_value = self.model.action_value(next_obs[None, :])

returns, advs = self._returns_advantages(rewards, dones, values, next_value)

acts_and_advs = np.concatenate([actions[:, None], advs[:, None]], axis=-1)

losses = self.model.train_on_batch(observations, [acts_and_advs, returns])

return ep_rews

def _returns_advantages(self, rewards, dones, values, next_value):

returns = np.append(np.zeros_like(rewards), next_value, axis=-1)

for t in reversed(range(rewards.shape[0])):

returns[t] = rewards[t] + self.params['gamma'] * returns[t+1] * (1-dones[t])

returns = returns[:-1]

advantages = returns - values

return returns, advantages

def test(self, env, render=True):

def _value_loss(self, returns, value):

def _logits_loss(self, acts_and_advs, logits):

训练&结果

我们现在已经准备好在CartPole-v0上训练这个single-worker A2C agent!训练过程应该只用几分钟。训练结束后,你应该看到一个智能体成功地实现了200分的目标。

rewards_history = agent.train(env)

print("Finished training, testing...")

print("%d out of 200" % agent.test(env))

源代码中,我包含了一些额外的帮助程序,可以打印出正在运行的episode的奖励和损失,以及rewards_history。

静态计算图

eager mode效果这么好,你可能会想知道静态图执行是否也可以。当然是可以!而且,只需要多加一行代码就可以启用静态图执行。

with tf.Graph().as_default():

print(tf.executing_eagerly())

model = Model(num_actions=env.action_space.n)

agent = A2CAgent(model)

rewards_history = agent.train(env)

print("Finished training, testing...")

print("%d out of 200" % agent.test(env))

有一点需要注意的是,在静态图执行期间,我们不能只使用 Tensors,这就是为什么我们需要在模型定义期间使用CategoricalDistribution的技巧。

One More Thing…

还记得我说过TensorFlow在默认情况下以eager 模式运行,甚至用一个代码片段来证明它吗?好吧,我骗了你。

如果你使用Keras API来构建和管理模型,那么它将尝试在底层将它们编译为静态图。所以你最终得到的是静态计算图的性能,它具有eager execution的灵活性。

你可以通过model.run_eager标志检查模型的状态,还可以通过将此标志设置为True来强制使用eager mode,尽管大多数情况下可能不需要这样做——如果Keras检测到没有办法绕过eager mode,它将自动退出。

为了说明它确实是作为静态图运行的,这里有一个简单的基准测试:

env = gym.make('CartPole-v0')

obs = np.repeat(env.reset()[None, :], 100000, axis=0)

Eager Benchmark

%%timemodel = Model(env.action_space.n)

model.run_eagerly = Trueprint("Eager Execution: ", tf.executing_eagerly())

print("Eager Keras Model:", model.run_eagerly)

_ = model(obs)

######## Results #######

Eager Execution: TrueEager Keras Model: TrueCPU times: user 639 ms, sys: 736 ms, total: 1.38 s

Static Benchmark

%%timewith tf.Graph().as_default():

model = Model(env.action_space.n)

print("Eager Execution: ", tf.executing_eagerly())

print("Eager Keras Model:", model.run_eagerly)

_ = model.predict(obs)

######## Results #######

Eager Execution: FalseEager Keras Model: FalseCPU times: user 793 ms, sys: 79.7 ms, total: 873 ms

Default Benchmark

%%timemodel = Model(env.action_space.n)

print("Eager Execution: ", tf.executing_eagerly())

print("Eager Keras Model:", model.run_eagerly)

_ = model.predict(obs)

######## Results #######

Eager Execution: TrueEager Keras Model: FalseCPU times: user 994 ms, sys: 23.1 ms, total: 1.02 s

正如你所看到的,eager模式位于静态模式之后,默认情况下,模型确实是静态执行的。

结论

希望本文对理解DRL和即将到来的TensorFlow 2.0有所帮助。请注意,TensorFlow 2.0仍然只是预览版的,一切都有可能发生变化,如果你对TensorFlow有什么特别不喜欢(或喜欢:))的地方,请反馈给开发者。

一个总被提起的问题是,TensorFlow是否比PyTorch更好?也许是,也许不是。两者都是很好的库,所以很难说是哪一个更好。如果你熟悉PyTorch,你可能会注意到TensorFlow 2.0不仅赶上了它,而且还避免了PyTorch API的一些缺陷。

无论最后谁胜出,对于开发者来说,这场竞争给双方都带来了净积极的结果,我很期待看到这些框架未来会变成什么样子。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 智能工场AIWorkshop 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
详解TensorFlow 2.0新特性在深度强化学习中的应用
TensorFlow 2.0的特性公布已经有一段时间了,但很多人对此应当还是一头雾水。
深度强化学习实验室
2019/11/20
9050
如何在TensorFlow 2.0中构建强化学习智能体
对此,Keras 提出者、谷歌科学家 François Chollet 表示,这是一份非常详尽的介绍。
机器之心
2019/04/29
1.3K0
如何在TensorFlow 2.0中构建强化学习智能体
强化学习 cartpole_a3c
https://github.com/rlcode/reinforcement-learning/blob/master/2-cartpole/5-a3c/cartpole_a3c.py
CreateAMind
2018/07/24
3140
强化学习 cartpole_a3c
强化学习-A3C
loss由两部分组成,计算方式和第二篇其实大同小异,那篇文章里其实已经引入了Actor-Critic的思想。Actor就是策略网络(估计某个状态下每个动作的概率),Critic就是值函数网络(估计某个状态下的期望回报,也就是基准线),过程进行中得到的实际回报可以用MC或者TD计算得到。这些之前都有提到过了。
luxuantao
2021/02/24
4070
TensorFlow强化学习入门(3)——构建仿真环境来进行强化学习
在上一篇文章中,我演示了如何设计一个基于策略的强化学习agent来解决CartPole任务。在本文中,我们将从另一个角度重新审视这个问题——如何构建仿真环境来提升agent在当前环境下的性能。
ArrayZoneYour
2018/02/27
5.3K0
TensorFlow强化学习入门(3)——构建仿真环境来进行强化学习
使用Ray并行化你的强化学习算法(二)
spinningup给新手提供了几个重要算法的实现,具有很好的参考价值。除了SAC外,其他on policy算法都使用MPI进行并行化,唯独SAC没有并行实现。所以,我们使用Ray来完成SAC的并行实现。
CreateAMind
2019/12/19
1.4K0
使用Ray并行化你的强化学习算法(二)
教程 | 如何保持运动小车上的旗杆屹立不倒?TensorFlow利用A3C算法训练智能体玩CartPole游戏
本教程面向所有对强化学习感兴趣的人,不会涉及太深的机器学习基础,但主题中涵盖了高级策略网络和价值网络的相关知识。此外,我建议阅读 Voldymyr Mnih 的《Asynchronous Methods for Deep Reinforcement Learning》(https://arxiv.org/abs/1602.01783),这篇文章很值得一读,而且文中涉及到本教程采用的算法的很多细节。
机器之心
2018/09/20
1K0
教程 | 如何保持运动小车上的旗杆屹立不倒?TensorFlow利用A3C算法训练智能体玩CartPole游戏
近端策略优化算法(PPO):RL最经典的博弈对抗算法之一「AI核心算法」
但现在我们不用现行Policy的日志,而是用现行Policy与旧Policy的比率.
用户7623498
2020/12/14
7.5K0
Hands on Reinforcement Learning Frontier Chapter
虽然强化学习不需要有监督学习中的标签数据,但它十分依赖奖励函数的设置。有时在奖励函数上做一些微小的改动,训练出来的策略就会有天差地别。在很多现实场景中,奖励函数并未给定,或者奖励信号极其稀疏,此时随机设计奖励函数将无法保证强化学习训练出来的策略满足实际需要。例如,对于无人驾驶车辆智能体的规控,其观测是当前的环境感知恢复的 3D 局部环境,动作是车辆接下来数秒的具体路径规划,那么奖励是什么?如果只是规定正常行驶而不发生碰撞的奖励为+1,发生碰撞为-100,那么智能体学习的结果则很可能是找个地方停滞不前。具体能帮助无人驾驶小车规控的奖励函数往往需要专家的精心设计和调试。
一只野生彩色铅笔
2023/04/27
6700
Hands on Reinforcement Learning Frontier Chapter
强化学习系列(四)-PolicyGradient实例
上文我们介绍了使用简单的Random Guessing Algorithm & Hill Climbing 算法来解决CartPole问题,主要在决策动作这个步骤进行了修改,但是上文介绍的方法都是随机改变权重,针对简单问题参数量比较少的问题可能会得到比较好的效果,但是如果问题复杂,需要参数量多的话,这种方法就不太理想。本文主要介绍基于PolicyGradient方案如何解决CartPole问题。
languageX
2022/02/06
9050
《Scikit-Learn、Keras与TensorFlow机器学习实用指南(第二版)》第18章 强化学习
(第二部分:深度学习) 第10章 使用Keras搭建人工神经网络 第11章 训练深度神经网络 第12章 使用TensorFlow自定义模型并训练 第13章 使用TensorFlow加载和预处理数据 第14章 使用卷积神经网络实现深度计算机视觉 第15章 使用RNN和CNN处理序列 第16章 使用RNN和注意力机制进行自然语言处理 第17章 使用自编码器和GAN做表征学习和生成式学习 第18章 强化学习 [第19章 规模化训练和部署TensorFlow模型]
SeanCheney
2020/02/13
1.9K0
强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0
相比于Q learning,DQN本质上是为了适应更为复杂的环境,并且经过不断的改良迭代,到了Nature DQN(即Volodymyr Mnih发表的Nature论文)这里才算是基本完善。DQN主要改动的点有三个:
汀丶人工智能
2023/06/24
5130
强化学习从基础到进阶-案例与实践[4.1]:深度Q网络-DQN项目实战CartPole-v0
【强化学习】异步优势Actor-Critic, A3C算法(对比AC、A2C)
Asynchronous Advantage Actor-Critic, A3C(异步优势Actor-Critic)算法可以用通俗的方式解释为一种“团队协作”的强化学习方法,它的核心思想是通过多个线程(“团队成员”)同时工作,快速学习一个任务的最佳策略。
不去幼儿园
2024/12/26
2370
【强化学习】异步优势Actor-Critic, A3C算法(对比AC、A2C)
TensorFlow强化学习入门(2)——基于策略的Agents
在本教程系列的(1)中,我演示了如何构建一个agent来在多个选择中选取最有价值的一个。在本文中,我将讲解如何得到一个从现实世界中获取 观测值 ,并作出 长期收益 最大的 行动 的agent。正如前文所说,本文解决的问题将是一个完备的强化学习问题。
ArrayZoneYour
2018/02/25
1.6K0
TensorFlow强化学习入门(2)——基于策略的Agents
OpenAI Gym 中级教程——深入强化学习算法
OpenAI Gym 是一个用于开发和比较强化学习算法的工具包,提供了多个环境,包括经典的控制问题和 Atari 游戏。本篇博客将深入介绍 OpenAI Gym 中的强化学习算法,包括深度 Q 网络(Deep Q Network, DQN)和深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)。
Echo_Wish
2024/01/30
8081
OpenAI Gym 中级教程——强化学习实践项目
通过这个实际项目,我们演示了如何在 OpenAI Gym 中使用深度 Q 网络(DQN)来解决经典的 CartPole 问题。我们创建了一个简单的 DQN 模型,实现了经验回放缓冲区,并进行了训练。这个项目为初学者提供了一个实践的起点,同时展示了在强化学习任务中使用 TensorFlow 和 OpenAI Gym 的基本步骤。希望这篇博客能够帮助你更好地理解和应用强化学习算法。
Echo_Wish
2024/02/03
2680
【机器学习】机器学习重要分支——强化学习:从理论到实践
强化学习(Reinforcement Learning, RL)作为机器学习的重要分支之一,通过与环境交互、试错学习来优化决策策略,已在机器人控制、游戏AI、自动驾驶等领域展现出巨大的潜力。本文将深入探讨强化学习的基本原理、核心算法及其在实际中的应用,并提供代码示例和图表以帮助读者更好地理解和掌握这一技术。
E绵绵
2024/06/17
1.2K0
深度强化学习之:PPO训练红白机1942
本公众号MyEncyclopedia定期发布AI,算法,工程类深度和前沿文章。欢迎关注,收藏和点赞。本系列将从原理和代码来循序渐进讲解强化深度学习。
godweiyang
2021/04/08
2.3K0
深度强化学习之:PPO训练红白机1942
【DRL】深度强化学习介绍
随着深度学习的迅猛发展,深度强化学习(Deep Reinforcement Learning, DRL)将深度学习与强化学习相结合,使得处理高维状态空间成为可能。
不去幼儿园
2024/12/03
1650
【DRL】深度强化学习介绍
基于模块化和快速原型设计的Huskarl深度强化学习框架
前言:Huskarl是一种基于TensorFlow 2.0构建的深度强化学习的框架,其专注于模块化和快速原型设计。设计中尽可能使用了tf.keras API以实现简洁性和可读性。Huskarl可以轻松地跨多个CPU核心并行计算环境动态。这对于加速从多个并发经验源(如A2C或PPO)中受益的策略性学习算法非常有用。并且对于计算密集型环境尤其有用,例如基于物理的环境。其与OpenAI Gym环境无缝协作,并支持多智能体环境和Unity3D环境。
深度强化学习实验室
2019/11/21
6130
基于模块化和快速原型设计的Huskarl深度强化学习框架
推荐阅读
相关推荐
详解TensorFlow 2.0新特性在深度强化学习中的应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档