跳到正文
阿里雲開發者社區 AI·· 2 小時前AI 評分54

同一函數套 96 遍:一道初中函數題拆解大模型原理

同一个函数套 96 遍:大模型的全部秘密,藏在一道初中函数题里

AI 導讀

文章以 f(x)=20+10x 解釋大模型的函數結構,並以 GPT-3 説明將 TransformerBlock 重複套用 96 次的函數複合。文中指出,GPT-3 有 1750 億個參數;訓練會調整參數,推理則使用固定參數。文章並以定義域和高維外推説明,輸入超出訓練分佈時,模型仍可能輸出缺乏依據的答案;損失地形圖則只是高維空間的低維切片。

正文

简介: 本文用皮卡丘捡能量球的简单函数 f(x)=20+10x,生动拆解AI本质:模型即函数,变量是输入,参数是学习所得,结构由人设计。从截距(底线)、斜率(效率)到定义域(适用边界),揭示GPT-3等大模型实为1750亿参数、96层嵌套的复合函数——真正决定AI成败的,不是懂不懂公式,而是是否守住了它的定义域。(239字)

摘要:我们总说"AI 模型本质上是一个数学函数",但这句话到底是什么意思?用皮卡丘捡能量球的一道 f(x)=20+10x,我们把函数、变量、参数、截距、斜率、定义域、图像一路拆到底,最后抵达那个让人后背发凉的事实:1750 亿参数的 GPT-3,不过是把同一个函数套了 96 遍。而真正决定你能不能用好 AI 的,不是懂不懂这个公式,是懂不懂它的定义域。


一、皮卡丘捡了 3 个能量球

先从一个几乎不需要任何基础的例子开始。

假设皮卡丘在道馆里捡能量球,每个能量球能给它加一点战斗力。我们想预测它最终的战斗力是多少,于是写下这么一个规则:

f(x) = 20 + 10x

这里的 x 是它捡到的能量球数量。

捡了 3 个?代进去:f(3) = 20 + 10×3 = 50。

捡了 0 个呢?f(0) = 20。也就是说,就算一个能量球都没捡,皮卡丘也有 20 点基础战斗力。

就这么简单。这是初中数学。

但请你先别急着翻页,因为接下来我要说的是:今天所有那些听起来无比玄乎的 AI——能写代码的、能看病的、能跟你聊哲学的大模型——它们在做的事情,和这个 f(x)=20+10x,结构上没有任何区别。

区别只在三处:输入不是 1 个数而是几万个;系数不是 2 个而是 1750 亿个;这个式子不是写一遍,而是套了 96 遍。

其余的,都是同一个想法。


二、函数和公式,不是一回事:先分清"变的"和"学来的"

很多人在这一步就已经混淆了。

f(x) = 20 + 10x 里有三种东西,它们的身份完全不同:

|
成分
|
例子
|
谁定的
|
会不会变

|
| --- | --- | --- | --- |
|
变量
|
x(能量球个数)
|
用户给的
|
每次调用都可能不同
|
|
参数
|
20 和 10
|
从数据里学的
|
训练时变,训完就固定
|
|
函数形式
|
"一次函数"这个结构
|
人设计的
|
基本不变
|

这个区分,是理解整个 AI 的第一把钥匙。

变量是别人塞给你的。你问模型一句话,这句话就是 x。你上传一张图,这张图的像素就是 x。这一层,AI 没有任何发言权。

参数是模型自己学的。20 和 10 这两个数字,不是谁拍脑袋定的,是模型看了大量"捡了几个球、最后战斗力是多少"的历史数据之后,倒推出来的。

函数形式是人选的。为什么是 20 + 10x 而不是 20 + 10x²?这是架构师的选择——就像你决定"用一条直线去拟合"还是"用一条曲线去拟合"。

然后是最关键的一句话,我在讲训练那篇里说过一次,这里值得再说一遍:

训练,改变的是参数的值,不是函数本身。

f 还是那个 f。变的只是里面填进去的数字,从 20 和 10,变成了别的什么。

