如何在无标签商品描述数据上微调Sentence Transformer?
无标签数据微调Sentence Transformer优化商品相似匹配
核心思路:无监督对比学习
无标签场景下,用对比学习让模型学会捕捉商品描述的核心特征——让同一商品(或语义相近的描述)的嵌入向量距离更近,不同商品的向量距离更远。核心是构造正/负样本对,用对比损失训练模型。
步骤1:数据预处理与样本构造
数据清洗
先清理商品描述:去除乱码、冗余广告语、重复符号,统一文本格式(比如全角转半角、小写化)。
生成正/负样本
- 正样本:如果同一商品有多条描述,直接配对;如果没有,用数据增强生成语义一致的变体,比如同义词替换、关键信息保留的改写:
import nlpaug.augmenter.word as naw # 基于WordNet的同义词替换增强 aug = naw.SynonymAug(aug_src='wordnet', aug_p=0.3) def generate_positive(desc): return aug.augment(desc)[0] - 负样本:随机选取不同商品的描述作为负例,建议每个正样本搭配4-8个负样本,提升模型区分度。
步骤2:微调Sentence Transformer
用Sentence Transformer原生工具链完成训练,无需额外复杂框架:
1. 加载预训练模型
优先选适合短文本的轻量模型,比如all-MiniLM-L6-v2,平衡效果和速度:
from sentence_transformers import SentenceTransformer, losses, InputExample from sentence_transformers.training_args import SentenceTransformerTrainingArguments from sentence_transformers.trainer import SentenceTransformerTrainer import random # 加载预训练模型 model = SentenceTransformer('all-MiniLM-L6-v2')
2. 构造训练数据集
将清洗后的描述转换为InputExample格式:
train_examples = [] product_descriptions = [你的商品描述列表] # 替换为你的数据 for desc in product_descriptions: pos_desc = generate_positive(desc) # 随机选4个不同商品的描述作为负样本 neg_candidates = [d for d in product_descriptions if d != desc] neg_descs = random.sample(neg_candidates, min(4, len(neg_candidates))) # 构造样本:[原描述, 正样本, 负样本1, 负样本2, ...] train_examples.append(InputExample(texts=[desc, pos_desc] + neg_descs))
3. 设置训练参数与损失函数
用MultipleNegativesRankingLoss——这是无标签场景下的最优损失之一,它会让正样本对的相似度高于所有负样本对:
training_args = SentenceTransformerTrainingArguments( output_dir="./fine_tuned_product_model", num_train_epochs=3, # 视数据量调整,3-5轮足够 per_device_train_batch_size=16, learning_rate=2e-5, warmup_ratio=0.1, # 前10%步数做学习率热身 logging_steps=100, save_strategy="epoch" ) # 初始化损失函数 train_loss = losses.MultipleNegativesRankingLoss(model=model)
4. 启动训练
trainer = SentenceTransformerTrainer( model=model, args=training_args, train_dataset=train_examples, loss=train_loss ) trainer.train() # 保存微调后的模型 model.save(training_args.output_dir)
步骤3:效果验证
- 计算已知相似商品(比如同SKU的不同描述)的余弦相似度,对比预训练模型的结果,确保相似度提升
- 随机选取商品,用微调后的模型检索Top-N相似商品,人工判断匹配准确性
- 用召回率、精确率等指标量化效果(如果有少量标注数据的话)
额外优化技巧
- 硬负样本:如果商品有分类标签,把同分类但不同商品的描述作为硬负样本,比随机负样本更具挑战性,能进一步提升模型区分能力
- 模型选型:如果数据量较大,可尝试
all-mpnet-base-v2,效果更好但训练成本更高 - 增强多样性:除了同义词替换,还可以尝试商品属性改写(比如"纯棉T恤"→"全棉短袖上衣")、语序调整等增强方式
内容的提问来源于stack exchange,提问作者Margam Rohith Kumar
相关产品推荐
相关产品推荐

