上一节我们构造出如下结构的神经网络:

本节我们看看如何使用该网络训练围棋机器人。我们在标题中提到Q-Learning,它实际上是一种使用上面网络进行训练的算法流程。首先我们先定义执行Q-Learning算法的机器人对象:

class QAgent:def  __init(self, model, encoder): #参数model就是我们构造的神经网络self.model = modelself.encoder = encoder  #对棋盘的编码self.temperature = 0  #对应epsilong参数def  set_temperature(self, temperature):self.temperature = temperature  #该参数的值越大,机器人胆子就越大,就越多的进行随机落子def set_collector(self, collector):#collector包含了机器人对弈时的棋盘数据self.collector = collector

在上面代码实现中,参数temperature对应上一章我们说过的epsilong参数,这个参数的值越大,QAgent的随机性就越强.同时代码中的collector根前几节一样,它收集了两个机器人对弈的大量棋盘数据,这些数据将用于执行Q-Learning算法。接着我们看看基于Q-Learning算法的围棋机器人如何选择落子策略:

def  select_move(self, game_state):board_tensor = self.encoder.encode(game_state) #对输入棋盘进行编码moves = []for move in game_state.legal_move():if not move.is_play:continuemoves.append(self.encoder.encode_point(move.point)) #记录落子位置board_tensors.append(board_tensor) #将每个落子位置与当前棋盘对应起来if not moves:return goboard.Move.pass_turn()num_moves = len(moves)board_tensor = np.array(board_tensor)move_vectors = np.zeros((num_moves, self.encoder.num_points()))for i , move in enumerate(moves):move_vectors[i][move] = 1  #将落子位置转换为19*19的一维向量values = self.model.predict([board_tensors, move_vectors]) #让网络评判每个落子位置的优劣values = values.reshape(len(moves))  #转换为N*1二维矩阵,N是moves数组的长度ranked_moves = self.rank_moves_eps_greedy(values)  #将每一个落子位置按照网络给出的评分和相应策略进行调整for move_idx in ranked_moves:point = self.encoder.decode_point_index(moves[move_index])  #得到落子位置在二维棋盘上的对应位置if not is_point_an_eye(game_state.board, point, game_state.next_player):if self.collector is not None:#将当前棋盘与相应的落子方式记录下来self.collector.record_decision(state = board_tensor,action = moves[move_idx])return goboard.Move.play(point)return go_board.Move.pass_turn()def  rank_moves_eps_greedy(self, values):if np.random.random() < self.temperature:  #如果生成随机数小于epsilong,那么随机选择一种可行的落子位置values = np.random.random(values.shape)ranked_moves = np.argsort(values)  #将网络对每一步落子给出的评分进行升序排列return ranked_moves[::-1]  #返回评分最高的落子方式

select_moves用于机器人给出落子方式。机器人先获得当前棋盘和棋盘所有可能的落子位置,然后让网络对所有落子位置的好坏进行评分。按道理它应该选择评分最高的落子位置,但是在rank_move_eps_greedy函数中,我们要像上一节描述的那样引入随机性,先生成一个随机数,如果该随机数小于预先给定的数值,那么机器人就不按照评分来选择落子位置,而是从所有可能的落子位置中随机选择一种,要不然就老老实实按照每一步的评分,选择分数最高的那个落子位置。

接下来我们看看网络的训练方式:

    def  train(self, experience, lr = 0.1, batch_size = 128):opt = SGD(lr = lr)self.model.compile(loss = 'mse', optimizer = opt)n = experience.states.shape[0]num_moves = self.encoder.num_points()y = np.zeros((n, ))for i in range(n):action = experience.actions[i]  #获得给定棋盘时对应的落子位置reward = experience.rewards[i] #如果模拟对弈中赢了,reward的值是1,如果输了值是-1y[i] = reward#如果最终结果是胜利,那么我们希望网络对落子位置的评分尽可能趋近与1,如果输了,我们希望网络对落子位置的评分尽可能接近-1self.model.fit([experience.states, actions], y , batch_size = batch_size,epochs = 1)

上面所给定的代码就是Q-Learning算法训练机器人的过程,这些代码主要用来表达设计逻辑,由于要运行上面代码需要强大的硬件支持,我们普通电脑根本运行不了上面代码,因此代码主要目的还是在于展现逻辑过程。

更详细的讲解和代码调试演示过程,请点击链接

新书上架,请诸位朋友多多支持:

