门球是什么?它1947年起源于日本北海道,是一项团队运动。场地是约20×15米的草地,场上设三道门(拱门)和一根中心柱。双方各五颗球,红白两色,按固定顺序轮流击球:1号红、2号白、3号红,一直到10号。

打开网易新闻 查看精彩图片

每颗球要按顺序通过三道门,最后触柱。过一道门得一分,触柱得两分。真正有意思的地方在别处:如果我的球撞到另一颗球(touch),我可以把两颗球摆在一起,再击打自己的球,把对方那颗远远送出去,这就是spark。靠它,我能帮队友推进,也能把对手的球清出场。一场比赛30分钟,分高者胜。

乍看之下,这像是个比准头的游戏。实际上,它是个比策略的游戏。

kantoku是什么

kantoku(監督)就是指挥球队策略的人。他决定每一轮每颗球该做什么:推进自己的门、攻击对手、调整位置帮队友,还是自我保护。

一个好的kantoku不会只盯着眼前这一杆。他会想自己给下一个上场的对手留下了什么,会想队里谁近射准、谁远射稳,会想场上哪些区域值得控制,还会想还剩多少时间——因为最后几分钟的打法会变很多。

这个项目从一款电子游戏开始。作者正在开发Nana-Ban(七番,“数字七”),一款2D复古风格的门球游戏,灵感来自80年代的门球电子游戏,用Claude Code以短迭代的方式搭建。

游戏一度什么都有了:10颗球、轮次、touch、spark、犯规和计时。CPU能打完整场比赛。但作者和它对局时发现了一件事:它打球没有章法。它只会朝自己的门瞄准,别的几乎不管。有时它把自己的球停在我正好能撞到、能清出场的位置;有时它重新进场,直接送到我手边。它能打中,但它不思考。

作者由此明白,它缺的不是准头,而是一个kantoku。

它像棋手吗

作者的第一直觉是:kantoku就像棋手,读棋盘、预判对手。两者在这点上相似,但有三处重要差别:

  • 击球是连续的。国际象棋一轮大约有30种走法,门球里角度和力度是无限的。
  • 执行有随机性。你可以选出完美的一杆,然后打丢。草地会让球偏。
  • 下一个上场的是谁极其重要。轮次顺序是固定的,所以关键问题是:我给接下来那颗对手球留下了什么?

所以最接近的模型不是国际象棋,而是台球或冰壶的人工智能:想几个选项,逐个模拟,评估场上最后变成什么样。

人工kantoku怎么想

每一轮,CPU做三件事:

  • 想选项:过自己的门、撞对手、靠近队友、去中心柱,还是调整位置。
  • 在脑子里试:用和游戏相同的物理模拟每一杆,模拟多次,并带上击球者自身的误差——因为准的射手和不稳的射手不是一回事。
  • 评估场上局面:给每种可能的情况打分,选最好的。

这个评估就是kantoku的核心。它是一个加总多项内容的公式:拿到的分数、我的球离下一道门有多好、我给下一个对手留了什么最好的选项、我是否控制住2号和3号门前的区域、我的球是否彼此靠近以便连续打出touch和spark。

每一项都有权重:它值多少。清掉一颗对手球和确保一分,哪个更值?让自己的球暴露在外,代价多大?策略就在这里。

让机器自己学权重

一开始,这些权重是作者按自己的判断手写的。能用,但都是估计。于是他问自己:如果让一个kantoku自己把这些权重找出来呢?

思路很简单:

  1. 创建24个权重略有不同的kantoku。
  2. 让它们互相对局,几千场,不渲染画面,只做模拟。
  3. 系统保留表现最好的,并在赢家附近生成新一代。
  4. 重复几十代。

最后留下一个冠军:一个装着约30个数字的文件。这就是模型。学到的不是公式,而是公式里每样东西值多少。就像一份食谱:代码写着“放面粉、糖和鸡蛋”,训练找出的是用量。

技术上是自对弈优化,用的算法叫CMA-ES。在作者的笔记本电脑上跑,一到两小时。

为什么不用神经网络

这是显而易见的问题。神经网络是现代人工智能的基础,AlphaZero学下棋和围棋比任何人类都强。为什么不用一个?

对作者来说,最重要的原因是最后一行。当他跟CPU对局后说“要控制2号门前的区域,又不给对手射门角度”,这个想法就变成了公式里的一项,kantoku在下一次训练中就开始重视它。换成神经网络,这个直觉得靠它自己打上百万场去发现,而且不保证能发现。

那给它一块GPU呢?作者原以为有GPU一切都会更快。这个场景里不是。GPU擅长的是把工作拆成数百万个简单相同的运算,像一千个人同时刷一千块栅栏板。神经网络就是这样。

但一场门球比赛是接力赛:碰撞产生touch,touch开启spark,spark决定下一杆。每一步都依赖前一步。这更适合普通处理器(CPU),而加速训练靠的是更多核心:每个核心打一场不同的比赛,像有多块场地的锦标赛。

那神经网络就更差吗?不是。论上限,神经网络能走得更远,因为它不受作者定义的那些项限制,能发现没人想到过的概念。但在电子游戏里,目标不是全世界最强的kantoku,而是一个有章法的好对手。为此,选定的方案更快、更便宜、可理解、也容易修正。

如果哪天需要更多,下一步不是从零搭一个网络,而是让一个小网络从已经定义好的这些项里学起。

第一次训练学到了什么

第一个冠军在对阵手写权重的比赛里赢了93%。看起来是成功。但作者跟它对局时,轻松赢了。

发生了什么?这个kantoku学会了极度激进:不停做touch、清球,把“暴露”这一项的权重降到了零。它不在乎把自己的球留在我的手边。原因是:它训练时的对手很被动,几乎从不进攻。面对一个不进攻的人,暴露自己毫无代价,而这正是它学到的东西。

这就像一支只跟从不射门的对手打友谊赛的球队:它学会了防守没用。

教训是:机器学到的是你给它的世界,不是真实世界。第二次训练改了四件事:

  • 更强的对手,包括冠军自己。
  • 给风险设一个下限,因为门球里暴露自己总是有代价的。
  • 真实的草地偏差:kantoku以为自己98%的球能打中,而在9米处实际命中率接近60%。
  • 作者自己的球员基准:一个好球员在约6米处打touch有一半命中,在13米处也许五次中一次。

这就是这个方案的价值:我在对局中做出的每一个观察,都能变成kantoku能理解的东西。

这是第一章:人工kantoku为什么是现在这个样子。第二章会讲它在游戏里的实现:新冠军表现如何,它怎么变成Nana-Ban的难度等级,以及跟一个终于会思考的kantoku对局是什么感觉。