如果你记住这一句,后面关于"微调""训练""推理"的所有困惑,都会少一半。


三、截距和斜率:一条直线能翻译出多少东西

现在我们把这条直线拆开看。

20 是截距(intercept)。

它的含义是:当输入为 0 时,输出是多少。放在皮卡丘这里,是"什么都不做时的基础战斗力"。

10 是斜率(slope)。

它的含义是:输入每增加 1,输出增加多少。放在这里,是"每多捡一个能量球,战斗力涨 10 点"。

这两个词,其实可以原封不动地翻译成商业语言:

|
数学概念
|
数学含义
|
商业翻译

|
| --- | --- | --- |
|
截距
|
x=0 时的输出
|
底线:你不投入任何资源时,这件事的默认值
|
|
斜率
|
Δy/Δx
|
边际效率:每多投一份资源,能换回多少产出
|

这个翻译特别有用,因为它能立刻暴露一个常见的管理误区:很多人天天在优化斜率,却从来没审视过截距。

一个团队,立项三个月才能出第一版 demo——它的截距是负的,而且是很大的负数。这时候你去抓"每个人每天多写 20 行代码",是在调斜率,但真正拖垮它的是那个巨大的负截距:流程太长、审批太多、环境搭不起来。

反过来,有些业务的截距很高——比如一家已经开了十年、口碑很好的店,什么都不做也有一批老客。这时候如果不小心把斜率搞成负的(服务变差、涨价过猛),高截距也只是让你死得慢一点。

截距决定你从哪里出发,斜率决定你走得多快。这两件事,必须分开看。

对应到 AI 里,这就是偏置(bias)和权重(weight)——我在讲权重那篇里说过,偏置是激活门槛:权重决定"这件事有多大声",偏置决定"多大声才够得着"。今天从函数视角再补一句:偏置就是截距,是那个"什么都不发生时"的默认立场。


四、f(-1) = 10:数学上成立,现实里是个坑

图里有个细节我特别喜欢。

它算了一下 f(-1):20 + 10×(-1) = 10。

然后旁边写着一句警告:"Mathematically it works, but doesn't make sense here!"(数学上成立,但在这里讲不通。)

为什么讲不通?因为能量球的数量不可能是负的。你不能"捡 -1 个球"。

这就是定义域(domain)和值域(range):

  • 定义域:x ≥ 0(不能捡负数个球)

  • 值域:y ≥ 20(起点是 20,只会往上走)

表面上这只是个数学概念。但实际上,这是AI 落地翻车最集中的地方。

因为数学函数不会因为输入超出定义域就报错——它会老老实实地给你算出一个数来,而且这个数字看起来非常合理、非常有说服力。

模型在训练数据的分布内是可靠的;一旦把它推到分布之外,它依然会输出一个自信的答案,只是那个答案毫无依据。

而残酷的是:在高维空间里,"分布之外"几乎是常态。

图灵奖得主 Yann LeCun 说过一句很值得咀嚼的话:深度学习"只是通过曲线拟合产生的插值……但在高维空间中,不存在插值这种情况。在高维空间中,一切都是外推。"

这句话值得读两遍。

在低维世界里,新来的数据点几乎总能落在你见过的点之间——这叫插值,很安全。但在一个 12288 维的空间里,任何一个新的输入,大概率都落在你所有训练样本的"外面"。你以为你在插值,其实你一直在外推。

所以当你问一个模型"帮我预测下季度这个新市场的销量"时,它给你的那个数字,本质上是 f(-1)=10——数学上成立,但可能毫无意义。

这不代表 AI 不可用,只代表一件事:你要知道你问的是不是它的定义域。


五、从一条线到一个向量:真实世界从来不止一个输入

皮卡丘的战斗力当然不只取决于能量球。图里接着就把它升级了:

f(x₁, x₂, x₃) = 20 + 10x₁ + 30x₂ − 15x₃

其中:

  • x₁ = 能量球个数

  • x₂ = 火属性克制加成(有就是 1,没有就是 0)

  • x₃ = 对手的防御强化(有就是 1,没有就是 0)

