代码的结构约束简化建模 | AI生成和翻译
问题:为什么代码模型通常比自然语言模型更容易?
回答:
是的,这里有一个强有力的观点。代码在几个重要方面比自然语言“更简单”,但并非因为代码的变量更少。区别在于语言的结构和熵。
代码具有:
balance = 100
asset = {"BTC": 2}
含义是受限的。balance 几乎总是指一个数值。asset 通常指一个结构化对象。可能的解释范围很窄。
自然语言:
“您那微不足道的剩余余额……”
“您那神秘隐藏的资产……”
“您那令人印象深刻的财务资源……”
都可以指代相似的概念,但却增添了:
- 情感
- 社交语境
- 礼貌
- 讽刺
- 文化
- 个性
- 隐喻
- 歧义
令牌预测空间要大得多。
编程语言被设计用来减少歧义:
if balance < 0:
alert_user()
关于其含义几乎没有不确定性。
自然语言等价表达:
“如果某人的财务状况看起来不太乐观,也许我们应该委婉地告知他们。”
相同的意图,却有成千上万种可能的表达方式。
因此,从信息论的角度来看:
- 代码的熵更低:有效的后续内容更少。
- 自然语言的熵更高:许多可能的后续内容。
一个小型代码模型可以变得出奇地有用,因为它能学习:
- 语法模式
- API
- 常见算法
- 命名约定
- 重复结构
例如:
user.balance += amount
数百万程序员编写类似的模式。分布非常集中。
但自然语言:
经济正在……
可能的后续有:
- 改善
- 崩溃
- 不确定
- 变化
- 进入新时代
- 面临挑战
- 等等
巨大的分支因子。
然而,代码也有其自身的困难:
- 长距离依赖
- 架构理解
- 调试
- 隐藏需求
- 大型上下文管理
一个1B参数的代码模型可以写一个函数,但一个70B+的模型能更好地理解整个分布式系统。
一个有用的类比:
- 代码就像国际象棋:规则很少,复杂性却极大。
- 自然语言就像人类社会:显式规则较少,上下文无限。
这就是为什么一个小型专用模型在狭窄的编码任务上往往能击败一个更大的通用模型。该领域具有很强的约束条件。一个“银行代码模型”知道:
balance
transaction
ledger
asset
liability
可以非常有效,因为词汇和行为高度规范。
你关于“没有装饰性语言”的观察实际上很接近早期AI研究人员喜欢形式语言的原因:它们消除了歧义,使符号到含义的映射更加紧密。
