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.模型验证

使用新的验证数据集和微调后的新模型进行验证吧~
相关推荐
李昊哲小课1 小时前
Hermes Agent 系统架构设计
人工智能·智能体·hermes agent
一切皆是因缘际会7 小时前
从概率拟合到内生心智:2026 下一代 AI 架构演进与落地实践
人工智能·深度学习·算法·架构
科研前沿8 小时前
镜像视界 CameraGraph™+多智能体:构建自感知自决策的全域空间认知网络技术方案
大数据·运维·人工智能·数码相机·计算机视觉
爱学习的张大8 小时前
具身智能论文问答(2):Diffusion Policy
人工智能
AI科技星8 小时前
全域数学·72分册·射影原本 无穷维射影几何卷细化子目录【乖乖数学】
人工智能·线性代数·算法·机器学习·数学建模·数据挖掘·量子计算
Chef_Chen8 小时前
论文解读:MemOS首次把记忆变成大模型的一等公民资源,Scaling Law迎来第三条曲线
人工智能·agent·memory
风落无尘8 小时前
《智能重生:从垃圾堆到AI工程师》——第四章 变化的艺术
人工智能·线性代数·算法
发哥来了8 小时前
AI视频生成模型选型指南:五大核心维度对比评测
大数据·人工智能·机器学习·ai·aigc
发哥来了8 小时前
AI驱动生产线的实际落地:一个东莞厂商的技术选型实录
大数据·人工智能·机器学习·ai·aigc
AC赳赳老秦8 小时前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw