0%

Q-Learning

Q-Learning介绍

前面已经简单见过Q-Learning,现在回顾加学习新内容。

另一种Critic

状态-行动价值函数\(Q^\pi(s,a)\),指的是当使用actor \(\pi\),在状态\(s\)情况下采取行动\(a\)后,直到结束累计的奖励

使用上述\(Q^\pi(s,a)\)就可以找出比较好的actor,这种方法就称为Q-Learning

  • 最开始是有一个初始actor \(\pi\),使用这个\(\pi\)去和环境互动(玩游戏)
  • critic去观察actor和环境的互动,然后使用TD或MC去学出\(Q^\pi (s,a)\)
  • 找到一个比\(\pi\)更好的新的\(\pi '\)
  • \(\pi=\pi'\),重复上述

什么叫\(\pi'\)\(\pi\)好?

对于所有state s,\(V^{\pi'} \ge V^\pi (s)\),而使用\(Q^\pi(s,a)\)去找\(\pi'\)的方法就是:\(\pi'(s)=\arg \max_a Q^\pi (s,a)\)

  • \(\pi'\)没有额外的参数,而是仅依赖\(Q\)
  • 并不适用于连续型的action

为什么这样求出的\(\pi'\)一定比\(\pi\)好呢?

证明

\(\pi'(s)=\arg \max_a Q^\pi (s,a) \qquad 对任意s,V^{\pi'}(s) \ge V^\pi(s)\) \[ \begin{align} V^\pi(s) &= Q^\pi(s, \pi(s)) \le \max_a Q^\pi(s,a)=Q^\pi(s,\pi'(s)) \\ V^\pi(s) & \le Q^\pi(s,\pi'(s)) \\ &=E[r_{t+1}+V^\pi(s_{t+1})|s_t=s,a_t=\pi'(s_t)] \\ &\le E[r_{t+1}+Q^\pi(s_{t+1},\pi'(s_{t+1}))|s_t=s,a_t=\pi(s_t)] \\ &=E[r_{t+1}+r_{t+2}+V^\pi(s_{t+2})|\cdots] \\ &\le E[r_{t+1}+r_{t+2}+Q^\pi(s_{t+2},\pi'(s_{t+2}))|\cdots] \\ &\cdots \\ &\le V^{\pi'}(s) \end{align} \]

目标网络(Target Network)

在训练时会不太稳定,因为假设\(Q^\pi(s_t,a_t)\)作为模型输出,\(r_t+Q^\pi(s_{t+1},\pi(s_{t+1}))\)作为目标,就会发现需要去拟合的目标也是一直在变的,这样就会导致不好训练。

因此,实际上通常会将下面这个\(Q^\pi\)固定住,只调整左边的这个网络。

探查(Exploration)

基于Q函数的策略是: \[ a=\arg \max_a Q(s,a) \] 问题:这并不是一个好的收集数据的方式,可能会存在总是采样部分数据的问题。

解决方法:

  • Epsilon Greedy

\[ a=\left\{\begin{aligned}\arg \max_a Q(s,a), \quad &概率1-\epsilon \\random,\quad &其它 \end{aligned}\right. \]

\(\epsilon\)会在学习过程中慢慢衰减

  • Boltzmann Exploration \[ P(a|s)=\frac{exp(Q(s,a))}{\sum_aexp(Q(s,a))} \]

重播缓冲(Replay Buffer)

创建一个缓冲,将所有经验数据放到缓存中,这个经验数据可能来自不同的策略。

然后在每次迭代时:

  1. 选择一个batch
  2. 更新Q函数

Q-Learning算法流程

  • 初始化Q函数\(Q\),目标函数\(\hat Q=Q\)
  • 在每个episode中
    • 对于每个时间步t
    • 给定状态\(s_t\),基于Q(epsilon greedy)采取行动\(a_t\)
    • 获得奖励\(r_t\),进入新状态\(s_{t+1}\)
    • 存储\((s_t,a_t,r_t,s_{t+1})\)到缓冲中
    • 从缓冲中采样\((s_i,a_i,r_i,s_{i+1})\)(通常是一个batch)
    • 目标\(y=r_i+\max_a \hat Q(s_{i+1},a)\)
    • 更新\(Q\)的参数来使得\(Q(s_i,a_i)\)更接近\(y\)
    • \(C\)步后重置\(\hat Q=Q\)

Q-Learning的小建议

Double DQN

问题:在实际使用中,\(Q\)值往往是被高估的(over-estimated)

由于\(Q\)的目标总是会趋向选择高估的,所以\(Q\)就容易高估

解决:Double DQN,使用两个函数\(Q\)\(Q'\)

\(Q(s_t,a_t)\leftrightarrow r_t+Q'(s_{t+1},\arg \max_a Q(s_{t+1},a))\)

就是使用\(Q\)\(Q'\)相互制衡,如果Q高估了a,它被选择了,则\(Q'\)会给其一个适当的值;而如果\(Q'\)高估了,则a不会被\(Q\)选择。

怎么获得\(Q\)\(Q'\)呢?使用上述的固定不动的目标网络作为\(Q'\),使用更新网络作为\(Q\)

Dueling DQN

改了网络架构

通过对A进行一些限制,保证更新\(V(s)\)\(A(s,a)\)更加容易,所以模型会趋向于更新\(V(s)\),这样就会让\(Q(s,a)\)所以action都更新,而不会部分更新了。

因此,在实际使用时,会在\(A\)\(V\)相加前,先对\(A\)进行标准化:如原来是\(7,3,2\),变成\(3=7-4,-1=3-4,-2=2-4\)

Prioritized Reply

在将数据存入buffer中时,可能会有一些数据更重要,因此需要给它们更高的被采样的概率

Multi-step

在MC和TD之间取得一个平衡,存入的数据不再只是一步的数据,而是多步

Noisy Net

在每个episode开始时向Q函数参数注入噪音

  • 如果是在Action上加噪音
    • 给定一样的状态,agent可能会采取不同的行动
    • 现实中不会有真的有这种策略
  • 如果是在参数上加噪音
    • 给定一样的(类似的)状态,agent采取一样的行动
    • 使用一致的方式探索(测试)

Distributional Q-function

原来的\(Q^\pi(s,a)\)输出的结果是一个期望值,实际是所有的reward进行统计得到的会是一个分布,但实际上不同的分布可能会有不同的期望值,例如:

因此仅用期望值的\(Q\)值来代表整个奖励的话,可能会存在一些信息丢失的,因此Distributional Q-function考虑直接输出对应的分布:

Q-Learning用于连续Actions

Q-Learning的最大的问题是不容易处理连续的Actions

连续Actions

Action a是一个连续向量:\(a\arg \max_a Q(s,a)\)

  • 解法1

    采样一些actions:\(\{a_1,a_2,\cdots,a_N\}\)

    看哪个action可以得到最大的Q值,结果可能不是太精确

  • 解法2

    使用梯度上升解优化问题

  • 解法3

    设计一个网络来使得优化变简单

\[ Q(s,a) = -(a-\mu(s))^T\Sigma(s)(a-\mu(s))+V(s) \\ \mu(s)=\arg \max_a Q(s,a) \]

  • 解法4

    不使用Q-Learning