26 / 10 / 21
今天翻 flomo,翻到自己的一条旧笔记,日期是 2024 年 5 月 27 日。原文是这样的:
为什么此劫只能有一尊佛,只有一尊佛,为什么还鼓励我们走成佛之路?
因为人生没有最后的真相和目标的…这个和GPT梯度下降结合去理解。
禅宗讲究超越不谈目的,无尽的超越而已,超越本身就是目的。
我盯着它看了好一会儿。字都认得,意思也大概明白,可当时脑子里那条线是怎么连起来的,我自己都忘了。从“此劫只有一尊佛”一下跳到“梯度下降”,当时觉得理所当然,两年多以后再看,像是别人留在桌上的一张便条。
今天,试着把这条线重新走一遍。
那段时间我在看梯度下降,起因很简单:想弄明白 GPT 到底是怎么回事。我是做工程的,一个程序怎么就会写文章、会回答问题了?不知道原理,心里总不踏实。查下去,绕不开的是“训练”,再往下,就碰到了梯度下降。
我后来是这样理解的。
想象一个人被蒙住眼睛,站在山上,要走到山底。他看不见山底在哪,手里也没有地图。他能做的只有一件事:用脚在周围探一探,感觉哪个方向往下最陡,然后朝那边迈一小步。站稳了,再探,再迈一小步。就这样一点一点往下挪。
训练 GPT,可以先这样去想。模型里面有数量极多的参数,可以把它们想成一大排小旋钮。一开始旋钮是随便拧的,它给出的回答也乱七八糟。每回答一次,就算一算它错得有多离谱,这个“错的程度”叫损失(loss)。然后看看每个旋钮往哪边拧能让错误变小,就朝那边拧一点。再回答,再算,再拧。这样反复调整。
举个很小的例子。让它接“床前明月”后面那个字,它一开始可能猜“饭”,错得很远,损失很大。调一调,下一次猜“光”的可能性就高了一点。这样想,就容易明白它是怎么一点一点学的。
这个“一点一点”很要紧。每次调整的幅度都很小,单看一次,几乎看不出变化。是成千上万次这样的小调整叠在一起,模型才慢慢从胡说八道,变成能接上一首诗,能回答一个问题。
这里面有三个特点,后来让我想了很久。
第一,没有终点的地图。蒙眼的人不知道山底长什么样,模型也不知道“完美的参数”是什么。它只知道眼下这一步,往哪边走能错得少一点。
第二,步子的大小要合适。这个大小叫学习率。步子迈得太大,本来该往下,结果一脚跨过了谷底,踩到对面的坡上去,再往回跨,又跨过头,来回晃,停不下来。把步子收小一点,看着慢,却可能走得更稳。
第三,也可能停在一个小坑里。山上不止一个谷底,到处是大大小小的洼地。走进一个洼地,四周探一圈,哪边都是往上,就以为到底了。其实翻过旁边那道坡,下面还有更低的地方。这叫局部最小值。眼下走不下去了,不等于已经到了整座山的最低处。
看懂这几点之后,我就想到了修行。
我在寺院里持续的修习过三年,敲过早晚的鼓,参加各种法会,听了很多法师开示,念过佛号,背过楞严咒,现在也还在打坐。可“成佛”到底是一个什么样的终点,我其实说不清。经典里有很多描述,但对一个还站在山上的人来说,那些描述跟看不见的山底差不多。知道它在,不知道它的样子,更没法拿它当地图来走。
梯度下降给了我一个角度。模型不需要知道终点长什么样,也能根据眼下的偏差作调整。人好像也是这样。我不知道佛是什么境界,但我大概知道,今天哪里又起了贪心,哪里又跟人较上了劲,哪个念头又把自己绕了进去。看见了,往回收一点,就是往下走了一小步。
步子要合适这一点,放在修行上也说得通。用功太猛,今天发愿要断掉所有的习气,明天做不到就整个泄了气,像是学习率太大,一脚跨过谷底,又往回晃。倒是每天一点点地收,看起来不起眼,日子久了,回头一看,已经走下来不少。
在我看来,GPT 的训练和人的修行,在这里有一点相像:不必先看清终点,也能从眼下的偏差入手,一次次修正。
禅宗不太谈目标。我笔记里写“无尽的超越而已,超越本身就是目的”,现在回头看,大概是这个意思:并没有一个叫“超越”的终点,到了就算完事。每一步从错多一点的地方,挪到错少一点的地方,这个挪动本身就是路。蒙着眼下山,能探到的是脚边的路,能管的是这一步踩得稳不稳。
再回到笔记开头那个问题。
旧笔记里那句“此劫只能有一尊佛”,现在再看,仍然有个疑问:既然只有一个,为什么还鼓励每个人都走成佛之路?好比一座山只有一个最低点,那还叫所有人都往下走做什么?
我当时是怎么想的,现在只能尽量还原。下面这些不敢说就是对的,只是我自己的一条思路。
在梯度下降里,全局最小值,也就是整座山真正的最低点,未必找得到。可这并不说明走过的路是白走的。从山腰走进一个洼地,损失降了。哪怕最后停在一个局部最小值里,也可能比出发时好了许多。
修行也许也是这样。能不能成佛,那个最终的点,不是我能规划的。但少了一分执着,改掉一个让自己反复受困的习惯,日子也就清净一点。这些变化,不会因为没到最低点就作废。
还有一层。局部最小值最麻烦的地方,是你待在里面的时候,会觉得自己已经到底了。修行的人也容易这样,坐得好了几次,有了一点轻安,就以为这就是了,抓着不放。一抓,就停在洼地里了。所以“没有最后的真相和目标”,反过来也是个提醒:走到哪里,都别急着把它当终点,旁边那道坡后面,也许还有更低的地方。
这样一想,“此劫只有一个佛”和“人人都可以走成佛之路”,在我这里好像就不那么矛盾了。即使还想不清那个终点,也不妨碍眼下这一步走得有意义。
当然,这只是我的理解。佛经里讲劫,讲佛出世,有它自己的道理,我不想拿一个工程上的算法去套教义。它只是帮我把一个想不通的地方,换个角度看通了一点。
写到这里,把两边并排摆一摆,可能更清楚:
| 梯度下降 | 修行 |
|---|---|
| 损失(loss):答案错了多少 | 烦恼和错误:心里哪里不对劲 |
| 梯度:往哪个方向能让错误变小 | 觉察:看见自己哪里错了 |
| 学习率:每一步的大小要合适 | 不急不猛,渐修 |
| 局部最小值:以为到底了 | 以为到了,执着于某个境界 |
| 一轮一轮反复迭代 | 日日功课,早晚的鼓一遍一遍地敲 |
| 不知道终点的完美参数长什么样 | 超越本身就是目标 |
不过这个比喻也有走不通的地方,得说清楚。
GPT 的损失是外面的人替它定好的。什么算对,什么算错,有标准答案,有人写好了计算方法。人没有这个。哪里是错,得自己去找,自己去看,而且看的标准本身也在变。很多时候,修行最难的不是改,是看见。
还有,GPT 没有身体,也没有觉。它的参数被调了无数次,它自己并不知道。人往下走一步,是自己知道的。打坐坐到腿麻,是自己的腿在麻;某个念头放下了,胸口松了一下,也是自己感觉到的。这一点,算法里找不到对应的东西。
所以梯度下降能借来说明的,是走路的方式,不是那个终点。
这篇写完,我想把其中几句贴回 flomo 那条旧笔记下面:看不清终点,也可以先看看眼下哪里能改一点。蒙着眼下山,只问下一步往哪边。
这次写得详细一些。下回再翻到它,我应该能顺着这几句,接着往下走一步。