本文是学人工神经网络后试图理解人工智能领域最热门的AlphaGo对弈应用。综合浓缩了众多博主的观点。
由于状态空间无法穷举,博弈类游戏AI都采用了(启发式)搜索算法,即从当前状态出发,尝试可靠的行动,达到终局或一定步数后停止,根据后续局面的优劣反馈,采取最优行动。 为了评估行动是否可靠,引入策略函数Q(a|s)和评估函数V(s),策略函数Q即在当前状态(state)下能采取的行动(action),评估函数V对当前状态评分,AlphaGo采用卷积神经网络拟合这两个函数。AlphaGo应用的蒙特卡罗树搜索(MCTS)是一种搜索框架,它把游戏的进程用树结构表示,通过反复模拟和采样对局过程来探索状态空间。它有如下特点:
- 并行搜索,对可靠的多个行动同时进行推演;
- 能随时进行,随时停止。 在对方思考对策时,不停止推演,在对方走子后保留之前的状态,根据最新的状态 进行推演。对方实际走子可能出现在刚才的推演中,所以刚才的计算是有用的。
- 随机性采样,能减小估值错误的负面影响。
- 在探索状态空间过程中,能应用神经网络选择节点,能结合强化学习调整评估函数。
- 它基于规则进行推演,而神经网络基于案例训练出评估函数,用来调整蒙特卡罗树搜索。
机器学习大体上可以分为四部分:数据集、系统模型、训练方法、评估方法。下面分别解释AlphaGo的这几个部分:
数据集:一个个独立的KGS人类在线围棋比赛棋谱、机器自我对弈棋谱作为训练集,最后的胜负作为目标;
模型:策略网络(policy network)和评估网络(value network),它们都是卷积神经网络。
策略网络P(a|s)也叫走棋网络,表示在当前状态(state)下,走子(action)的概率分布。输入当前棋局,输出棋盘上361个点的概率分布矩阵,即下一手棋子落在棋盘各个点的偏好;
评估网络V(s),输入当前棋局,输出单个值,给出当前棋局的总体评分,取值[0,1],也可以看作当前棋局的胜率。输入的棋局包括自己下的和对方下的,即也给对方下的这一手评判。
训练方法:监督学习SL(SupervisedLearning)、增强学习RL(Reinforced Learning);
评估方法:终局获胜;
训练过程:
神经网络都存在一个激活函数y=f(x),机器学习训练的过程就是通过给定大量的x和y,学习函数f,找准映射关系。y做为训练目标,可以取一个值或者一个矩阵。AlphaGo的训练过程如下:
- 训练策略网络P_net:采用监督学习。训练集为三千万的KGS人类对弈棋局图片,目的是对每个盘面做下一手预测。不同的盘面相互独立,没做成时间序列。一个盘面是19x19的二维向量s,将其输入神经网络,目的是让神经网络输出的a'不断逼近人类选手的下法a。 可以理解为学“定式”。
- 训练增强策略网络P_plus:采用增强学习,自我对弈。胜率高,但变化少,所以没直接应用在对弈过程中,主要用来生成盘面来训练V_net。
- 训练快速走棋模型P_fast,没采用神经网络训练,而是传统的局部模式匹配+线性回归,研究者基于对围棋的理解提炼出对局部落子算法。
- 训练评估网络V_net,采用增强学习,训练集为3000万人类对弈棋局和不断增长的自我对弈棋局,得到对当前盘面的胜率评估网络,即快速判断我这种局面能不能嬴。有了它,在比赛过程中就不必要用MCTS推演到终局才知道结果。
对弈过程:
整个对弈过程以蒙特卡罗树搜索算法为框架,探索各种可能下法:
- 对于当前盘面,P_net先给出几个可能选点概率;
- 对每个选点进行自我对弈往后推演,展开搜索树;
- 对各个节点的盘面进行评估,胜率高则继续推演,胜率低则剪掉。评估结果是两种方法平均加权:V_net基于盘面给出评估分数;P_fast基于盘面自我对弈到终局,返回当前盘面的胜率。
相关讨论:
- AlphaGo只求胜,不求大胜(嬴最大目数),对它来说嬴多赢少没区别。例如a选择是70%概率嬴十目,b 80%概率嬴一目,c 90%概率嬴二目,AlphaGo一定会选c,而人类会选a。因为人类没有计算机强大的计算能力,只能依靠不断积累优势来获胜。
- Alpha Go没有局部概念,求不出局部最优解。对行棋次序的组合无法遍历完。局部战斗仍然要放到最终局才能判断优劣。
- 没有采用递归神经网络RNN,所以没有基于时间序列,不会根据已经下出来的棋做决策,下棋没有逻辑。
- Alpha Go遇强则强,遇弱则弱。每一步的推演都假设对方知道自己的决策,假设对方最强。所以遇到弱手后会删掉之前正确的策略。
- 可能会出现神经网络的通病-“过拟合”问题。长期和自己下,时间久了会达到自洽,导致遇盲点而不见。所以要用不同等级的AlphaGo对弈。
- 卷积神经网络CNN对围棋拓扑图无感。围棋不是一般意义上的图案,棋子连成的形状最重要是没有断点,而具体是什么形状厚还是薄没有关系,一块连在一起的棋子中有一个眼、两个眼还是十目以上的大空是有区别。
- 是否会有升级版Beta Go,以嬴最多目数为目的,这样就会成为棋风凶狠的棋手。这样说来围棋AI还有更多发展空间。
- 是否能引入RNN,把整个棋局看作时许序列,而不仅仅是独立的盘面,这样更有逻辑性。在棋局不同阶段,动态选取两种评估方法的权重,而不是固定的0.5。
- Alpha Go不能通过观察一个棋手的棋局来学会他的“棋风”,再有针对性地攻其弱点,因为训练样本太小。
- 让人工智能下围棋是为了更深入理解智能的本质,理解人是怎么思考问题。
疑问:
1. 一个系统需要多个神经网络还是一个神经网络?
感觉对弈过程是在海量的训练集中寻找相同的盘面,一个盘面一个结果。 训练集中有人类的盘面,有机器自我对弈的盘面,一部分基于统计,一部分基于规则。如果是这样,遇到没出现过的盘面怎么办?
2. 蒙特卡罗树搜索和神经网络的在对弈过程中的角色、发挥的作用是什么?
我的理解:蒙特卡罗树MCTS基于规则推演,神经网络基于案例学习,神经网络训练完后作为盘面应对策略数据库和评分数据库。开局,蒙特卡罗树随机选择一个好开局,再基于规则对各种下法并行展开推演,对方下棋后,MCTS根据盘面,搜索到对应的策略网络,得到多种走棋方法,作为树的子节点,对每一个节点,搜索相同盘面,找到对应的评估网络,给出胜率得分(同时并行地对每个节点快速自我对弈到终局,得到胜率),综合概率和胜率得分,选择走子。对方走棋后继续这样搜索。
参考文献:
- AlphaGo如何下棋:https://www.zhihu.com/question/41176911
- 观棋录:http://imaginary.farmostwood.net/597.html
- AlphaGo的分析:https://zhuanlan.zhihu.com/p/20607684
- 关于 AlphaGo 论文的阅读笔记http://imaginary.farmostwood.net/594.html