策略网络和估值网络是强化学习两种重要的方法。强化学习和有监督学习、无监督学习不同,它的学习目标是变化的、不明确的,甚至可能不存在绝对正确的标签。AlphaGo就是结合了策略网络,估值网络和蒙特卡洛搜索树实现对战程序的。
强化学习中有环境状态(Environment State)、动作(Action)和奖励(Reward)。模型的载体是Agent。
策略网络的实质是建立一个神经网络模型,通过观察环境状态预测出目前应该执行的策略,执行这个策略,并获取可以获得最大的奖励是多少。和普通的监督学习不同,策略网络不是通过feature预测label,而是根据对观察的环境状态进入模型,得到action,执行这个action后得到reward,通过reward的加权衰减并叠加后计算梯度,通过梯度优化网络参数。
强化学习与其他两类学习还有一个很不同的点——它需要一个环境生成工具,生成问题对应的环境和模型载体Agent。Gym是OpenAI退出的开源的强化学习环境。通过pip install gym即可安装。
选择gym下的Cartpole问题来完成强化学习初体验。
CartPole的环境中有一辆小车,在一个一维无阻力轨道上行驶,在车上连接着不太结实的杆,这个杆会左右摇晃,我们的任务是让车不偏离中心超过2.4个单位距离并且杆的倾角小于15度,否则,表示任务失败。环境和agent如下:

环境信息Observation是一个4值的数组,包含小车的位置、速度、杆的角度等。
在运行过程中,小车每坚持一步,reward加1,每次失败后,reward清0. 当reward大于200后任务完成,退出学习。

以带有一个隐含层的MLP为神经网络模型,完成本次任务。整个计算图如下

其中,虚线框内是圣经网络计算子图,绿色部分是小车每动作一步都会计算的,橙色是一次迭代(从开始运行到任务失败算一次迭代)执行一次,红色是一个batch执行一次。
Input_y = 1-action;
epr = reward * discount
advantage = epr – mean(epr) / std(epr), mean为均值,std为标准差。

程序如下:

#coding:utf-8import numpy as np
import tensorflow as tf
import gymenv = gym.make('CartPole-v0')H = 50
batch_size = 25
learning_rate = 1e-1
D = 4
gamma = 0.99"""
以observation为输入,建立MLP。
一个隐藏层用relu激活,一个全连接层接输出,因为是action,所以,输出只有一个。
输出用sigmoid激活
"""
observations = tf.placeholder(tf.float32, [None, D], name = "input_x")
W1 = tf.get_variable('W1', shape = [D, H], initializer = tf.contrib.layers.xavier_initializer())
layer1 = tf.nn.relu(tf.matmul(observations, W1))
W2 = tf.get_variable('W2', shape = [H, 1], initializer = tf.contrib.layers.xavier_initializer())
score = tf.matmul(layer1, W2)
probability = tf.nn.sigmoid(score)"""
reward的逐步衰减。
"""
def discount_rewasrd(r):discounted_r = np.zeros_like(r)running_add = 0for t in reversed(range(r.size)):running_add = running_add * gamma + r[t]discounted_r[t] = running_addreturn discounted_r""""""
input_y = tf.placeholder(tf.float32, [None, 1], name="input_y")
advantages = tf.placeholder(tf.float32, name="reward_singal")
#实际上是对action做对数似然
loglik = tf.log(input_y * (input_y - probability) + (1 - input_y) * (input_y + probability))
loss = -tf.reduce_mean(loglik * advantages)tvars = tf.trainable_variables()
newGrads = tf.gradients(loss, tvars)"""
梯度更新模块
每个Batch计算完成后才做一次更新
apply_gradients的更新原理?
"""
adam = tf.train.AdamOptimizer(learning_rate = learning_rate)
W1Grad = tf.placeholder(tf.float32, name = "batch_grade1")
W2Grad = tf.placeholder(tf.float32, name = "batch_grade2")
batchGrad = [W1Grad, W2Grad]
updateGrads = adam.apply_gradients(zip(batchGrad, tvars))""""""
xs, ys, drs = [], [], [] #xs是环境信息的观察列表, ys是label列表, drs是每一个action的reward
reward_sum = 0
episode_number = 1
total_episodes = 10000with tf.Session() as sess:rendering = Falseinit = tf.global_variables_initializer()sess.run(init)observation = env.reset()gradBuffer = sess.run(tvars)for ix,grad in enumerate(gradBuffer):gradBuffer[ix] = grad * 0#因为循环层次不同,整个计算图被分成几个子图执行。while episode_number <= total_episodes:if reward_sum/batch_size > 100 or rendering == True:env.render()rendering = Truex = np.reshape(observation, [1,D])tfprob = sess.run(probability, feed_dict={observations: x})action = 1 if np.random.uniform() < tfprob else 0xs.append(x)y = 1 - actionys.append(y)observation, reward, done, info = env.step(action)reward_sum += rewarddrs.append(reward)if done:episode_number += 1epx = np.vstack(xs)epy = np.vstack(ys)epr = np.vstack(drs)xs, ys, drs = [], [], []discounted_epr = discount_rewasrd(epr)discounted_epr -= np.mean(discounted_epr)discounted_epr /= np.std(discounted_epr)tGrad = sess.run(newGrads, feed_dict={observations: epx, input_y: epy, advantages: discounted_epr})for ix, grad in enumerate(tGrad):gradBuffer[ix] += gradif episode_number % batch_size == 0:#运行图中的优化子图,将梯度缓存中一个batch的梯度输入到图中。sess.run(updateGrads, feed_dict={W1Grad: gradBuffer[0], W2Grad: gradBuffer[1]})for ix, grad in enumerate(gradBuffer):gradBuffer[ix] = grad * 0   #一个batch结束后,将所有的梯度缓存清空。print "Average reward for episode %d : %f." % (episode_number, reward_sum / batch_size)if reward_sum / batch_size > 200:print "Task solved in", episode_number, 'episodes!'breakreward_sum = 0observation = env.res

