亲手算一段中文的信息熵:编码浪费在哪

"信息量"听起来是个虚词,香农给了它一个能精确计算的形态:一段消息的信息量等于它的不确定性。动手算一次,编码浪费这个抽象概念立刻变成具体数字。

公式与最小验证

单事件信息量是 -log2(p),整个分布的平均信息量就是熵:

H = - Σ p_i · log2(p_i)

底数取 2,单位 bit——字面意思就是"平均需要几个二进制位来表达"。先验最小的零件:概率 0.5 信息量 1.00 bit,0.25 是 2.00 bit,0.001 是 9.97 bit。概率每减半,信息量加 1 bit,曲线和直觉一致。

真算一段中文

取一段 277 字的中文和一段 530 字符的英文,按字符统计频率:

中文:277 字符,159 种字符
  H = 6.909 bit/字符  (上界 log2(159) = 7.313)
英文:530 字符,33 种字符
  H = 4.187 bit/字符  (上界 log2(33) = 5.044)

两个数都落在 0 与种类上界之间,公式自洽。中文 6.909 贴着上界,因为 159 种字符摊在 277 个位置上,每种平均不到 2 次——这是小样本高估:字符种类被高估,熵跟着高估。真拿一本书统计,常见字会明显集中,熵会低不少。这个数不能当"中文的熵",只能当这段文本的熵。方法论上这是个值得记住的坑:熵估计对样本量敏感,报告时永远带上样本描述。

有意思的对比:存储开销 vs 信息量

把熵和实际编码放一起看:

中文:UTF-8 每字符固定 3 字节 = 24 bit
      熵 6.909 bit → 理论压缩空间 3.47 倍
英文:ASCII 每字符 8 bit
      熵 4.187 bit → 理论压缩空间 1.91 倍

24 bit 里真正有用的平均只有 6.9 bit,剩下 17 个 bit 是固定长度编码的浪费——压缩算法干的就是把可恢复的部分去掉。"UTF-8 不是压缩格式"这句话,从此有了数字支撑。两个极端对照更直观:26 个字母各出现一次,熵 4.700 bit;26 个 a,熵 0.000 bit——零熵意味着完全确定,一个 bit 都不需要。

增量提醒(原文没延伸的两点):其一,这段方法论可以直接迁移到 LLM tokenizer 评估——同一段中文用不同分词器编码,token 数除以熵就是"分词冗余度",冗余度高说明分词碎片化严重,直接推高推理成本;其二,工程上真正可压缩的不止字符分布,n-gram 条件熵(前一字符已知时的不确定性)会比一阶熵低得多,中文真实压缩极限要看条件熵而不是一阶熵,所以 3.47 倍只是下界参考。

一次动手计算的收获比十篇科普实在:熵不是比喻,是能落地到压缩比、token 成本和存储规划的硬指标。

0

评论0

请先
显示验证码
没有账号?注册  忘记密码?