赞
踩
总结记录深度强化学习算法Deep Q Network
参考自莫凡python
Q-Learning
α-学习效率 γ-衰减率 ε-贪婪度
r-环境所对应回报
s-状态
s_-下一状态
a-行为
Q(s,a)-Q表(某状态下采取某行为的价值)
ε:每次执行时,会有ε的概率选择Q表当中的最优项,1-ε的概率选择随机项(用于学习)。
γ:越高,效果越有远见,不会只看到近期的回报。
Q(s,a) += α[r + γQ(s_,a).max - Q(s,a)]
之前传统的强化学习算法,比如:Q-learning,Sarsa等方法都是用表格的方式去存储每一个状态的state,和在这个state每个action所拥有的Q值。局限性在于如果实际问题中的state过多,计算机内存无法满足存储要求。
于是Deep Q Network将传统的强化学习算法与神经网络结合.我们可以将状态和动作当成神经网络的输入, 然后经过神经网络分析后得到动作的 Q 值, 这样我们就没必要在表格中记录 Q 值, 而是直接使用神经网络生成 Q 值. 还有一种形式的是这样, 我们也能只输入状态值, 输出所有的动作值, 然后按照 Q learning 的原则, 直接选择拥有最大值的动作当做下一步要做的动作.
Experience replay是指DQN可以建立记忆库用于存储之前学习过的一些经历,Q-learning是一种off-policy的算法,可以学习过去的或者是别人的经历。所以每次 DQN 更新的时候, 我们都可以随机抽取一些之前的经历进行学习. 随机抽取这种做法打乱了经历之间的相关性, 也使得神经网络更新更有效率.
Fixed Q-targets 也是一种打乱相关性的机理, 如果使用 fixed Q-targets, 我们就会在 DQN 中使用到两个结构相同但参数不同的神经网络, 预测 Q 估计 的神经网络具备最新的参数, 而预测 Q 现实 的神经网络使用的参数则是很久以前的.
Q估计神经网络参数是随着学习的进行不断更新的,而Q现实的参数是被冻结的,我们可以设定参数,固定在X次更新之后,将Q估计中的参数覆盖到Q现实中的参数。
在Q-learning算法的基础上增加了以下特点:
记忆库 (用于重复学习)
神经网络计算 Q 值
暂时冻结 q_target 参数 (切断相关性)
首先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() # 观看神经网络的误差曲线
class DeepQNetwork:
# 建立两个结构相同参数不同的神经网络
def _build_net(self)<
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。