深度强化学习
第四篇:深度Q学习
提纲
- 什么是深度Q学习(DQL)?
- 为什么要使用神经网络替代Q表?
- 使用DQL的最佳策略
- 如何处理时间限制问题?
- 为什么使用经验回放?
- 如何实现DQL?
内容
🙋 什么是DQL
DQL就是通过神经网络获取智能体的状态并为该状态的每个动作计算Q值,而非使用Q表进行强化学习过程。
🙋 为什么使用神经网络?
在状态空间比较小的时候,使用Q表是方便而高效的。但是当状态空间很大,就会产生“维度诅咒”(维度灾难)问题,这时使用Q表极其低效甚至不可行。
这种情况下,最好的想法是创建一个神经网络(高效、相比其他算法可能效果更好),神经网络可以在给定状态的情况下,近似每个动作的Q值。
🙋 以游戏为例说明:
预处理
- 目标是降低状态的复杂度,减少训练所需时间
- 操作:首先对图像帧进行灰度化(如果颜色不重要),裁剪图像,去除无用部分,减小每帧图大小
时间限制问题(Temporal limitation)
- 使用LSTM神经网络或者图像帧堆叠法
使用卷积网络
- 使用卷积网络处理帧,这些图层可以利用图像中的空间关系。每个卷积层使用ELU作为激活函数(ELU已经被证明是卷积层较好的激活函数。
- 设定一个具有ELU激活函数的完全连接层和一个输出层(具有线性激活函数的完全连接层),其输出为每个动作的Q估计值。
经验回放
作用
避免忘记之前的经历
- 将智能体与环境相互作用得到序列样本输入到神经网络进行训练过程中,神经网络往往会忘记之前的经历,因为它的参数会被新的经验覆盖。
- 解决方案:创建一个“replay buffer”存盘,,在智能体与环境交互过程中存储经验元祖,然后使用小批量元组数据来训练神经网络。“replay buffer”可以看做是一个文件夹,其中每个工作表都是经验元组,通过智能体与环境交互来产生,然后随机拿出其中的一些表来训练神经网络,防止网络只学习智能体当前的经验。
减少经验之间的相关性
- 每个行动都会影响下一个状态,行动过程中得到的一个序列的经验元祖(状态,动作,新状态,奖励)可能会高度相关。因此我们不按照顺序,而是随机抽取,打破这种相关性,可以防止动作值发生振荡或者发散。
优先级经验回放:更频繁地想神经网络呈现罕见或“重要”的元组。
🙋 深度Q学习算法
- 时序差分误差是通过Q_target(下一个状态的最大可能值)和Q_value(当前预测的Q值)之间的差计算。
- 公式为:
- 算法
xxxxxxxxxx
1141Initialize Doom Environment E
2Initialize replay Memory M with capacity N (= finite capacity)
3Initialize the DQN weights w
4for episode in max_episode:
5s = Environment state
6for steps in max_steps:
7Choose action a from state s using epsilon greedy.
8Take action a, get r (reward) and s' (next state)
9Store experience tuple <s, a, r, s'> in M
10s = s' (state = new_state)
11
12Get random minibatch of exp tuples from M
13Set Q_target = reward(s,a) + γmaxQ(s')
14Update w = α(Q_target - Q_value) * ∇w Q_value
🙋 实战
💪 环境
A monster is spawned randomly somewhere along the opposite wall.
Player can only go left/right and shoot.
1 hit is enough to kill the monster.
Episode finishes when monster is killed or on timeout (300).
REWARDS:
+101 for killing the monster
-5 for missing
Episode ends after killing the monster or on timeout.
living reward = -1
💪 电脑猝死……代码没跑起来……服务器又卡的不行……凉凉……