增强式学习:如何使用Q-Learning算法训练围棋机器人相关推荐

  1. 强化学习(二):Q learning 算法

    强化学习(一):基础知识 强化学习(二):Q learning算法 Q learning 算法是一种value-based的强化学习算法,Q是quality的缩写,Q函数 Q(state,action ...

  2. 2021 增强式学习RL 李宏毅

    到目前为止,我們講的幾乎都是 Supervised Learning.就算是我們在講 Self Supervised Learning 的時候.其实也是很类似Supervised Learning的方 ...

  3. [PARL强化学习]Sarsa和Q—learning的实现

    [PARL强化学习]Sarsa和Q-learning的实现 Sarsa和Q-learning都是利用表格法再根据MDP四元组<S,A,P,R>:S: state状态,a: action动作 ...

  4. 向AlphaGo进化,应用增强式学习技术打造超越人类的围棋机器人

    AlphaGo在与李世石或柯洁对弈过程中有个休息流程.此时人类选手利用这段时间充分放松思维,让自己从上一盘比赛的剧烈思维活动中抽身而出,让身体和思维获得恢复以便再战.但此时AlphaGo并没有休息,而 ...

  5. 【强化学习笔记】从 “酒鬼回家” 认识Q Learning算法

    1.背景 现在笔者来讲一个利用Q-learning 方法帮助酒鬼回家的一个小例子, 例子的环境是一个一维世界, 在世界的右边是酒鬼的家.这个酒鬼因为喝多了,根本不记得回家的路,只是根据自己的直觉一会向 ...

  6. 强化学习入门 : 一文入门强化学习 (Sarsa、Q learning、Monte-carlo learning、Deep-Q-Network等)

    最近博主在看强化学习的资料,找到这两个觉得特别适合入门,一个是"一文入门深度学习",一个是"莫烦PYTHON". 建议:看资料的时候可以多种资料一起参考,一边调 ...

  7. Deep Q Network 算法

     Deep Q Network 算法前置基础知识: Reinforcement Learning 基本概念 Q Leaning算法原理 深度学习神经网络知识 Tensorflow.Pytorch.Py ...

  8. q learning matlab,用Matlab实现简单的Q-learning算法(学习走出房间)

    看到一个简单有趣的Q learning例子,写了段matlab代码实现一下.有兴趣的请先阅读原文 链接 dbstop if error%stop at the error if it happens ...

  9. 机器学习——监督学习、非监督学习、半监督式学习、增强学习

    机器学习的主要问题 supervised learing:监督学习 unsupervised learing:非监督学习 discrete:离散的 continuous:连续的 classificat ...

最新文章

  1. linux服务器网页出现错误,常见网页错误 | Linux 主机 (cPanel) - GoDaddy 帮助 SG
  2. 服务器内存傲腾基本参数信息,服务器加傲腾内存
  3. Python爬虫实战之(五)| 模拟登录wechat
  4. ShellAPI 调用搜索引擎
  5. 豆瓣最高评分8.9!让你拥有“多样性思维”
  6. 【DP】回文词 (ssl 1813)
  7. matlab无法右键,GUI右键菜单不能在鼠标右键的位置显示
  8. IDEA常用提升开发效率的插件及快捷键(持续更新)
  9. 6个感人的亲情小故事,足以映照以后的人生
  10. 高反差保留滤镜学习OpenCV:滤镜系列(11)——高反差保留
  11. js学习笔记(新手)
  12. json特殊符号 java_java 特殊符号转json出错
  13. 石墨烯的精细结构研究取得进展
  14. 通过修改环境变量修改当前进程使用的系统 Temp 文件夹的路径
  15. 服务器计算技术解决远程接入速度困扰
  16. 彻底理解原型对象与原型链机制
  17. 预测:深度学习未来的6种可能
  18. TZT3818Y 静态信号测试分析系统
  19. 规约——前置条件和后置条件
  20. 我们无法创建新分区。【错误:0x80042468】

热门文章

  1. 『2月特刊』伟大的朋友丨拿破仑(1)
  2. 如何创建一个Java项目
  3. RKC Z-TIO 模块基于MODBUS使用PROTEM软件设定参数
  4. Three.js实现跳一跳(在线玩)
  5. 屏幕序列Screen Sequences
  6. Pycharm 简介
  7. C#,数值计算,解微分方程的龙格-库塔二阶方法与源代码
  8. 人活着的目的是什么?
  9. Robust Document Image Dewarping Method Using Text-Lines and Line Segments论文学习笔记
  10. 判断图的连通子图个数