强化学习【六】价值函数的近似表示 (内含DQN)

前言

本章之前的内容介绍的多是规模比较小的强化学习问题,生活中有许多实际问题要复杂得多,有些是属于状态数量巨大甚至是连续的,有些行为数量较大或者是连续的。这些问题要是使用前几章介绍的基本算法效率会很低,甚至会无法得到较好的解决。本章就聚焦于求解那些状态数量多或者是连续状态的强化学习问题。

解决这类问题的常用方法是不再使用字典之类的查表式的方法来存储状态或行为的价值,而是引入适当的参数,选取恰当的描述状态的特征,通过构建一定的函数来近似计算得到状态或行为价值。对于带参数的价值函数,只要参数确定了,对于一个确切的由特征描述的状态就可以计算得到该状态的价值。这种设计的好处是不需要存储每一个状态或行为价值的数据,而只需要存储参数和函数设计就够了,其优点是显而易见的。

在引入近似价值函数后,强化学习中不管是预测问题还是控制问题,就转变成近似函数的设计以及求解近似函数参数这两个问题了。函数近似主要分为线性函数近似和非线性近似两类,其中非线性近似的主流是使用深度神经网络计数。参数则多使用建立目标函数使用梯度下降的办法通过训练来求解。由此诞生了著名的强化学习算法:深度Q学习网络(DNQ)。本章将就这些问题详细展开

强化学习【六】价值函数的近似表示 (内含DQN)

目标函数

先来回顾下上一章中介绍的几个经典学习算法得到最终价值的思想,首先是随机初始化各价值,通过分析每一个时间步产生的状态转换数据,得到一个当前状态的目标价值,这个目标价值由即时奖励和后续价值联合体现。由于学习过程中的各价值都是不准确的,因而在更新价值的时候只是沿着目标价值的方向做一个很小幅度(α)的更新: 

强化学习【六】价值函数的近似表示 (内含DQN)

现在把上式中的所有强化学习【六】价值函数的近似表示 (内含DQN)强化学习【六】价值函数的近似表示 (内含DQN)代替,就变成了基于近似价值函数的价值更新方法:

强化学习【六】价值函数的近似表示 (内含DQN)

这个目标价值仍然由即时奖励和后续价值联合体现,用目标价值去逐步更新强化学习【六】价值函数的近似表示 (内含DQN)。因为之前近似价值函数的时候,就是很直白的计算出式子中的每一个部分,然后就更新了最左侧的部分,达到了更新的目的。现在用了近似价值函数之后,更新过程也要顺势改变。现在已经不是储存一个大的表格了,也自然不是改写一个表格中的一个值,现在要做到是改整个近似价值函数,让他在改之前比改之后代入S,A能更接近目标价值。

更新的过程其实就是基于当前的ω,代入A',S'计算出后续价值,加上R得到目标价值,然后再代入S,A,用含有ω的式子表达出强化学习【六】价值函数的近似表示 (内含DQN),通过调整优化ω的取值,让这两者尽可能地靠近,这样就是在优化Q_hat了。

与当更新了很多次之后,再拿到一组S,A,R,S‘,A'的时候,可能会发现目标函数已经非常接近强化学习【六】价值函数的近似表示 (内含DQN)的取值了,也就是说价值函数收敛不再更新,同时意味着找到了基于某策略的最终价值函数或者是控制问题中的最优价值函数。

为了衡量在采样产生的M个状态转换上近似价值函数的收敛情况,可以定义目标函数Jw为:

强化学习【六】价值函数的近似表示 (内含DQN)

只要调整ω,让 J(ω)尽量小,就是达到了优化Q_hat的目标。要注意的是:强化学习【六】价值函数的近似表示 (内含DQN)这部分要计算出实际的值,而不是含有ω的式子。

这里集中使用Vtarget或Qtarget来代表目标价值,使用期望代替平均值的方式,那么目标价值的表述公式为:

强化学习【六】价值函数的近似表示 (内含DQN)

原本这部分就是要计算出实际数值的,所以用Vtarget或Qtarget表示,实际上就放宽了对这个部分计算的限制,可以自己设计合理的计算方法。

