Deep Q-network(DQN)是一项实用度很高的强化学习算法,下面进行一个简介,后期还会持续更新。
这个是DQN的一个算法伪代码表示:

首先初始化,我们初始化2个网络:Q 和Q^,其实Q^就等于Q。一开始Q^这个目标 Q 网络,跟我们原来的Q网络是一样的。在每一个episode(回合),我们用actor(演员)去跟环境做交互,在每一次交互过程中,我们都会得到一个状态st,那我们会采取某一个动作at。怎么知道采取哪一个动作at呢?我们就根据我们现在的 Q-function。但是我们要有探索的机制。比如说我们用 Boltzmann探索或是 Epsilon Greedy的探索。那接下来我们得到奖励rt,然后跳到状态st+1。现在收集到一些数据,这些数据是(st,at,rt,st+1)。把这些数据塞到我们的 buffer(缓冲区)里面去。如果buffer 满的话,我们就再把一些旧的数据丢掉。接下来我们就从我们的buffer里面去采样数据,那我们采样到的是 (si,ai,ri,si+1)。值得注意的是这些数据跟我们刚放进去的不一定是同一批数据,我们可能抽到一个旧的数据。其实我们采样出来不是一笔数据,我们采样出来的是一个batch的数据,我们采样一个batch 出来,接下来就是计算我们的目标。假设我们采样出这么一笔数据。根据这笔数据去算我们的目标。我们的目标是什么呢?目标要用目标网络Q^来算。目标是:y=ri+maxa Q(si+1, a)
下面解释一下几个词的意思:
Q网络:
为了在连续的状态和动作空间中计算值函数Qπ(s,a),我们可以用一个函数Qϕ(s,a)来表示近似计算,称为价值函数近似(Value Function Approximation)。
Qϕ(s,a)≈Qπ(s,a)
其中
- s,a分别是状态ss和动作aa的向量表示,
- 函数Qϕ(s,a)通常是一个参数为ϕ的函数,比如神经网络,输出为一个实数,称为Q 网络(Q-network)。
Epsilon Greedy:
Epsilon Greedy的意思是说,我们有1 −ε的概率会按照Q-function来决定动作,通常ε就设一个很小的值,1-ε可能是90%,也就是90%的概率会按照 Q-function 来决定动作,但是我们有10%的机率是随机的。通常在实现上ε会随着时间递减。在最开始的时候。因为还不知道那个动作是比较好的,所以我们会花比较大的力气在做探索。接下来随着训练的次数越来越多。已经比较确定说哪一个Q是比较好的。我们就会减少我们的探索,我们会把ε的值变小,主要根据Q-function来决定我们的动作,比较少随机决定动作,这是Epsilon Greedy。
Boltzmann Exploration:
还有一个方法叫做
Boltzmann Exploration
,这个方法就比较像是策略梯度。在策略梯度里面,网络的输出是一个期望的动作空间上面的一个的概率分布,再根据概率分布去做采样。那其实我们也可以根据Q值去定一个概率分布,假设某一个动作的Q值越大,代表它越好,我们采取这个动作的机率就越高。但是某一个动作的Q值小,不代表我们不能尝试。简单来说就是给各个动作分配概率,概率大的动作更容易做,概率小一点的动作做的几率跟小一些。