执行结果很尴尬的是,reward最大值刚好只能达到200.000,一直都不退出。

《tensorflow实战》6——强化学习之策略网络相关推荐

  1. 免费教材丨第55期:Python机器学习实践指南、Tensorflow 实战Google深度学习框架

    小编说  时间过的好快啊,小伙伴们是不是都快进入寒假啦?但是学习可不要落下哦!  本期教材  本期为大家发放的教材为:<Python机器学习实践指南>.<Tensorflow 实战G ...

  2. 06.图像识别与卷积神经网络------《Tensorflow实战Google深度学习框架》笔记

    一.图像识别问题简介及经典数据集 图像识别问题希望借助计算机程序来处理.分析和理解图片中的内容,使得计算机可以从图片中自动识别各种不同模式的目标和对象.图像识别问题作为人工智能的一个重要领域,在最近几 ...

  3. 读书笔记 - 多智能体强化学习在城市交通网络信号的综述2018

    多智能体强化学习在城市交通网络信号 控制方法中的应用综述 交通信号控制系统在物理位置和控制逻辑上分散于动态变化的网络交通环境, 将每个路口的交通信号控制器看做一个异质的智能体, 非常适合采用无模型.自 ...

  4. 第七章 深度强化学习-深度Q网络系列1(Deep Q-Networks,DQN)

    获取更多资讯,赶快关注上面的公众号吧! 文章目录 第七章 深度强化学习-深度Q网络 7.1 学习目标 7.2 深度学习和强化学习的区别 7.3 DQN原理 7.4 DQN算法 7.4.1 预处理 7. ...

  5. 【ICLR 2018录用结果出炉】23篇oral干货,强化学习、对抗网络、可解释性最受关注...

    Oral Papers:23篇 1.AmbientGAN: Generative models from lossy measurements (AmbientGAN:来自有损测量的生成模型) 作者: ...

  6. (转)Tensorflow 实战Google深度学习框架 读书笔记

    本文大致脉络: 读书笔记的自我说明 对读书笔记的摘要 具体章节的摘要: 第一章 深度学习简介 第二章 TensorFlow环境搭建 第三章 TensorFlow入门 第四章 深层神经网络 第五章 MN ...

  7. 《Tensorflow 实战google深度学习框架》第二版源代码

    <<Tensorflow 实战google深度学习框架–第二版>> 完整资料github地址: https://github.com/caicloud/tensorflow-t ...

  8. 学习《TensorFlow实战Google深度学习框架 (第2版) 》中文PDF和代码

    TensorFlow是谷歌2015年开源的主流深度学习框架,目前已得到广泛应用.<TensorFlow:实战Google深度学习框架(第2版)>为TensorFlow入门参考书,帮助快速. ...

  9. 说说TensorFlow实战Google深度学习框架

    说说TensorFlow实战Google深度学习框架 事情是这样的,博主买了这本书,但是碍于想在电脑上边看边码,想找找PDF版本,然后各种百度,Google,百度网盘,最后找到的都是很多200M的,百 ...

  10. 实战深度强化学习DQN-理论和实践

    全文共3061字,11张图,预计阅读时间15分钟. Q-Learning回顾 Q-learning 的 算法过程如下图所示: 在Q-learning中,我们维护一张Q值表,表的维数为:状态数S * 动 ...

最新文章

  1. 人类已无法阻挡AI?围棋后AI再破最强人类堡垒,通杀智力比赛
  2. 2016年深圳市宝安区小一学位申请流程及时间安排
  3. 关于valgrind的安装和内存泄露分析
  4. java重写面试题_Java面试题:重写了equals方法,为什么还要重写hashCode方法?
  5. 我爱计算机视觉干货集锦分类汇总(2019年3月9日)
  6. 如何快速开发一个支持高效、高并发的分布式ID生成器(一)
  7. kinect1+depthimage_to_laserscan
  8. SQL中的「规则」 constraint 与「约束」 rule 的区别。
  9. Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]
  10. 区域增长 matlab,图像分割 区域增长
  11. 小米球 ngrok 安装教程
  12. tf hub bigGan 猫变狗
  13. 如何解决注塑成型中的毛边问题?
  14. AMiner 会议论文推荐第十四期
  15. 速记混淆矩阵中的FP、FN、FP、TN
  16. 使用gensim框架及Word2Vec词向量模型获取相似词
  17. Legacy Build System
  18. 【ELK】ELK菜鸟手记 (一) 环境配置+log4j日志记录——转自Master HaKu
  19. Python数据分析之数据抓取 part 1
  20. 计算机二级考试公共基础知识——第一章计算机系统

热门文章

  1. pta算法:计算天数
  2. 面对爱情,相当真诚的星座,将心比心,单纯善良
  3. IT界有哪些书是必看的?
  4. border-color属性设置单边边框和综合四边边框颜色
  5. vue 手机h5动态银行支付密码键盘前端
  6. Word中规范输入大写的中文日期(转)
  7. 百度迟到移动互联网:寻入口级产品 文化成挑战
  8. 码农慌不慌?只因写了一段爬虫,大数据公司200多人被抓!
  9. QGIS插件开发-执法业务计算
  10. HTML模拟电池页面,Html 电池图标