这里有两个值得停下来的地方。

第一,出现了负数系数:−15。

一个负的权重,意思是"这个因素越大,结果越小"。对手开了防御强化,你的预测战斗力要往下调 15 点。

我在讲权重那篇里专门说过这一点:权重的正负号是方向,不是好坏。正号不代表"重要",负号不代表"不重要"。−15 和 +30 一样,都是模型学到的有用信息。

第二,输入从一个数变成了一组数。

这组的三个数排在一起,就是向量。 GPT-3 的输入不是一个数,是一个 2048 × 12288 的矩阵。

至此,那条你能在纸上画出来的直线,已经悄悄变成了一个根本画不出来的东西。


六、方程变成图像:既是桥梁,也是陷阱

图里最漂亮的一步,是把 f(x)=20+10x 画成了一条直线。

(0,20)、(1,30)、(2,40)、(3,50)、(4,60)、(5,70)——六个点连成一条斜线。截距是它与 y 轴的交点,斜率是它的陡峭程度。

"把方程变成图像",是人类理解抽象关系最强的一根拐杖。

但我要在这里泼一盆冷水,这正是本文最想说的一点:

这根拐杖,在低维世界里是神器,在高维世界里是幻觉。

一维输入 → 一条线,能画。 二维输入 → 一个曲面,勉强能画。 三维输入 → 一个体,还能靠切片看。 12288 维 → 画不出来。没有任何办法画出来。

于是我们做了什么?我们做了投影:从几千亿个维度里挑两个方向,把损失函数在这两个方向上切成一片,画成等高线图。这就是那篇著名的《Visualizing the Loss Landscape of Neural Nets》(Li 等人,NeurIPS 2018)在做的事。

它确实帮我们看到了一些真东西:

  • 没有残差连接的深网络(比如 VGG-56、VGG-110),损失地形会从平缓自发变成"混沌",坑坑洼洼,极难训练;

  • 加上残差连接之后(ResNet-56),地形被显著"平滑化"了,训练就顺了;

  • 平坦的极小值通常比尖锐的极小值泛化更好;大 batch 训练更容易落进尖锐的坑里。

这些结论都很有价值。但论文作者自己明确写了局限:这些 2D 可视化终究只是"包含数百万维度的空间的低维切片",它能提供直觉,但无法捕捉真实高维几何的全部细节。

换句话说:你看的那张损失地形图,是真的,但不完整。

这就是"方程变图像"这一步的陷阱——它给了你直觉,也给了你错觉。你会以为你在看整片地形,其实你只看了一张切面。

而 AI 领域几乎所有反直觉的现象,都源于我们的直觉是三维的,而它活在一万维里。


七、从函数到神经网络:图里那个神经元,其实少画了一步

图接下来把神经元画成了一个函数:输入 x₁、x₂、x₃ 进到一个标着 f(a) = 0.8a 的圈里,出来一个输出。

配文说:"A single neuron computes a simple function. Multiple neurons and layers combine many functions to learn complex patterns."(一个神经元计算一个简单函数。多个神经元和层把许多函数组合起来,学习复杂模式。)

这句话完全正确。但图里那个具体的 f(a) = 0.8a,我要较真一下——它是纯线性的,而一个真正有用的神经元不能只有这一步。

为什么?因为我在讲神经元那篇里算过一笔账:

如果每个神经元都只做 f(a) = 0.8a 这种线性变换,那把它们叠起来会怎样?

两层:0.8 × (0.8a) = 0.64a 三层:0.8 × 0.8 × 0.8 × a = 0.512a 一百层:0.8¹⁰⁰ × a ≈ 一个几乎为 0 的数

一百层线性神经元,等效于一层。 你白叠了九十九层。

真正让深度有意义的,是每一层之间夹进去的那个非线性激活函数——ReLU、GELU、SwiGLU。是它把"乘法"变成了"判断",把"缩放"变成了"选择"。

