强化学习(二)——Q learning、Sarsa、Deep Q learning三种算法思想
一、Q learning算法
如上图所示,Q learning的决策值(基于值的一种算法)存储在一张Q table中。可以先设定a1的奖励值为-2,a2的奖励值为1,那么在s1状态下我们选择奖励值大的动作a2,这就是上图中的Q(S1,a2)估计,接下来状态变为s2。
更新思想:但是Q table中的决策值只是我们先假定的决策值,这不是最优的。因此需要每走一步就更新一次(单步更新)。如何进行更新呢?借助上图中Q(S1,a2)现实的表达式,这里Q(S1,a2)现实之所以称作现实,我理解的是:表格中s1状态下的两个行为a1和a2的奖励值,并不是我们真正获取的奖励值,而是预期获取的奖励值。因为选择了a2动作后到达s2,不仅获得了即时的奖励值R,而且还有一个s2状态对未来期望的reward值,那么不难理解其称作现实。根据Q(S1,a2)现实和Q(S1,a2)估计的差值对原来的Q(S1,a2)决策值进行更新。
决策思想:其中-greedy是用于决策的的一种策略,比如
-greedy=0.9时,那么90%的概率根据最优选择行为,10%的概率随机选择动作。
称作学习率,是小于1的数,用来决定这次的误差有多少是需要被学习的。
称作对未来奖励的衰减值,0-1之间的数,
越大,机器人越有远见,越能看清远处的价值。
Q learning是一种离线学习方式,因为Q(S1,a2)现实表达式中max项,更新只是考虑了s2状态时Q值更大的那个动作,但s2状态未必就会选择该动作。这使得Q table 的更新可以不基于现在经历的经验,可以是学习着很久之前的经验,或是学习他人的经验。
二、Sarsa算法
Sarsa算法和Q learning的决策部分是一样的,但更新部分略有不同。
在Q learning中我们知道实际中s2状态不一定选择更新中用到的使s2的Q值大的那个动作。而Sarsa在s2状态估计的那个动作,也是下一个状态将要做的动作,即:Sarsa会在当前状态就决定下一状态要执行的动作,并且用下一状态要执行的动作的Q值来更新当前状态的Q值。相比于Q learning,Sarsa看起来是一个“说到做到”型算法(在线学习)。
Q learning和Sarsa算法另外的不同在于:Sarsa在执行动作时考虑全局(更新当前状态Q值时会确定下一步要走的动作),而Q learning每次都会选择当前利益最大的动作,而不考虑其他状态,显得更加贪婪。
三、Deep Q learning算法
Q learning用Q table储存状态的Q值,当状态特别多,动作有限时,我们提出Deep Q learning算法,这是一种融合了神经网络和Q learning的方法。即:将当前状态 作为输入,输出各个动作的Q值。该算法的核心在于:如何训练整个神经网络。
通过神经网络预测出输入状态s2的Q(s2, a1) 和 Q(s2,a2) 的值, 这就是 Q(s2) 估计.。然后选取下一个状态 s’的 Q 估计中最大值的动作,同时换取环境中的奖励 reward。 最后利用 Q 估计和 Q 现实的差值,进行反向传播。下图为Deep Q learning的算法思想。
上面的算法跟 Q-Learning 最大的不同就是多了 Experience Replay 这个部分,它做的事情就是先进行反复的实验,并将这些实验步骤获取的 sample 存储在 memory 中,每一步就是一个 sample,每个sample是一个四元组,包括:当前的状态,当前状态的各种action的 Q 值,当前采取的action获得的即时reward,下一个状态的各种action的Q值。拿到这样一个 sample 后,就可以根据反向传播来更新网络。通过 Experience Replay 机制对存储下来的样本进行随机采样,在一定程度上能够去除经历之间的相关性,进而使神经网络更有效率,更容易收敛。用 Experience Replay训练时是离线形式。
另一方面基于采用 Experience Replay的Deep Q learning算法,对其进行改进,增加了separate Target Network机制。这样我们利用TensorFlow就可以实现DQN。通常我们搭建两个神经网络,target_net
用于预测q_target
值,它不会及时更新参数,这组参数被固定一段时间,然后被eval_net
的新参数替换。eval_net
用于预测 q_eval,
这个神经网络拥有最新的神经网络参数.。不过这两个神经网络结构是完全一样的,只是里面的参数不一样。