赞
踩
前置基础:Policy gradient
Actor-Critic算法 (演员批判家算法),合并了以值为基础 (比如 Q learning) 和以动作概率为基础 (比如 Policy Gradients) 两类强化学习算法。Actor 和 Critic网络都能用不同的神经网络来代替。
Actor-Critic 的 Actor 的前生是 policy gradient, 这能让它毫不费力地在连续动作中选取合适的动作, 而 Q-learning 无法做到。
为什么不直接用 Policy Gradients 呢?
Actor Critic 中的 Critic 网络是 Q-learning 或者其他的 以值为基础的学习法 , 能进行单步更新, 传统的 Policy Gradients 则是回合更新, 这降低了学习效率。
在 Policy Gradients 的中提到过, 现实中的奖惩会左右 Actor 的更新情况. Policy Gradients 也是靠着这个来获取适宜的更新. 那么何时会有奖惩这种信息能不能被学习呢? (补充:或者是理解为在当前这一步的时候未来获得的奖惩是多少呢?这个信息可以被学习到吗?)这看起来不就是 以值为基础的强化学习方法做过的事吗. 那我们就拿一个 Critic 去学习这些奖惩机制, 学习完了以后. 由 Actor 来指手画脚, 由 Critic 来告诉 Actor 你的那些指手画脚哪些指得好, 哪些指得差, Critic 通过学习环境和奖励之间的关系, 能看到现在所处状态的潜在奖励, 所以用它来指点 Actor 便能使 Actor 每一步都在更新, 如果使用单纯的 Policy Gradients, Actor 只能等到回合结束才能开始更新.
(Actor-Critic更多的是一种范式,里面的Actor结构的算法或者Critic结构的算法都是可以修改的)
Actor-Critic:结合了 Policy Gradient (Actor) 和 Function Approximation (Critic) 的方法。Actor 基于概率选行为, Critic 基于 Actor 的行为评判行为的得分, Actor 根据 Critic 的评分修改选行为的概率。
Actor Critic 方法的优势: 可以进行单步更新, 比传统的 Policy Gradient 要快。
Actor Critic 方法的劣势: 取决于 Critic 的价值判断, 但是 Critic 难收敛, 再加上 Actor 的更新, 就更难收敛.
Actor 修改行为时就像蒙着眼睛一直向前开车, Critic 就是那个扶方向盘改变 Actor 开车方向的。 Actor 在运用 Policy Gradient 的方法进行 Gradient ascent 的时候, 由 Critic 来告诉他, 这次的 Gradient ascent 是不是一次正确的 ascent, 如果这次的得分不好, 那么就不要 ascent 那么多.
代码:github
Actor 想要最大化期望的 reward, 在 Actor Critic 算法中, 我们用 比平时好多少 (TD error) 来当做 reward, 所以就是:
with tf.variable_scope('exp_v'):
log_prob = tf.log(self.acts_prob[0, self.a]) # log 动作概率
self.exp_v = tf.reduce_mean(log_prob * self.td_error) # log 概率 * TD 方向
with tf.variable_scope('train'):
# 因为我们想不断增加这个 exp_v (动作带来的额外价值),
# 所以我们用过 minimize(-exp_v) 的方式达到
# maximize(exp_v) 的目的
self.train_op = tf.train.AdamOptimizer(lr).minimize(-self.exp_v)
Critic 的更新很简单, 就是像 Q learning 那样更新现实和估计的误差 (TD error) 就好了.
with tf.variable_scope('squared_TD_error'):
self.td_error = self.r + GAMMA * self.v_ - self.v
self.loss = tf.square(self.td_error) # TD_error = (r+gamma*V_next) - V_eval
with tf.variable_scope('train'):
self.train_op = tf.train.AdamOptimizer(lr).minimize(self.loss)
for i_episode in range(MAX_EPISODE): s = env.reset() t = 0 track_r = [] # 每回合的所有奖励 while True: if RENDER: env.render() a = actor.choose_action(s) s_, r, done, info = env.step(a) if done: r = -20 # 回合结束的惩罚 track_r.append(r) td_error = critic.learn(s, r, s_) # Critic 学习 actor.learn(s, a, td_error) # Actor 学习 s = s_ t += 1 if done or t >= MAX_EP_STEPS: # 回合结束, 打印回合累积奖励 ep_rs_sum = sum(track_r) if 'running_reward' not in globals(): running_reward = ep_rs_sum else: running_reward = running_reward * 0.95 + ep_rs_sum * 0.05 if running_reward > DISPLAY_REWARD_THRESHOLD: RENDER = True # rendering print("episode:", i_episode, " reward:", int(running_reward)) break
Actor-Critic的全部代码:github
Actor-Critic 涉及到了两个神经网络, 而且每次都是在连续状态中更新参数, 每次参数更新前后都存在相关性, 导致神经网络只能片面的看待问题, 甚至导致神经网络学不到东西(难以收敛)。
DeepMind 为了解决这个问题, 修改了 Actor Critic 的算法,增加单步更新属性。将之前在电动游戏 Atari 上获得成功的 DQN 网络加入进 Actor Critic 系统中, 这种新算法叫做 Deep Deterministic Policy Gradient,DDPG。
DDPG 最大的优势就是能够在连续动作上更有效地学习,解决了critic不易收敛的问题。
DPG=‘Deterministic’+‘Policy Gradient’
Deterministic对policy gradient的优化:改变了输出动作的过程, 只在连续动作上输出一个动作值
DDPG=‘Deep’ + ‘Deterministic Policy Gradient’
DDPG 中所用到的神经网络. 它其实和我们之前提到的 Actor-Critic 形式差不多, 也需要有基于 策略 Policy 的神经网络 和基于 价值 Value 的神经网络。
但是为了体现 DQN 的思想, 每种神经网络我们都需要再细分为两个。(原因参考链接的文章)
Policy Gradient 这边, 我们有估计网络和现实网络, 估计网络用来输出实时的动作, 供 actor 在现实中实行. 而现实网络则是用来更新价值网络系统的。(PG这里的现实网络对PG结构本身无影响,是为了计算Q现实服务的)
Value-based RL这边, 也有现实网络和估计网络, 都在输出这个状态的价值, 而输入端却有不同, 状态现实网络这边会拿着从动作现实网络来的动作加上状态的观测值加以分析。 而状态估计网络则是拿着当时 Actor 施加的动作当做输入.
在实际运用中, DDPG 的这种做法的确带来了更有效的学习过程.
更详细的内容参考深度强化学习 # DDPG
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。