所以一个完整的神经元其实是两步,不是一个函数,而是两个函数的复合:

  1. 线性部分:z = w₁x₁ + w₂x₂ + w₃x₃ + b

  2. 非线性部分:y = ReLU(z)(或者 GELU、SwiGLU)

神经网络的本质,是函数的复合(composition),不是函数的叠加。


八、把同一个函数套 96 遍,就是 GPT-3

到这里,我们可以把整个系列串起来了。

斯坦福 CS324 课程里,用一个公式定义了 GPT-3:

GPT-3(x₁:ʟ) = TransformerBlock⁹⁶( EmbedTokenWithPosition(x₁:ʟ) )

翻译成人话:把输入变成带位置的向量,然后把这个 Transformer 模块,重复套 96 次。

就这一句。96 层,1750 亿参数,全部装在这个式子里。

而每一层里面是什么?是注意力子层 + 前馈网络子层,其中前馈网络又是两层线性变换夹一个 GELU/SwiGLU——又是函数套函数。

整个大模型,就是一棵巨大的、深度为 96 的函数复合树。

那么问题来了:为什么"套函数"就能产生智能?

答案来自通用逼近定理(Universal Approximation Theorem):

  • 1989 年,George Cybenko 证明:一个单隐藏层、足够宽、使用 S 型激活函数的前馈网络,可以以任意精度逼近任意连续函数。

  • 1991 年,Kurt Hornik 进一步证明:激活函数的具体形式不是关键,多层 + 多神经元的结构本身才是使网络成为通用逼近器的关键。

这个定理的意思是:只要你愿意堆足够多的函数,理论上没有任何"输入到输出的关系"是你表达不出来的。

但——这也是我在讲"深度为什么有效"那篇里强调过的——这个定理有三件事没说:

  1. 没说要多少个神经元。 一层也能逼近,但在复杂高维问题上,需要的神经元可能多到天文数字。(我算过那个例子:20 层的网络用 40 个神经元能做的事,单层网络大约需要 105 万个神经元。)

  2. 没说参数怎么找。 它只保证"好参数存在",不保证训练能找到。

  3. 没说能不能泛化。 能拟合见过的数据,不等于能在没见过的数据上做对。

"能表达"和"能学会"和"能用",是三件事。 通用逼近定理只承诺了第一件。


九、训练与推理:函数不变,参数在不在变

最后回到图里的最后一节,它把整个系列的核心区别画得清清楚楚:

训练(Training):

  • 学习参数

  • 调整权重和偏置,让预测更准

  • 函数形式不变,参数值在变

推理(Inference):

  • 使用学到的参数

  • 对新输入算一个输出

  • 不算损失、不求梯度、不更新

  • 函数不变,参数也固定

我特别喜欢"函数不变"这四个字。

你看,这解释了为什么训练和推理在工程上是两个完全不同的问题:

  • 训练是一次性的、极贵的、要反向传播的、要存梯度和优化器状态的;

  • 推理是持续的、按次计费的、只走前向的、只关心延迟和吞吐的。

同一个函数,两种活法。

而对大模型来说,这个区别还有一个残酷的成本含义:在模型的整个生命周期里,推理消耗的算力往往是训练算力的十倍以上。 训练那笔钱是一次性的、看得见的、容易申请到预算的;推理那笔钱是持续的、按调用量涨的、也是最容易被漏算的。


十、所以呢:四条可以立刻用上的东西

讲了这么多数学,落到地上,我觉得有四条是马上能用的。

第一,分清"变量"和"参数",你才知道该改什么。

变量是别人给你的,参数是你能学的。很多人抱怨"市场不行""客户难搞"——这些都是变量,你改不了。真正能改的是你的参数:你的定价策略、你的交付流程、你的人效。把精力花在参数上,而不是对着变量生气。

第二,截距和斜率必须分开优化。

先问自己:这件事不投入时的默认值是多少?是正的还是负的?如果截距是负的,别急着加人加班——先把那个"起跑线前面的坑"填了。如果截距已经是正的,再去抠斜率。

第三,永远先问一句:这在我的定义域内吗?

