一文带你实战强化学习(上) | DQN
作者 | 小猴锅
编辑 | 奇予纪
出品 | 磐创AI团队出品
目录:
1. 引言
-
专栏知识结构
-
从AlphaGo看深度强化学习
2. 强化学习基础知识
-
强化学习问题
-
马尔科夫决策过程
-
最优价值函数和贝尔曼方程
3. 有模型的强化学习方法
-
价值迭代
-
策略迭代
4. 无模型的强化学习方法
-
蒙特卡洛方法
-
时序差分学习
-
值函数近似
-
策略搜索
5. 实战强化学习算法
-
Q-learning 算法
-
Monte Carlo Policy Gradient 算法
-
Actor Critic 算法
6. 深度强化学习算法
-
Deep Q-Networks(DQN)
-
Deep Deterministic Policy Gradient(DDPG)
7. 专栏小结
5.1 Q-Learning算法
两个版本的不同点是前一个版本的游戏场景是“4X4”大小的,后者是“8X8”大小的,另外前一个版本可以选择“有风”或“无风”模式,后者只有默认的“有风”模式。
这里,我们选择“FrozenLake8X8-V0”版本。
“FrozenLake8X8-V0”游戏示意图
我们首先导入所需要的包,并初始化一些相关的参数:
1 import gym
2 import numpy as np
import random as rd
3
4 # 注册游戏环境
5 env = gym.make('FrozenLake8x8-v0')
6 # 定义Q值表,初始值设为0
7 Q = np.zeros([env.observation_space.n, env.action_space.n])
8 # 设置学习参数
9 learningRate = 0.85
10 discountFactor = 0.95
11 # 定义一个数组,用于保存每一回合得到的奖励
12 rewardList = []
第7行代码定义了Q值表,并将初始值设为0。其中:
接下来我们实现Q-Learning算法的核心部分:
13 def train():
14 for i_episodes in range(20000):
15 # 重置游戏环境
16 s = env.reset()
17 i = 0
18 # 学习 Q-Table
19 while i < 2000:
20 i += 1
21 # 使用带探索(ε-greedy)的策略选择动作
22 a = epsilon_greedy(Q, s, i_episodes)
23 # 执行动作,并得到新的环境状态、奖励等
24 observation, reward, done, info = env.step(a)
25 # 更新 Q-Table
26 Q[s, a] = (1-learningRate) * Q[s, a] + learningRate * (
reward + discountFactor * np.max(Q[observation, :]))
27 s = observation
28 if done:
29 break
第26行代码就是我们Q-Learning算法中对于Q值的更新,算法中更新Q值的公式为:
式1
将公式1稍作变换即为:
式2
30 def epsilon_greedy(q_table, s, num_episodes):
31 rand_num = rd.randint(0, 20000)
32 if rand_num > num_episodes:
33 # 随机选择一个动作
34 action = rd.randint(0, 3)
35 else:
36 # 选择一个最优的动作
37 action = np.argmax(q_table[s, :])
38 return action
第34行我们随机选择了一个动作,0到3分别对应动作“左移”、“下移”、“右移”和“上移”。第37行我们选择了当前状态下s最优的动作。
还有一种简单的方法也可以实现对环境的探索,我们不需要“epsilon_greedy”函数,直接把第22行代码改为如下形式:
22 a = np.argmax(Q[s, :] + np.random.randn(1, env.action_space.n)
* (1. / (i_episodes + 1)))
接下来我们写一个测试函数,利用学到的Q值表来玩“FrozenLake8x8-v0”游戏。
39 def test():
40 for i_episodes in range(100):
41 # 重置游戏环境
42 s = env.reset()
43 i = 0
44 total_reward = 0
45 while i < 500:
46 i += 1
47 # 选择一个动作
48 a = np.argmax(Q[s, :])
49 # 执行动作,并得到新的环境状态、奖励等
50 observation, reward, done, info = env.step(a)
51 # 可视化游戏画面(重绘一帧画面)
52 env.render()
53 # 计算当前回合的总奖励值
54 total_reward += reward
55 s = observation
56 if done:
57 break
58 rewardList.append(total_reward)
59 train()
60 test()
61
62 print("Final Q-Table Values:")
63 print(Q)
64 print("Success rate: " + str(sum(rewardList) / len(rewardList)))
只需将“train()”函数稍作修改,我们就可以得到Q-Learning算法的在策略(on-policy)版本Sarsa算法。
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2019/11/09/0f98fa02b3/
评论列表(2条)
您好,我复现了您的程序,但是结果出错,显示E gym.error.DeprecatedEnv: Env FrozenLake8x8-v0 not found (valid versions include [‘FrozenLake8x8-v1’]) 是因为我gym没安装正确吗
您好,之前的问题已经解决啦,游戏的版本应该更新为v1