用深度强化学习玩游戏之DQN实战笔记
前言
本项目基于Bilibili up主蓝魔digital的项目改编,研究对象为并进行了分析,供大家学习与参考(视频链接在文末)
环境配置
Python 3.8
Tensorflow – 2.4.1
Opencv-python – 4.5.1
Cuda – 11.1
cudnn – 11.1
《MuseDash》游戏
游戏环境信息提取及建模
(1)血量信息提取
对于本文中讨论的AI智能体来说,首先需要了解自己的血量,以保证自己能够通过整个关卡。对于游戏中的血量,不便选择读取内存的方式来提取数据,故采用图像处理的方式对游戏界面的血量进行实时提取,并将其转化为数据。由于游戏界面血量接近于红色,故可以直接通过提取HSV色彩空间中的红色,判断两帧之间血条的变化,从而直接设置奖励(惩罚),如果血量低于限定值,则判断智能体死亡游戏结束。
(2)击打信息提取
在得知血量信息后,还需要提取智能体是否击中目标的信息,考虑到《Muse Dash》的画面信息较为复杂,不易直接提取画面中的打击提示,故决定不从连击提示和打击点进行信息提取。
由于游戏中人物在击中敌人时,蓝条会增加,且如果造成连击蓝条会有一段比较大的增量,故采用提取蓝条信息,判断蓝条两帧之间的变化的方式来判断人物的打击效果。
使用和提取血条相似的方式,选取一行像素判断蓝色的灰度区间,进行对蓝量的计数,累加得到蓝量信息,间接得到击打反馈。
(3)智能体动作设置
人物的动作分为向上击打、向下击打、向上长按、向下长按四种,考虑到长按操作会使计算流程存在一个空档期,在此期间智能体无法观察环境,且长按空档期时间不定,如果加入长按动作会使模型极难收敛,故不考虑长按操作。
由于可能出现向上击打和向下击打同时出现的情况,为了使模型收敛性较好,故可将这个两个动作合成为同时击打动作。游戏中陷阱会和击打目标同时出现在上下击打点,故通过奖励设置可以避免同时击打一直产生的情况。
(4)奖励设置
在得到血量和蓝量信息后,通过动作触发奖励。
1 )对于击中的情况,蓝条增加则直接触发较小的奖励。
2 )对于连击的情况,如果判断蓝条两帧差距超过阈值则出发连击奖励。
3 )对于掉血的情况,如果血条减少则触发掉血惩罚。
4 )对于死亡的情况,如果判断死亡则触发死亡惩罚。
5 )对于蓝条收集满,触发特殊的奖励,同时蓝条清零。
所用算法——DQN(Deep Q Network)
DQN是Q学习算法与深度神经网络的结合,使用深度神经网络直接作用于RGB图像,使用target Q network来更新target,还使用了经验回放Experience replay。
算法流程:
- 初始化经验池 D \ D D,其容量为 N \ N N,用作经验回放
- 用随机权值初始化 动作-价值 函数网络 Q \ Q Q 参数
- 用相同的权值初始化目标 动作-价值 函数网络 Q ^ \hat Q Q^ 参数
- 进入第一次游戏循环,游戏总共 M \ M M次
- 初始化事件的第一个状态 S 1 = x 1 \ S_1=x_1 S1=x1 ,预处理得到状态对应的特征输入 ϕ 1 ( S 1 ) \ \phi_1(S_1) ϕ1(S1)
- 进入一次游戏循环的一步
- 如果概率为 ϵ \ \epsilon ϵ 的事件发生了,选取一个随机动作 a t \ a_t at
- 如果概率为 ϵ \ \epsilon ϵ 的事件没有发生,则按贪婪策略选取此状态下最大的Q结果对应动作 a t \ a_t at
- 代理执行动作 a t \ a_t at,获得环境反馈的奖励 r t \ r_t rt和下一时间步的游戏图像 x t + 1 \ x_{t+1} xt+1
- 将此时的 a t \ a_t at, S t \ S_t St, x t + 1 \ x_{t+1} xt+1作为下一状态 S t + 1 \ S_{t+1} St+1,并继续处理下一时间得到游戏图像得到 ϕ t + 1 \ \phi_{t+1} ϕt+1
- 将刚刚获得的状态转移 ( ϕ t , a t , r t , ϕ t + 1 ) \ (\phi_t,a_t,r_t, \phi_{t+1} ) (ϕt,at,rt,ϕt+1)存入经验池 D \ D D中
- 从经验池 D \ D D中均匀随机采样一个状态转移样本数据 ( ϕ j , a j , r j , ϕ j + 1 ) \ (\phi_j,a_j,r_j, \phi_{j+1} ) (ϕj,aj,rj,ϕj+1)
- 计算目标值 y j \ y_j yj,首先判断是否是一次游戏的终止状态,若是终止状态则目标值 y j = r j \ y_j=r_j yj=rj ,如果没有终止则利用目标 Q ^ \hat Q Q^ 网络计算来得到 y j \ y_j yj。
- 通过 y j \ y_j yj与实际预测网络 Q \ Q Q 计算结果的差值,进行梯度下降算法,更新预测网络 Q \ Q Q的参数
- 每隔C步用预测网络 Q \ Q Q参数更新一次目标网络 Q ^ \hat Q Q^参数
- 结束该步运算
- 结束该次游戏循环
在训练智能体时,卷积网络的输入为将游戏图像预处理成连续 4 帧的像素的图像。预处理过程主要是将游戏图像缩放并去色,由彩色图像变为灰度图像
实际表现
游戏界面:
训练后成果已上传至Bilibili,视频链接:https://www.bilibili.com/video/BV1Up4y1n77y
原作者蓝魔Digital的用DQN玩只狼视频:https://www.bilibili.com/video/BV1SA411u7g9