领域|强化学习算法DeepCube,机器自行解决复杂魔方问题( 九 )


神经网络,包括要训练的模型、训练样本的生成和循环训练过程。见the training tool和libcube / model.py模块;
魔方复原方法, 见the solver tool和libcube/mcts.py;
其他一些不同组件,例如超参数的配置文件和魔方数据生成文件等。
魔方环境
正如前文介绍的,组合优化可不是个小问题,而且种类繁多,即使单就魔方而言,也包含数十种变体,包括2x2x2、3x3x3和4x4x4Rubick魔方,以及Square-1,Pyraminx等。本文介绍的方法不依赖于预定义的领域知识、动作集和状态空间大小,具有较强的适用性。具体而言,求解魔方问题基于以下假设:
环境状态必须是完全可观察的,根据观察结果可以区分不同状态。在魔方问题中,我们可以观察到魔方所有面的状态,因此该问题符合我们的假设。但对于类似扑克牌这样的问题,我们是看不到对手的牌的,本文方法就不再适用了。
动作的数量是离散且有限的。在魔方复原问题中,我们只需执行12中动作,这符合假设。但是对操作空间是“旋转角度α∈[-120°… 120°]”这样的非离散动作的问题,就需要不同的处理方法了。
环境的准确建模。换句话说,我们要能够回答以下问题:“对状态s采取行动a会产生什么结果?”。如果无法解决这样的问题,ADI和MCTS方法都会失效。这个要求对于实现模型是及其必要的。然而,对于大多数问题,并不存在这样的模型,或者模型的输出非常嘈杂,但在象棋或围棋之类的游戏中,游戏规则即是这样的符合要求的模型。
领域确定性。即对相同状态的相同动作会得到相同的最终状态。不过我觉得,即使采取随机行动也应该会起作用,但也不一定。
为了使我们的方法可以很方便的迁移到非3x3魔方的问题,我将所有具体的环境信息都移到了一个单独模块,并通过抽象接口CubeEnv与其余代码进行联系(见此处)。通过这样的方式,每个环境都有一个名称,指定环境名称即可使用相应的的环境类型。目前,我们定义了两种不同的环境:经典三阶魔方cube3x3和二阶魔方cube2x2。
如果你要使用自己的魔方数据或其他不同的环境,只需要修改该模块,通过接口即可在其它代码中使用你自定义的环境。
训练
模型训练过程见train.py和libcube/model.py。为简化实验,同时增强实验的可重复性,在单独的ini文件中设置训练的所有参数,包括:
要使用的环境的名称,我们提供了cube2x2和cube3x3两个环境;
运行名称,在TensorBoard的名称和目录中显示,并用于保存模型;
ADI的目标值计算方法。本代码提供两种计算方式:一种是原论文的方法,另一种是我改进的方法。实验表明,我的改进方法收敛更加稳定;
训练参数,包括batch、是否使用CUDA、学习率、LR衰减等。