【清明折柳】写在扬马三周目后

在这里插入图片描述

黄绿之间,方寸之外。



楔子

“——就像物理学家通过演绎与归纳将宏微世界的运转规律浓缩到数学公式中时,如今的人工智能也在试图量化整个人类文明。”

“——只是,使用的是昂贵、笨拙且轮椅,然而目前看来,似乎确实奏效的方法。”

“——但无论如何,这是缺乏灵魂的。”

3月17日晚间,非结构化数据课,借给老爷头代课的机会,我向研一的新兵蛋子们吐露长久以来的心声。那晚我独自讲了两个多小时,课后,陪亦童去隔壁小酌几杯,我极少陪人出来喝酒,或许那是第三回,久违的冥想与释放。


解耦到离散

“——世界并非解耦与离散。”

从运筹博弈的角度来说,当环境内只有一个智能体时,整体效益才能趋于最大化。

在以往的人工智能中同样如此,模块从设计到整合,最终经由统一的目标函数进行优化。

从前如此,譬如 GAN 融合训练 Generator 与 Discriminator 来逼近博弈的边界;DCMN 里保留双线性TopK检索器的阅读理解方案;六年前 IRNet 在Text-to-SQL任务上精巧的两步走 SQL Skeletion 模块设计,令人惊艳。

如今,时代变了。GAN 变成朴实无华的 diffusers,文档检索器被向量库取代,代码生成早已不是当年难以攻克的难题。当下的LangChain、LangGraph以及各种热插拔Adapters,皆是现代人工智能极为偏爱的事——模块解耦

  • 笔者注:我的理解,代码较于自然语言更为结构化,倘若自然语言生成都可以做得很好,代码做得好就应该是顺理成章的事情

下面是 DeepSeek-R1 系列模型的 chat template,实际上就是定义了一系列的分支规则来确保模型在不同场景下使用不同的工具,或是生成不同的标记。

