# TensorFlow强化学习入门（0）——Q-Learning的查找表实现和神经网络实现

## 查找表实现

```# FrozenLake 问题的规则
SFFF       (S: 起始点, 安全)
FHFH       (F: 冰层, 安全)
FFFH       (H: 空洞, 跌落危险)
HFFG       (G: 目的地, 飞盘所在地)```

Eq 1. Q(s,a) = r + γ(max(Q(s’,a’))

```# Q-Table Learning
import gym
import numpy as np
# 加载实验环境
env = gym.make('FrozenLake-v0')

# 集成Q表学习算法
# 初始表（全0）
Q = np.zeros([env.observation_space.n,env.action_space.n])
# 设定超参数
lr = .8
y = .95
num_episodes = 2000
# 创建episodes中包含当前奖励值和步骤的列表
rList = []
for i in range(num_episodes):
# 初始化环境，得到第一个状态观测值
s = env.reset()
rAll = 0
d = False
j = 0
# Q表学习算法
while j < 99:
j += 1
# 根据Q表和贪心算法(含噪)选定当前的动作
a = np.argmax(Q[s,:] + np.random.randn(1, env.action_space.n) * (1./(i+1)))
# 获取新的状态值和奖励值
s1, r, d, _ = env.step(a)
# 更新Q表
Q[s,a] = Q[s,a] + lr * (r + y*np.max(Q[s1,]) - Q[s,a])
rAll += r
s = s1
if d == True:
break
rList.append(rAll)

print("Score over time: " +  str(sum(rList)/num_episodes))
print("Final Q-Table Values")
print(Q)```

## 神经网络实现

Eq2. Loss = ∑(Q-target - Q)²

```import gym
import numpy as np
import random
import tensorflow as tf
import matplotlib.pyplot as plt
%matplotlib inline

# 加载实验环境
env = gym.make('FrozenLake-v0')
# Q网络解法
tf.reset_default_graph()
# 建立用于选择行为的网络的前向传播部分
inputs1 = tf.placeholder(shape=[1,16], dtype=tf.float32)
W = tf.Variable(tf.random_uniform([16,4], 0, 0.01))
Qout = tf.matmul(inputs1, W)
predict = tf.argmax(Qout, 1)
# 计算预期Q值和目标Q值的差值平方和（损失值）
nextQ = tf.placeholder(shape=[1,4], dtype=tf.float32)
loss = tf.reduce_sum(tf.square(nextQ - Qout))
updateModel = trainer.minimize(loss)
# 训练网络
init = tf.initialize_all_variables()
# 设置超参数
y = .99
e = 0.1
num_episodes = 2000 # 为了快速设置为2000，实验调为20000时可以达到0.6的成功率
# 创建episodes中包含当前奖励值和步骤的列表
jList = []
rList = []
with tf.Session() as sess:
sess.run(init)
for i in range(num_episodes):
# 初始化环境，得到第一个状态观测值
s = env.reset()
rAll = 0
d = False
j = 0
# Q网络
while j < 99:
j += 1
# 根据Q网络和贪心算法(有随机行动的可能)选定当前的动作
a, allQ = sess.run([predict, Qout], feed_dict={inputs1:np.identity(16)[s:s+1]})
if np.random.rand(1) < e:
a[0] = env.action_space.sample()
# 获取新的状态值和奖励值
s1, r, d, _ = env.step(a[0])
# 通过将新的状态值传入网络获取Q'值
Q1 = sess.run(Qout, feed_dict={inputs1:np.identity(16)[s1:s1+1]})
# 获取最大的Q值并选定我们的动作
maxQ1 = np.max(Q1)
targetQ = allQ
targetQ[0, a[0]] = r + y*maxQ1
# 用目标Q值和预测Q值训练网络
_, W1 = sess.run([updateModel, W], feed_dict={inputs1:np.identity(16)[s:s+1], nextQ:targetQ})
rAll += r
s = s1
if d == True:
# 随着训练的进行不断减小随机行动的可能性
e = 1./((i/50) + 10)
break
jList.append(j)
rList.append(rAll)
print("Percent of succesful episodes: " + str(sum(rList)/num_episodes))
# 网络性能统计
plt.plot(rList)
plt.plot(jList)```

1. （0）Q-Learning的查找表实现和神经网络实现
2. (1) 双臂赌博机
3. Part 1.5 — Contextual Bandits
4. Part 2 — Policy-Based Agents
5. Part 3 — Model-Based RL
6. Part 4 — Deep Q-Networks and Beyond
7. Part 5 — Visualizing an Agent’s Thoughts and Actions
8. Part 6 — Partial Observability and Deep Recurrent Q-Networks
9. Part 7 — Action-Selection Strategies for Exploration
10. Part 8 — Asynchronous Actor-Critic Agents (A3C)

17 篇文章41 人订阅

0 条评论

## 相关文章

26480

18420

### 开发 | TOP5%Kaggler：如何在 Kaggle 首战中进入前 10%

Introduction Kaggle 是目前最大的 Data Scientist 聚集地。很多公司会拿出自家的数据并提供奖金，在 Kaggle 上组织数据竞赛...

59080

46550

17820

366100

39560

### 词向量fasttext，CNN is All，强化学习，自回归生成模型，可视化神经网络损失函数

【导读】专知内容组整理出最近arXiv放出的五篇论文，包括《Tomas Mikolov新作词向量表示，CNN Is All You Need，强化学习库, 自回...

29050

### 【2017年末AI最新论文精选】词向量fasttext，CNN is All，强化学习，自回归生成模型, 可视化神经网络损失函数

【导读】专知内容组整理出最近arXiv放出的五篇论文，包括《Tomas Mikolov新作词向量表示，CNN Is All You Need，强化学习库, 自回...

37660

29760