gym :OpenAI提供的开发强化学习的工具库
scipy :科学计算库
tqdm :进度条显示
实验及代码来自《Tensorflow实战》,黄文坚 唐源 著,第8章2节;仅供学习分享非商用。
一、环境简介
1.1 Gym环境介绍
Gym中环境接口是Env类,其中有几个重要的方法。
(1)创建某个任务的环境
env = gym.make('Copy-v0')
(2)初始化环境
state_0 = env.reset()
(3)在当前状态执行一步动作
[observation,reward,done,info] = env.step(action)
observation是一个 四维数组包含 [ 位置、速度、杆角度、杆速度 ]。
(4)渲染一帧的任务图像
env.render()
(5)对模型进行监控记录
env.monitor()
1.2 导入必要的库(代码片01)
import numpy as np
import tensorflow as tf
import gym
二、策略网络
2.1 策略网络参数定义(代码片02)
# 隐藏层节点数
H = 50
# 累计达到 batch_size 个数的样本进行更新
batch_size = 25
# 学习速率
learning_rate = 1e-1
# 奖励折扣率
gamma = 0.99
# 环境参数维度
D = 4
2.2 策略网络结构定义(代码片03)
# ##### 设置默认图
tf.reset_default_graph()
# 输出参数 是一个维度 N*4 的张量
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)
三、损失函数
3.1 获取可训练参数(代码片04)
# 获取可训练参数
tvars = tf.trainable_variables()
调试得到 tvars为 tvars:[<Variable>,<Variable>];
(1)第一项子对象
name:‘W1:0’,
shape:TensorShape([Dimension(4),Dimension(50)])
(2)第二项子对象
name:‘W2:0’,
shape:TensorShape([Dimension(50),Dimension(1)])
3.2 定义虚拟Label及损失函数(代码片05)
这里是个技术活,看懂代码但没理解,为什么要这么定义!!!
策略网络输出probability, Action取1概率为probability, Action取0概率为(1-probability)
令label = 1-Action, 即 label取1概率为(1-probability), 取0概率为probability
当Action为1, label为0, loglik = tf.log(probability)
当Action为0, label为1, loglik = tf.log(1-probability)
所以 loglik 就是当前Action的概率的对数
将 loglik与潜在价值advantages相乘并取平均值, 取其负值作为损失函数, 即优化目标;
那么优化器就会让 获