{% if not add_generation_prompt is defined %}{% set add_generation_prompt = false %}{% endif %}{% set ns = namespace(is_first=false, is_tool=false, is_output_first=true, system_prompt='') %}{%- for message in messages %}{%- if message['role'] == 'system' %}{% set ns.system_prompt = message['content'] %}{%- endif %}{%- endfor %}{{bos_token}}{{ns.system_prompt}}{%- for message in messages %}{%- if message['role'] == 'user' %}{%- set ns.is_tool = false -%}{{'<|User|>' + message['content']}}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is none %}{%- set ns.is_tool = false -%}{%- for tool in message['tool_calls']%}{%- if not ns.is_first %}{{'<|Assistant|><|tool▁calls▁begin|><|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\\n' + '```json' + '\\n' + tool['function']['arguments'] + '\\n' + '```' + '<|tool▁call▁end|>'}}{%- set ns.is_first = true -%}{%- else %}{{'\\n' + '<|tool▁call▁begin|>' + tool['type'] + '<|tool▁sep|>' + tool['function']['name'] + '\\n' + '```json' + '\\n' + tool['function']['arguments'] + '\\n' + '```' + '<|tool▁call▁end|>'}}{{'<|tool▁calls▁end|><|end▁of▁sentence|>'}}{%- endif %}{%- endfor %}{%- endif %}{%- if message['role'] == 'assistant' and message['content'] is not none %}{%- if ns.is_tool %}{{'<|tool▁outputs▁end|>' + message['content'] + '<|end▁of▁sentence|>'}}{%- set ns.is_tool = false -%}{%- else %}{% set content = message['content'] %}{% if '</think>' in content %}{% set content = content.split('</think>')[-1] %}{% endif %}{{'<|Assistant|>' + content + '<|end▁of▁sentence|>'}}{%- endif %}{%- endif %}{%- if message['role'] == 'tool' %}{%- set ns.is_tool = true -%}{%- if ns.is_output_first %}{{'<|tool▁outputs▁begin|><|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- set ns.is_output_first = false %}{%- else %}{{'\\n<|tool▁output▁begin|>' + message['content'] + '<|tool▁output▁end|>'}}{%- endif %}{%- endif %}{%- endfor -%}{% if ns.is_tool %}{{'<|tool▁outputs▁end|>'}}{% endif %}{% if add_generation_prompt and not ns.is_tool %}{{'<|Assistant|>'}}{% endif %}

但是,只要是规则就一定会有漏洞,总有被打破的一天。

解耦之本身很符合软件工程的观念——便捷维护与快速开发。然而,人类的思维与行为真的可以简单地使用离散模块来拟合吗?似乎并非如此。解耦带来的最大优点,是大大降低 AI 使用门槛,大到企业,小到个人都能快速上手。

同时,解耦带来的缺点也是如此——无法否认,AI 正在被滥用

人类个体的思维与行动依赖生理系统紧密协作——人体本身就是一件极为精密的仪器,但现代人工智能试图使用解耦的、离散的、独立的若干模块来仿生。就像所谓类人或是类脑 AI 中,A 负责充当眼睛(视觉信号),B 负责充当耳朵(听觉信号),C 负责接收指令(文本信号),D 负责融合语义(大脑处理),E 负责最终决策(信号输出),彼此可以完全割裂地进行预训练,然后就像积木一样进行拼搭。

某种程度上,这是算力制约下的权宜之计,如果能便捷地全量微调,谁不愿意去做呢?但是无论如何,离散较于连续,本身隐含更大的不确定性,好比模型量化里的 FP16 与 INT4 一样,建模越是离散,模型越是不稳定,就像最近某米智驾的车祸那样——享受解耦带来的高效,必然承担解耦引发的风险。


螃蟹与毒药

“——并非螃蟹,而是毒药。”

有人说我们应当对新技术多一些容忍,总是需要第一个吃螃蟹的人,就像密密麻麻的航空条例背后,是成百上千次血淋淋的空难。

可是,这真的是一只螃蟹吗?

LLM 真的是在模拟人的思维模式吗?

假如不是,那么它的思维模式是什么样的?

以 prompt engineering 为例,prompt 本身并不是什么很新颖的概念,事实上在2022年11月 ChatGPT 首次发布之前,就已经有许多关于prompt learning 的工作,这个概念本身应该是来自迁移学习。

3~5年前的一些研究会指出,那些 “勾引” 出模型知识的 prompt,实际上很多时候并不符合人类语法习惯RLPrompt: Optimizing Discrete Text Prompts with Reinforcement Learning)。

这个命题可能在CV上体现得会多一些,至少目前在NLP领域似乎谈论得并不多,目前大部分主流模型的默认 prompt template 里不会加入太多规则标记来控制生成。尽管在使用 Claude 等模型时,依然会使用这类奇技淫巧,但是本身 prompt engineering 这件事在不同系列的模型上并不互通,这更像是一个经验性的工作,熟能生巧。

  • 下面是 Claude 写春联的一个 prompt,题外话,其实 Claude 很多时候更像是一个哲学家。
    (define-couplet-generation
      ;; 首先提取传统文化元素和节日氛围
      (extract-cultural-elements
        (combine
          (traditional-symbols  ;春节符号:红灯笼、爆竹、年画...
            (festive-objects)
            (seasonal-elements))
          (cultural-values     ;文化内涵:团圆、祝福、希望...
            (family-values)
            (good-wishes))))
    
      ;; 构建对联的语言结构
      (construct-couplet
        (build-upper-line      ;上联:确定主题和节奏
          (select-theme)
          (set-rhythm
            (define-tone-pattern)
            (match-syllables)))
    
        (create-lower-line     ;下联:严格对仗
          (mirror-structure)
          (match-parts-of-speech)
          (balance-tones))
    
        (compose-horizontal    ;横批:点睛之笔
          (summarize-theme)
          (concentrate-wishes)))
    
      ;; 注入艺术性和韵味
      (enhance-artistry
        (apply-style           ;文风选择
          (choose-level        ;雅俗程度
            (elegant-literary)
            (folk-style))
          (add-rhetoric        ;修辞手法
            (metaphor)
            (personification)))
    
        (refine-rhythm         ;调整节奏
          (balance-syllables)
          (harmonize-tones))
    
        (verify-pairing        ;检验对仗
          (check-symmetry)
          (ensure-harmony))))
    
    ;; 创作要求:
    ;; 1. 必须体现春节喜庆祥和氛围
    ;; 2. 上下联字数相等,结构对称
    ;; 3. 可以典雅或通俗,但要有深意
    ;; 4. 注意平仄韵律和对仗工整
    ;; 5. 横批简洁有力,点明主题
    
    请基于这个思维模式来创作春联,确保作品既符合传统格律,又富有新意。
    

另一个角度——CoT的生成。熟悉当年风靡围棋界的 AlphaGo 的朋友一定会知道,目前这套 reflect-based 的 CoT 生成方式,跟当年 AlphaGo 左右互博几乎是完全相同的原理。

年前,OpenAI就指出更长的思考时间能够得到更强的鲁棒性(Trading inference-time compute for adversarial robustness),尽管近期一些研究会指出过度思考的问题(① The Danger of Overthinking: Examining the Reasoning-Action Dilemma in Agentic Tasks② On the Overthinking of o1-Like Models),也有研究会试图去控制思考的时长(Controlling How Long A Reasoning Model Thinks With Reinforcement Learning)。

不过,直观上来讲,这种 reflect-based 的思路是比较拟人的——一条路走不通就换一条路走,直到走通为止。尽管有时候还是会陷入死胡同,如下面的生成来自 DeepSeek-R1-Distill-Qwen-32B 对 英文单词strawberry中有多少个字母r 的贪心解码结果。


让我再确认一下“strawberry”的正确拼写。通常,strawberry是正确的,对吗?让我们数一下字母的数量:S, T, R, A,
W, B, E, R, R, Y。所以总共有10个字母?不对,strawberry应该是有10个字母吗?让我数一遍:S(1), T(2),
R(3), A(4), W(5), B(6), E(7), R(8), R(9), Y(10)。所以是的,是10个字母。

现在,我需要找出其中有多少个字母r。让我一个一个字母地检查。

第一个字母是S,不是r。 第二个字母是T,不是r。 第三个字母是R,是r,记下来,这是第一个r。 第四个字母是A,不是r。
第五个字母是W,不是r。 第六个字母是B,不是r。 第七个字母是E,不是r。 第八个字母是R,是r,这是第二个r。
第九个字母是R,又是r,这是第三个r。 第十个字母是Y,不是r。

等等,这好像不对,因为strawberry通常不会拼成三个r。让我再仔细检查一遍,可能我数错了字母的位置。

正确的拼写应该是S-T-R-A-W-B-E-R-R-Y吗?或者是不是中间少了一个r?让我再确认一下。strawberry的正确拼写应该是S-T-R-A-W-B-E-R-R-Y,对吗?是的,应该是这样的,因为“straw”是S-T-R-A-W,然后加上“berry”是B-E-R-R-Y,所以中间的“berry”部分有两个r,对吗?

所以,整个单词中r出现的位置是第三个字母和第八个、第九个字母吗?不对,因为strawberry的正确结构应该是S-T-R-A-W-B-E-R-R-Y,对吗?让我再数一遍每个字母的位置:

S T R A W B E R R Y
哦,对,所以从位置来看,第三个字母是R,第八个字母是R,第九个字母也是R。那是不是有三个r呢?这似乎有点多,因为通常strawberry中r的数量可能不是三个。

等等,这可能是个错误,因为有时候拼写可能会有变化,或者我的记忆有误。让我再确认一下。实际上,strawberry的正确拼写是S-T-R-A-W-B-E-R-R-Y,对吗?那确实有三个r吗?或者是不是在straw的部分有一个r,berry部分有两个r,总共三个r?

不对,通常strawberry只有两个r,对吗?让我再检查一次。可能我数错了。

让我重新分解一下:straw是S-T-R-A-W,berry是B-E-R-R-Y。所以,straw中的r是第三个字母,berry中的r是第八和第九个字母。所以总共三个r?但通常来说,strawberry应该是有两个r,对吗?

或者,可能我在数的时候重复计算了。让我再数一遍每个字母的位置:

S T R A W B E R R Y 哦,看来确实有三个r:位置3、8、9。所以,总共有三个r字母。

但是,我记得通常strawberry只有两个r,可能是在 …

通过改变 generation config,或是对 prompt 进行调整,依然可以得到正确的结果。但是,现在所有的问题都在于,无论前者还是后者,都是一种无法解释且难以控制的力量,在促使 LLM 生成几乎正确的语句。

也就是说,LLM 的思维模式拟人,但是说话方式并不拟人。

目前所有的解码器都是从左到右解码,没有例外,无非是解码策略上的差异。但是,人类也是从左到右说话的吗?并不见得。

试想你在面试,需要边思考边回答面试官的问题,假如你是挤牙膏的一个词一个词的思考,可能说到最后前后矛盾,上文不接下文,那大概率也是吹了。优秀的语言组织方式应当是从点到线,连线成面的——先把语句中各个主要成分想好(主语、宾语、谓语),再把各个修饰词(定语,助词,介词)给依次补上,来生成完整的语句;若干语句相互联系以阐述某种观点。

这有点像把十几年前基于句法分析工具将语句结构成一张计算图的思路。实际上,至少对于人类来说,语义表达绝非是简单的直线计算。甚至,如今 LLM 用这种解码方式来生成表格、代码、公式等网状或树状的半结构化内容,这是令人费解与不安的,它为什么可以生成得如此正确,我们找不到令人信服的理论保证。

除非有更好的基座出现。


文本的力量

If an army of monkeys were strumming on typewriters, they might write all the books in the British Museum.

——《The Nature of the Physical World》Sir Arthur Stanley Eddington

在目前多模态的时代,文本处理看似是最简单的一种信息处理,至少较于图像、音频、视频来说似乎并不是那么高级,至少从卡的耗用上来说是这样的,是吧?

但是,实际上文本确是实实在在的一种更加结构化的语义表征——我们的祖先经过成千上万年的积累,将极其高维的语义空间压缩到了这么数万个汉字上,文字本身已经是对语义进行了一个预先的压缩了。

将一句话中的一个字进行修改可能就会完全改变整句话的语义,但即便抽去一张图像90%的像素,依然可以通过各种图像复原技术进行还原。

也许不需要去拟合整个世界,但是,需要真理。

人类也许无法通晓一切,但是人类掌握了语言。

一切的真理无非是文字的堆砌,在无限猴子理论下,LLM 可能终将说出真理,但又有谁知道那是真理呢?AI 是否终将凌驾于人类文明之上。我们只能拭目以待。


朝花夕拾

断了这么久没写 Memo,有很多原因吧,其中一个很直接的原因是之前 CSDN 要绑定微信才能发布文章,但是我的微信已经绑定了小号,所以就没有然后了。最近大概是又取消了这个限制,反正是日常犯病,都习惯了。

简单概述一下最近三个多月的历程,自去年12月13日晚,耐不住性子跑了一个4+3+2+1的倒金字塔后,左膝伤痛了整整一个月。期间多以倒跑维持(倒跑本身更接近于跳绳,依赖小腿和脚踝,并不吃膝盖),每天也就2K左右的量,但其实倒跑2K也很累。

在这里插入图片描述

1月13日左膝痊愈,不过这段伤痛也不是什么太坏的事,因为到1月23日这段时间在投 IJCAI,高压期我甚至开始下了个野狐围棋开始重操旧业,有一些原因是那段时间在研究KataGo,就是想给强化学习找点头绪,顺便也是休闲放松,结果很快就打到了4段水平(以前也就3-4段地水平,跟5段是包下不过的),能跟人机5段打个有来有回,结果1月22日-24日那段LG杯柯洁提子犯规争议事件,23日第二盘那天下午我甚至看了直播,气得不行,卡四目是真的猥琐到家了,当着面不敢举手,背后搞这种勾当,小人之至,君子不齿。

24日也看了第3盘的直播,都希望柯洁能赢拿下酒罐王创造历史,结果看到柯洁左下那个离谱大头鬼的大漏勺,真的无语到家,觉得柯洁很快就要中盘投子了,就直接开始午睡,结果下午4点跑步的时候打开直播发现柯洁还在坚持,也是挺感动的,顶尖棋手的胜负心真的是太强了,柯洁真的是太傲气,但这也不总是好事。如今他也被雪藏,大概是被禁赛了。

言归正传,1月16号,是提交摘要的DDL,结束之后破天荒的晨跑了整整一周,每天六点到操场,顶着寒风跑半个小时左右,配速在400-430,跑完整个人都好起来了,就是中午需要睡很久才能有精力继续搬砖。

1月25日回家过年,回家一直到1月31日都坚持了每天晨跑半个小时左右。一月总跑量是150K,总感觉不认真跑些还是不太行。

2-3月稍显怠惰,但也没有停跑,每天都至少会跑2-3K的量,而且都是穿着棉袄和代步鞋跑,是真正的养老跑,Garmin 计数都是90K左右,但实际上这两个月我很多时候都没有开表,3月甚至有一周都没戴手表跑步,突出一个返璞归真。

我是真的想跟跑步和解了,但是3月30日回去参加扬马时还是止不住去再拼一回的冲动。开跑前A区一群人都是4分配以内冲出去,大众水平提升的速度太快太快。虽然,我预计跑进130问题是不大的,甚至幻想自己可能超量恢复,说不定还能4分配以内顶完全程,不过最后结果表明我还是想多了,到15K左膝旧伤复发,疼得不行,到17K为止我算了一下按435跑还是可以进130的,但是我实在是疼得受不了了,最后3K完全放掉了,算了,跑进130又有啥意义呢?不过我也不想停下来走,就5分配慢悠悠地摇完了最后一段距离。

在这里插入图片描述


后记

发生许多事,头绪很乱,无法一一跃然纸上。

灵感来自回乡看到的油菜花,规规矩矩地约束在一方田亩中。风起,摇曳,不自觉地黄绿出墙。

三年前 LLM 横空出世时,大家都说 NLP 已死,如今又是如何呢?

当文本、图像、音频都能做得很好时,也就是说大脑已经成型。四肢依赖具身智能,但这并不那么容易,有人说 AI 在脑力活上做得很好,反而在体力活上做得不佳,这是反直觉的。其实并不是这样,具身智能的理论基础远不是如今的NLP和CV能比拟的。

但是在可预见的未来,5-10年内,大街上将会到处跑着机器人,就像学园都市那样。

大概会是如此,长治久安当然很好,但变革也不总是坏事。

有感而发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值