强化学习经典算法笔记(六):深度Q值网络 Deep Q Network

前期回顾

强化学习经典算法笔记(零):贝尔曼方程的推导
强化学习经典算法笔记(一):价值迭代算法Value Iteration
强化学习经典算法笔记(二):策略迭代算法Policy Iteration
强化学习经典算法笔记(三):蒙特卡罗方法Monte Calo Method
强化学习经典算法笔记(四):时间差分算法Temporal Difference(Q-Learning算法)
强化学习经典算法笔记(五):时间差分算法Temporal Difference(SARSA算法)

强化学习经典算法笔记——深度Q值网络

  到这里,我们终于来到了深度强化学习的领域了,之前的算法都是经典RL算法,它们和DRL的关系好比是机器学习和深度学习的关系。深度神经网络的引入极大地提升了强化学习算法的效率和能力,使强化学习的研究进入了新的阶段。

简介

  深度强化学习的经典之作是2015年DeepMind发表在Nature的DQN论文《Human-Level Control Through Deep Reinforcement Learning》。本篇博客就讲一讲DQN的基本框架思想,并用代码实现它。

  DQN属于Q-Learning算法,也是一种Value-Based算法,并不直接学习一个Policy,而是学习Critic,也就是学习如何评价当前状态的好坏,进而根据Q值选取最佳的action。因此可以将DQN中的神经网络看做是一个复杂的Q-function,本质上,它和前几篇中提到的Q-table干的事是一样的,只不过神经网络的函数拟合能力很强,它能胜任更复杂的RL任务。

  我个人观点,深度强化学习的框架大致可以分为两部分,一部分是感知(Sensoring),另一部分是决策(Decision Making)。

  DRL往往需要学习一个感知算法,感知真实环境的各种信息。有的感知器输出一个标量,反映当前环境或状态动作对的好坏;有的感知器则是对真实环境进行建模,将当前状态抽象成一个隐层特征,用于后续的决策算法使用,这类算法有DeepMind的World Model和PlaNet系列,我们以后都会讲到。

  感知算法是对真实环境的总结和特征提取,要想做出决策,还需要一个决策算法。比如DQN中的 ϵ − g r e e d y \epsilon-greedy ϵgreedy算法,虽然是一个比较简单的policy算法,直接采取具有最大Q值的动作作为当前策略,但是我们也可以看做是一个决策算法,它利用了上一步的感知器对环境的感知信息。

  再比如,AlphaGo系列算法中,CNN负责对当前棋盘状态提取特征,给出当前胜算(也就是评估当前状态好坏),接着蒙特卡洛树搜索算法根据CNN输出的Q值计算子结点的U值,进行棋盘搜索,完成决策。

  从感知和决策的角度审视深度强化学习,深度神经网络的引入提升了感知和决策两方面的效果。我们在这一篇主要讲神经网络对感知能力的提升,而将神经网络用于决策的内容放到后面去讲。但是,将神经网络用于强化学习早已有之,不过效果一直不好,直到DQN引入了几个核心技术,才将性能大大提升,即

  • 卷积神经网络 CNN
  • 目标网络 Target Network
  • 经验回放 Experience Replay

  DQN应该是第一个采用原始图像作为CNN输入进行训练的,也应该是第一个将CNN在RL发挥巨大威力的算法。DQN中的CNN采用和AlexNet类似的结构。

  目标网络是DQN的一大贡献。我们知道,与环境交互具有极大的随机性,XXXXXXXXXXXXXXXXX

  经验回放是DQN的另一贡献。我们知道,一个episode是一个时间关联性很强的(状态-动作-回报)序列,如果直接拿若干个episode的序列数据来训练CNN,XXXXXXXXXXXXXXXXXXXXXXX

现在让我们看看DQN完整的算法

以下操作执行N个Episode:

  • 将游戏画面 s s s进行预处理,送入CNN,输出每个动作的Q值
  • 根据 ϵ − g r e e d y \epsilon-greedy ϵgreedy算法计算应该采取的动作 a = a r g m a x ( Q ( s , a , θ ) ) a=argmax(Q(s,a,\theta)) a=argmax(Q(s,a,θ))
  • 执行动作 a a a,转移到下一状态 s ′ s' s,收到环境给出的回报
  • 将序列 &lt; s , a , r , s ′ &gt; &lt;s,a,r,s&#x27;&gt; <s,a,r,s
DQN的Q网络模型是一个深度神经网络,它的输入是当前状态,输出是每个动作对应的Q。在DQN中,我们使用一个带有固定目标网络的Q网络和一个经验回放池来进行离线学习。 下面是一个简单的DQN的Q网络模型的Python实现,使用Keras作为深度学习库: ```python import numpy as np from keras.models import Sequential from keras.layers import Dense class DQNAgent: def __init__(self, state_size, action_size): self.state_size = state_size self.action_size = action_size self.memory = [] self.gamma = 0.95 # discount rate self.epsilon = 1.0 # exploration rate self.epsilon_min = 0.01 self.epsilon_decay = 0.995 self.learning_rate = 0.001 self.model = self._build_model() self.target_model = self._build_model() def _build_model(self): model = Sequential() model.add(Dense(24, input_dim=self.state_size, activation='relu')) model.add(Dense(24, activation='relu')) model.add(Dense(self.action_size, activation='linear')) model.compile(loss='mse', optimizer='adam') return model def remember(self, state, action, reward, next_state, done): self.memory.append((state, action, reward, next_state, done)) def act(self, state): if np.random.rand() <= self.epsilon: return np.random.choice(self.action_size) act_values = self.model.predict(state) return np.argmax(act_values[0]) def replay(self, batch_size): minibatch = random.sample(self.memory, batch_size) for state, action, reward, next_state, done in minibatch: target = reward if not done: target = (reward + self.gamma * np.amax(self.target_model.predict(next_state)[0])) target_f = self.model.predict(state) target_f[0][action] = target self.model.fit(state, target_f, epochs=1, verbose=0) if self.epsilon > self.epsilon_min: self.epsilon *= self.epsilon_decay def update_target_model(self): self.target_model.set_weights(self.model.get_weights()) ``` 在上面的代码中,我们定义了一个DQNAgent类,它包含了一个用于存储经验回放池的memory列表,以及一些超参数和两个Keras模型:一个用于学习的model和一个用于生成目标的target_model。在构建model时,我们使用了三个全连接层,其中前两个层使用ReLU激活函数,最后一层使用线性激活函数。在compile函数中,我们使用均方误差作为损失函数,使用Adam优化器进行优化。 在act函数中,我们使用epsilon-greedy策略来选择动作,其中epsilon是用于控制探索程度的超参数。 在replay函数中,我们从memory中随机抽取一批经验数据,并使用Bellman方程计算目标。然后,我们将目标与当前模型输出的Q进行比较,并使用mse损失函数进行训练。 最后,在update_target_model函数中,我们将model的权重复制到target_model中,以保持目标的稳定。 需要注意的是,这只是一个简单的DQN的Q网络模型的实现,实际应用中还需要进行一些改进和调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值