NLP语义相似度尝试

要实现这么一个需求,预设一个评分标准,然后根据用户的行为或者一段描述进行打分,很自然的想到了这几年很火的NLP,调研了一番做个记录。

1.方案选择

python上有很多很成熟的库来实现,本次选用SentenceTransformers。

2.环境搭建

安装python:太新的版本可能造成各种库不兼容,固使用了python 3.10版本。

安装pip:pip 是一个 Python 包安装与管理工具。

安装pytorch:

打开pytorch.org/,会发现有很多版本可以...

没有n卡的可以选择cpu版本

安装SentenceTransformers:

SentenceTransformers是一个可以用于句子、文本和图像嵌入的Python库。它基于PyTorch和Transformers,提供了大量针对各种任务的预训练模型,例如中文BERT、英文RoBERTa等。其中,sentence-transformers (SBert) 预训练模型可以用于计算文本的嵌入并且可以轻松地将它们用于语义文本相似性、语义搜索和同义词挖掘等常见任务 。

复制代码
pip install -U sentence-transformers
pip install -U transformers

3.模型训练

Hugging Face上有很多预训练的模型,我们要做的是选择一个模型做微调,使其跟符合我们的业务场景。初始模型选择distiluse-base-multilingual-cased-v2。具体的参数可以不同情况下的表现可以官网查看(huggingface.co/)

加载模型:

javascript 复制代码
from sentence_transformers import SentenceTransformer, SentencesDataset 
from sentence_transformers import InputExample , evaluation, losses
from torch.utils.data import DataLoader
import os
import pandas as pd
import math
import torch

current_dir=current_dir = os.path.dirname(os.path.abspath(__file__))
model_save_path=os.path.join(current_dir, '', 'chinese_model')
model = SentenceTransformer('distiluse-base-multilingual-cased-v2')
device=torch.device('cuda')
model=model.to(device)

初次训练的时候模型会自动下载,大约500m。

准备训练数据:

训练数据可以从日常的使用数据导出为一定格式的excel文件,下面是几个常用的数据类型和损失函数:

css 复制代码
CosineSimilarityLoss
输入样本:(sentence1, sentence2, 相似度),这个相似度范围是-1~1(因为求的是余弦相似度)
Contrastiveloss
输入样本:(sentence1, sentence2, label),这里label只能为0或者1
MultipleNegativesRankingLoss
输入样本:(anchor, positive)

加载训练数据:

def load(path):

df = pd.read_csv(path,encoding='gb18030')

samples = []

for idx,item in df.iterrows():

samples.append((item['sentence1'], item['sentence2'], item['label']))

return samples

ini 复制代码
train_path = os.path.join(current_dir, '', 'train.csv')  
valid_path = os.path.join(current_dir, '', 'valid.csv')  
train_data = load(train_path)
valid_data = load(dev_path)

train_datas = []
for i in train_data:
    train_datas.append(InputExample(texts=[i[0], i[1]], label=1))

sentences1,sentences2,scores = [],[],[]
for i in valid_data:
    print(i[2])
    sentences1.append(i[0])
    sentences2.append(i[1])
    scores.append(float(i[2]))
evaluator = evaluation.EmbeddingSimilarityEvaluator(sentences1, sentences2, scores)
复制代码
evaluator相当于当前模型对于验证数据的一个评估。
训练模型并导出:
ini 复制代码
train_dataset = SentencesDataset(train_datas, model)
train_dataloader = DataLoader(train_dataset, shuffle=True, batch_size=128)
train_loss = losses.MultipleNegativesRankingLoss(model)
num_epochs=5
warmup_steps = math.ceil(len(train_dataloader) * num_epochs * 0.1) #10% of train data for warm-up
model.fit(train_objectives=[(train_dataloader, train_loss)], epochs=num_epochs, warmup_steps=warmup_steps, 
          evaluator=evaluator, evaluation_steps=1000, output_path=model_save_path)
makefile 复制代码
evaluation_steps:评估步数,是指在训练过程中,模型会在每个evaluation_steps迭代中进行一次评估。

batch_size:单次训练选取的样本量。

batch_size过大优点:

(1)提高了内存利用率,大矩阵乘法并行计算效率提高。

(2)计算的梯度方向比较准,引起的训练的震荡比较小。

(3)跑完一次epoch所需要的迭代次数变小,相同数据量的数据处理速度加快。

batch_size过大缺点:

容易内容溢出,想要达到相同精度,epoch会越来越大,容易陷入局部最优,泛化性能差。

复制代码
epochs:训练迭代次数。

warmup_steps:预热步数。在训练神经网络时,预热步数可以帮助模型更好地收敛。预热步数是指在训练过程中,学习率会从0逐渐增加到预设的学习率,这个过程中的一部分步数就是预热步数。 通常的,在训练网络的前期过程中,会选取一个相对较大的学习率以加快网络的收敛速度。而随着迭代优化的次数增多,逐步减小学习率,以保证最终收敛至全局最优解,而不是在其附近震荡或爆炸

4.模型验证

使用新的验证数据集和微调后的新模型进行验证吧~
相关推荐
小陈工8 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
墨染天姬12 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
AI成长日志12 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_9481142412 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠12 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
黎阳之光12 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好13 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型
智星云算力13 小时前
本地GPU与租用GPU混合部署:混合算力架构搭建指南
人工智能·架构·gpu算力·智星云·gpu租用
jinanwuhuaguo13 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
xiaozhazha_13 小时前
效率提升80%:2026年AI CRM与ERP深度集成的架构设计与实现
人工智能