本次要总结分享的是DeepMind出品的强化学习经典DQN原始论文,论文链接DQN Paper,DeepMind使用该DQN方法,在某些电玩游戏上,机器表现超越人类。
马尔科夫
序列。我们之前总结过The Bellman Equation,从这里我们知道,强化学习的目标是最大化未来奖励:
R t = ∑ t ′ = t T γ t ′ − t r t ′ R_t=\sum_{t'=t}^{T}\gamma^{t'-t}r_{t'} Rt=t′=t∑Tγt′−trt′
上式中 T T T 为MDP序列长度。
根据The Bellman Equation得到optimal action-value function,也就是:
Q ∗ ( s , a ) = m a x π E [ R t ∣ s t = s , a t = a , π ] Q^{*}(s,a)=\underset{\pi}{max}E[R_t|s_t=s, a_t=a, \pi] Q∗(s,a)=πmaxE[Rt∣st=s,at=a,π]
等价于这种迭代形式:
Q ∗ ( s , a ) = E s ′ ∼ ε [ r + γ m a x a ′ Q ∗ ( s ′ , a ′ ) ∣ s , a ] Q^{*}(s,a) = E_{s'\sim\varepsilon}[r+\gamma \underset{a'}{max}Q^{*}(s',a')|s,a] Q∗(s,a)=Es′∼ε[r+γa′maxQ∗(s′,a′)∣s,a]
这里的 π \pi π 是指策略函数。
上述这种 Q Q Q 函数,我们可以用深度网络去拟合,那么我们称这种深度网络为 Q − n e t w o r k Q-network Q−network,其损失函数为:
L i ( θ i ) = E s , a ∼ p ( . ) [ ( y i − Q ( s , a ; θ i ) 2 ] L_i(\theta_i) = E_{s,a\sim p(.)}[(y_i-Q(s,a;\theta_i)^2] Li(θi)=Es,a∼p(.)[(yi−Q(s,a;θi)2]
上述 y i = E s ′ ∼ ε [ r + γ m a x a ′ Q ∗ ( s ′ , a ′ ) ∣ s , a ] y_i=E_{s'\sim\varepsilon}[r+\gamma \underset{a'}{max}Q^{*}(s',a')|s,a] yi=Es′∼ε[r+γa′maxQ∗(s′,a′)∣s,a], i i i 表示第 i i i 次迭代, p ( s , a ) p(s,a) p(s,a) 表示产生的动作行为概率分布。在训练时,我们将第 i − 1 i-1 i−1次更新得到的参数 θ i − 1 \theta_{i-1} θi−1 固定好,然后按照 L i ( θ i ) L_i(\theta_i) Li(θi) 进行参数更新。
- 注意上述算法是 model-free模式的,他是使用游戏环境产生的样本来进行学习的,而无需显示的去对游戏环境进行估计。
- 同时他也是 off-policy的学习方式,是采用贪心策略采取动作的,即 a = m a x a Q ( s , a ; θ ) a=\underset{a}{max}Q(s,a;\theta) a=amaxQ(s,a;θ),这就需要确保积累和探索了足够多的状态空间,在实际操作中,通常采用 ε-greedy strategy,也即随机产生的概率大于 1 − ε 1-\varepsilon 1−ε时,则在合法动作空间内随机产生一个动作。
首先我们存储Agent与游戏环境交互产生的样本,如 e t = { s t , a t , r t , s t + 1 } e_t=\{s_t, a_t, r_t, s_{t+1}\} et={st,at,rt,st+1},存入到data-set D = e 1 , e 2 , . . . , e N D=e_1, e_2,...,e_N D=e1,e2,...,eN,这个我们称之为 r e p l a y m e m o r y replay\ memory replay memory,在算法的内层循环里,采用Q-learning 的更新方式,每次从 D D D 中随机采样minibatch样本,进行学习,来更新network的参数 θ \theta θ,在选择执行的动作时,采用ε-greedy strategy,也即随机产生的概率大于 1 − ε 1-\varepsilon 1−ε时,则在合法动作空间内随机产生一个动作,反之直接从 Q Q Q 网络中取概率最大的动作,与游戏环境进行交互,产生新的样本。
上述做法有以下三个优点:
显然上述算法流程中,有两个地方需要进行估计:
在DQN实现代码里,分别用两个神经网络来估计上述两个 Q Q Q。
代码实现这里参考的是莫烦AI教程代码,写的清晰易懂,推荐大家一读。莫烦教程里已经对代码细节进行了详细的讲解,这里只总结下几个我认为比较重要的点。
在原始DQN中,用eval_net 和 target_net 分别估计 Q ( ϕ j , a j ; θ ) Q(\phi_j, a_j; \theta) Q(ϕj,aj;θ)、 m a x a ′ Q ( ϕ j + 1 , a ′ ; θ ) \underset{a'}{max}Q(\phi_{j+1}, a'; \theta) a′maxQ(ϕj+1,a′;θ),实际上eval_net 和 target_net 这两个网络在网络更新上存在时延(定期覆盖), Q m a x Q_{max} Qmax 存在误差;并且实际实验发现, m a x a ′ Q ( ϕ j + 1 , a ′ ; θ ) \underset{a'}{max}Q(\phi_{j+1}, a'; \theta) a′maxQ(ϕj+1,a′;θ) 存在 o v e r e s t i m a t e overestimate overestimate。在Double DQN,我们用 e v a l _ n e t eval\_net eval_net 预测 s _ s\_ s_ 得到概率最大的动作 a ′ a' a′,然后在 t a r g e t _ n e t target\_net target_net 中得出 a ′ a' a′ 的概率。其他的和原始DQN一致。
也即原始DQN的 y j y_j yj 为:
Y j = R j + γ m a x a ′ Q ( ϕ j + 1 , a ′ ; θ ) Y_j = R_{j} + \gamma \underset{a'}{max}\ Q(\phi_{j+1}, a'; \theta) Yj=Rj+γa′max Q(ϕj+1,a′;θ)
在Double DQN中 y i y_i yi 为:
Y j = R j + γ Q ( ϕ j + 1 , a r g m a x a Q ( ϕ j + 1 , a ; θ j ) , θ j − 1 ) Y_j = R_{j} + \gamma\ Q(\phi_{j+1}, \underset{a}{argmax} Q(\phi_{j+1}, a; \theta_j), \theta_{j-1}) Yj=Rj+γ Q(ϕj+1,aargmaxQ(ϕj+1,a;θj),θj−1)
也可以这样理解:
t a r g e t _ Q = t a r g e t _ Q ( s _ , a r g m a x a ( e v a l _ Q ( s _ , a a l l ) ) ) target\_Q= target\_Q(s\_, \underset{a}{argmax}(eval\_Q(s\_, a_{all}))) target_Q=target_Q(s_,aargmax(eval_Q(s_,aall)))
简而言之:区别就在于 这里的 target_net 里的最高奖励动作 是 由 eval_net 产生的,而不是直接reduce_max( target_net)。
因为原始的DQN,每次将Agent与环境交互产生的样本存储起来,然后进行mini_batch的学习,但是这种随机采样的方式,可能比较低效,因为可以思考带权重的采样方式,比如某个样本,模型学习的不好,在采样时应该给予比较大概率,在这里直接将 a b s ( s e l f . q _ t a r g e t − s e l f . q _ e v a l ) , a x i s = 1 ) abs(self.q\_target - self.q\_eval), axis=1) abs(self.q_target−self.q_eval),axis=1) 作为样本采样权重,这样学习起来必然效率更高。但是如何快速的计算每个样本的权重,以及根据权重快速采样呢?论文中提出使用一种 s u m T r e e sumTree sumTree 的结构。这里就不详细讲了。