Prioritized Replay DQN
在深度强化学习(2)Double DQN 中,我们讲到了DDQN使用两个Q网络,用当前Q网络计算最大Q值对应的动作,用目标Q网络计算这个最大动作对应的目标Q值,进而消除贪婪法带来的偏差。今天我们在DDQN的基础上,对经验回放部分的逻辑做优化。对应的算法是Prioritized Replay DQN。
DQN 的成功归因于经验回放和独立的目标网络。Double DQN 改进了Qlearning中的max操作,经验回放仍然采用均匀分布。经验回放时利用均匀分布采样并不是高效利用数据的方法。因为,智能体的经验即经历过的数据,对于智能体的学习并非具有同等重要的意义。智能体在某些状态的学习效率比其他状态的学习效率高。优先回放的基本思想就是打破均匀采样,赋予学习效率高的状态以更大的采样权重。
如何选择权重?⼀个理想的标准是智能体学习的效率越高,权重越大。符合该标准的⼀个选择是TD偏差 δ \delta δ。TD偏差越大,智能体的更新量越大,对我们反向传播的作用越大,因此该处的学习效率越高。而TD偏差小的样本,由于TD偏差小,对反向梯度的计算影响不大。
Prioritized Replay DQN根据每个样本的TD偏差绝对值 ∣ δ ( t ) ∣ |\delta(t)| ∣δ(t)∣,给定该样本的优先级正比于 ∣ δ ( t ) ∣ |\delta(t)| ∣δ(t)∣,将这个优先级的值存入经验回放池。之前的DQN算法,我们仅仅只保存和环境交互得到的样本状态,动作,奖励等数据,没有优先级这个说法。
由于引入了经验回放的优先级,那么Prioritized Replay DQN的经验回放池和之前的其他DQN算法的经验回放池就不一样了。因为这个优先级大小会影响它被采样的概率。在实际使用中,我们通常使用SumTree这样的二叉树结构来做我们的带优先级的经验回放池样本的存储。
具体的SumTree树结构如下图:
所有的经验回放样本只保存在最下面的叶子节点中,一个节点一个样本。内部节点不保存样本数据。而叶子节点除了保存数据以外,还要保存该样本的优先级,就是图中的显示的数字。对于内部节点每个节点只保存自己的儿子节点的优先级值之和,如图中内部节点上显示的数字。
这样保存有什么好处呢?主要是方便采样。以上面的树结构为例,根节点是42,如果要采样一个样本,那么我们可以在[0,42]之间做均匀采样,采样到哪个区间,就是哪个样本。比如我们采样到了26, 在(25-29)这个区间,那么就是第四个叶子节点被采样到。
注意到第三个叶子节点优先级最高,是12,它的区间13-25也是最长的,会比其他节点更容易被采样到。
如果要采样两个样本,我们可以在[0,21],[21,42]两个区间做均匀采样,方法和上面采样一个样本类似。
除了经验回放池,现在我们的Q网络的算法损失函数也有优化,之前我们的损失函数是:
1 m ∑ j = 1 m ( y j − Q ( ϕ ( S j ) , A j , w ) ) 2 \frac{1}{m} \sum_{j=1}^{m}\left(y_{j}-Q\left(\phi\left(S_{j}\right), A_{j}, w\right)\right)^{2} m1∑j=1m(yj−Q(ϕ(Sj),Aj,w))2
现在我们新的考虑了样本优先级的损失函数是:
1 m ∑ j = 1 m w j ( y j − Q ( ϕ ( S j ) , A j , w ) ) 2 \frac{1}{m} \sum_{j=1}^{m} w_{j}\left(y_{j}-Q\left(\phi\left(S_{j}\right), A_{j}, w\right)\right)^{2} m1∑j=1mwj(yj−Q(ϕ(Sj),Aj,w))2
其中 w j w_{j} wj是第 j j j个样本的优先级权重。
w j = ( N ∗ P ( j ) ) − β max i ( w i ) = ( N ∗ P ( j ) ) − β max i ( ( N ∗ P ( i ) ) − β ) = ( P ( j ) ) − β max i ( ( P ( i ) ) − β ) = ( p ( j ) min i P ( i ) ) − β w_{j}=\frac{(N * P(j))^{-\beta}}{\max _{i}\left(w_{i}\right)}=\frac{(N * P(j))^{-\beta}}{\max _{i}\left((N * P(i))^{-\beta}\right)}=\frac{(P(j))^{-\beta}}{\max _{i}\left((P(i))^{-\beta}\right)}=\left(\frac{p(j)}{\min _{i} P(i)}\right)^{-\beta} wj=maxi(wi)(N∗P(j))−β=maxi((N∗P(i))−β)(N∗P(j))−β=maxi((P(i))−β)(P(j))−β=(miniP(i)p(j))−β
我们在样本 i i i处的采样概率为:
P ( i ) = p i α Σ k p k α P(i)=\frac{p_{i}^{\alpha}}{\Sigma_{k} p_{k}^{\alpha}} P(i)=Σkpkαpiα
我们把TD偏差的绝对值 ∣ δ ( t ) ∣ |\delta(t)| ∣δ(t)∣ 作 为 p i 作为p_{i} 作为pi的值。在实际计算中,我们会取 p i α p_{i}^{\alpha} piα。
算法流程
输入:迭代轮数
T
T
T,状态特征维度
n
n
n, 动作集
A
A
A, 步长
α
α
α,采样权重系数
β
β
β,衰减因子
γ
γ
γ, 探索率
ϵ
ϵ
ϵ, 当前Q网络
Q
Q
Q,目标Q网络
Q
′
Q^{\prime}
Q′, 批量梯度下降的样本数
m
m
m,目标Q网络参数更新频率
C
C
C, SumTree的叶子节点数
N
N
N。
输出:
Q
Q
Q网络参数。
- 随机初始化所有的状态和动作对应的价值 Q Q Q. 随机初始化当前 Q Q Q网络的所有参数 w w w,初始化目标Q网络 Q ′ Q^{\prime} Q′的参数 w ′ w^{\prime} w′= w w w。初始化经验回放SumTree的默认数据结构,所有SumTree的 N N N个叶子节点的优先级 p j p_{j} pj为0。
- for i from 1 to
T
T
T,进行迭代。
a) 初始化 S S S为当前状态序列的第一个状态, 拿到其特征向量 ϕ ( S ) ϕ(S) ϕ(S)
b) 在 Q Q Q网络中使用 ϕ ( S ) ϕ(S) ϕ(S)作为输入,得到 Q Q Q网络的所有动作对应的 Q Q Q值输出。用 ϵ − ϵ− ϵ−贪婪法在当前 Q Q Q值输出中选择对应的动作 A A A
c) 在状态 S S S执行当前动作 A A A,得到新状态 S ′ S^{\prime} S′对应的特征向量 ϕ ( S ′ ) \phi\left(S^{\prime}\right) ϕ(S′)和奖励 R R R,是否终止状态is_end
d) 将 { ϕ ( S ) , A , R , ϕ ( S ′ ) , i s − e n d } \left\{\phi(S), A, R, \phi\left(S^{\prime}\right), i s_{-} e n d\right\} {ϕ(S),A,R,ϕ(S′),is−end}这个五元组存入SumTree
e) S S S= S ′ S^{\prime} S′
f) 从SumTree中采样mm个样本 { ϕ ( S j ) , A j , R j , ϕ ( S j ′ ) , i s − e n d j } , j = 1 , 2. , , , m \left\{\phi\left(S_{j}\right), A_{j}, R_{j}, \phi\left(S_{j}^{\prime}\right), i s_{-} e n d_{j}\right\}, j=1,2 .,,, m {ϕ(Sj),Aj,Rj,ϕ(Sj′),is−endj},j=1,2.,,,m,每个样本被采样的概率基于 P ( i ) = p i α Σ k p k α P(i)=\frac{p_{i}^{\alpha}}{\Sigma_{k} p_{k}^{\alpha}} P(i)=Σkpkαpiα,损失函数权重 w j = ( N ∗ P ( j ) ) − β / max i ( w i ) w_{j}=(N * P(j))^{-\beta} / \max _{i}\left(w_{i}\right) wj=(N∗P(j))−β/maxi(wi),计算当前目标Q值 y j y_{j} yj:
y j = { R j is end j is true R j + γ Q ′ ( ϕ ( S j ′ ) , arg max a ′ Q ( ϕ ( S j ′ ) , a , w ) , w ′ ) i s − e n d j is false y_{j}=\left\{\begin{array}{ll}{R_{j}} & {\text {is end }_{j} \text { is true }} \\ {R_{j}+\gamma Q^{\prime}\left(\phi\left(S_{j}^{\prime}\right), \arg \max _{a^{\prime}} Q\left(\phi\left(S_{j}^{\prime}\right), a, w\right), w^{\prime}\right)} & {i s_{-} e n d_{j} \text { is false }}\end{array}\right. yj={RjRj+γQ′(ϕ(Sj′),argmaxa′Q(ϕ(Sj′),a,w),w′)is end j is true is−endj is false
g) 使用均方差损失函数 1 m ∑ j = 1 m w j ( y j − Q ( ϕ ( S j ) , A j , w ) ) 2 \frac{1}{m} \sum_{j=1}^{m} w_{j}\left(y_{j}-Q\left(\phi\left(S_{j}\right), A_{j}, w\right)\right)^{2} m1∑j=1mwj(yj−Q(ϕ(Sj),Aj,w))2,通过神经网络的梯度反向传播来更新 Q Q Q网络的所有参数 w w w
h) 重新计算所有样本的TD误差 δ j = y j − Q ( ϕ ( S j ) , A j , w ) \delta_{j}=y_{j}-Q\left(\phi\left(S_{j}\right), A_{j}, w\right) δj=yj−Q(ϕ(Sj),Aj,w),更新SumTree中所有节点的优先级 p j = ∣ δ j ∣ p_{j}=\left|\delta_{j}\right| pj=∣δj∣
i) 如果 T T T% C C C=1,则更新目标Q网络参数 w ′ w^{\prime} w′= w w w
j) 如果 S ′ S^{\prime} S′是终止状态,当前轮迭代完毕,否则转到步骤 b)
注意,上述第二步的f步和g步的 Q Q Q值计算也都需要通过 Q Q Q网络计算得到。另外,实际应用中,为了算法较好的收敛,探索率 ϵ ϵ ϵ需要随着迭代的进行而变小。
参考文献
[1]https://www.cnblogs.com/pinard/p/9797695.html