强化学习

  • Actor Critic
    • 1.概念
    • 2.优缺点
    • 3.原理
    • 4.公式原理
    • 5.代码实现
    • 附完整代码

Actor Critic

1.概念

Actor是一个神经网络
Critic也是一个神经网络,他们是不同的神经网络,Actor用于预测行为的概率,Critic是预测在这个状态下的价值。
结合了Policy Gradient(Actor)和Function Approximation(Critic)的方法,Actor基于概率选行为,Critic(可以用Q-learning或者Value-based)估计每一个状态的价值,用这个状态的价值减去下个状态的价值,(TD-error),Critic就告诉actor下一个动作要被加大更新的,TD-error如果是正的,下个动作就要加大更新,如果是负的,就减小actor的更新幅度,Criric基于Actor的行为评判行为的得分,Actor根据Critic的评分修改选行为的概率。
总结:
(1)演员(Actor)是指策略函数π θ(a∣s),即学习一个策略来得到尽量高的回报。
(2)评论家(Critic)是指值函数 V π(s),对当前策略的值函数进行估计,即评估演员的好坏。
(3)借助于值函数,演员-评论家算法可以进行单步更新参数,不需要等到回合结束才进行更新。

2.优缺点

1.优点:Actor-Critic是由Policy Gradients和Value-Based组成的,critic通过学习环境和奖惩的关系能看到所处的状态潜在的奖励,所以来指点actor使actor每一步都在更新,如果使用Policy Gradients,actor只能等到一个回合才能更新。
因此:可以进行单步更新,比传统的Policy Gradient要快。
2.缺点:
(1)Actor— Critic涉及到两个神经网络,每次都在连续状态中更新参数,每次参数更新的前后都存在相关性,导致了神经网络只能片面的看待问题,甚至学不到东西,
(2)Actor的行为取决于Critic的Value,但是因为Critic本来就很难收敛,和Actor一起更新的话就更难收敛了(为了解决收敛问题,后又提出了DDPG)

3.原理

1.Actor

Actor用于预测行为的概率。输入是现在的状态state,选择生成出各种行为的价值,(左60%,右40%),根据概率来选择行为(选择60%的),输出概率,然后优化行为(TD-error),
2.Critic

输入状态state,输出状态的值。

4.公式原理

伪代码如下:

5.代码实现

代码主要分为两部分,第一部分是Actor,第二部分是Critic。对于Actor部分,大家可以和上一篇策略梯度的代码对比,改动并不大,主要区别在于梯度更新部分,策略梯度使用是蒙特卡罗法计算出的价值v(t)v(t),则我们的actor使用的是TD误差。

在策略梯度部分,对应的位置如下:

self.loss = tf.reduce_mean(self.neg_log_prob * self.tf_vt)  # reward guided loss

而我们的Actor对应的位置的代码是:

self.exp = tf.reduce_mean(self.neg_log_prob * self.td_error)

此处要注意的是,由于使用的是TD误差,而不是价值v(t)v(t),此处需要最大化self.exp,而不是最小化它,这点和策略梯度不同。对应的Actor代码为:

#这里需要最大化当前策略的价值,因此需要最大化self.exp,即最小化-self.expself.train_op = tf.train.AdamOptimizer(LEARNING_RATE).minimize(-self.exp)

对于Critic部分,我们使用了类似于DQN的三层神经网络。不过我们简化了这个网络的输出,只有一维输出值,而不是之前DQN使用的有多少个可选动作,就有多少维输出值。网络结构如下:

def create_Q_network(self):# network weightsW1q = self.weight_variable([self.state_dim, 20])b1q = self.bias_variable([20])W2q = self.weight_variable([20, 1])b2q = self.bias_variable([1])self.state_input = tf.placeholder(tf.float32, [1, self.state_dim], "state")# hidden layersh_layerq = tf.nn.relu(tf.matmul(self.state_input, W1q) + b1q)# Q Value layerself.Q_value = tf.matmul(h_layerq, W2q) + b2q

对于算法中Actor和Critic交互的逻辑,在main函数中:

