山斯野人吧 关注:680贴子:218,476
  • 10回复贴,共1

谈谈我对收益论的理解

只看楼主收藏回复

一楼度娘


IP属地:山西1楼2023-12-20 10:02回复
    最近在玩七圣召唤(原神内置卡牌游戏)。昨天晚上和群友聊天,聊到怎么看待收益论,成功引发了争议。
    收益论为什么容易引发争议?因为它很难简单地描述清楚。出于方便,大部分时候我们对收益论的描述是一个简单的等式,三国杀里是1血=2牌,七圣召唤里是1血=1牌=1费=1充能。这个东西当然很容易引发大家质疑,很容易举出一堆例子,某一步按照最大收益去打是不对的,比如说被杀无脑出闪,毕竟1血>1牌嘛。
    对吗?对也不对,因为收益论在我理解中不是干这个的。但是如果有人只看到这个等式,确实容易这么理解。


    IP属地:山西2楼2023-12-20 10:19
    回复
      有一个东西和收益论等式很像,这个东西叫象棋子力价值估计。国际象棋基本公认是后9车5象3.5马3兵1. 据此可以推出什么1马=3兵,1后>1车+1马之类的东西。中国象棋也有类似的东西,但好像不被公认。
      这个东西和收益论面临的质疑也很像:1. 举出特例,证明你这估计不对;2. 宣称子力价值随局面变化,这样的模型没什么意义,至少对实战意义不大。


      IP属地:山西3楼2023-12-20 10:37
      收起回复
        原神更新完了,去玩原神了,此贴缓更。


        IP属地:山西4楼2023-12-20 10:39
        回复
          回到野人吧看到自己还有个贴子,直接说结论吧:收益论是一种局面估值方式。
          为什么我们需要局面估值?如果我们有超强的算力,能直接把每条分支算到游戏结束,那其实局面估值是不需要的,在不含运气的棋类中就是我们知道哪些走法必胜哪些走法必败,在含运气的游戏中则是我们知道每种选择的胜率。
          但实际上对于稍微复杂一点的游戏,我们不可能有这个能力。即使是现在最好的计算机去算象棋,算个二三十步也顶天了,人脑则更是差得远。此时我们要如何做选择?能算出来必胜的分支肯定是要走的,能算出来必败的分支肯定是不走的,但也并非只有这两种情况。一般地,我们可以算出一些可能的分支,然后选出一个最好的去走。怎么选?这就是局面估值发挥的时候了。比如说,象棋中会丢掉车的分支我们一般是不选的,因为我们把车的价值估得很高。
          这么看来,局面估值似乎是算力不够时的一个下位替代。不过实际上,一个完全准确的局面估值和无限大的算力实际上是等价的。论证如下:如果我们有完全准确的估值方式,那就只需要枚举我们下一步的所有选择,比较所有这些选择生成的局面,选择估值最高的一个,这样就是胜率最高的打法。实际上这也说明完全准确的局面估值不会存在,除非游戏发生了策略退化,或者你真的有无限大的算力。
          那局面估值一定不准,是否说明局面估值没有意义呢?


          IP属地:山西5楼2024-06-28 17:10
          回复
            答案当然是否定的,局面估值有意义,非常有意义。我们前文说过现在的计算机没有穷举很多游戏的算力,那计算机是怎么在象棋、围棋等领域打败人类的呢?其实就是靠估值。不过因为计算机的算力比人类高,所以可以采用一些不同的估值方式。
            alphago用到的一个技术是蒙特卡洛树搜索。这个方法简单来说就是,我从当前局面开始随机下很多盘棋下到结束,然后看看下一步下什么的情况下我的胜率最高。这个方法就是以随机下了若干盘棋的胜率作为局面的估值。
            这个方法听起来有点道理,但好像问题也挺大的。最直接的问题是随机下的棋很可能是没什么实战意义的棋,根本不能代表局面的优劣。为了弥补这个问题,我们需要不那么随机地下,比如每步在看上去比较靠谱的几步里随机。怎么选出看上去比较靠谱的几步呢?我们需要另一个估值方式,这个估值方式可以不太准确,但一定要估得快,然后再在这种估值方式认为比较好的几步棋中随机(实际上也要留一些小概率给这种估值方式认为比较差的棋,防止有些分支走不到),这样才能下很多很多盘棋给蒙特卡洛树搜索提供估值的依据。
            更早的象棋软件使用的技术更直接一点,称为min-max搜索。这个方法来自于那些算力可以穷尽的游戏的启发。比如说,对于一个游戏,你算出了所有最终分支的结果,是一个分数,此时怎么判断你最终能拿到的最大分数?我们的方法是倒推。当我们处于一个状态时,我们假设这个状态往后走一步的所有状态的最终分数都是已知的,然后我们看看这个状态是轮到自己行动还是轮到对方行动,如果轮到自己行动,那这个状态的最终分数就是后面那些状态的最大值,否则这个状态的最终分数是后面那些状态的最小值(当然,我们假设这是零和博弈)。这样一步步倒推我们就能知道当前状态的最终分数。对于算力不能穷尽的游戏,我们事先限定一个最大搜索深度,把这个深度内的所有分支都搜出来,然后给达到的局面一个估值,这个估值又是一定要快,然后再用一步步倒推求最大值或最小值的方式求出当前局面的估值。当然min-max搜索也有很多改进,比如说只保留一些估值好的分支,把估值差的分支剪掉,再继续往深了搜索。
            可以看到,不管是蒙特卡洛树搜索,还是min-max搜索,都是一种估值方式,也都要建立在另一种不太准确但非常快的估值方式之上,我们称为快速估值算法。


            IP属地:山西6楼2024-06-28 17:41
            回复
              那快速估值算法是什么呢?
              早期的象棋软件中的快速估值算法其实是根据人的直觉来的,简单的办法比如说给每个子力一个价值,将帅是无穷大,然后车很大,马炮其次等等,计算一下双方的子力价值差。更复杂的可以再考虑子力的组合、位置等等因素。因为你不能穷尽所有的因素,甚至考虑到要快所以你只能考虑很少的因素,所以这样估值必然是不准的,但无所谓,快就完了,min-max搜索可以从一个不太准的估值出发得到一个更准的估值。
              实际上,对照人类的思考过程,快速估值算法起到的就是直觉的作用,而搜索起到的是计算的作用。你算出几个可能的分支,然后凭某种方式,经验或直觉,选出一个你觉得最好的分支。
              如果算力无限大,那么快速估值算法的好坏是无关紧要的,只要它能正确判断已经胜利的局面拿到最高分,已经失败的局面拿到最低分,剩下的都可以交给搜素或者说计算。但我们并没有无限大的算力,此时快速估值算法的准确性依然对软件的能力有很大影响。
              怎么找到更准确的快速估值算法呢?人类可以多积累经验,或者当一个天才;计算机有一个更聪明的办法叫调参。比如说只考虑车和马,我们固定车是10分,然后把马是1-10分的情况都试一下,让使用不同快速估值算法的计算机互相对战,选出一个最强的,那我们可以认为他用的快速估值算法就是最好的。
              深度神经网络是一个更聪明的调参办法。你可以不用太关心它的原理,只要知道它就是一个估值函数,输入一个局面,输出这个局面的估值,而且它有很多很多参数可以调,参数的好坏会决定估值函数的好坏。因为参数实在太多,参数组合就更多,不可能让它们两两去打决出一个最强的。一个朴素的想法是,每次随机把参数调一点,然后和原来的比较,如果比原来更强就替换,否则保留原来的,这样一直做下去参数就会越变越好。实际上的做法可能要更聪明一点,它保证这些参数是可微的,然后做随机梯度下降,换句话说就是每次改进不是只试探一个方向,而是同时试探所有方向选一个最好的。因为参数空间的维数很高,所以这样做的效率会高很多。
              不过深度神经网络并不意味着之前积累的基于人类直觉的估值方式全部作废,因为神经网络的结构还是需要人类来设计,我们可以决定提前帮它算一些东西出来,称为特征,这一般还是基于人类的直觉。


              IP属地:山西7楼2024-06-28 18:06
              收起回复
                收益论就是一种快速局面估值。
                其实已经可以结束了,不过最后再回应一下文章初提出的两点质疑吧。
                1. 举出特例,证明你这估计不对。
                确实不对,因为快速局面估值关键是算得快,不需要那么准。
                2. 宣称子力价值随局面变化,这样的模型没什么意义,至少对实战意义不大。
                意义很大,因为进一步的计算要依托于快速局面估值,估值的好坏会决定计算的质量。
                End


                IP属地:山西8楼2024-06-28 18:12
                回复