AlphaGo 的棋局,与人工智能有关,与人生无关
|
当模拟结束了,需要把这个 virtual loss 去掉,同时加上这次 Simulation 的得分。
此外,当 GPU 算完 value 的得分后也要更新:
最终算出Q(s,a):
Expansion(图 b) 当一条边 (s,a) 的访问次数 Nr(s,a)【提个小问题,为什么是Nr(s,a)而不是Nv(s,a)?】超过一个阈值 Nthr 时会把这条边的局面(其实就是走一下这个走法)s’=f(s,a) 加到搜索树里。 初始化统计量:Nv(s’,a)=0, Nr(s’,a)=0, Wv(s’,a)=0, Wr(s’,a)=0, P(s’,a)=P(a|s’) 由于计算 P(a|s’)需要在 GPU 中利用 SL Policy Network 计算,比较慢,所以先给它一个 place-holder 的值,等到 GPU 那边算完了再更新。 这个 place-holder 的值使用和 rollout policy 类似的一个 tree policy 计算出来的(用的模型了 rollout policy 一样,不过特征稍微丰富一些,后面会在表格中看到),在 GPU 算出真的 P(a|s’) 之前的 selection 都是先用这个 place-holder 值,所以也不能估计的太差。因此 AlphaGO 用了一个比 rollout feature 多一些的模型。 Expansion 的阈值 Nthr 会动态调整,目的是使得计算 Policy Network 的 GPU 能够跟上 CPU 的速度。 Distributed APV-MCTS 算法 一台 Master 机器执行主搜索(搜索树的部分),一个 CPU 集群进行 rollout 的异步计算,一个 GPU 集群进行 Policy 和 Value Network 的异步计算。 整个搜索树都存在 Master 上,它只负责 Selection 和 Place-Holder 先验的计算以及各种统计量的更新。叶子节点发到 CPU 集群进行 rollout 计算,发到 GPU 集群进行 Policy 和 Value Network 的计算。 最终,AlphaGo 选择访问次数最多的走法而不是得分最高的,因为后者对野点(outlier)比较敏感。走完一步之后,之前搜索过的这部分的子树的统计量直接用到下一轮的搜索中,不属于这步走法的子树直接扔掉。另外 AlphaGo 也实现了 Ponder,也就是对手在思考的时候它也进行思考。它思考选择的走法是比较“可疑”的点——最大访问次数不是最高得分的走法。AlphaGo 的时间控制会把思考时间尽量留在中局,此外 AlphaGo 也会投降——当它发现赢的概率低于 10%,也就是 MAXaQ(s,a) < -0.8。 AlphaGo 并没有想常见的围棋那样使用 AMAF 或者 RAVE 启发,因为这些策略并没有什么用处,此外也没有使用开局库,动态贴目(dynamic komi)等。 Rollout Policy 使用了两大类 pattern,一种是 response 的 pattern,也就是上一步走法附近的 pattern(一般围棋很多走法都是为了“应付”对手的走子);另一种就是非 response 的 pattern,也就是将要走的那个走法附近的 pattern。具体使用的特征见下表。Rollout Policy 比较简单,每个 CPU 线程每秒可以从空的局面(开局)模拟 1000 个对局。
横线之上的 feature 用来 rollout,所有的 feature 用来计算 place-holder 先验概率。 Symmetries 前面在讲 Search Algorithm 讲过了。 SL Policy Network SL Policy Network 使用了 29.4 million 局面来训练,这些局面来自 KGS 6d-9d 的 16 万个对局。使用了前 1million 用来测试,后面的 28.4million 用来训练。此外进行了旋转和镜像,把一个局面变成 8 个局面。使用随机梯度下降算法训练,训练的 mini-batch 大小是 16。使用了 50 个 GPU 的DistBelief(并没有使用最新的 Tensorflow),花了 3 周的时间来训练了 340million 次训练步骤(每个 mini-batch 算一个步骤?) RL Policy Network 每次用并行的进行 n 个游戏,使用当前版本(参数)的 Policy Network 和之前的某一个版本的 Policy Network。当前版本的初始值来自 SL Policy Network。然后用 Policy Gradient 来更新参数,这算一次迭代,经过 500 次迭代之后,就认为得到一个新的版本把它加到 Pool 里用来和当前版本对弈。使用这种方法训练,使用 50 个 GPU,n=128,10,000 次对弈,一天可以训练完成 RL Policy Network。 Value Network 前面说了,训练的关键是要自己模拟对弈然后随机选择局面而不是直接使用 KGS 的对局库来避免 overfitting。 AlphaGo 生成了 3 千万局面,也就是 3 万次模拟对弈,模拟的方法如下: 随机选择一个 time-step U~unif{1,450} 根据 SL Policy Network 走 1,2,… , U-1 步棋 然后第 U 步棋从合法的走法中随机选择 然后用 RL Policy Network 模拟对弈到游戏结束
被作为一个训练数据加到训练集合里。 这个数据是
的一个无偏估计。 最后这个 Value Network 使用了 50 个 GPU 训练了一周,使用的 mini-batch 大小是 32。 Policy/Value Network使用的Features 其实和前面 Tian 的差不太多,多了两个征子相关的 feature,另外增加了一个常量 1 和常量 0 的 plane。 最后一个 feature 是 value network 用的,因为判断局面得分时要知道是谁走的,这个很关键。
神经网络结构 Policy Network 13 层从 CNN,输入时 19*19*48,第一个 hidden 层把输入用零把输入 padding 成 23*23,然后用 k 个 5*5 的 filter,stride 是 1。 2 到 12 层首先用零把输入 padding 成 21*21,然后使用 k 个 5*5 的 filter,stride 依然是 1。 最后一层用一个 1*1 的 filter,然后用一个 softmax。 比赛用的 k=192,文章也做了一些实验对比 k=128,256,384 的情况。 Value Network 14 层的 CNN,前面 12 层和 Policy Network 一样,第 13 层是一个 filter 的卷积层,第 14 层是全连接的 Relu 激活,然后输出层是全连接的 tanh 单元。
不同分布式版本的水平比较,使用的是 Elo rating 标准。 总结 从上面的细节来看,神经网络的训练其实用的时间和机器不多,真正非资源的还是在搜索阶段。 最强的 AlphaGo 使用了 64 个搜索线程,1920 个 CPU 的集群和 280 个 GPU 的机器(其实也就二十多台机器) 之前我们讨论过分布式 MCTS 时说过,MCTS 很难在多机上并行,所以 AlphaGo 还是在一台机器上实现的 LockFree 的多线程并行,只不过 Rollout 和神经网络计算是在 CPU 和 GPU 集群上进行的。Google 的财力肯定不只二三十台机器,所以分布式 MCTS 的搜索才是最大的瓶颈。如果这个能突破,把机器堆到成百上千台应该还是能提高不少棋力的。 我个人估计在 3 月与李世石的对弈中这个架构可能还很难有突破,可以增强的是 RL Policy 的自对弈学习,不过这个提升也有限(否则不会只训练一天就停止了,估计也收敛的差不多了) 所以我个人的观点是 3 月份要战胜李世石还是难度比较大的。 人生的棋 之前我们讨论的都是完全信息的两人的零和博弈游戏。用的 minimax 也是假设对手都是走最优的走法,但实际比赛中可能并非如此。 比如为了争胜,我们可能走一些冒险的策略,这个策略下如果对手走到最佳的走法我们可能会输。但是由于局面复杂,稍有不慎可能就会走错,那么我们的目的就达到了。 还有就是多人的博弈,比如斗地主,我们可能还得对多个对手或者队友建模。比如地主最后一张牌是否要炸,还得看队友的接牌能力。 又比如你陪领导玩斗地主,另外一个人明显目的是来给领导送钱的,那么你的策略可能也需要调整。 这可能就是现实世界和人工智能的差别了。有些事情,机器永远也不会懂,比如人生。 对于人生,每个人都像一颗棋子,那么谁是下棋者呢,他又是和谁在下棋呢? 我们在下棋的时候更多的考虑是全局的利益,比如用一个兵卒换一个马炮我们会非常开心,但是作为要牺牲的兵卒来说呢?一将功成万骨枯。 人生如棋,落子无悔。等到游戏结束的时候我们来复盘,才能发现当年犯下的错误,不过毕竟于事无补,只能给后人一些经验教训罢了。 (编辑:PHP编程网 - 湛江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |









