趋近智
大师班
为您的子词分词器选择词汇量大小,通常表示为 ∣V∣,是一个主要的超参数选择,直接影响模型表现、内存占用和计算成本。与词汇表可能自然增长的简单分词方法不同,BPE 或 WordPiece 等子词算法要求您预先定义一个目标词汇量大小。这一决定需要平衡多个相互影响的因素。
较小的词汇量大小会使分词器更频繁地将单词拆分为更小的子词单元。
反之,更大的词汇量大小允许分词器将更多常见词或频繁出现的子词序列表示为单个标记。
以“tokenization”(分词)一词为例。
['tok', 'en', 'ization'](3个标记)。['tokenization'](1个标记)。['token', 'ization'](2个标记)。更长的序列直接影响训练期间激活所需的内存,特别是注意力得分矩阵(L×L)。
词汇量越大,对于固定语料库,通常会使平均序列长度变短,从而降低注意力计算成本。
词汇量大小直接决定了输入嵌入矩阵和输出投影层(通常是绑定的)的大小。嵌入矩阵的维度为 ∣V∣×dmodel,其中 dmodel 是模型的隐藏维度。
嵌入矩阵大小=∣V∣×dmodel×每参数字节数更大的 ∣V∣ 会导致嵌入矩阵按比例增大。对于dmodel 为数千的大型模型,将 ∣V∣ 从30,000增加到100,000,仅在嵌入层就可能增加数十亿参数和数千兆字节的模型内存占用。
import torch
import torch.nn as nn
# 嵌入层大小示例
d_model = 4096 # 隐藏维度示例
vocab_size_small = 32000
vocab_size_large = 128000
embedding_small = nn.Embedding(vocab_size_small, d_model)
embedding_large = nn.Embedding(vocab_size_large, d_model)
params_small = sum(p.numel() for p in embedding_small.parameters())
params_large = sum(p.numel() for p in embedding_large.parameters())
# 假设使用 float32 (每个参数4字节) 的内存
mem_small_gb = params_small * 4 / (1024**3)
mem_large_gb = params_large * 4 / (1024**3)
print(
f"Vocab Size: {vocab_size_small}, "
f"Embedding Params: {params_small:,}, "
f"Memory: {mem_small_gb:.2f} GB"
)
print(
f"Vocab Size: {vocab_size_large}, "
f"Embedding Params: {params_large:,}, "
f"Memory: {mem_large_gb:.2f} GB"
)
# --- 输出 ---
# Vocab Size: 32000, Embedding Params: 131,072,000, Memory: 0.49 GB
# Vocab Size: 128000, Embedding Params: 524,288,000, Memory: 1.95 GB
此计算仅包含嵌入层。最终输出层将隐藏状态投影回词汇维度以预测下一个标记,其大小通常也相似(dmodel×∣V∣),这会进一步放大 ∣V∣ 对模型大小的影响。
在训练和推理期间,模型通常使用应用于输出logits的softmax函数计算整个词汇表的概率。此最终softmax层的计算成本与 ∣V∣ 呈线性关系。
Softmax 成本∝L×dmodel×∣V∣虽然对于长序列,注意力机制(O(L2×dmodel))通常占据主导地位,但softmax计算(O(L×dmodel×∣V∣))可能成为一个重要瓶颈,特别是在词汇量非常大或在推理过程中批量大小可能较小且延迟很关键时。更大的 ∣V∣ 直接增加了这项成本。
没有单一的“最佳”词汇量大小;它取决于具体的任务、语言、数据集大小、模型架构和可用的计算资源。然而,存在一些常见的观察和做法:
选择较小或较大词汇量大小(∣V∣)所涉及的权衡。
在实际操作中,选择 ∣V∣ 通常涉及一些经验性测试,或采用文献中针对类似模型规模和数据集报告的大小。您需要权衡更短序列和潜在更好表示常见词(更大的 ∣V∣)带来的益处,与增加的内存使用、较慢的softmax计算以及潜在更差的稀有词处理(较小的 ∣V∣)所产生的成本。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造