Month: March 2016

观棋录

本文不代表我的雇主。 一、 很多人都注意到,AlphaGo 的棋风有个有意思的特点:它很少下出「好棋」,也就是凶狠的杀招,并且还时不时似乎下出缓手。它局面从未大幅领先过,永远只赢一点点。 为什么呢? 要训练一个神经网络,需要定义一个反馈函数,即告诉这个神经网络怎样的决策是好的。在 AlphaGo 的设计中有个重要的细节:训练 AlphaGo 的神经网络时所采用的反馈函数只依赖于输赢,而同输赢的幅度无关。换言之,对 AlphaGo 而言,赢一目的棋和赢十目的棋一样好,它追求的只是单纯的胜负而已。 但单纯追求胜率实际上就意味着放弃追求大胜。因为在多元优化问题中靠近边缘的地方,不同的优化目标之间几乎总是彼此矛盾的。比方说,如果一个局面需要考虑三手可能的棋,第一手可以赢十目,有 70% 的胜率,第二手可以赢一目,有 80% 的胜率。第三手可以赢二目,有 90% 的胜率。首先第二手棋显然全面劣于第三手棋,不应该列入考虑。而值得比较的第一和第三手棋之间,胜率高的选择一定是胜利幅度较低的那一个。——很显然,这就是典型的帕雷托优化问题。第二手棋不是帕雷托最优的,或者说不够接近优化的边缘。而在边缘处的第一手和第三手,两个指标的优劣一定彼此相反。 (这当然不是说,围棋中追求胜率和追求领先幅度是两件矛盾的事。事实上,在绝大多数情况下,它们的指向都是相同的,一手导致领先幅度大幅下降的棋一般来说也会导致胜率大幅下降,但它根本就不会被列入权衡,也就不会被注意到。值得权衡的选择之间一定是彼此两难的,并且对手愈强,这两个优化目标之间的分歧就越大。) 因此,AlphaGo 以单纯胜负作为反馈函数的结果,就是 AlphaGo 总是选择那些相对而言更保证胜率而胜出幅度较小的棋。只赢一点点就够了。 为什么人类棋手(至少绝大多数)不这么下棋呢? 因为这和人的思维方式不符。AlphaGo 可以这么做的前提是极端精细的计算能力,从而得以控制微小而稳定的盘面优势。像是贴着水面飞行的鸟,最危险但也最省力。但人无法永远做出精确的计算,所以需要一次次努力扩大领先的幅度以维持一个安全的距离,防止一着不慎胜负翻盘。所以 AlphaGo 会显得遇强则强,但也很少下出「好看」的棋。甚至可能因为过于追求全局取胜几率,下出在人类的视角看来局部并非最优的招式。反过来,通过一番搏杀来取得局部胜利在人类看来总是一件好事,而在 AlphaGo 看来,这也许只是毫无必要地增加不确定性而已。 于是我忍不住设想,如果 AlphaGo 在训练时采用不同的反馈函数会是什么结果。不妨假设存在一个 BetaGo,一切都和 AlphaGo 设定相同,只是反馈函数定义为盘面领先的目数。(换言之,从一个正负之间的阶梯函数变成线性函数。)可以猜测 BetaGo 的「棋风」应该比 AlphaGo 凶狠许多,更追求杀着,更希望大赢。如果让 BetaGo 和 AlphaGo 反复对战,AlphaGo 赢的次数会更多,但平均而言 BetaGo 赢的幅度会更大。 (或者更极端一点,干脆采用盘面领先程度的平方乃至指数函数作为反馈,那会培养出什么暴躁疯狂的算法呢?) AlphaGo 采用目前的设计是很好理解的,因为首先追求的目标还是证明 AI 能够战胜人脑。但是从目前的情况来看,AlphaGo 似乎已经遥遥领先,那即使 BetaGo […]