You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无标签商品描述数据上微调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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:32:50