王霞
(福建船政交通职业学院 信息与智慧交通学院,福建 福州 350007)
Unity3D是一个广为人知的专业游戏开发平台,而将机器学习技术与Unity3D相结合则可以提高游戏研发效率[1-2]。机器学习技术(尤其是深度增强学习)适用于复杂任务的学习和控制,通过采用Unity Machine Learning Agents(ML-Agents)等工具包,可以实现Unity3D与深度学习平台Tensorflow之间的通信[3]。近端策略优化(Proximal Policy Optimization,PPO)是一种能用于连续控制的强化学习算法,是目前性能较好的策略算法[4]。本研究在Unity3D平台中实现了PPO算法的训练框架,并使用这个框架来试验不同的训练设置。
PPO算法易于实现,能在连续的状态和动作空间中取得非常好的效果。PPO的目标函数具有以下的形式[5]:
L(θ)=Et[min(rt(θ)Advt,clip(rt(θ),1-ε,1+ε)Advt]
(1)
这个目标函数取前一个目标值和clip函数值之间的最小值,其中ε是超参数。Adv的值大于0意味着算法所采取的行动具有优势。如果0
在ML框架中,Agent负责接收观察的结果(状态),大脑根据这些状态决定选择动作以最大化当前的奖励。大脑与不同的Agent相连,负责决定Agent所需要采取的行动。由此决定需要使用哪种类型的大脑以及要处理的状态空间和动作空间的类型及其大小。在学习的过程中,大脑将被设置为外部类型意味着通过TensorFlow来做出动作和决定;而内部类型的大脑可以在ML模型的内部做出决策。
在进行训练之前,需要选择模型的超参数。这些参数是用来调整训练的设置,所使用的超参数设置及其定义如下表1所示:
表1 超参数取值和含义
表1(续)
首先实现一个简单的游戏场景来了解工作原理。该场景由一个玩家和一个目标组成,游戏的目的是让玩家到达目标。对于学院,将使用通用的学院设置,将大脑设置为具有1个观察和1个动作,并且状态和动作空间都将设置为连续的。当代理达到最大步数或接触目标时,会调用代理重置算法。该算法将代理和目标随机放置在一些预定义的位置上,并保存了代理和目标之间的初始距离。接下来,代理采用观察收集算法收集观察。在得到一个观察结果后,代理将其传递给大脑以决定选择哪个动作,使用两个物体之间的距离作为观察结果。尽量保持观察次数尽可能少,同时让代理有足够的信息来完成任务,代理使用动作选择算法来选择动作和计算相应的回报。由大脑决定的动作存储在数组中,由于只有一个动作,因此该动作的值会被存储在该数组的第一个条目中。动作的取值范围是-1和1之间,代理最大的移动步长为SAgent。如果代理和目标之间的距离足够小,将奖励设置为1,并将完成标志标记为 true。 为了加快学习进度,当代理和目标之间的距离过大时,将设置额外的惩罚。此时奖励被设置为-0.1。
图1展示了在训练过程中累积回报的变化情况。此处的最大步数是5 000 000。从图中可以看到,在训练迭代了2 500 000步之后算法开始稳定。
由于仅使用一个代理进行训练需要较长的收敛时间,为了提高训练效率,可以考虑使用多个代理。与一个代理相比,多个代理可以收集更多的经验来更新本策略和价值函数。图2展示了多个代理的训练收敛过程。与图1相比,多个代理的累计回报大约在25 000步后就稳定,说明采用多个代理能更快地收敛。
接下来考虑一个三维(3D)的场景,此时代理需要至少两个动作才能在三维空间中移动,而且观察次数的增加导致训练时间更长。对于该场景,使用球坐标,并按照以下方程将其转换为笛卡尔坐标:
x=rsinθcosφ
y=rsinθsinφ
(2)
z==rcosφ
为代理设置了2个动作,6个观察值。代理收集的观察不仅有横、纵坐标,还有竖坐标。代理使用动作选择算法(如算法1所示)选择动作和计算回报。在该算法中,大脑需要选择2个动作。与前一种场景不同的是,该算法没有使用固定的惩罚值-0.1,而是根据与代理与目标的距离来设置可变的惩罚值,即当代理与目标的距离越大,惩罚值就会变大。算法通过设置边界来避免代理远离目标,当代理超过预设的边界时,算法将惩罚值设置为一个较大的负数。
算法1 三维场景的动作选择算法1: the←GetThe(actVector);2: phi←GetPhi(actVector);3: mag←UpdateMag(mf *sin(the)*cos(phi), 4: mf *sin(the)*sin(phi),5: cos(the));6: moveAgent(mag);7: dist←CalDist(agent.pos, target.pos);8: r←-dist/(inidist×maxStep);9: if agent.x > rB and agent.y cB and agent.z > dB do10: r←-1;11: return;12: end if13: if dist < thre do14: r←maxStep - curStep;15: return;16: end if17: return;
在训练期间,代理可能会学习到次优行为,例如缓慢地移动向目标。针对这个问题,可以设置更大的奖励。当代理靠近或者达到目标时,算法设置一个较大的奖励,以缩短代理的学习过程,使代理尽可能快地到达目标。
图3展示了三维场景中累计回报随着迭代次数增加的变化情况。由图可知,累计回报大约在1 500 000次迭代后趋向稳定,此时算法收敛。
接下来,考虑一个更为复杂的汽车避障场景。汽车的后轮负责驱动车辆,前轮用于转向。需要使用2个动作来使汽车移动:一个动作负责驱动前进,另一个负责转向。代理的观察值不仅包括汽车的移动速度和汽车与目标的距离,还包括扭矩和前轮的转向角。
代理使用算法2来选择动作和计算相应的回报值。
算法2 无障碍汽车动作选择算法1: tor←GetTor(actVector);2: tor← tor * 200;3: ang←GetAngle(actVector);4: SetTor(tor);5: SetAngle(ang);6: dist←CalDist(agent.pos, target.pos);7: r ←-dist/(inidist×maxStep);8: if dist < thre do9: r←10;10: return;11: end if12: return;
使用随机生成的目标来训练汽车。从图4所示的结果可知,在训练开始时,汽车的学习速度非常快,累计回报不断增加。但随着迭代次数的增加,累计回报逐渐下降,并趋于稳定。这是因为当目标在代理前面时,代理能更快地达到目标。但是当目标在后方时,代理一开始的表现会变得不稳定,随后才慢慢稳定了自己的速度,追赶后面的目标。
接下来在随机生成的目标旁边设置一个障碍物,考察强化学习算法在该场景下的性能。将目标随机放置在障碍物的一侧。在每一个episode中,障碍物都会出现在汽车前面的位置。在该场景中,观察的数量显著增加,这是因为需要一些关于汽车周围的信息。使用了11条长度为15个单位、从汽车出发的射线来感知汽车周围的信息。当汽车与障碍物接近时,将即时回报设置为-10。当射线与目标接触时,该射线的编码将被设置为rdist/15。当射线没有与目标接触时,将射线编码为-1。
在训练开始时,智能体会随机走到障碍物的一侧,以尽快找到目标。在多次迭代之后,智能体学习到了与目标接触射线的距离和智能体与目标之间的距离关系,因此收敛速度变快了(如图5所示)。
本文在Unity3D的环境中研究了深度增强学习训练框架的实现。首先在一维的简单场景中实现了深度增强学习模型的训练框架。然后,逐步增加场景的复杂性:从一维到三维,最后到汽车避障问题,并为这些问题实现了相应的训练框架,考察了深度增强学习模型的收敛性能。未来的研究将实现自动化的模型训练,以减少繁琐的人工操作。