程序员为什么普遍信玄学?

程序员为什么普遍信玄学? 煮啵今天刚下单了一个龟甲和乾隆通宝预计后天到货。主要是最近跑实验 loss 老是在我觉得”差不多了”的时候突然炸炸完还自己好了煮啵实在想不出任何科学解释准备试试玄学介入。我导如果看到了咳咳那我们素不相识所以这个问题问到煮啵心坎里了我来认真讲讲。程序员信玄学是有充分理由的不是迷信是被逼的。你在做一个”确定性系统”——代码是死的输入确定输出就确定这是所有人入行时被灌输的世界观。然后你开始真正写代码。你发现有一种 bug你去看的时候它不出现你不看的时候它出现。这玩意儿甚至有个正式的名字叫 Heisenbug——名字取自量子力学的海森堡不确定性原理因为”观测行为本身会影响结果”。物理学家描述亚原子粒子用的词被程序员拿来描述自己的 bug你品一品这里面的绝望。更离谱的是有时候你什么都没改重新跑一遍好了。你再跑一遍又出问题了。你第三遍好了。阿西吧你对着屏幕沉默了三十秒想说一种植物然后意识到你永远不会知道发生了什么于是你保存了代码关上电脑去吃饭了。这不是认输这是一种比认输更高级的境界——与不确定性和解。咳咳可恶这不是什么阿q的精神胜利法好吗应该不是吧。。。做机器学习的信玄学的比例更高这不是煮啵瞎说是有结构性原因的。普通程序员遭遇的随机性还是有迹可循的——多线程竞争、网络抖动、内存对齐你花时间总能找到。但像我们这些做机器学习的面对的随机性是写进训练过程里的。随机初始化权重。随机采样 batch。Dropout 随机丢神经元。数据加载随机 shuffle。就算你把所有随机种子都固定了换一张卡、换一台机器、甚至换一个 CUDA 版本结果都可能不一样——因为浮点数的并行计算顺序变了累积误差不同模型就走上了不同的路。说起来昨天在阿里实习的时候给主管讲训练的cpt模型和base模型token变动最多的前100的时候我们看到居然存在一些奇怪的词比如说宇智波也感觉很稀奇哈哈哈然后你会遇到一个让所有做炼丹的人都心有戚戚的现象同样的代码同样的数据seed 从 42 改成 43最终模型效果差了两个点。两个点。因为一个数字。你没办法解释这件事。你只能接受这件事。接受了之后你开始明白玄学信仰者和科学主义者之间的区别可能没有你以为的那么大——大家都在面对一个自己无法完全掌控的系统只是解释框架不一样。煮啵师兄有一个说法煮啵觉得说得很准“炼丹的本质是在一个高维的、有无数局部最优的空间里靠随机性找到一个还不错的地方——你管这叫优化但其实你也不知道你走到的是不是真的好地方只是它在你看得见的范围里看起来不错。”这跟算命先生说”你现在的运势在一个相对平稳的阶段”结构上有多大区别呢开玩笑的BUT只是一点点。程序员的玄学有一个有趣的分类然后其实读者姥爷们如果日常中仔细观察你就会发现程序员的玄学信仰不是随机分布的它有规律认真ing第一类仪式感玄学。必须喝某种饮料才能写出好代码比如旺仔牛奶。必须在某个位置坐着。键盘必须是某个型号。这类玄学的本质是建立心理锚点——让自己进入状态的触发器。不神秘是巴普洛夫条件反射的自我版本。吆西没错就是这样第二类归因玄学。代码跑通了是因为今天喝了红牛。训练炸了是因为改代码之前没有备份这是在惩罚你。loss 突然降了是因为你刚才去上了个厕所走了走。这类玄学的本质是人类大脑对因果关系的过度拟合——我们的大脑天生要在随机噪音里找规律即使规律不存在。第三类环境玄学。深夜代码比白天好用。下雨天模型收敛更快。这类玄学通常有一个隐藏的真实原因——深夜服务器负载低、网络稳定下雨天你心情平静专注度高。玄学的外壳里可能包着一个现实的内核。第四类纯纯的玄学。比如煮啵准备用龟甲占卜来决定下次跑实验用什么 learning rate。这类煮啵没办法给你一个科学解释但煮啵可以说在你用尽了所有调参技巧之后随机选一个值和按照某种仪式选一个值期望效果是一样的——也就是说玄学在这个意义上和随机搜索是等价的。而随机搜索在某些情况下确实不比网格搜索差。所以煮啵的龟甲本质上是一个随机数生成器。只是更有仪式感。有人用八字原理写过算法吗——还真有这个问题问得好煮啵来说说我知道的叭。八字这个系统从计算机的角度看其实结构非常清晰——它是一个基于出生时间的确定性规则系统。天干十个地支十二互相组合年月日时各一组总共八个字。每两个字一组形成”柱”四柱八字。然后有一套复杂的相生相克规则加上大运流年的推演得出命理判断。这玩意儿说白了就是一个以出生时间为输入、以命理描述为输出的规则引擎。每个时间点对应的八字是确定的规则是确定的输出本来也应该是确定的。有没有人写成代码了有。最简单的版本就是把天干地支的查表逻辑写成程序输入出生年月日时自动计算八字组合再根据五行强弱给出基础判断。这类程序满网上都是生辰八字计算器随手可以搜到一堆。有没有更进一步用机器学习来”验证”或者”优化”八字预测的有人做过这个方向的尝试。思路大概是收集大量有命理记录的样本把八字编码成特征向量然后用分类器来预测某些人生事件。但这里有一个根本性的问题——你的标注数据是什么谁来标注标注是否可靠“这个人一生大富大贵”这句话怎么量化由谁来判断历史上的命理案例记录本来就有幸存者偏差——预测准的被记下来广泛流传预测不准的悄悄消失了。所以这类研究的数据质量本身就很成问题模型训出来了也很难说它学到的是真实规律还是数据噪音。我没有见过这个方向上有什么让人信服的结论。但作为一个算法练习项目把八字系统用代码实现一遍其实还挺有意思的——它考验你对复杂规则系统的建模能力天干地支的循环结构、五行相生相克的图结构、大运流年的时间序列推演都是可以用不同数据结构来表达的。真的有人写过而且写得挺认真的GitHub 上搜一下能找到。有一个更硬核的方向易经和计算机科学的关系咳咳这个真的不是玄学是真实的历史。莱布尼茨微积分的发明者之一在17世纪接触到了《易经》的六十四卦图据说这件事给了他一些启发——六十四卦对应的正好是 2 的 6 次方64 个状态跟二进制的逻辑高度吻合。这件事的历史真实性有争议莱布尼茨本人对二进制的研究早于接触易经所以”易经启发了二进制”这个说法是有点过度演绎的。但阴爻阳爻对应 0 和 1、卦的叠加对应二进制数这个对应关系本身是确实存在的不是硬凑的。六十四卦每卦六爻每爻两态——这是一个完整的 6 位二进制空间。你可以把 64 个卦当成 0 到 63 的编码把爻的变化规则当成某种状态机的转移函数。从这个角度看《易经》是三千年前的人类用纯粹的抽象思维构建了一个结构上等价于 6 位二进制系统的符号体系。不管他们的目的是什么这件事本身还挺让人肃然起敬的。果然古人的智慧呀真的是哈哈哈哈。说回我的龟甲后天到货之后煮啵打算认真研究一下周易筮法的正确流程。如果你不知道的话——正统的龟甲占卜是用火灼烧龟甲看裂纹的走向来判断吉凶。但煮啵不太可能真的烧一来现代龟甲来源不明二来宿舍不允许明火。所以煮啵打算用铜钱卦就是用乾隆通宝投掷六次按正反面的组合起一个六爻卦然后查卦辞。本质上这是一个每次有二分之一概率的随机过程重复六次生成一个 6 位的随机数然后用一套解释系统赋予它意义。跟我们用随机种子初始化模型参数然后用 loss 曲线来”解读”模型状态结构上真的没有本质区别。好吧有一点区别煮啵的模型煮啵能反向传播卦煮啵反向传播不了。下次跑实验之前煮啵会先起一卦。如果卦象不好煮啵就推迟跑顺便再检查一遍数据管道。反正检查数据管道是永远没错的。咳咳并且实在不行模型效果不好那就甩锅给数据就行了哦不是甩锅是一定是数据的问题