趋近智
困惑度是语言模型最常用的一种内在评估指标,如前所述。与信息论紧密关联的指标则提供不同视角,尤其在比较采用不同分词 (tokenization)方案的模型时。这些指标计算根据模型的概率分布,编码每个文本单位(字符或词/词元 (token))平均所需的比特数。
训练期间使用的交叉熵损失本质上是真实下一个词元的平均负对数似然,通常使用自然对数(以为底)计算: 是模型的分布, 是词元数量。困惑度是此损失的指数化:。
然而,信息论通常以比特(以2为底的对数)来衡量信息内容。一个为观测序列分配更高概率的模型,其“确定性”更强,根据其概率分配,平均编码该序列所需的比特数更少。这使得我们关注每字符比特数和每词/词元比特数等指标。
每字符比特数 (BPC) 衡量给定模型预测下,编码文本序列中每个字符所需的平均比特数。它的计算方法是,取使用以2为底的对数计算的交叉熵损失,然后除以序列中的总字符数 (),而不是词元 (token)数量:
然而,大多数大型语言模型是基于词元(词或子词 (subword))工作的,而非单个字符。计算每个字符的精确概率需要一个字符级别模型,或对词元概率进行复杂的边缘化处理。对于基于词元的模型,一个更实用的方法是计算每个词元的标准交叉熵损失(以为底),然后将其转换为比特(以2为底),并除以原始文本中的字符数量。
每词元计算的交叉熵损失(以为底,表示为)与 BPC 的关系如下:
此处, 是词元数量, 是评估文本中的字符数量。 因子将自然对数转换为以2为底的对数()。
BPC 的主要优点是它对所选分词 (tokenization)方法相对不敏感。由于它通过字符数量进行归一化 (normalization),因此可以在相同的原始文本数据上,更公正地比较使用不同分词器 (tokenizer)(例如,BPE、WordPiece、字符级别)的模型。一个模型可能仅因为其分词器将词分解成许多小片段而获得不错的困惑度分数,但其BPC可以表明它是否在建模底层字符序列方面确实表现更佳。
我们来看一个 PyTorch 示例。假设您已从评估循环中获得每词元的平均交叉熵损失以及字符/词元计数:
import torch
import math
# 假设这些值来自评估结果
avg_cross_entropy_loss_per_token = 1.85 # 示例损失 (自然对数底)
total_tokens_in_eval_set = 50000 # 示例词元数量
total_chars_in_eval_set = 200000 # 示例字符数量
# 计算以2为底的交叉熵,按词元归一化
avg_bits_per_token = avg_cross_entropy_loss_per_token / math.log(2)
# 根据模型计算数据集的总比特数
total_bits = avg_bits_per_token * total_tokens_in_eval_set
# 计算每字符比特数 (BPC)
bpc = total_bits / total_chars_in_eval_set
print(
f"每词元平均交叉熵损失(以e为底): "
f"{avg_cross_entropy_loss_per_token:.4f}"
)
print(f"每词元平均比特数 (BPT): {avg_bits_per_token:.4f}")
print(f"每字符比特数 (BPC): {bpc:.4f}")
# 示例输出:
# 每词元平均交叉熵损失(以e为底): 1.8500
# 每词元平均比特数 (BPT): 2.6691
# 每字符比特数 (BPC): 0.6673
每词比特数 (BPW) 或每词元比特数 (BPT) 对于基于词元的模型来说更简单。它表示根据模型的概率分配,编码每个词元(如果使用词级别分词 (tokenization),则为词)所需的平均比特数。
它与在词元上计算的交叉熵损失(以为底,)和困惑度(PPL)直接关联:
此外,BPW/BPT 与困惑度有直接关联:
这意味着 BPW/BPT 只是困惑度的以2为底的对数。如果一个模型在数据集上的困惑度为 16,这意味着平均而言,预测下一个词元的难度,相当于在 个选项中均匀选择。这对应于每词元 4 比特的 BPT。
import torch
import math
# 示例值
perplexity = 16.0
avg_cross_entropy_loss_per_token = math.log(perplexity) # H_e = ln(PPL)
# 从困惑度计算 BPT
bpt_from_ppl = math.log2(perplexity)
# 从交叉熵损失(以e为底)计算 BPT
bpt_from_loss = avg_cross_entropy_loss_per_token / math.log(2)
print(f"困惑度 (PPL): {perplexity:.4f}")
print(
f"每词元平均交叉熵损失(以e为底): "
f"{avg_cross_entropy_loss_per_token:.4f}"
)
print(f"从 PPL 计算的每词元比特数 (BPT): {bpt_from_ppl:.4f}")
print(f"从损失计算的每词元比特数 (BPT): {bpt_from_loss:.4f}")
# 示例输出:
# 困惑度 (PPL): 16.0000
# 每词元平均交叉熵损失(以e为底): 2.7726
# 从 PPL 计算的每词元比特数 (BPT): 4.0000
# 从损失计算的每词元比特数 (BPT): 4.0000
尽管 BPW/BPT 是困惑度的直接转换,但以“比特”来思考,能与信息论及压缩限制建立更强的关联。更低的 BPT 表明模型根据其学习到的概率分布,在压缩文本序列中的信息方面更高效。然而,与 BPC 不同,BPW/BPT 高度依赖于所使用的分词方法。使用子词 (subword)单元的模型在相同文本上通常会比字符级别模型具有更低的 BPT,仅仅因为预测一个更长的词元单元一次能覆盖更多字符。
总之,BPC 和 BPW/BPT 都提供了关于模型内在性能的信息论视角。BPC 提供了一种与分词器 (tokenizer)无关的衡量方法,在比较根本不同的模型时很有用;而 BPW/BPT 是困惑度的直接对数转换,常用于评估基于特定分词方案的词元模型。这两种指标都量化 (quantization)了模型的概率分布与数据的匹配程度,数值越低表示匹配度越好。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•