文章目录
前言
总结记录深度强化学习算法Deep Q Network
参考自莫凡python
一、什么是Q-learning
Q-Learning
α-学习效率 γ-衰减率 ε-贪婪度
r-环境所对应回报
s-状态
s_-下一状态
a-行为
Q(s,a)-Q表(某状态下采取某行为的价值)
ε:每次执行时,会有ε的概率选择Q表当中的最优项,1-ε的概率选择随机项(用于学习)。
γ:越高,效果越有远见,不会只看到近期的回报。
Q(s,a) += α[r + γQ(s_,a).max - Q(s,a)]
二、什么是Deep Q Network
之前传统的强化学习算法,比如:Q-learning,Sarsa等方法都是用表格的方式去存储每一个状态的state,和在这个state每个action所拥有的Q值。局限性在于如果实际问题中的state过多,计算机内存无法满足存储要求。
于是Deep Q Network将传统的强化学习算法与神经网络结合.我们可以将状态和动作当成神经网络的输入, 然后经过神经网络分析后得到动作的 Q 值, 这样我们就没必要在表格中记录 Q 值, 而是直接使用神经网络生成 Q 值. 还有一种形式的是这样, 我们也能只输入状态值, 输出所有的动作值, 然后按照 Q learning 的原则, 直接选择拥有最大值的动作当做下一步要做的动作.
三、DQN的两大利器
1.Experience replay
Experience replay是指DQN可以建立记忆库用于存储之前学习过的一些经历,Q-learning是一种off-policy的算法,可以学习过去的或者是别人的经历。所以每次 DQN 更新的时候, 我们都可以随机抽取一些之前的经历进行学习. 随机抽取这种做法打乱了经历之间的相关性, 也使得神经网络更新更有效率.
2.Fixed Q-targets
Fixed Q-targets 也是一种打乱相关性的机理, 如果使用 fixed Q-targets, 我们就会在 DQN 中使用到两个结构相同但参数不同的神经网络, 预测 Q 估计 的神经网络具备最新的参数, 而预测 Q 现实 的神经网络使用的参数则是很久以前的.
Q估计神经网络参数是随着学习的进行不断更新的,而Q现实的参数是被冻结的,我们可以设定参数,固定在X次更新之后,将Q估计中的参数覆盖到Q现实中的参数。
四、DQN算法
在Q-learning算法的基础上增加了以下特点:
记忆库 (用于重复学习)
神经网络计算 Q 值
暂时冻结 q_target 参数 (切断相关性)
五、DQN的实现(using tensorflow)
1.run_this.py
首先import所需模块
from maze_env import Maze
from RL_brain import DeepQNetwork
DQN与环境的交互
def run_maze():
step = 0 # 用来控制什么时候学习
for episode in range(300):
# 初始化环境
observation = env.reset()
while True:
# 刷新环境
env.render()
# DQN 根据观测值选择行为
action = RL.choose_action(observation)
# 环境根据行为给出下一个 state, reward, 是否结束本轮回合
observation_, reward, done = env.step(action)
# DQN 存储记忆(观测值,动作,回报,下一轮的观测值)
RL.store_transition(observation, action, reward, observation_)
# 控制学习起始时间和频率 (先累积一些记忆,填充记忆库,再开始学习)
if (step > 200) and (step % 5 == 0):
RL.learn()
# 将下一个 state_ 变为 下次循环的 state
observation = observation_
# 如果终止, 就跳出循环
if done:
break
step += 1 # 总步数
# end of game
print('game over')
env.destroy()
if __name__ == "__main__":
env = Maze()
RL = DeepQNetwork(env.n_actions, env.n_features,
learning_rate=0.01, #神经网络学习效率
reward_decay=0.9, #回报的衰变(γ)
e_greedy=0.9, #贪婪度
replace_target_iter=200, # 每 200 步替换一次 target_net 的参数
memory_size=2000, # 记忆上限
# output_graph=True # 是否输出 tensorboard 文件
)
env.after(100, run_maze)
env.mainloop()
RL.plot_cost() # 观看神经网络的误差曲线
2.RL_brain.py
1)DQN类的整体框架
class DeepQNetwork:
# 建立两个结构相同参数不同的神经网络
def _build_net(self):
# 初始值
def __init__(self):
# 存储记忆
def store_transition(self, s, a, r, s_):
# 选行为
def choose_action(self, observation):
# 学习
def learn(self):
# 看看学习效果
def plot_cost(self):