1.4 强化学习
尽管强化学习是针对没有标注的数据集而言的,但我们还是有办法来判断是否越来越接近目标(reward function,回报函数)。
经典的儿童游戏Hotter or Colder就是这个概念的一个很好的例证。你的任务是找到一个隐藏的目标物件,而你的朋友会告诉你,你是越来越接近(hotter)目标物件,还是越来越远离(colder)目标物件。hotter和colder就是回报函数,而算法的目标就是最大化回报函数。你可以把回报函数当成一种延迟和稀疏的标签数据形式,而不是在每个数据点获得特定的答案(right或者wrong)。你会得到一个延迟的反应,而它只会提示你是否在朝着目标方向前进[3]。
1.4.1 AlphaGo
下面介绍一个有监督学习的典型案例——AlphaGo。
AlphaGo是于2014年开始由位于英国伦敦的谷歌旗下的DeepMind团队开发的人工智能围棋软件,自“出道”以来就不停地找人类对局,并借此增强自身实力。2015年10月,AlphaGo击败樊麾,成为第一个无须让子就可以在19路棋盘上击败围棋职业棋士的计算机围棋程序。2016年3月,通过自我对弈数万盘进行练习和强化,AlphaGo在一场五番棋比赛中以4比1的总比分击败了顶尖职业棋手李世石,成为第一个不借助让子击败围棋职业九段棋士的计算机围棋程序,树立了里程碑。2016年12月29日至2017年1月4日,再度强化的AlphaGo以“Master”为账号,在未公开真实身份的情况下,通过非正式的网络快棋对战进行测试,挑战中、韩、日的一流围棋高手,测试结束时60战全胜。2017年5月23日至27日,在中国乌镇围棋峰会上,新的强化版AlphaGo和“世界第一棋士”柯洁对局,取得了全胜的战绩。
要了解AlphaGo,先要知道下围棋的思路——面对一盘棋,分析当前的局势,思考如何落子才能够获得更高的胜率,然后根据思考结果落子。之所以说“胜率”,是因为“对手”也会思考,“对手”的落子同样会给棋局带来影响。将己方落子与对方落子同时考虑并进行推演的过程,称为落子推演。对人类而言,难点就在于推演的分支数量庞大、数据复杂,很难覆盖所有的落子情况。
AlphaGo对围棋问题进行了量化。围棋的棋盘上有19×19=361个点可以落子,每个点有三个状态,无子为0,白子为1,黑子为-1。对于整盘棋,采用一个向量(即state)来保存棋盘状态。
整盘棋用361维向量来表示,对应的落子用1×361维的向量来表示。
注意 要将落子向量中的0与棋盘状态中的0区分开。落子向量中只有1或-1(暂不考虑不能落子的情况)。如果中的第20位为-1,就表示在棋盘的第2行第1列处落黑子(围棋棋盘的每一行和每一列都有19条线,因此,第20位就表示第2行的第1列)。
AlphaGo的算法流程可以分为如下四步。
①由策略网络得出落子概率分布;
②由评估网络对每个可落子点进行快速评估,筛选出值得推演的落子;
③由落子推演得出落子点的模拟赢棋概率;
④ 综合策略网络和落子推演的结果,进行落子选择,选出胜率最高的点并落子。
策略网络用于进行落子预测。DeepMind团队采用深度卷积神经网络,依据输入的棋盘状态来计算输出对应落子的向量的概率分布,选出概率最大的落子点进行落子,以此模拟人类的下棋方式,如图1.12所示。AlphaGo的“老师”其实是人类,因为训练使用的数据(,)就源于围棋对战平台KGS上人类的围棋对弈棋谱。
图1.12 策略网络得出的落子概率分布
评估网络用于评估当前局势状态下己方的获胜概率。它的作用在于能够快速筛选“死局”,不再花时间进行“死局”的落子推演,而把推演重心放到能够带来胜率的落子点上。这样做能极大提升AlphaGo的整体运算速度。
该深度神经网络的训练过程如同人类累积经验的过程,让AlphaGo用已经训练好的评估网络来预测落子,进行“双手互搏”,直到每局终了,得到胜者r。随着对局数的增加(包括与人类的对局),AlphaGo能持续完善评估网络,“积累”更多的“经验”。
落子推演采用蒙特卡罗树搜索(Monte Carlo tree search,MCTS)的方法进行。每次推演都从经过评估网络筛选的落子点着手,假如已经选择了该落子点(并未真正落子),则更改“角色”,利用策略网络继续推演落子,并使用评估网络进行评估,直到推演出胜者,返回赢棋概率。
AlphaGo最终的落子选择依赖于策略网络预测落子概率分布及落子推演所得落子胜率的加权求和的结果。仅由预测得到的落子点不一定是最佳落子点,尤其是在某一落子点被反复预测到的时候。此时,需要降低其权重,主要依赖落子推演来模拟得到的赢棋概率。
AlphaGo对每个经由评估网络筛选得到的落子点都进行以上计算,得到每个可落子点的落子概率,从中选择概率较高者进行落子。
1.4.2 AlphaGo Zero
AlphaGo的后续版本AlphaGo Zero,在AlphaGo的基础上进行了改进,训练数据不再源于人类,而是通过自我对弈进行提升。AlphaGo Zero在3天内以100比0的战绩战胜了AlphaGo Lee,花21天达到了AlphaGo Master的水平,用40天超越了之前的所有版本。而之前版本的AlphaGo的棋力获得这样的进步,花了两年左右。
AlphaGo Zero的算法流程大体可以分为以下三步。
①将神经网络参数初始化为θ0;
②在状态下,执行MCTS网络,利用深度卷积神经网络fθ来模拟落子;
③根据MCTS网络的返回值落子,同时更新参数θ。
与AlphaGo不同的是,AlphaGo Zero采用参数为θ的神经网络fθ。该神经网络输入棋盘状态和7步历史落子记录,输出落子概率分布与评估值ν。落子概率用于给出最佳落子点分布,而评估值ν用于评估当前状态下己方获胜的概率,如图1.13所示。
图1.13 深度卷积神经网络fθ的输入与输出
DeepMind团队采用随机方式对参数θ进行初始化,在不断对弈中进行调整。MCTS网络返回的是各落子点的赢棋概率,在AlphaGo Zero中则直接将其作为落子概率。AlphaGo Zero用一个神经网络fθ代替AlphaGo中的两个神经网络,用落子概率分布代替策略网络来指导MCTS网络落子,用评估值ν代替评估网络来评估棋局。
在每次对弈中,AlphaGo Zero先根据棋盘状态,利用深度神经网络fθ得出落子概率分布和评估值ν。若评估值较低,则已经处于败局,不再进行后续对弈。反之,就利用MCTS网络对由得出的落子点进行推演。此时已经能判断出胜者,AlphaGo Zero会记录当前胜者z。
模拟落子并返回结果后,记录当前数据。其中,作为数据,和z作为标签,用于训练神经网络fθ。将和z与落子概率分布和评估值ν进行比对,尽可能最大化与的相似度,最小化ν预测的胜者和局终胜者z的误差,以此来更新神经网络的参数θ。同时,会根据返回的选择最佳落子点进行落子,然后轮换到对手回合。每次落子后都对参数θ进行更新,使得当前的fθ比前一次落子时所用的fθ更为精确、有效。这也是AlphaGo Zero无师自通、越战越强的原因。
在机器学习领域,还有一种半监督学习方法,介于有监督学习和无监督学习之间,既有带标签的数据集L={(xi,yi)}(xi是数据,yi是数据xi所对应的标签),也有不带标签的数据集U={xj},且数据集L的数据量远小于数据集U的数据量。其目的是:通过训练得到一个学习机,即函数f(xi)→yi,使其对每个数据xi都能尽可能准确地预测出标签yi。但是,在深度学习中,半监督学习的成功案例几乎没有。