均值池化通常用于从 Transformer token 输出(如 BERT)创建句子嵌入,因为它提供了一种直接的方法来聚合所有 token 中的上下文信息,同时平衡了计算效率和有效性。像 BERT 这样的 Transformer 生成一系列 token 级别的嵌入,每个嵌入都捕获了整个输入的上下文。然而,许多任务需要一个固定长度的向量来表示整个句子。均值池化——对所有 token 嵌入进行平均——确保每个 token 都对最终表示做出同等的贡献。 这避免了过度依赖特定的 token(例如,第一个或最后一个),并捕获了句子语义的更广泛的视图。例如,在“猫坐在垫子上”这样的句子中,均值池化将“猫”、“坐”和“垫子”的上下文混合到一个统一的向量中,该向量反映了整个场景。
选择均值池化而不是使用 [CLS] token 或最大池化等替代方案通常取决于经验性能和简单性。 BERT 的 [CLS] token 专为分类任务而设计,但如果没有微调,其嵌入可能无法固有地捕获句子含义。 相比之下,均值池化利用所有 token 嵌入,这些嵌入已经编码了丰富的上下文关系。 例如,在语义相似性任务中,与依赖单个 token 相比,平均嵌入可以更好地表示跨句子(如“我喜欢编程”和“编码是我的热情”)的细微差别。 最大池化(它获取 token 嵌入的每个维度上的最大值)可以强调离群值特征,但有丢失细微信息的风险。 均值池化通过在 token 之间分配影响,倾向于产生更稳定和可推广的嵌入,尤其是在没有单个 token 主导句子含义的情况下。
实际上,均值池化在计算上是轻量级的,并且可以在可变长度的输入上保持一致。由于 Transformer 以批处理方式处理输入并处理填充,因此平均 token 嵌入只需要最少的额外代码或资源。例如,使用 Hugging Face 的 Transformers 库的开发人员可以通过简单地对 token 输出求和(忽略填充)并除以序列长度来实现均值池化。这种简单性使其成为一个可靠的默认选择,即使存在更复杂的方法(如基于注意力的池化)。虽然均值池化并不总是最优的——上下文繁重的任务可能会受益于加权方法——但它是一个强大的基线。它在句子检索和文本分类等基准测试中的有效性,加上易于实现,解释了它在 Sentence-BERT 等框架中的广泛应用,在这些框架中,它支持高效的语义搜索系统。