强化学习 学习心得(1)



  • Q-learning and Sarsa

    Q-learning:(off-policy)

    <br/>Q(s,a)Q(s,a)+α[r+γmaxaQ(s,a)Q(s,a)]<br/><br /> Q(s, a) \leftarrow Q(s, a)+\alpha\left[r+\gamma \max_{a'} Q\left(s^{\prime}, a^{\prime}\right)-Q(s, a)\right]<br />

    碎碎念:这个loss就相当于是她不断趋近于0,让Q完全拟合r+γ\gamma maxQ‘ 吧

    Sarsa: (on-policy)

    <br/>Q(s,a)Q(s,a)+α[r+γQ(s,a)Q(s,a)]<br/><br /> Q(s, a) \leftarrow Q(s, a)+\alpha\left[r+\gamma Q\left(s^{\prime}, a^{\prime}\right)-Q(s, a)\right]<br />

    碎碎念:这个Sarsa的不同就是 取得不是最大的Q值

    所以在代码中一个取Q_max,另一个取任意一个Q。介于之前Q(s,a)Q(s',a')不知道值的原因,代码中在提取下一个Q的时候,是先提前赋值了的。

    on-policy and off-policy的区别:

    On-policy 的目标策略和行为策略是同一个策略,其好处就是简单粗暴,直接利用数据就可以优化其策略,但这样的处理会导致策略其实是在学习一个局部最优。

    Off-policy将目标策略和行为策略分开,可以在保持探索的同时,更能求到全局最优值。

    Sarsa Lambda

    $$
    \begin{aligned}
    &\delta \leftarrow R+\gamma Q\left(S^{\prime}, A^{\prime}\right)-Q(S, A)\
    &Q(s, a) \leftarrow Q(s, a)+\alpha \delta E(s, a)\
    &E(s, a) \leftarrow \gamma \lambda E(s, a)
    \end{aligned}
    $$

    代码在建立Q表的时候,还会建立一个E表。可以看到,上面的更新是乘了E表的值。对于具体如何处理E表,代码中写的很明白。λ\lambda = lambda

    DQN,double-DQN,dueling-DQN(涉及到构建网络)

    DQN:(deep Q network)

    DQN的出现是为了解决在复杂的情况下,更新Q表的方法不太现实的问题。对于DQN为什么要有两个网络,我想是因为需要一个现实Q,一个估计Q来计算差值。从而达到两个现实个估计网络几乎相同。

    两个网络,一个eval来预测Q表,一个target来计算现实的Q表(Q现实就是根据这个更新的)。两个网络的结构是一样的,只是参数更新的速度不一样。

    eval网络输出的是当前s的所有a的q值,eval网络的 loss:
    $$
    y_i=r+\gamma*maxQ(s',a')\
    y_i=Q(s,a)\
    loss=\left(y_{j}-Q\left(\phi_{j}, a_{j} ; \theta\right)\right)^{2}
    $$
    这个Q(s',a')是由target网络预测得到的。而前面的Q-learning只是Q表的更新。

    target网络的输出下一个s的所有a的q值,没有loss。在learn 中有一个值替换函数,是用tf.assign实现的。

    下一步a根据最大的Q‘值来选择

    DQN开始有了经验回放的方法。

    double-DQN:

    用当前Q网络计算最大Q值对应的动作,用目标Q网络计算这个最大动作对应的目标Q值,进而消除贪婪法带来的偏差。

    以下是改进的公式:
    $$
    Y_{t}^{\text {DoubleDQN }}= r+\gamma Q'\left(s', \underset{a}{\operatorname{argmax}} Q\left(s', a ; \boldsymbol{\theta}{t}\right), \boldsymbol{\theta}{t}'\right)
    $$
    double-DQN和DQN的网络结构并没有什么不同,只是q-target的计算方式不一样。

    下面给出差别部分的代码:

    if self.double_q:
    	max_act_for_next = np.argmax(q_eval_for_next, axis=1)   #q_eval_for_next = q_eval 
        selected_q_next = q_next[batch_index, max_act4next]  # Double DQN
    else:
    	selected_q_next = np.max(q_next, axis=1)    # the natural DQN
    
    q_target[batch_index, eval_act_index] = reward + self.gamma * selected_q_next
    

    **double-DQN的下一步的q值对应的a‘是根据eval网络来选择的。**这样就不会有很大的过拟合。

    Prioriized Experience Replay DQN

    PER 优先经验回放,改进了DQN中的经验回放策略,值得一看!

    dueling-DQN

    只要稍稍修改 DQN 中神经网络的结构, 就能大幅提升学习效果, 加速收敛 。 用一句话来概括 Dueling DQN 就是. 它将每个动作的 Q 拆分成了 state 的 Value 加上 每个动作的 Advantage.

    下面是它q值的公式:Q(s,a;θ,α,β)=V(s;θ,β)+A(s,a;θ,α) Q(s, a ; \theta, \alpha, \beta)=V(s ; \theta, \beta)+A(s, a ; \theta, \alpha)

    在网络中建立V与A两个输出

    我们发现当可用动作越高, 学习难度就越大, 不过 Dueling DQN 还是会比 Natural DQN 学习得更快. 收敛效果更好.

    value-based and policy-based 的区别:

    value-based 的典型算法是DQN,policy-based是policy gradient,结合这两种具体算法可能会更好的理解。

    1. 处理的action space不同:value-based适合处理action space低维离散的,policy-based适合处理连续的action space。

    2. 针对action的价值输出不同:value-based计算出每个action的价值,policy-based一般情况下只给出较价值较高的actions。

    3. 更新频率不同:value-based每个action执行都可以更新,policy-based 每个episode完成之后才能更新一次。这里可以理解成下棋的时候,value-based每下一步就学习一次,而policy-based要在一盘棋下完之后再学习。

    像DDPG,AC算法就是将两者都结合了起来。

    单步更新(TD算法)和回合更新(蒙特卡洛算法)的区别:

    这个就是字面的区别,主要是理解为什么单步是TD算法,回合是蒙特卡洛算法。

    MC算法:蒙特卡罗方法又叫做统计模拟方法,它使用随机数(或伪随机数)来解决计算问题。在强化学习中,在为了能够从环境中学习,我们需要让agent与environment交互,得到一些经历(样本)。然后通过这些经历来进行策略评估与策略迭代。从而最终得到最优策略。这种做法的理论是从蒙特卡罗方法中来的。

    TD算法:就是单步更新算法

    有一个公式可以体现两者的差别:
    $$
    MC: V(S_t) \leftarrow V(S_t) + \alpha(G_t-V(S_t))\
    TD: V(S_t) \leftarrow V(S_t)+ \alpha(R_{t+1} + \gamma V(S_{t+1})-V(S_t))
    $$
    DP(动态规划)算法:上面两个算法可以和DP算法相比较,因为这三种学习方法都是用来计算状态价值的。它们的区别在于,前两种是在不知道模型的情况下常用的方法,而MC方法又需要一个完整的episode来更新状态价值,TD则不需要完整的episode。DP方法则是基于Model(知道模型的运作方式)的计算状态价值的方法
    <br/>DP:V(St)Eπ[Rt+1+γV(St+1)<br/><br /> DP: V(S_t) \leftarrow E_{\pi}[R_{t+1} + \gamma V(S_{t+1})<br />

    我发现TD算法还是有一个大的种类,包括很多的东西,这个有时间可以一起总结一下。而且TD和MC是可以结合起来的,比如说A3C中的n-steps就是一个很好的结合的例子。还有一个统一的方法Eligibility traces(资格迹)。

    eligibility traces 优于n-step的主要地方在于计算非常有效率,其只需要一个trace向量,而不需要储存n个特征向量。另外,eligibility trace的学习是逐步的,而不需要等到n-steps之后。


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待