以前咱们提到过各类计算值函数的方法,好比对于 MDP 已知的问题可使用 Bellman 指望方程求得值函数;对于 MDP 未知的状况,能够经过 MC 以及 TD 方法来得到值函数,为何须要再进行值函数近似呢?html
其实到目前为止,咱们介绍的值函数计算方法都是经过查表的方式获取的:web
可是对于大型 MDP 问题,上述方法会遇到瓶颈:算法
所以咱们须要有一种可以适用于解决大型 MDP 问题的通用方法,这就是本文介绍的值函数近似方法。即:
\[ \hat{v}(s, \mathbf{w}) \approx v_{\pi}(s) \\ \text{or } \hat{q}(s, a, \mathbf{w}) \approx q_{\pi}(s, a) \]网络
那么为何值函数近似的方法能够求解大型 MDP 问题?app
对于大型 MDP 问题而言,咱们能够近似认为其全部的状态和动做都被采样和计算是不现实的,那么咱们一旦获取了近似的值函数,咱们就能够对于那些在历史经验或者采样中没有出现过的状态和动做进行泛化(generalize)。函数
进行值函数近似的训练方法有不少,好比:学习
此外,针对 MDP 问题的特色,训练函数必须能够适用于非静态、非独立同分布(non-i.i.d)的数据。优化
梯度降低再也不赘述,感兴趣的能够参考以前的博文《梯度降低法的三种形式BGD、SGD以及MBGD》google
咱们优化的目标函数是找到一组参数 \(\mathbf{w}\) 来最小化最小平方偏差(MSE),即:
\[J(\mathbf{w}) = E_{\pi}[(v_{\pi}(S) - \hat{v}(S, \mathbf{w}))^2]\]spa
经过梯度降低方法来寻优:
\[ \begin{align} \Delta\mathbf{w} &=-\frac{1}{2}\alpha\triangledown_{\mathbf{w}}J(\mathbf{w})\\ &=\alpha E_{\pi}\Bigl[\Bigl(v_{\pi}(S) - \hat{v}(S, \mathbf{w})\Bigr)\triangledown_{\mathbf{w}}J(\mathbf{w})\Bigr] \end{align} \]
对于随机梯度降低(Stochastic Gradient Descent,SGD),对应的梯度:
\[\Delta\mathbf{w} = \alpha\underbrace{\Bigl(v_{\pi}(S) - \hat{v}(S, \mathbf{w})\Bigr)}_{\text{error}}\underbrace{\triangledown_{\mathbf{w}}\hat{v}(S, \mathbf{w})}_{\text{gradient}}\]
上述公式中须要真实的策略价值函数 \(v_{\pi}(S)\) 做为学习的目标(supervisor),可是在RL中没有真实的策略价值函数,只有rewards。在实际应用中,咱们用target来代替 \(v_{\pi}(S)\):
在获取了值函数近似后就能够进行控制了,具体示意图以下:
动做价值函数近似:
\[\hat{q}(S, A, \mathbf{w})\approx q_{\pi}(S, A)\]
优化目标:最小化MSE
\[J(\mathbf{w}) = E_{\pi}[(q_{\pi}(S, A) - \hat{q}(S, A, \mathbf{w}))^2]\]
使用SGD寻优:
\[\begin{align} \Delta\mathbf{w} &=-\frac{1}{2}\alpha\triangledown_{\mathbf{w}}J(\mathbf{w})\\ &=\alpha\Bigl(q_{\pi}(S, A)-\hat{q}_{\pi}(S, A, \mathbf{w})\Bigr) \triangledown_{\mathbf{w}}\hat{q}_{\pi}(S, A, \mathbf{w}) \end{align}\]
略,感兴趣的能够参考David的课件。
随机梯度降低SGD简单,可是批量的方法能够根据agent的经验来更好的拟合价值函数。
优化目标:批量方法解决的问题一样是 \(\hat{v}(s, \mathbf{w})\approx v_{\pi}(s)\)
经验集合 \(D\) 包含了一系列的 <state, value> pair:
\[D=\{<s_1, v_1^{\pi}>, <s_2, v_2^{\pi}>, ..., <s_T, v_T^{\pi}>\}\]
根据最小化平方偏差之和来拟合 \(\hat{v}(s, \mathbf{w})\) 和 \(v_{\pi}(s)\),即:
\[ \begin{align} LS(w) &= \sum_{t=1}^{T}(v_{t}^{\pi}-\hat{v}(s_t, \mathbf{w}))^2\\ &= E_{D}[(v^{\pi}-\hat{v}(s, \mathbf{w}))^2] \end{align} \]
经验回放(Experience Replay):
给定经验集合:
\[D=\{<s_1, v_1^{\pi}>, <s_2, v_2^{\pi}>, ..., <s_T, v_T^{\pi}>\}\]
Repeat:
- 从经验集合中采样状态和价值:\(<s, v^{\pi}>\sim D\)
- 使用SGD进行更新:\(\Delta\mathbf{w}=\alpha\Bigl(v^{\pi}-\hat{v}(s, \mathbf{w})\Bigr)\triangledown_{\mathbf{w}}\hat{v}(s, \mathbf{w})\)
经过上述经验回放,得到最小化平方偏差的参数值:
\[\mathbf{w}^{\pi}=\arg\min_{\mathbf{w}}LS(\mathbf{w})\]
咱们常常听到的 DQN 算法就使用了经验回放的手段,这个后续会在《深度强化学习》中整理。
经过上述经验回放和不断的迭代能够获取最小平方偏差的参数值,而后就能够经过 greedy 的策略进行策略提高,具体以下图所示:
一样的套路:
对于控制环节,咱们采起与Q-Learning同样的思路:
略,感兴趣的能够参考David的课件。
[1] Reinforcement Learning: An Introduction, Richard S. Sutton and Andrew G. Barto, 2018
[2] David Silver's Homepage