DQN算法

结合价值函数近似与神经网络技术,介绍基于神经网络(深度学习)的Q学习算法:深度Q学习(deep Q-learning, DQN)算法。DQN算法主要使用经历回放(experience replay)来实现价值函数的收敛。

其具体做法为:个体能记住既往的状态转换经历,对于每一个完整状态序列里的每一次状态转换,依据当前状态的st价值以ε-贪婪策略选择一个行为at,执行该行为得到奖励rt+1和下一个状态st+1,将得到的状态转换存储至记忆中。(其实就是将游戏的过程打成碎片存储,训练时随机抽取就避免了相关性问题)。当记忆中存储的容量足够大时,随机从记忆力提取一定数量的状态转换,用状态转换中下一状态来计算当前状态的目标价值,计算目标价值与网络输出价值之间的均方差代价,使用mini-batch梯度下降算法更新网络的参数。

这个算法有两个版本,分别是最初的2013版和改进的2015版

NIPS 2013版

强化学习【六】价值函数的近似表示 (内含DQN)

Nature 2015版

强化学习【六】价值函数的近似表示 (内含DQN)

对于函数优化问题,监督学习的一般方法是先确定Loss Function,然后求梯度,使用随机梯度下降等方法更新参数。DQN则基于Q-Learning来确定Loss Function。我们想要使q-target值和q-eval值相差越小越好。DQN中的损失函数是:

 强化学习【六】价值函数的近似表示 (内含DQN)

这里yi是根据上一个迭代周期或者说target-net网络的参数计算出的q-target值,yi的计算如下:

强化学习【六】价值函数的近似表示 (内含DQN) 

为什么说上一个迭代周期或者说target-net网络?

在Nature 2015版本的DQN中提出了双网络结构改进,使用另一个网络(这里称为target_net)产生Target Q值。具体地,Q(s,a;θi) 表示当前网络eval_net的输出,用来评估当前状态动作对的值函数;强化学习【六】价值函数的近似表示 (内含DQN) 表示target_net的输出,代入上面求 TargetQ 值的公式中得到目标Q值。根据上面的Loss Function更新eval_net的参数,每经过N轮迭代,将MainNet的参数复制给target_net。引入target_net后,再一段时间里目标Q值使保持不变的,一定程度降低了当前Q值和目标Q值的相关性,提高了算法稳定性。



引入之前呢,就是使用上一个迭代周期的参数来计算TargetQ 值,计算loss,最小化loss,更新参数。

引入之后,使用 target-net网络的参数来计算TargetQ 值,计算loss,最小化loss,更新MainNet参数。一段时间后将MainNet的参数复制给target_net。

算法流程图(2015版)

主要流程图

强化学习【六】价值函数的近似表示 (内含DQN)

Loss Function 的构造 

强化学习【六】价值函数的近似表示 (内含DQN)

DDQN 

但是2015版本的DQN仍然存在一些问题,DDQN改进了这个缺陷

论文(Hasselt等人)发现并证明了传统的DQN普遍会过高估计Action的Q值,而且估计误差会随Action的个数增加而增加。如果高估不是均匀的,则会导致某个次优的Action高估的Q值超过了最优Action的Q值,永远无法找到最优的策略。

具体操作是对要学习的Target Q值生成方式进行修改,原版的DQN中是使用TargetNet产生Target Q值,即

强化学习【六】价值函数的近似表示 (内含DQN)

在DDQN中,先用MainNet找到 MAXa′Q(s′,a′;θi)的Action(θi是MainNet的参数),再去TargetNet中找到这个Action的Q值以构成Target Q值,这个Q值在TargetNet中不一定是最大的,因此可以避免选到被高估的次优Action。最终要学习的Loss Function为:强化学习【六】价值函数的近似表示 (内含DQN)强化学习【六】价值函数的近似表示 (内含DQN)

除此之外,其他设置与DQN一致。实验表明,DDQN能够估计出更准确出Q值,在一些Atari2600游戏中可获得更稳定有效的策略。

Loss Function 的构造流程图 

强化学习【六】价值函数的近似表示 (内含DQN)