如何增大BERT sentence-transformers生成的句嵌入向量维度
增大sentence-transformers句子嵌入维度与优化语义搜索效果方案
维度异常澄清
你提到的当前模型输出78维属于异常情况:
bert-base-nli-mean-tokens作为基于BERT-base的预训练句子向量模型,标准输出维度为768维,出现78维大概率是代码运行环境异常、模型下载不完整或者打印时的输出截断导致,可先重新下载完整模型校验维度。
合法增大嵌入维度的实现方式
更换更高维度的预训练模型
sentence-transformers官方提供了多种不同输出维度的预训练模型,直接替换模型名即可获得更高维度的嵌入向量,同时可同步提升语义识别精度,推荐可选模型如下:all-mpnet-base-v2:输出维度768,语义匹配精度远高于当前使用的nli系列旧模型gtr-t5-large:输出维度1024,基于T5-large训练,长文本语义理解能力更强all-roberta-large-v1:输出维度1024,基于RoBERTa-large训练,适合短文本精准匹配
替换代码仅需要修改模型初始化行即可,示例如下:
# 替换为高维高精度模型示例 from sentence_transformers import SentenceTransformer model = SentenceTransformer('all-mpnet-base-v2')自定义维度映射(适配特定维度需求场景)
如果需要自定义输出维度,可以在基础模型后添加全连接层做维度投影,比如需要输出2048维向量,可以按照如下方式实现:import torch from sentence_transformers import SentenceTransformer, models # 加载基础Transformer模型 word_embedding_model = models.Transformer('bert-base-uncased', max_seq_length=256) # 均值池化层,生成基础句子向量 pooling_model = models.Pooling(word_embedding_model.get_word_embedding_dimension()) # 新增全连接层映射到目标维度2048 dense_model = models.Dense(in_features=pooling_model.get_sentence_embedding_dimension(), out_features=2048, activation_function=torch.nn.Tanh()) # 组装成完整的SentenceTransformer模型 model = SentenceTransformer(modules=[word_embedding_model, pooling_model, dense_model])注意:自定义新增的全连接层需要在自身业务数据集上做微调后才能获得更好的语义效果,直接使用随机初始化的全连接层反而会降低语义匹配精度
语义搜索精度优化额外建议
- 若使用场景为非中文/英文的小语种,优先选择对应小语种预训练的sentence-transformers模型,不要使用通用英文预训练模型
- 语义相似度计算可根据场景调整:通用场景优先使用余弦相似度,短文本高速匹配可尝试点积相似度
- 输入文本提前做预处理,去除无关特殊字符、冗余停用词,提升模型对核心语义的识别效率
内容的提问来源于stack exchange,提问作者Juned Ansari
相关产品推荐
相关产品推荐

