文章插图
作者 | 李秋键
责编 | Carol
头图 | CSDN 付费下载自视觉中国
人工智能作为当前热门在我们生活中得到了广泛应用,尤其是在智能游戏方面,有的已经达到了可以和职业选手匹敌的效果 。而DQN算法作为智能游戏的经典选择算法,其主要是通过奖励惩罚机制来迭代模型,来达到更接近于人类学习的效果 。
那在强化学习中, 神经网络是如何被训练的呢? 首先, 我们需要 a1, a2 正确的Q值, 这个 Q 值我们就用之前在 Q learning 中的 Q 现实来代替. 同样我们还需要一个Q估计来实现神经网络的更新. 所以神经网络的的参数就是老的NN参数加学习率 alpha乘以Q现实和Q估计的差距 。
文章插图
文章插图
我们通过 NN 预测出Q(s2, a1) 和 Q(s2,a2) 的值, 这就是 Q 估计. 然后我们选取 Q 估计中最大值的动作来换取环境中的奖励 reward. 而 Q 现实中也包含从神经网络分析出来的两个 Q 估计值, 不过这个 Q 估计是针对于下一步在 s’ 的估计. 最后再通过刚刚所说的算法更新神经网络中的参数.
DQN是第一个将深度学习模型与强化学习结合在一起从而成功地直接从高维的输入学习控制策略 。
- 创新点:
通过experience replay(经验池)解决相关性及非静态分布问题;
使用TargetNet解决稳定性问题 。
- 优点:
End-to-End 训练方式;
可生产大量样本供监督学习 。
- 缺点:
只能处理只需短时记忆问题,无法处理需长时记忆问题(后续研究提出了使用LSTM等改进方法);
CNN不一定收敛,需精良调参 。
整体的程序效果如下:
文章插图
实验前的准备首先我们使用的Python版本是3.6.5所用到的库有cv2库用来图像处理;
Numpy库用来矩阵运算;TensorFlow框架用来训练和加载模型 。Collection库用于高性能的数据结构 。
文章插图
程序的搭建
1、游戏结构设定:
我们在DQN训练前需要有自己设定好的程序,即在这里为弹珠游戏 。在游戏整体框架搭建完成后,对于计算机的决策方式我们需要给他一个初始化的决策算法为了达到更快的训练效果 。
程序结构的部分代码如下:
def __init__(self):self.__initGame# 初始化一些变量self.loseReward = -1self.winReward = 1self.hitReward = 0self.paddleSpeed = 15self.ballSpeed = (7, 7)self.paddle_1_score = 0self.paddle_2_score = 0self.paddle_1_speed = 0.self.paddle_2_speed = 0.self.__reset'''更新一帧action: [keep, up, down]'''# 更新ball的位置self.ball_pos = self.ball_pos[0] + self.ballSpeed[0], self.ball_pos[1] + self.ballSpeed[1]# 获取当前场景(只取左半边)image = pygame.surfarray.array3d(pygame.display.get_surface)# image = image[321:, :]pygame.display.updateterminal = Falseif max(self.paddle_1_score, self.paddle_2_score) >= 20:self.paddle_1_score = 0self.paddle_2_score = 0terminal = Truereturn image, reward, terminaldef update_frame(self, action):assert len(action) == 3pygame.event.pumpreward = 0# 绑定一些对象self.score1Render = self.font.render(str(self.paddle_1_score), True, (255, 255, 255))self.score2Render = self.font.render(str(self.paddle_2_score), True, (255, 255, 255))self.screen.blit(self.background, (0, 0))pygame.draw.rect(self.screen, (255, 255, 255), pygame.Rect((5, 5), (630, 470)), 2)pygame.draw.aaline(self.screen, (255, 255, 255), (320, 5), (320, 475))self.screen.blit(self.paddle_1, self.paddle_1_pos)self.screen.blit(self.paddle_2, self.paddle_2_pos)self.screen.blit(self.ball, self.ball_pos)self.screen.blit(self.score1Render, (240, 210))self.screen.blit(self.score2Render, (370, 210))'''游戏初始化'''def __initGame(self):pygame.initself.screen = pygame.display.set_mode((640, 480), 0, 32)self.background = pygame.Surface((640, 480)).convertself.background.fill((0, 0, 0))self.paddle_1 = pygame.Surface((10, 50)).convertself.paddle_1.fill((0, 255, 255))self.paddle_2 = pygame.Surface((10, 50)).convertself.paddle_2.fill((255, 255, 0))ball_surface = pygame.Surface((15, 15))pygame.draw.circle(ball_surface, (255, 255, 255), (7, 7), (7))self.ball = ball_surface.convertself.ball.set_colorkey((0, 0, 0))self.font = pygame.font.SysFont("calibri", 40)'''重置球和球拍的位置'''def __reset(self):self.paddle_1_pos = (10., 215.)self.paddle_2_pos = (620., 215.)self.ball_pos = (312.5, 232.5)
推荐阅读
- Python破解BiliBili滑块验证码,完美避开人机识别
- 数据更新删除与排序:横向对比 Python、PowerBI、Excel、MySQL
- 用 Python 解析命令行参数
- 用 Python 绘制数据的7种最流行的方法
- 如何监视Python程序的内存使用情况
- 茶叶变质还能喝吗,铁观音过期了没开封还能喝吗
- 驾驶证到期了怎么办?还能继续开车吗
- 视频直播服务搭建好了?教你快速实现多频道输入输出与权限控制
- 5个案例让Python输出漂亮的表格
- Python 命令行之旅:使用 argparse 实现 git 命令