ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基函数:大模型背后的乐高积木,拆解位置编码、注意力与LoRA

基函数:大模型背后的乐高积木,拆解位置编码、注意力与LoRA 我先说一个让很多人意外的点Transformer 看起来是在预测下一个 token实际上干的一件事是把输入信号拆成一组“标准零件”再按权重拼回去。这套“拆碎—拼装”的动作数学上有一个非常朴素的名字用基函数做展开。《看清大模型》系列之前聊过 Transformer 的整体骨架这次把镜头推到更底层。你不需要重新学一遍线性代数只需要建立一个直觉基函数就是“表达世界的乐高积木”。把一块不规则的形状拼出来你可以选大块的通用积木也可以选一堆锯齿形的小配件不同选法决定了你要多少块积木、拼出来的东西有多精细、改一块会不会影响整体。大模型里的 token 表征、位置编码、注意力打分、甚至微调时用的 LoRA背后全是这一件事。这篇文章不会出现一行你抄不走的高深公式但会把四种关键基函数——标准基、傅里叶三角基、多项式基、径向基函数——和它们背后两种完全相反的“世界观”全部拆开。看懂之后你再看位置编码、注意力权重、LoRA 低秩适配会像看一张自己手绘的地图而不是黑盒。1. 基函数是什么为什么说它是大模型的地基1.1 一个“拆开—重组”的底层动作想象你手里有一段任意波形的声音想把它描述出来。最简单的办法不是一个点一个点地念坐标而是告诉别人“我用 100 赫兹的正弦波放三格音量再用 300 赫兹的余弦波放一格音量最后加一点噪声压平。”别人只要把这几个固定形状的波叠加起来就能还原出几乎一样的声音。这里的“固定形状的波”就是基函数。数学上的说法是某个函数空间的任意元素都可以写成一组基底函数的线性组合。这组基底有几个要求数量够用、互相独立、最好还能正交彼此不重叠干扰。满足这些条件你把无数个复杂信号压成几百个系数存储和计算都会轻松很多。大模型做的是同样的事。一篇文本进来tokenizer 先把它切成 token词根级符号每个 token 映射到一个固定维度的向量。这个向量空间本质上是一个被精心设计的坐标系模型学到的所有权重都是在这个坐标系下如何组合各个“方向”的系数。你看到的 hundreds of dimensions不是随意取的而是要让这个空间尽量能“表达”语言里各种细微差别。1.2 为什么大模型绕不开基函数很多自学大模型的朋友卡在“向量”“矩阵”这些词上总觉得是编程里的一种数据结构其实没那么复杂。你可以把模型每一层计算的本质记成一句话输入一行坐标权重矩阵是一张换基表输出是新坐标系下的坐标。神经网络的反向传播、损失函数、梯度下降全部发生在“坐标”上而坐标系本身就是由基函数定义的。如果基函数选得不对后面无论怎么调参数表达的天花板都焊死了。这就好比给一个乐队只发一种乐器演奏再努力也出不了交响效果。理解基函数就是理解这个乐队到底有哪些乐器、每种乐器在什么情况下该响。2. 四种基函数逐个拆解从坐标轴到傅里叶展开2.1 标准基离散世界的坐标轴第一种基函数最朴素标准基canonical basis。二维空间里 (1,0) 和 (0,1) 就是标准基三维空间里 (1,0,0)、(0,1,0)、(0,0,1) 也是。它们的共同特点是每个基向量只在某一个维度上是 1其余全是 0。大模型里最典型的标准基应用是one-hot 编码。tokenizer 有一张词表假设词表大小是 V比如 5 万每个 token 都会被表示成一个 V 维向量只有该词在词表中的那一位是 1其他位置全是 0。从基函数的角度看这个 token 就落在标准基的某个“坐标轴”上方向明确不与其他 token 纠缠。但标准基有个致命问题维度灾难。词表 5 万向量就是 5 万维哪怕只存 1 万个 token 的 one-hot也是 5 亿个数字太浪费。所以模型第一层一定会接一个 Embedding 矩阵把稀疏的、高维的 one-hot 向量投影到低维紧凑空间比如 4096 维。这一步本质上就是一次基变换从“每个词一个坐标轴”的离散世界观换到“连续的低维语义空间”。在这个新空间里相似词会落在彼此附近语义关系开始变得可计算。也正因为如此EMBEmbedding Matrix的每一行都可以看作一个可学习的“词向量基”模型后面所有的抽象都建立在它之上。2.2 傅里叶三角基把信号抖成“频率零件”第二种基函数你可能在信号处理里见过傅里叶基也就是一族不同频率的 sin 和 cos 函数。它们能在一定条件下把任意周期函数拆成无数“纯频率”的叠加。傅里叶基最迷人的地方是这些三角波是全局的波峰波谷遍布整个定义域叠加起来却可以精确还原出非常复杂的曲线。也就是说它是典型的“全局世界观”基底——每个基底都覆盖全场但频率各不相同。大模型里傅里叶基最出名的落点是 Transformer 的正弦位置编码。原始论文里的公式是PE(pos, 2i) sin(pos / 10000^(2i/d)) PE(pos, 2i1) cos(pos / 10000^(2i/d))位置 pos 从 0 到序列长度变化维度 i 从 0 到 d/2 变化。你把 i 看成“频率标号”这个公式就是在给每个位置分配一组不同频率的三角波。不同维度对应不同波长于是模型既能通过高频分量感知相邻 token 的相对位置又能通过低频分量感知全局距离。这就是为什么后来很多改进版本比如 RoPE 旋转位置编码依然没有离开“频率”这个词——它们本质上是把位置信息从“正弦波幅度”改成“旋转变量的相位”数学精神一脉相承。2.3 多项式基最朴素的全局逼近第三种是多项式基由 1, x, x², x³…… 这些幂次函数组成。泰勒展开就是用它任何一个足够光滑的函数都可以在某一点附近展开成多项式之和。多项式基的好处是“无脑通用”——不管你的函数长什么样先拿幂次怼上去再说坏处是数值稳定性很差阶数一高就震荡得离谱。两个相邻的幂次项往往数值很大、正负相消计算机一舍入结果直接废掉。在深度学习里多项式基没有直接出现在经典激活函数中ReLU 不是多项式GELU 也不是但“用全局基底去逼近复杂函数”的思路影响极深。比如多项式核在 SVM 时代就是万金油在神经网络理论里一个足够宽的隐层也可以用某个基函数族展开来近似任意函数这就是所谓的 universal approximation 直觉。如果你想把模型的行为拆成“宏观趋势 局部细节”多项式基是最容易直觉化的工具——就像用一条平滑多项式曲线先抓一个复杂函数大致走向再去补贴小凹凸。2.4 径向基函数以距离为灵魂的局部基底第四种就是径向基函数RBF。最好理解的例子是高斯核φ(x) exp(-γ ||x - c||²)它只取决于样本点 x 与中心点 c 的距离。距离越近输出值越大距离一远指数衰减迅速趋近于 0。你可以把它想象成“一个只在自家门口发光的灯”——它有明显的局部性是世界观的另一极。这种基底很适合插值和散点拟合每个中心点控制一小片区域互不干扰想改哪块就改哪块。大模型里到处能看见 RBF 的影子。最直接的是注意力机制里的 softmax 加权结构。注意力先算查询向量 q 与所有键向量 k 的相似度常见为点积相似度再经过 softmax 归一化成权重最后对 value 向量加权求和。这个“相似度→权重→加权求和”的流程和 RBF 插值里“距离核→归一化权重→加权求和”的流程是同构的。注意力层本质上就是一个数据自适应的局部基函数加权器哪个 value 与当前 query 更“靠近”谁的权重就更大不需要全局对齐只看局部关系决定输出。也正是因为 RBF 的局部性模型才能把复杂任务拆成海量小规则分别精确处理而不是每次都必须重新协调全局所有信息。3. 两种世界观全局展开与局部拼装3.1 世界观一整体同时振动的高频低频叠加第一种世界观我称它为“全局展开”。它的口号是你不需要一块一块补只要把足够多覆盖全场的基底按比例叠起来最终形状自然会出现。傅里叶基、多项式基在这个阵营。这种世界观的优势极其明显表达光滑、结构清晰。一个低频正弦波处理的是整体趋势一个高频正弦波处理的是极细密的纹理它们天然分层理解起来很舒服。很多物理现象热传导、波动用这种基底描述会让方程变得简洁优雅。同时它也有弱点基底之间高度耦合。你哪怕只想微调曲线某个局部的形状往往也会牵动所有系数想加一个只在某处有小凸起的修正得动用很多基底同时调整。在大模型的语境里这种世界观对应的就是“位置编码”那一类全局信息序列里一个 token 到底处在第几个位置、与序列首尾相距多远这种信息必须从全局出发任何局部特征都替代不了。3.2 世界观二近距离决定一切的局部拼装第二种世界观是“局部拼装”。口号是每个基底只负责它附近那一小撮数据整个函数就是无数小块的拼接。径向基函数是典型代表B 样条、小波也属于这个阵营。局部世界观的好处是鲁棒、灵活、容错率高。一段曲线里有一小块异常你不需要重建整个模型把那一小块对应的几个基底系数调一调就行。遇到不认识的新样本只要它的邻居们还在就还能插值猜出一个合理结果。代价是参数数量通常更多宏观结构不如全局基底那么直观而且如果基底之间没有保证连续性拼出来的整体可能不光滑。注意力机制就是这种世界观的忠实信徒模型生成下一个 token 时不会去问“所有历史 token 是什么”而是先找到现今这个 query 最该“关注”的那几个 key再由它们决定输出。它天然适配语言里的局部修饰关系形容词修饰名词、主谓宾之间的邻近搭配本质上都是“近邻规则”。3.3 大模型内部其实是世界观的混搭如果你以为大模型只选了其中一种世界观那就太小看它了。实际模型是混搭高手位置编码用全局世界观注意力用局部世界观两者的输出又被门控和残差连接调和在一起。可以这样理解全局坐标负责保证“这段文本里每个词的位置感不出轨”局部注意力负责“提取上下文里该关注的具体语义点”。没有全局模型会把“我爱你”和“你爱我”当成同一句话没有局部模型读不懂“明天下午三点的会议改到四点”里“四点”到底改谁的期。两层信息在不同“基函数坐标系”里并行处理最后通过加权汇合才形成一个真正能理解序列的表示。这也是为什么很多人试图用“只看注意力图”来推测模型行为会失败注意力只代表局部世界观那一层你把它当成全部等于只看了拼图中的其中一块积木。3.4 两种世界观在大模型里的现实交锋位置编码与注意力把位置编码全局基和注意力局部基放一起对比能更清楚看到它们的博弈关系。当模型编码“猫坐在垫子上狗趴在旁边”时位置编码告诉模型“猫在第 0 位垫子在第 2 位狗在第 4 位”——这些绝对位置来自全局基注意力则在同一个序列里把“垫子”和“旁边”这两个词的表示拉近形成一个局部“语义簇”。全局基给了刚性骨架局部基给了柔性内容互相缺一不可。这个对比也有实操价值当你想调试一个模型的长文本表现优先检查位置编码是否覆盖到足够长距离比如上下文从 4096 扩展到 8192 时RoPE 的旋转角度是否溢出当你想改善它的局部语义理解则可以盯住注意力头里有哪些异常高的“邻近偏差”。两种世界观在大模型内部的这种分工几乎是一张现成的调试地图。4. 实操视角看懂基函数微调和部署更不慌4.1 LoRA 微调本质上是在“换一组基”聊基函数不是只看理论。现在大模型微调最主流的方案是 LoRA。LoRA 的逻辑是把权重增量 ΔW 拆成两个低秩矩阵的乘积ΔW B × A Bd × rr 远小于 d Ar × k为什么这样能生效从基函数角度理解完整微调原始权重 W等于可以在几万维方向上自由移动代价巨大LoRA 则只在一个 r 维子空间里移动相当于把“允许调整的自由度”限制在一个低维基坐标系里。这个低维基由 B 的行向量构成它决定了模型在下游任务里能表达的方向有限但足够。你调 LoRA 的 r秩本质就是在“买更多的基函数”r 太小基不够表达任务r 太大过拟合和存储成本一起上来。实操上我有一个建议不要只把 r 当成一个超参数而要想清楚下游任务到底需要几个“语义方向”。比如做风格改写r8 往往足够做知识注入式微调r 最好到 32 以上。多试几档观察验证集上的变化拐点——那个拐点通常就是任务所需基函数数量的真实边界。4.2 部署时的算子就是基函数的“现场施工”部署大模型时你会看到不少算子里面藏着大量基函数实现。位置编码层在计算 sin/cos注意力层在做 softmax 归一化LayerNorm 在做均值和方差归一化。很多同学部署时遇到性能瓶颈第一反应是换推理框架、开量化却从没想过这些算子本身就是基函数的计算现场。比如 sin/cos 位置编码如果每次输入都现算长序列会白白浪费 GPU 周期。更聪明的做法是预计算一张位置编码表按序列长度做查表再与输入向量相加。RBF 式注意力如果遇到不同长度的 key 集合导致 softmax 分母数值不稳定就要考虑使用数值稳定的 softmax 变体减去最大值再归一化。这类优化本质上都是在“给基函数施工提供更好的场地”。我推荐你在部署前先用 profiling 工具看一眼模型在位置编码和注意力层的时间占比。如果位置编码占比异常多半是每次都现算 sin/cos如果注意力占比异常多半是 softmax 里指数运算过慢。这两种症状都能从“基函数怎么算”的角度找到对症药。4.3 通过“基函数心电图”预判模型状态还有一个我常用的土办法看权重分布像看心电图一样预判模型状态。正常训练的模型Embedding 层和输出层的权重里基函数系数的分布应该是连续、平滑的不应该出现大量极端尖峰。如果你发现某一层的权重几乎全集中在一个方向比如某个奇异值特别大往往意味着这个模型“表达单一”像一个人只会用同一种语气说话。具体操作不复杂加载模型的权重文件对每一层的权重矩阵做奇异值分解SVD画出奇异值从大到小的衰减曲线。衰减很陡说明这个基坐标系里有效基很少模型表达能力偏弱衰减平缓说明有效基很多模型容错和表达空间都更大。LoRA 微调后对比一下基线的奇异值曲线如果下游任务的曲线整体向右平移有效方向变多说明微调在真正“补充表达”如果只是头部变大而尾部不变很可能只是把已有几个方向放大并没有学到新知识。这个方法不需要花式框架一个 notebook 就能跑非常实用。5. 常见误区与排坑经验5.1 误区把基函数当成学院派理论和应用无关我见过太多人觉得“基函数是数学课本里的东西跟调参部署没关系”。真不是。一个很简单的例子当你把上下文长度从 2048 扩展到 4096很多人只记得改 RoPE 的缩放因子却不理解那里调整的本质是让同一组频率基能覆盖更长的相位范围。如果只知道调参、不懂基函数遇到“扩展后模型变笨”就只能瞎试参数理解了基函数你会主动检查不同频率分量的覆盖范围一眼找准关键参数。基函数不是一个抽象的数学名词它是模型每一个设计决策背后的说明书。5.2 误区把“频域”神秘化看到 sin/cos 就发怵很多人一看到“频率、傅里叶、相位”就头晕。我用一个生活化类比帮你卸下负担傅里叶基就是把曲线描成“一组粗细不同的波浪线叠在一起”粗波浪决定大趋势细波浪决定小细节。你不用会积分只要记住这句话。位置编码里的 10000^(2i/d) 这个底数决定的是“最粗的波浪能跨多远、最细的波浪能抖多密”。你完全可以把它当成一个可调的旋钮改了它模型对长距离位置的敏感度就会变。别让“频域”这个词拦住你它背后就是一个简单的节奏感问题。5.3 误区非得在两种世界观里争出高下有些教程会把“局部 vs 全局”讲成两个对立派系一个说注意力是全部一个说位置编码是全部。现实里它们是协作关系。你可以把全局基想象成房子的承重结构——柱子、横梁决定整体稳不稳固把局部基想象成装修——每个房间的墙面、地板、灯光决定具体空间好不好用。没有承重结构装修就是危楼没有装修结构只是一个空壳。大模型之所以强悍正是因为它能在同一个序列里无缝切换这两种世界观而理解这一点后你读模型源码时会很容易判断某层设计是在补全局骨架还是补局部细节。5.4 我的三点实操体会第一别怕在低维度上做实验。我经常用 4 维、8 维的小 toy model 去验证对基函数的理解比如自己写一个随机初始化的位置编码表再观察加上注意力权重后输出的变化。小模型跑得快能直观看到改动基函数带来的全局影响这种手感是看论文给不了的。第二微调前先看看基底别一上来就调参。加载要微调的模型先跑一遍奇异值分解摸清哪些有效方向已经强、哪些方向很弱。我踩过最深的坑是在一个本来方向就偏的基底上继续使劲放大结果下游任务越调越偏反而损失了不少基线上的通用能力。第三调试模型时心里始终带着两套坐标系。错误发生先问一句这是全局坐标系的问题位置编码、长距离依赖还是局部坐标系的问题注意力集中、局部语义对齐我遇到的长文本变傻、重复生成、上下文丢失一半以上是全局位置信息没处理好而指代错误、关键词漏抓则多半是局部注意力不够聚焦。带着这个分类去排查效率比漫无目的地改超参数高太多。如果只能记住一件事我会记住每一次训练都是在一个由基函数撑起的空间里调整坐标。想清楚你在哪个坐标系里许多问题会突然变简单。
返回列表