明天你会感谢今天奋力拼搏的你。
ヾ(o◕∀◕)ノヾ
之前一直只是把Sentence Transformer组件作为一个Embedding向量生成的组件,不经意间发现其还有模型微调的能力,深入了解后就有了这篇文章。
在自然语言处理领域,Sentence Transformer 是一款强大的 Python 库,专注于生成句子、文本段落和图像的嵌入向量。其基于 Transformer 架构,能够将文本转化为固定长度的向量表示,可有效捕捉文本语义信息,在语义搜索、文本聚类、文本分类等任务中表现出色。
核心模块:
常用方法:
代码示例:
from sentence_transformers import SentenceTransformer
from sentence_transformers.util import cos_sim
# 加载预训练模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 定义要编码的句子
sentences = [
    "这是一个示例句子。",
    "一个示例不够。",
    "另一个示例句子。"
]
# 生成句子嵌入
embeddings = model.encode(sentences)
# 计算第一句和第二句的相似度
similarity = cos_sim(embeddings[0], embeddings[1])
print(f"Similarity between sentence 1 and 2: {similarity.item()}")Sentence Transformer 支持模型微调,以更好地适配特定任务和数据集。微调步骤如下:
微调示例代码:
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader
# 加载预训练模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 准备训练数据
train_examples = [
    InputExample(texts=['This is a positive pair', 'These are similar sentences'], label=1.0),
    InputExample(texts=['This is a negative pair', 'These are different sentences'], label=0.0)
]
# 创建数据加载器
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=2)
# 定义损失函数
train_loss = losses.CosineSimilarityLoss(model)
# 微调模型
model.fit(
    train_objectives=[(train_dataloader, train_loss)],
    epochs=1,
    warmup_steps=100,
    output_path='输出路径'
)在此把Sentence Transformer与Hugging Face Transformers、ModelScope、PyTorch Lightning进行对比。因为Sentence Transformer本身更偏向于Embedding相关场景,下文不是对其优劣进行比较,而是把这几个组件放在一起,可以互相参照,了解它们在不同特性下的表现。
| 对比维度 | Sentence Transformer | Hugging Face Transformers | PyTorch Lightning | ModelScope | 
| 易用性 | API 设计简洁,针对句子嵌入和语义相似度任务高度优化,无需复杂配置,开发者能快速上手。微调时只需准备数据、选损失函数并调用 fit方法。 | 功能强大通用,但非专业人员处理复杂任务(如自定义损失函数、数据加载)时,需编写较多代码并详细配置。 | 作为 PyTorch 轻量级扩展,提供一定抽象,但要求用户对 PyTorch 有一定了解,需手动定义训练循环和优化器等。 | 一站式模型开发和应用平台,有平台化界面和丰富文档助新手快速了解使用。不过功能丰富,初次使用需花时间熟悉概念和操作流程。 | 
| 任务针对性 | 专注于句子嵌入和语义相似度任务,预训练模型和微调策略围绕这些任务设计,特定任务微调效果出色。 | 适用于各种自然语言处理任务,如文本生成、问答系统等,通用性强,特定任务可能需额外调整。 | 本身不针对特定任务,主要简化 PyTorch 模型训练过程,可用于多种深度学习任务,灵活性高。 | 任务覆盖范围广,涵盖自然语言处理、计算机视觉、语音识别等多个领域,满足不同类型任务需求。 | 
| 模型资源 | 提供一系列预训练的句子嵌入模型,如all-MiniLM-L6-v2等,模型资源集中在句子嵌入相关领域。 | 拥有丰富预训练模型库,涵盖多种自然语言处理模型架构,满足不同任务需求。 | 本身不提供预训练模型,主要辅助模型训练,用户需自行选合适预训练模型。 | 具备海量预训练模型资源,覆盖各领域和各种任务,用户可方便选择模型微调。 | 
| 灵活性 | 在句子嵌入任务上灵活性相对低,主要针对特定任务设计,难进行大规模架构修改。 | 允许用户对模型架构一定程度修改定制,灵活性较好,但需一定技术能力。 | 灵活性高,用户可自定义训练过程各方面,适合研究人员进行复杂实验和模型开发。 | 允许用户一定程度自定义模型结构和训练流程,支持用户上传自己的模型进行微调。 | 
| 社区与生态 | 有活跃社区,但规模相对小,主要围绕句子嵌入相关任务交流。 | 社区庞大活跃,有丰富文档、教程和开源项目,开发者可获取大量资源和支持。 | 依托 PyTorch 强大社区生态,众多开发者分享经验和代码。 | 背后有阿里云等强大技术支持,有庞大用户社区和丰富生态资源,用户可交流模型使用案例、技术文章和解决方案。 | 
选型场景建议
全部评论