f(-1)=10,数学上成立,现实中没意义。当一个模型给你一个数字,第一个该问的不是"准不准",而是"它见过这种输入吗"。超出定义域的输出,越自信越危险。

这一点尤其适用于那些拿 AI 做预测的场景:你问的是一个历史上从没发生过的新情况,那么模型给你的答案,本质上就是外推——它可以参考,但不能当作依据。

第四,你看到的一切可视化,都只是切片。

损失地形图、注意力热力图、嵌入空间散点图——它们都是几万维空间投到二维的一张影子。有用,但不完整。别把影子当成实体。 这也是为什么 AI 领域"看起来很有道理的解释"特别多——因为低维投影天然会制造出看起来很清晰的模式。


十一、结语

回到那个皮卡丘。

f(x) = 20 + 10x。捡 3 个球,战斗力 50。

它简单到不值一提。但如果你愿意顺着它往下走:

  • 变量和参数的区分,是训练这件事的前提;

  • 截距和斜率,是理解任何"投入—产出"关系的通用尺子;

  • 定义域,是所有外推风险的源头;

  • 多个输入,把直线变成了向量;

  • 图像,既是我们的拐杖也是我们的幻觉;

  • 加上一个非线性激活,神经元才真正成立;

  • 把这个函数复合 96 次,就是 GPT-3。

AI 模型就是一个函数。剩下的,都是这个函数的层层嵌套。

所以,下一次有人问你"大模型到底在干什么",你可以这样回答:

它在算一个函数。这个函数有 1750 亿个系数,这些系数是从海量文本里学出来的,而不是谁写死的;它被套了 96 遍;它每套一遍都会做一次非线性判断;而它算出来的那个数,只有在它的定义域里才值得相信。

就这么简单,也就这么复杂。


互动话题:你有没有遇到过"数学上成立、现实里讲不通"的那种输出?不管是 AI 给你的,还是某个报表给你的。欢迎在留言区讲讲那个 f(-1)=10 的时刻。


免责说明:

  1. 本文内容整理自「100 Days of AI Inference」系列 Day 8/100《Functions, Variables and Graphs Explained》信息图及配套英文原文(图中署"PROF. OAK'S POKEMON GYM"主题,系列未标注个人作者姓名),并结合公开学术资料展开分析。

  2. 通用逼近定理相关年份与具体表述存在版本差异:英文主流文献记为 Cybenko 1989(单隐藏层、S 型激活函数)、Hornik 1991(激活函数非关键,结构才是关键);部分中文资料记为 Cybenko 1988、两个隐藏层。本文采用前者,特此注明。

  3. GPT-3 架构数据(96 层、d_model=12288、96 个注意力头、FFN 维度 49152、1750 亿参数)来自 OpenAI 论文与公开技术拆解;GPT-3(x) = TransformerBlock⁹⁶(EmbedTokenWithPosition(x)) 这一记法来自斯坦福 CS324 课程讲义的简化表达。

  4. 损失地形相关结论来自 Li、Xu、Taylor、Studer、Goldstein《Visualizing the Loss Landscape of Neural Nets》(NeurIPS 2018)。文中关于"2D 可视化只是低维切片、无法捕捉完整高维几何"的提醒,出自该论文自述的局限性部分。

  5. "在高维空间中,不存在插值这种情况,一切都是外推"一语转引自 Yann LeCun 的公开表述(源自其与 Steven Pinker 相关讨论的传播链),为观点性表述而非严格数学定理,请按此理解。

  6. 图中神经元示意图标注为 f(a)=0.8a,为线性形式;本文指出真实神经元需在线性变换后再施加非线性激活函数,此为对教学示意图的补充说明,非指认原图有误。

  7. 文中"推理算力常超训练算力十倍"为行业经验性估算,不同模型、不同调用量下差异极大,不构成精确结论。

  8. 本文所举商业类比(截距=底线、斜率=边际效率等)为作者阐释性延伸,不代表原图观点。

來源:阿里雲開發者社區 AI · developer.aliyun.com