基于Pytorch的强化学习(DQN)之 Experience Replay

目录

1. 引言

2. 经验回放算法

2. 优先经验回放

2.1 抽取方法改进

2.2 学习率修正 


1. 引言

我们之前学过TD 算法 ,基本的TD算法的思路如下

  1. 观测到一个transition (s_t,a_t,r_t,s_{t+1})
  2. 计算TD target y_t=r_t+\gamma \underset{a}{max} Q(s_{t+1},a;w)
  3. 计算TD error \delta_t=q_t-y_t\qquad (q_t=Q(s_t,a;w))
  4. 梯度下降w\leftarrow w-\alpha\delta_t\frac{\partial \,q_t}{\partial \,w}

我们发现一个transition在使用之后就会被丢弃了,我们不会在后面使用到它,这样的训练速度就非常慢:想象AI在打boss,但是一下就被秒了,它从中获取不到足够的信息,只能一遍又一遍地去刷boss,那又需要将前面的所以关卡打一遍,非常的费时。而且按照顺序使用state效果不好:两个相邻的state所包含的信息往往大致相同,甚至没有区别。

总结地来说朴素TD 算法有两个缺点:

  1. 浪费经验也就是transition
  2. 连续地使用的s_t,s_{t+1} 具有强关联性,训练效果不好

2. 经验回放算法

从上面的问题中我们发现我们不应该将每个transition变成一次性用品,所以我们将每个使用过的transition放入一个盒子里,这个盒子就叫做replay buffer,就是一个缓冲区,这样便解决了经验浪费的问题,我们在对replay buffer中的transition进行随机选取,这样便解决了训练时相邻state强关联的问题,于是我们得到算法

  1. 从trajectory中选取n个transition将它们放入replay buffer中
  2. 将新观测到的transition放入replay buffer中,删去最其中最早的旧的transition以确保replay buffer中至多有n个transition
  3. 使用mini batch选取 T 个transition
  4. 计算所有的TD target y_1,y_2,...,y_T
  5. 计算使所有TD error \delta _1,\delta _2,...,\delta _T
  6. 使用SGD更新参数w\leftarrow w-\alpha g_i\qquad(g_i=\delta_i \frac{\partial q_i}{\partial w}),使得损失函数L(w)=\frac{1}{T}\sum_{i=1}^{T}\frac{\delta_{i}^2}{2}减小

2. 优先经验回放

2.1 抽取方法改进

我们上面提到的经验回放算法是一开始是随机选取n个transition,但是我们知道并不是所以的transition都具有同等重要的地位的,我们不会认为普通关卡比boss关卡重要因为普通关卡太多了而打boss的机会非常宝贵,所以我们要有选择性地抽取transition,我们可以用选取那些总是和我们预期策略不一致的state,因为预期不一致所以我们总是没选对策略从而在这里输掉,那么什么叫预期不一致呢?没错,TD error就是衡量实际和预期的量呀,先定义p_t为transition(s_t,a_t,r_t,s_{t+1})被抽中的概率根据这个思路我们得到下面两种角度不同的选取方法

  1. 依据表达式 p_t\propto |\delta_t|+\epsilon 确定概率相对大小,思路很直接,注意这里的 \epsilon 是为了保证 p_t\neq 0
  2. 依据表达式 p_t\propto \frac{1}{rank(t)} 这里的 rank(t) 是 transition(s_t,a_t,r_t,s_{t+1})根据 |\delta_t| 排序得到的序号,最大的序号为1

2.2 学习率修正 

我们知道,在学习中我们碰到难的知识点要沉下心慢慢学,AI也是如此,每个transition由于不同的TD error 而获得不同的被抽取概率,这就代表其重要,AI需要在这里也就不能学的太快否则效果不好,也就是说不同的被抽取概率对应着不同的学习率,计算公式如下transition (s_t,a_t,r_t,s_{t+1})的学习率 \alpha_t=\alpha(np_t)^{- \beta }

你可能感兴趣的:(深度学习,深度学习)