Introduction on function approximation
问题引入:大规模的MDP问题如何估计价值函数?
答:在面对大规模 MDP 问题时,要避免用table去表示特征(Q-tabel等),而是采用带参数的函数近似的方式去近似估计V、Q、π
如果我们获得了实际的价值函数(Oracle),就可以用梯度下降方法更新 w 参数
Value function approximation for prediction
如果已知Oracle/Ground Truth/Vπ (s):
如果已知实际V funciton是线性的:
随机梯度下降收敛到全局最优。 因为在线性情况下,只有一个最优解,因此局部最优解为自动收敛到或接近全局最优。
如果用one-hot编码,Table Lookup Feature
拟合出的价值函数就是等于Wk
如果没有Oracle/Ground Truth/Vπ (s)
采用之前的model-free prediction的方法
蒙特卡罗 MC 预测用于价值函数
MC return的Gt特点:无偏估计、但是有很大噪声(采很多次样才能得出结果)
时域差分 TD 预测用于值函数
TD target特点:有偏估计(取期望时包含了正在优化的W)
semi-gradient:
Q function(Action-Value function)估计(类似V function)
如果已知实际Q函数:
可通过计算MSE和梯度下降的方法估计Q函数:
如果Q函数为线性的:
Value function approximation for control
如果没有获得真正的Groundtruth的Q函数,用Gt或TD target代替oracle,从而更新Q函数近似函数的参数。
其中Sarsa for VFA Control:
讨论VFA Control的收敛问题:
TD在使用off-policy或使用非线性函数拟合时会发散(难以收敛):
- TD with VFA 得出来目标函数的梯度是不准确的(gradient本身包含了正在优化的参数)
- update包含了Bellman backup的近似和价值函数的近似
- off-policy的behavior policy(采取数据的策略) and target policy(优化的策略)不完全相同,因此价值估计函数难以收敛
强化学习的死亡三角(强化学习不确定不稳定的因素)
-
Function approximation:近似V或者Q会引入误差
-
Bootstrapping:TD基于之前来估计当前函数会引入噪声,使得网络过拟合;MC用了实际的return,而且是无偏的,所以稍微好些(如果足够多会近似真值)
-
Off-policy training:采用behavior policy来采取数据,但优化的是target policy,导致采集的数据和优化的函数是不一样的
控制算法的收敛性问题
Batch优化
之前单步优化效率低,Batch-based方法优化batch中所有样本,
目标:求D数据库中pair的最小均方差
如果数据集太大,每次随机采样部分样本,计算梯度并优化函数,不断迭代。
Deep Q-Networks
当环境更加复杂时,使用非线性函数(以神经网络举例)拟合V、Q函数会有更好的效果。
在训练DQN时出现的问题以及解决方法
问题1:样本之间具有相关性
解决办法:Experience replay
使用一个容器,存了很多游戏环节里的sample,得到transition tuple(St,at,rt,St+1)并打乱, 采集数据时会将数据存在容器中,优化函数时从容器中随机采样从而获得相关度较低的tuple。
问题2:不稳定的目标
解决办法:Fixed Q targets
在计算loss时,我们是通过计算TD target(Q_target)和当前Q value(Q的估计)的差来得到的。
但是其实对于真实的TD target,我们是不知道的,没有概念的。我们也是需要预测的。使用Bellman 方程,我们发现TD target仅仅是当前动作的reward加上通过衰减的下一个state的最高Q value。
问题是我们使用同样的参数(网络权重)来估计target和Q value。这就使得网络权重和TD target具有很强的相关性。
因此,这就意味着训练的每一步,我们的Q value偏移了,同时Q target也偏移了。
- 所以我们将使用一个单独的固定参数的网络(w-)来预测TD target
结果及demo
- Demo of Breakout by DQN:
https://www.youtube.com/watch?v=V1eYniJ0Rnk
- Demo of Flappy Bird by DQN:
https://www.youtube.com/watch?v=xM62SpKAZHU
- Code of DQN in PyTorch:
https://github.com/cuhkrlcourse/DeepRL-Tutorials/blob/master/01.DQN.ipynb
- Code of Flappy Bird:
https://github.com/xmfbit/DQN-FlappyBird
参考:
N in PyTorch:
https://github.com/cuhkrlcourse/DeepRL-Tutorials/blob/master/01.DQN.ipynb
- Code of Flappy Bird:
https://github.com/xmfbit/DQN-FlappyBird
参考:
https://blog.csdn.net/mike112223/article/details/90796992