读《神经网络与深度学习》一书,随笔。
1 IBM深蓝下象棋
深蓝打败卡斯帕罗夫用的是蛮力和一些启发式算法。其原理是:用评估函数评估当前棋盘的局势 + 在大量可能局势中挑最有利的。评估函数采用了8000多个因素来计算,需要非常专业的国际象棋知识。用博弈树搜索后面的6步,然后用评估函数在第6层上评估节点的质量,用评估函数的值替换了这个节点下的所有子树的概述,用极大极小算法找到下一步动作。
围棋难在:
(1)落子点太多,使得博弈树搜索到足够深度更困难;
(2)评估函数太难设计。
2 AlphaGo下围棋
AlphaGo的主要原理包括三个重要部分:
(1)估值网络(Value Network,也叫价值网络):用于估计棋局的局势,在当前棋局状态下,每个落子位置导致整个棋局“最后”的胜率。相当于深蓝的评估函数,不同点是自己学习的而不是领域专家精心设计出来的,并且估计的是最终胜率而不是短期的攻城略地。
(2)走棋策略网络(Policy Network):在某一个棋局的状态下,计算各个可能落子位置的概率,并选择下一步最佳的走法。
(3)蒙特卡洛树搜索(MCTS,Monte Carlo Tree Search)
上述每个部分具体是什么?又是怎么训练的呢?
2.1 策略网络
是一个13层的CNN网络,卷积核大小采用5 x 5。
训练数据集:围棋游戏中获取的对局样本,3000万人类对弈的位置信息拆解为训练集。
训练目标:在每一种棋局状态下,人类棋手的下一步落子是什么,对于算法来说就是看每种图形的下一种图形是什么。所以策略网是用来计算对手如何落子的。
结果:用这个数据集直接生硬的训练,精度能有57%,这表明大量人下棋总是凭直觉。只有策略网络的AlphaGo(起个别名P_human)下不过业余6段的人类棋手。
优化:此时的训练数据仍然不够,因此采用强化学习进一步AlphaGo的棋力。
2.2 估值网络
也是一个CNN网络。估值网络是AlphaGo的一大创新。
训练:通过两台AlphaGo对弈的方式来训练。人类完成一局对弈一般数小时,AlphaGo之间对弈1秒钟内能完成数局,这种方式可以快速地累积出正确的评价样本。
因此估值网络并不是通过这个世界上已知的棋谱作为训练的,因为人类对弈会受到主观因素的影响。AlphaGo在对战欧洲棋王时,使用的训练组样本只有3000万个棋谱位置,但是在对战李世石时,棋谱位置已经增加到了1亿个。所以,先前提到的机器下围棋的最大困难点:评价机制的部分,就是这样通过卷积神经网络来解决的。
综上所述,策略网络是分类问题,考虑的是对方会下在哪,估值网络是评估问题,考虑的是我下在这的胜率是多少。
2.3 MCTS搜索
MCTS是当时另外一个非常强的AI棋手CrazyStone中用到的算法,是由Coulum设计的(黄士杰的老师),他最初对围棋一无所知。用MCTS搜索替代了博弈树搜索才拯救了围棋算法。MCTS通过模拟大量的棋局,使得最靠谱的落子方法自己涌现出来,而不是暴力的搜索博弈树中的每一种可能的落子方案。
训练:模拟两个人下棋,起初,用掷骰子的方法决定子落在哪里。如果赢了,一些落子方案的分值就增加。然后继续开始下一盘棋,之前被保存下来的落子方案会引导下一步模拟选择行为,模拟因此越来越不随机。随着想象中的棋局下得越来越多,那些看起来不错的落子方案的分数就会越来越高,而落子方案越是有前途,越会被更多地选中进行推演,于是最有“前途”的落子方法就会“涌现”出来。最后,AlphaGo在想象中下完10万盘棋后,选择它推演中分数最高的那个方案落子,这时,AlphaGo才真正下了当前的一步棋。
优势:MCTS搜索的特点是没有任何人工的特征,完全依靠规则本身,通过不断想象自对弈来提高能力。除此之外,MCTS完全不用等对手落子后才开始计算,在对手思考过程中它就已经在计算了,因为对手的落子完全可能出现在之前想象的对弈中,所以所有的计算都不会浪费。
优化:黄士杰意识到他老师的程序起点太低,需要一个方法替代扔骰子。所以用之前训练好的P_human来代替扔骰子。在这一步还可以加一些由围棋专家设计的手工规则,用来排除一些不好的走法。
2.4 AlphaGo整体训练过程
(1)利用3000万专业棋手棋谱训练两个网络:基于全局特征和CNN训练的走棋策略网;基于局部特征和线性模型训练的快速走棋策略,后面在线对弈时用;
(2)利用第 t 轮的策略网络与先前训练好的策略网络互相对弈,利用强化学习修正第 t 轮的策略网络参数,得到一个增强的策略网络;
(3)利用普通策略网络生成棋局的前 U-1 步,然后利用随机采样决定第 U 步的位置(为了防止过拟合),随后,利用增强的策略网络完成后面的自我对弈过程。第 U 步的盘面作为特征输入,胜负作为label,学习一个估值网络。
2.5 AlphaGo在线对弈过程
核心思想是在MCTS中嵌入深度神经网络来减少搜索空间。
(1)根据当前盘面已经落子情况提取相应特征。
(2)利用策略网络估计出棋盘其他空地的落子概率。
(3)根据落子概率计算此处往下发展的权重。利用估值网络和快速走棋策略网络分别判断局势,两个局势得分相加为此处最后走棋获胜的得分。使用快速走棋策略快速行棋至最后,每次行棋结束后会有一个输赢结果,综合统计这个节点对应的胜率。而估值网络只根据当前状态便可直接评估出最后的结果。两者各有优缺点,可以互补。
(4)利用第3步计算的得分更新之前那个走棋位置的权重。然后,从权重最大的那条边开始继续搜索和更新。