for step in range(STEP):action = actor.choose_action(state) # e-greedy action for trainnext_state,reward,done,_ = env.step(action)td_error = critic.train_Q_network(state, reward, next_state)  # gradient = grad[r + gamma * V(s_) - V(s)]actor.learn(state, action, td_error)  # true_gradient = grad[logPi(s,a) * td_error]state = next_stateif done:break

附完整代码

来自莫烦PYTHON

import numpy as np
import tensorflow as tf
import gymnp.random.seed(2)
tf.set_random_seed(2)  # reproducible# 超参数
OUTPUT_GRAPH = True
MAX_EPISODE = 3000
DISPLAY_REWARD_THRESHOLD = 200  # 刷新阈值
MAX_EP_STEPS = 1000  # 最大迭代次数
RENDER = False  # 渲染开关
GAMMA = 0.9  # 衰变值
LR_A = 0.001  # Actor学习率
LR_C = 0.01  # Critic学习率env = gym.make('CartPole-v0')
env.seed(1)
env = env.unwrapped     # 为环境增加限制,对训练有利N_F = env.observation_space.shape[0]  # 状态空间
N_A = env.action_space.n              # 动作空间class Actor(object):def __init__(self, sess, n_features, n_actions, lr=0.001):self.sess = sessself.s = tf.placeholder(tf.float32, [1, n_features], "state")self.a = tf.placeholder(tf.int32, None, "act")self.td_error = tf.placeholder(tf.float32, None, "td_error")  # TD_error应该加大幅度或者减小幅度with tf.variable_scope('Actor'):       # 指定变量的作用域l1 = tf.layers.dense(              # 全连接层inputs=self.s,units=20,  # number of hidden unitsactivation=tf.nn.relu,kernel_initializer=tf.random_normal_initializer(0., .1),  # 初始化weights,均值为0,方差为1bias_initializer=tf.constant_initializer(0.1),  # biasesname='l1')self.acts_prob = tf.layers.dense(inputs=l1,units=n_actions,  # output unitsactivation=tf.nn.softmax,  # get action probabilities,输出概率kernel_initializer=tf.random_normal_initializer(0., .1),  # weightsbias_initializer=tf.constant_initializer(0.1),  # biasesname='acts_prob')with tf.variable_scope('exp_v'):           # 预计的价值函数log_prob = tf.log(self.acts_prob[0, self.a])          # 计算loss,将动作的可能性放大或是缩小,log动作概率self.exp_v = tf.reduce_mean(log_prob * self.td_error)  # advantage (TD_error) guided loss,,exp表示预计的价值,log概率*TD方向with tf.variable_scope('train'):# 不断增加exp_v(动作带来的额外价值)self.train_op = tf.train.AdamOptimizer(lr).minimize(-self.exp_v)  # minimize(-exp_v) = maximize(exp_v)最大化预计价值def learn(self, s, a, td):s = s[np.newaxis, :]          # 新增维度feed_dict = {self.s: s, self.a: a, self.td_error: td}              # TF的一种输入方式_, exp_v = self.sess.run([self.train_op, self.exp_v], feed_dict)return exp_vdef choose_action(self, s):s = s[np.newaxis, :]probs = self.sess.run(self.acts_prob, {self.s: s})        # 获取所有操作的概率return np.random.choice(np.arange(probs.shape[1]), p=probs.ravel())  # return a int,返回按照一定概率选择的动作class Critic(object):def __init__(self, sess, n_features, lr=0.01):self.sess = sessself.s = tf.placeholder(tf.float32, [1, n_features], "state")self.v_ = tf.placeholder(tf.float32, [1, 1], "v_next")self.r = tf.placeholder(tf.float32, None, 'r')with tf.variable_scope('Critic'):l1 = tf.layers.dense(inputs=self.s,units=20,  # number of hidden unitsactivation=tf.nn.relu,  # None# have to be linear to make sure the convergence of actor.# But linear approximator seems hardly learns the correct Q.kernel_initializer=tf.random_normal_initializer(0., .1),  # weightsbias_initializer=tf.constant_initializer(0.1),  # biasesname='l1')self.v = tf.layers.dense(inputs=l1,units=1,  # output unitsactivation=None,kernel_initializer=tf.random_normal_initializer(0., .1),  # weightsbias_initializer=tf.constant_initializer(0.1),  # biasesname='V')# 就想Q-learning那样更新TD-error就可以with tf.variable_scope('squared_TD_error'):self.td_error = self.r + GAMMA * self.v_ - self.v             # critic得出的评分self.loss = tf.square(self.td_error)  # TD_error = (r+gamma*V_next) - V_eval,TD-error=V现实-V估计with tf.variable_scope('train'):self.train_op = tf.train.AdamOptimizer(lr).minimize(self.loss)       # 最小化损失函数def learn(self, s, r, s_):s, s_ = s[np.newaxis, :], s_[np.newaxis, :]v_ = self.sess.run(self.v, {self.s: s_})td_error, _ = self.sess.run([self.td_error, self.train_op],{self.s: s, self.v_: v_, self.r: r})return td_errorsess = tf.Session()# 定义Actor,Critic
actor = Actor(sess, n_features=N_F, n_actions=N_A, lr=LR_A)  # 初始化Actor
critic = Critic(sess, n_features=N_F, lr=LR_C)  # 初始化Critic,critic学习的数据会为actor作指导,所以LR_C会大一些
sess.run(tf.global_variables_initializer())  # 初始化参数if OUTPUT_GRAPH:tf.summary.FileWriter("logs/", sess.graph)  # 输出日志# 开始迭代过程 对应伪代码部分
for i_episode in range(MAX_EPISODE):s = env.reset()  # 环境初始化t = 0track_r = []  # 每回合的所有奖励,置空while True:           # 回合中每一步if RENDER: env.render()a = actor.choose_action(s)  # Actor选取动作s_, r, done, info = env.step(a)  # 环境反馈if done: r = -20  # 回合结束的惩罚track_r.append(r)  # 记录回报值rtd_error = critic.learn(s, r, s_)  # Critic 学习,返回TD-erroractor.learn(s, a, td_error)  # Actor 学习s = s_t += 1if done or t >= MAX_EP_STEPS:# 回合结束, 打印回合累积奖励ep_rs_sum = sum(track_r)if 'running_reward' not in globals():running_reward = ep_rs_sumelse:running_reward = running_reward * 0.95 + ep_rs_sum * 0.05if running_reward > DISPLAY_REWARD_THRESHOLD: RENDER = True  # renderingprint("episode:", i_episode, "  reward:", int(running_reward))break

参考链接;
1.actor-critic
https://github.com/datawhalechina/leedeeprl-notes
https://blog.csdn.net/qq_30615903/article/details/80774384?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161033115816780265418113%252522%25252C%252522scm%252522%25253A%25252220140713.130102334…%252522%25257D&request_id=161033115816780265418113&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-1-80774384.pc_search_result_no_baidu_js&utm_term=actor%20critic%E6%9B%B4%E6%96%B0%E5%85%AC%E5%BC%8F

https://blog.csdn.net/rufanchen_/article/details/95093958?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161032889916780262561436%252522%25252C%252522scm%252522%25253A%25252220140713.130102334…%252522%25257D&request_id=161032889916780262561436&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-1-95093958.pc_search_result_no_baidu_js&utm_term=actor-critic

强化学习之Actor-Critic相关推荐

  1. 【强化学习】Actor Critic原理

    PG算法是一种只基于policy的一种方法,存在的问题就是该算法需要完整的状态序列,且单独对策略函数进行迭代更新,不太容易收敛. Actor-critic方法呢是一种将 策略(Policy Based ...

  2. 人工智能-强化学习-算法:Critic 【用于评价一个 Actor/Policy π】--> Q-Learning【用于训练出来一个最优 Actor/Policy π,擅长处理离散型 actions】

    一.Critic的作用 Critic就是一个神经网络,以状态 s s s 为输入,以期望的Reward为输出. Critic的作用就是衡量一个Actor在某State状态下的优劣.Given an a ...

  3. 【强化学习】一文带你理清强化学习

    整理不易,希望留个赞再走哦!! 学习路线 这个图描述的比较清晰,蓝框里是整个强化学习的一些概念基础了,橙色是一些学习方法,可以针对性的选择一些,废话不多说,接下来就按照这个路线图展开. 1. 马尔可夫 ...

  4. 【MATLAB强化学习工具箱】学习笔记--actor网络和critic网络的结果放在哪里?

    原算例见 [MATLAB强化学习工具箱]学习笔记--在Simulink环境中训练智能体Create Simulink Environment and Train Agent_bear_miao的博客- ...

  5. 强化学习论文笔记:Soft Actor Critic算法

    Soft Actor Critic是伯克利大学团队在2018年的ICML(International Conference on Machine Learning)上发表的off-policy mod ...

  6. 【强化学习笔记】2020 李宏毅 强化学习课程笔记(PPO、Q-Learning、Actor + Critic、Sparse Reward、IRL)

    前言 如果你对这篇文章感兴趣,可以点击「[访客必读 - 指引页]一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接. 文章目录 前言 Introduction Two Learning Mod ...

  7. 离线强化学习论文学习 Critic Regularized Regression

    Critic Regularized Regression 1.摘要 离线强化学习(RL),也被称为批量RL,提供了在没有在线环境交互的情况下从大型预记录数据集进行策略优化的前景.它解决了数据收集成本 ...

  8. critic法计算_对于强化学习算法中的AC算法(Actor-Critic算法) 的一些理解

    AC算法(Actor-Critic算法)最早是由<Neuronlike Adaptive Elements That Can Solve Difficult Learning Control P ...

  9. 深度增强学习--Actor Critic

    Actor Critic value-based和policy-based的结合 实例代码 1 import sys 2 import gym 3 import pylab 4 import nump ...

  10. 强化学习(九)- 策略梯度方法 - 梯度上升,黑箱优化,REINFORCE算法及CartPole实例

    策略梯度方法 引言 9.1 策略近似和其优势 9.2 策略梯度定理 9.2.1 梯度上升和黑箱优化 9.2.2 策略梯度定理的证明 9.3 REINFORCE:蒙特卡洛策略梯度 9.3.1 轨迹上的R ...

最新文章

  1. tweak 项目 快速搭建CocoaAsyncSocket(建连、断开、重连、心跳、通用请求)
  2. 第二篇: Mysql____语法格式——键值
  3. Java案例-用户注册邮箱绑定激活功能实现
  4. mybatis使用statement.getGenreatedKeys(); useGeneratedKeys=”true”;使用自增主键获取主键值策略和Oracle不支持自增,Oracle使用序列
  5. 程序员过关斩将--Http请求中如何保持状态?
  6. Delta架构:统一Lambda架构并利用Hadoop / REST中的Storm
  7. React开发(172):React引入背景图片
  8. 央视网与中国网络电视台5月底正式合并
  9. Python爬虫实战(2) 爬取中国土壤数据库部分数据
  10. 【网站】八大极品桌面壁纸网站,惊艳
  11. 中国歌手翻唱的日本歌曲(转)
  12. python读取包含层级关系的excel
  13. 福斯数据服务平台产品白皮书
  14. C# Snap7 实现对西门子PLC的读写(本篇主要对系统诊断缓存区(SSL或SZL)内容进行读取)
  15. C++ Primer Plus 第六版(中文版)第十一章(重置版)编程练习答案
  16. scheduleAtFixedRate和scheduleWithFixedDelay 区别
  17. 产品经理看过来,一篇文章说清楚MRD文档怎么写
  18. 6种实现前端下载图片的方法汇总
  19. 基于STM32的OLED屏显实例
  20. 世界各国 省市县 省份 城市 三级数据库表 资源下载 mysql

热门文章

  1. python一元运算符,python 重载一元运算符
  2. 尚硅谷谷粒音乐项目学习笔记及答疑解惑(1-20集)
  3. Ignite Transaction
  4. 【Hive】 解决 com.ctc.wstx.exc.WstxParsingException: String ‘--‘ not allowed in comment (missing ‘」‘?)
  5. 计算机专业非常辛苦,这3个专业“最辛苦”?毕业工作最吃香!
  6. 计算机配置故障的处理方法,电脑配置低怎么办(教你5个简单的处理方法)
  7. 基于51单片机智能家居电路控制仿真
  8. [益智]:有一辆火车以每小时15公里的速度离开洛杉矶直奔纽约,另一辆火车以每小时20公里的速度从纽约开往洛杉矶。如果有一只鸟,
  9. 解决font icon图标的对齐问题
  10. Phpstorm 崩溃