预测下一词的自回归大模型GPT早已风靡全球。压缩即智能的说法已经广为人知,但关于其无损压缩的能力貌似一直有争议。GPT压缩到底是无损还是有损呢?
这是一个非常值得打破沙锅问到底的问题,它正好切入了LLM压缩最核心、也最巧妙的部分。我们来把这个过程彻底拆解一下,让它变得清晰易懂。
一个直观的比喻:在无限的图书馆里找书
想象一个图书馆,里面包含了所有可能的句子。
-
- 像 “人工智能将重塑未来产业格局” 这种符合语法、逻辑且有意义的句子,位于图书馆里非常显眼、容易找到的区域 (比如“热门新书区”)。
- 而像 “产业未来将格局人工智能重塑” 这种语法不通的句子,位于偏僻的角落。
- 像 “猫枕头跳跃蓝色因为星期三” 这种完全随机的胡言乱语,则位于几乎无法访问的尘封地下室。
现在,我需要告诉您具体是哪句话。
-
- 对于那句热门句子,我不需要把整句话念给您听。我只需要给您一个极短的指令:“热门区,第3排,第5本”。这个指令就是压缩后信息 (少量比特)。
- 对于那句胡言乱语,我没有捷径可走,只能把整句话一字不差地读给您听。这个指令非常长,几乎和原文一样。
GPT的作用,就是建立了这个图书馆的终极索引系统(世界模型)。它知道每一句话“热门”的程度(概率)。算术编码就是那个高效的区间定位系统。
核心机制:算术编码如何划分“区间”
现在我们进入技术细节。算术编码的精髓是把一整段信息表示成 0.0
到 1.0
之间的一个小数。
压缩:一步步“缩小”区间
我们以您的例子 “人工智能将重塑未来产业格局” 来走一遍流程。为了简化,我们假设分词是:“人工”, “智能”, “将”, “重塑”, “未来”, “产业”, “格局”。
- 初始状态:我们的区间是
[0.0, 1.0]
。 - 编码第一个词“人工”:
- GPT模型启动,预测第一个词的概率。假设在所有可能开头的词中,"人工" 的概率是 5% : P("人工")=0.05。
- 算术编码器就在
[0.0, 1.0]
的区间里,把开头5%
的位置,也就是[0.0, 0.05]
,分配给"人工"。 - 我们“放大”进入这个新区间
[0.0, 0.05]
。
- 编码第二个词“智能”:
- 现在,GPT的上下文是“人工”。它预测下一个词。因为“人工智能”是高频词,所以 P("智能" | "人工") 的概率会非常高,比如 80%。
- 算术编码器就在当前区间
[0.0, 0.05]
里,把前80%
的位置分配给"智能"。 - 新的区间是
[0.0, (0.05 * 0.8)]
,即[0.0, 0.04]
。 - 我们再次“放大”进入这个更小的区间
[0.0, 0.04]
。
- 编码第三个词“将”:
- 上下文是“人工智能”。GPT预测 P("将" | "人工智能") 的概率也很高,比如 60%。
- 新区间是
[0.0, (0.04 * 0.6)]
,即[0.0, 0.024]
。
- ...持续这个过程...
最终结果:当整句话编码完毕,我们得到了一个非常精确定位的、极小的最终区间,比如 [0.02113, 0.02114]
。
关键来了:我们只需要从这个最终区间里随便挑选一个数,比如 0.02113
,把它转换成二进制(比如 0.00010101...
),这个二进制串就是我们的压缩结果。因为它是一个高概率句子,每一步都取了较大的百分比,所以最终区间的范围相对较大(虽然数值很小),可以用较少的二进制位数来精确表示。
解压:按图索骥,还原路径
解压过程就是上述步骤的逆向操作,像拿着藏宝图找宝藏一样。让我们用数学语言走一遍解压流程。
-
- 压缩数字:
V = 0.02113
- GPT模型:随时待命
- 压缩数字:
第一轮:解码第一个词
- 获取概率:GPT预测,(无上下文时)'人工'的概率是0.05,'智能'是0.03...
- 划分区间:
[0.0, 1.0]
被划分为:[0.0, 0.05]
-> '人工'[0.05, 0.08]
-> '智能'- ...
- 定位:
V = 0.02113
落在[0.0, 0.05]
区间内。 - 解码:输出第一个词 “人工”。
- 更新区间:我们接下来的工作区间是
L=0.0
,H=0.05
。
第二轮:解码第二个词
- 区间归一化 (Rescaling)
- 我们需要更新我们的指针
V
,计算它在[0.0, 0.05]
这个新区间里的相对位置。 - 公式:
V_new = (V_old - L) / (H - L)
- 计算:
V_new = (0.02113 - 0.0) / (0.05 - 0.0) = 0.4226
- 现在,我们用来做决策的指针变成了
0.4226
。
- 我们需要更新我们的指针
- 获取概率:解压器给GPT输入上下文“人工”,GPT预测下一个词的概率:
- P("智能" | "人工") = 0.8
- P("智慧" | "人工") = 0.1
- ...
- 在新坐标系下划分区间:我们根据新概率划分标准区间
[0.0, 1.0]
:[0.0, 0.8]
-> '智能'[0.8, 0.9]
-> '智慧'- ...
- 定位:我们用归一化后的新指针
V_new = 0.4226
来比较。它落在[0.0, 0.8]
这个区间内。 - 解码:输出第二个词 “智能”。
- 更新区间
[L, H]
:为下一轮的计算定义新的边界。方法:将相对的[l,h]
区间缩小/映射回绝对坐标系中。'智能'对应的区间是[0.0, 0.8]
。映射回绝对坐标系的工作区间是[0.0, 0.04]
。这个[0.0, 0.04]
精确地定义了“人工智能”这个词序列在整个[0.0, 1.0]
空间中的最终位置。
-
L_new = L_prev + (l_curr * Width_Previous)
H_new = L_prev + (h_curr * Width_Previous)
这个过程不断重复,每一步都包含 定位 -> 解码 -> 归一化 三个动作,直到结束。具体说,更新指针 V
与 更新区间 [L, H]
这两个过程交替进行,一个负责“决策”,一个负责“更新状态”,共同驱动解码器精确地还原出原始文本。因为每一步的选择都是唯一的,所以解压结果能100%保证和原文一致。
总结:为什么高概率 = 少比特
这背后的数学原理是信息论。一个事件所包含的信息量是其概率的负对数:
I(x) = -log₂(P(x))
-
- 高概率事件 (P → 1):比如GPT预测下一个词是“格局”的概率是95% (P=0.95)。它所包含的信息量就非常小(-log₂(0.95) ≈ 0.07比特)。我们只需要极少的信息就能确认这个预测。
- 低概率事件 (P → 0):如果下一个词是个罕见词,概率只有0.01% (P=0.0001),它所包含的信息量就极大(-log₂(0.0001) ≈ 13.3比特)。我们需要很多信息才能描述这个“意外”。
算术编码巧妙地将这个理论变成了现实。对于一个高概率序列,最终的区间总大小(即所有概率的乘积)会比较“大”,从而可以用一个位数较少的二进制小数来表示。这就是“语义级消除冗余”的本质:所有符合人类知识、语法和逻辑的“意料之中”的内容,都被GPT这个“世界模型”识别出来,并用最少的信息量进行了编码。