资源下载地址:https://download.csdn.net/download/sheziqiong/85656730
资源下载地址:https://download.csdn.net/download/sheziqiong/85656730
强化学习在Freeway游戏中的探究尝试
一、强化学习的方法和过程
1.1 强化学习之Q-learning的基本原理简介
强化学习与Q-learning的基本逻辑已经在上一部分简要阐述了,其中心思想便是图示的通过“探索行动”来在当前状态下走到下一个状态,同时获得环境产生的“奖励(或惩罚)”,以此来不断学习某一状态下进行某一动作的价值,以便后续在相同状态的决策过程中能更加正确地考虑到底该执行什么动作。其背后的哲学思想类似于我们在动物身上发现的条件反射,如果对某种行为进行正向刺激,动物在经过反复刺激过后将更加倾向于进行某种行为,而对某种行为施加惩罚则后续将更不倾向于进行这种行为。
Q-learning用一张Q-table来记录环境状态与动作价值的对应关系,它的值会在每次行动中不断更新。最好的期望是,在进行较多较多次行动迭代之后,Q-table中每一项的值可以收敛,这样我们就完全掌握了整个环境,今后的决策将十分简单,只需按照Q-table依次贪心选择最佳动作链就一定能到达终点。然而实际操作中,由于真实状态可能较多而Q-table规模受限,以及训练时间、训练方法有效程度等诸多限制,导致Q-table往往并不能理想的收敛到常数。然而即使这样,Q-learning仍然能在在很大程度上反映环境与动作的内在取舍关系,所以在一定精度以内,一张近似收敛的Q-table也能较好地满足我们对于对于最大化某些收益(如到达终点)的期望。而怎样能让Q-learning在较短的时间之内有效收敛到可以容许的误差范围之内,则是我们具体使用者应当着重考虑的问题,本篇文章将会在3、4两部分分别针对特征提取与参数选择进行分析。
一次理想状态的Q-learning的训练过程大体如下:
-
首先建立Q-table,初始状态下置为随机(如果能收敛,初值将无关紧要)。
-
接着开始迭代。在每一步中使用“epsilon贪婪”方法,以epsilon概率进行“探索(即不按Q-table来,比如随机走)”, 另外有(1-epsilon)概率进行严格按照Q-table的“决策”,不论采用哪种方法,都可获得一个当前状态所要采取的动作。
对采取此操作后的下一个状态,按照如下图方法更新原节点此动作对应的Q值。其中alpha为学习率,标志着“新”学习得到的信息与“历史”学习到的信息之间的取舍,可以发现Q(S,A)一项拿到外面来之后的系数为(1-alpha),而后面一项的系数为alpha,这样就比较直观的反映了学习率的含义,学习率越大代表越看重这一次操作新学习到的信息,更小则表示更加重视原先存在的学习经验所得。后面max前的gama为奖励衰变系数,它的存在是为了权衡这一步得到的即时奖励(R)与未来奖励的期望(通过下一状态所有动作的Q值得最大值来反映)之间的取舍,gama设的越小表示越“贪心”,越大则考虑的越“长远”,然而由于Q-table一开始的值是随机设置的,所以在初期不应使用过大的gama,因为它反映的信息没有太大的正确意义。此表达式通俗来讲就是,新价值=原先价值+学习率*价值改变量。
- 最终在一定迭代次数后,Q-table成功收敛,训练完成。后续决策可以完全按照Q-table的值来进行。
1.2 实验代码中的Q-learning实现
在一次实验中,总共进行10轮游戏,他们的经验是逐渐累积的。
每一个Agent拥有一个全局的训练数据集m_dataset,它的大小由m_maxPoolSize参数限制。每当系统向Agent索要一个动作时,它会先用learnPolicy进行一次学习,之后再从现有模型中找出当前最佳动作返回。
一次学习的过程learnPolicy,会进行10次模拟训练,每次模拟训练返回一组数据,在把这些数据添加到数据集末尾之后,按照m_maxPoolSize从开头处删除一些元素。最终我们调用一次m_policy的fitQ方法,来更新现有模型,更新原理是使用当前数据集构造一个weka内置的REPTRee分类器。
模拟训练的过程就是上文所说的更新Q值的过程,不过在这里我们不是一次只走一步,而是按照epsilon greedy方法,以一定概率随机走,另外概率正常决策,以此往后行进depth步。参考上文中的max(Q)一项,在这里我们从底层开始计算Q值,迭代更新直到当前状态。在设置两个系数的过程中,我们引入了一个衰减项m_gama,每次深度增加时factor(初值为1)就会乘上一个m_gama,这样到底层的时候它的值相比高层已经变小了。上式中R值,也就是环境对动作的回报,这里十分简答的用了游戏内分数作为reward,同时假如胜利或失败则赋予一个极大的正/负常数,以示区别。
1.2.1 策略模型用什么表示?该表示有何缺点?有何改进方法?
策略模型使用Q-table表示,在代码中Q-table并没有全局存储,而是存储全局dataset列表,并在每一个状态下通过weka的RTPtree模型来分别生成其Q-table。
这样表示的问题是游戏中的可能状态数量过大,难以全部保存所有训练所得信息,只能删除早先得到的结果。
改进方法是,更改状态表示方法,考虑更加抽象和主要的属性,而非简单利用每一个方块内的物体种类、游戏时间等时刻变化的属性。以此来合并一些并非完全相同,但在和游戏交互方面有较大相同之处的状态,降低总状态数量,使得训练、使用dataset与Q-table的效率能大大增加。
1.2.2 Agent.java 代码中 SIMULATION_DEPTH, m_gamma, m_maxPoolSize 三个变量分别有何作用?
SIMULATION_DEPTH表示的是一次“探索”过程一连串走下去的深度。这一串行动,每一步采用getact(with explore)方法来获得,其整体是代码中Q-learning更新学习所得数据的最小单位。
它的存在使得每一步探索不止是计算走一步的价值,而是用我们现有方法连续走好几步之后的统计总价值,用这种方法在总状态较多的环境下可以提高训练效率,同时更科学的反映每一个动作的后续期望价值。
M_gamma参数反映了factor学习率的“衰减”,类似于深度学习中学习率不断递减的思想,而这里是在更大的探索深度使用更小的学习率。每一层探索时,factor都会乘上一个m_gamma,以此来达到减小的目的。
Max_poolsize用来限制模型的总大小,在每一次learnpolicy训练周期之中,都会把模型的总大小减少到m_maxpoolsize。始终使用丢弃最早存在于队列中的元素的方法(FIFO),比较符合我们的认知规律—新学习到的应该比很久以前学习的更有用。
1.2.3 QPolicy.java 代码中,getAction 和 getActionNoExplore 两个函数有何不同?分别用在何处?
唯一的区别在于getAction中多了下图这部分epsilon greedy的实现,即有一定概率随机走一步,其他的概率下和getActionNOExplore无异,依据Q-table判别。
getActionNOExplore用于真正决策,而getAction用于学习。
二、特征提取方法的改进与性能评价
首先通过观察我们发现在原始的代码中,进行随机决策的过程发生在进行完一遍完整的Q-table决策之后。这样做事实上是浪费了很多时间的,因而我们简简单单地把epsilon贪心中的随机决策元素放到了getAction的一开始。
其次,又在源代码中发现了一个令人疑惑的现象:如图所示的代码sameaction的初值为0,这会导致假如有等价,第一个动作将绝对不会被选中,因为当碰到第二个一样的动作时,nextDouble()一定小于1/1=1,所以bestaction一定会被更改。正确的概率实现中sameactions初值不应该是0而是1,已经在代码中更改了。
在上文中我们已经说过,特征提取改进的总体思想是“合并”相似状态,基于这一思想我进行了大刀阔斧的改革,修改后的特征仅30项。
0:avatar的x坐标
1:avatar的y坐标
2-26:avatar周围5*5的格子里的物体,只关注与avatar靠近的局部,不看整体。在这里进行了边界扩展处理,把出界的格子算作地图另一端对应的格子,这是因为观察到当卡车开到地图末端的时候,往往另一侧会有一辆新卡车出现,总数大致不变,所以可以理解为卡车越过边界开到了另一边。
27: 目标的x坐标
28:action
29:Q-value
性能评价:对特征值的修改导致的改变主要不在于游戏结果,而在于学习和决策的速度上面。在改进之前,每一步操作几乎要花费半秒钟时间,而现在,一秒钟之内可以进行几十个时钟周期,学习的效率大大提高了。这也为下一部分调整参数时设置更大的深度、更大的pool_size提供了可能。
资源下载地址:https://download.csdn.net/download/sheziqiong/85656730
资源下载地址:https://download.csdn.net/download/sheziqiong/85656730