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)
创建一个缓冲,将所有经验数据放到缓存中,这个经验数据可能来自不同的策略。
然后在每次迭代时:
- 选择一个batch
- 更新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