DQN是一种强化学习算法,从随机的模型开始训练,训练过程中不断与实际游戏环境进行交互,交互过程中agent会尝试各种动作,好的动作会给予正向的reward,坏的动作会给予负的reward,通过agent与环境的大量交互逐渐学习到最优的AI模型。
平台内置了DQN强化学习算法,可以直接使用DQN算法训练AI模型。由于DQN训练要在实际游戏环境中进行,所以需要配置游戏UI,使游戏能够不断重复进入游戏场景;此外还需要游戏场景识别配置,通过识别游戏内特定的游戏元素(按钮、数字、血条等),设置游戏内训练开始、训练结束、以及设置reward奖励。
下面以<天天酷跑>游戏为例,说明如何使用内置的DQN算法训练游戏AI.
- 选择DQN AI算法
通过配置cfg/task/agent/AgentAI.ini文件内容如下,可以加载运行内置的DQN算法:
[AGENT_ENV]
UsePluginEnv = 0
EnvPackage = agentenv
EnvModule = DQNEnv
EnvClass = DQNEnv
[AI_MODEL]
UsePluginAIModel = 0
AIModelPackage = dqn
AIModelModule = DQNAIModel
AIModelClass = DQNAIModel
[RUN_FUNCTION]
UseDefaultRunFunc = 1
;RunFuncPackage = MyPackage
;RunFuncModule = MyModule
;RunFuncName = MyRunFunc
- UsePluginEnv = 0 表示使用平台内置的Env插件
- EnvPackage = agentenv 表示使用的Env插件的Package名(Python中Package名通常即为目录名)为agentenv
- EnvModule = DQNEnv 表示使用的Env插件的Module名(Python中Module名通常即为文件名)为DQNEnv
- EnvClass = DQNEnv 表示使用的Env插件的Class名为DQNEnv
- UsePluginAIModel = 0 表示使用平台内置的AI模型插件
- AIModelPackage = dqn 表示使用的AI模型插件的Package名为dqn
- AIModelModule = DQNAIModel 表示使用的AI模型插件的Module名为DQNAIModel
- AIModelClass = DQNAIModel 表示使用的AI模型插件的Class名为DQNAIModel
- 场景识别配置
场景识别配置文件路径为cfg/task/gameReg/Task.json,DQN算法中需要配置4个识别任务,:
- taskID为1的识别任务,配置为识别游戏开始,当检测到该任务为True时,开始AI模型训练;
- taskID为2的识别任务,配置为识别游戏胜利,本游戏中不存在游戏胜利的情况,所以不需要配置该任务;
- taskID为3的识别任务,配置为识别游戏失败,当检测到该任务为True时,停止AI模型训练;
- taskID为4的识别任务,配置为识别游戏画面上方的数字,根据跟数字来计算强化学习中的reward;
- 配置游戏动作
DQN算法支持离散型的动作类型,即每个动作id对应一个动作输出。通过修改cfg/task/agent/DQNAction.json文件来定义游戏内的动作,<天天酷跑>需定义的动作如下所示:
{
"screenHeight": 360,
"screenWidth": 640,
"actions": [
{
"startRectx": 120,
"startRecty": 132,
"width": 240,
"height": 428,
"contact": -1,
"type": 0,
"id": 0,
"name": "None"
},
{
"startRectx":1597,
"startRecty":770,
"width":322,
"height":305,
"contact": 0,
"type": 3,
"id": 1,
"name": "jump",
"durationMS": 50
},
{
"startRectx":4,
"startRecty":737,
"width":331,
"height":341,
"contact": 0,
"type": 3,
"id": 2,
"name": "slip",
"durationMS": 50
}
]
}
上述json文件共定义了三个动作:
- id为0的None动作类型,即游戏中不做任何动作
- id为1的click动作类型,即游戏中的跳跃动作
- id为2的click动作类型,即游戏中的滑动的动作
- 配置DQN算法参数
DQN算法包含一些训练参数,如学习率、replay memory大小、初始随机动作概率等,大部分情况下可以使用默认参数。通过修改cfg/task/agent/DQNLearn.ini文件可以修改算法参数:
[DQN]
QNetworkType = 2
InputImgWidth = 176
InputImgHeight = 108
StateRecentFrame = 4
TerminalDelayFrame = 6
RewardDiscount = 0.99
LearnRate = 0.000005
EndLearnRate = 0.000001
FramePerAction = 1
ObserveFrame = 10000
ExploreFrame = 1000000
InitialEpsilon = 0.01
FinalEpsilon = 0.001
QNetworkUpdateStep = 12000
MemorySize = 240000
ShowImgState = 0
MiniBatchSize = 32
TrainWithDoubleQ = 1
GPUMemoryFraction = 0.6
GPUMemoryGrowth = 0
CheckPointPath = data/trained-networks/
TrainFrameRate = 10
;RunType 0 for train, 1 for test
RunType = 1
- QNetworkType参数表示DQN神经网络结构,1表示Nature结构的神经网络,Nature结构的神经网络直接输出每个动作的价值;2表示Dueling结构的神经网络,Dueling将网络输出的价值分为状态价值和动作优势两部分;
- InputImgWidth和InputImgHeight表示训练输入图像的宽和高;
- StateRecentFrame = 4 表示将连续的4帧图像作为训练输入;
- TerminalDelayFrame = 6 表示训练过程中检测到的游戏结束比真实情况延迟了6帧;如果实际情况不存在延迟可以设置为0;
- RewardDiscount 表示强化学习中reward的折扣系数;
- LearnRate 表示训练中的学习率;
- FramePerAction 表示多少帧输出一个动作,训练中发现某些游戏如果输出动作频率太高,将难于收敛;
- InitialEpsilon和FinalEpsilon DQN训练采用ε-greedy策略,开始训练时有InitialEpsilon大小的概率采用随机动作,之后随机动作概率逐渐减小到FinalEpsilon;
- ObserveFrame = 10000 表示收集10000帧的数据后才开始训练模型;
- ExploreFrame = 1000000 表示经过1000000帧的训练后,随机动作概率降低到FinalEpsilon;
- MemorySize 表示训练中的经验池replay memory大小;
- ShowImgState 表示是否显示训练图像,0表示不显示,1表示显示;
- MiniBatchSize 表示采用minibatch方式训练的batch大小;
- TrainWithDoubleQ 表示表示是否采用Doule DQN方式训练,Doule DQN将动作选择和价值估计采用两个网络来进行,实践中采用Double DQN方式训练有更好的效果;
- GPUMemoryFraction 表示训练中限制GPU显存比例;
- CheckPointPath 表示训练的网络模型保存路径,确保已经创建了设置的保存路径;
- TrainFrameRate 表示训练模型的FPS帧率;
- RunType 表示DQN算法运行方式,0表示训练模型,1表示测试训练模型;
- 配置Reward奖励
强化学习训练过程中,根据环境反馈的reward进行模型训练。好的动作得到正的reward,差的动作得到负的reward。<天天酷跑>游戏中,可以根据游戏画面上方的距离数字作为游戏得分,并根据得分计算reward。得分增加表示agent一直在前进,给予正的reward;得分停止不变时表示agent死亡,给予负的reward。
其它游戏的reward计算方法,要根据实际情况来设置,总体的原则是好的动作给予正的reward,坏的动作给予负的reward。简单的reward计算,通过修改cfg/task/agent/DQNEnv.ini 可以来修改reward计算规则。<天天酷跑>游戏中,可以设置如下所示:
[IMAGE_ROI]
StartX = 0
StartY = 0
Width = 640
Height = 360
[REWARD_RULE]
InitScore = 0.0
MaxScoreRepeatedTimes = 4
RewardOverRepeatedTimes = -0.5
WinReward = 0.0
LoseReward = -0.5
MaxRunningReward = 0.5
MinRunningReward = -0.5
RewardPerPostiveSection = 0.1
RewardPerNegtiveSection = 0.0
ScorePerSection = 2.0
- StartX、StartY、Width、Height表示训练时输入给DQN训练算法的图像区域,本例中图像区域为整个游戏画面;
- InitScore 表示游戏开始时的初始得分;
- MaxScoreRepeatedTimes = 4、RewardOverRepeatedTimes = -0.5 表示当同一个得分数字重复超过4个连续帧时,给予的reward。本游戏中得分数字重复不变时,表示agent死亡,所以给予-0.5的reward;
- WinReward 表示检测到游戏胜利时,给予的reward值,由于本游戏中不存在游戏胜利结束的情况,可以设置为0;
- LoseReward 表示检测到游戏失败时,给予-0.5的reward;
- MaxRunningReward、MinRunningReward 表示游戏过程中给予的最大、最小reward值;
- ScorePerSection = 2.0、RewardPerPostiveSection = 0.1、RewardPerNegtiveSection = 0.0 表示2.0作为一个得分区间,当得分每增加一个区间给予RewardPerPostiveSection(本例为0.1) 的reward,当得分每减少一个区间给予RewardPerNegtiveSection(本例为0)的reward。
- 由于本游戏中不存在得分减少的情况,设置RewardPerNegtiveSection为0;
- AI模型训练
完成上述配置后,拉起运行AI SDK平台,重复进入游戏场景,在agent与游戏环境不断交互中进行DQN AI模型训练