首页 > 其他分享 >NLP语义相似度尝试

NLP语义相似度尝试

时间:2023-08-15 17:04:36浏览次数:35  
标签:尝试 NLP 训练 模型 语义 train import path model

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

1.方案选择

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

2.环境搭建

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

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

安装pytorch:

打开https://pytorch.org/,会发现有很多版本可以选择,cuda版支持显卡加速

 没有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。具体的参数可以不同情况下的表现可以官网查看(https://huggingface.co/)

加载模型:

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文件,下面是几个常用的数据类型和损失函数:

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
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相当于当前模型对于验证数据的一个评估。
训练模型并导出:
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)
evaluation_steps:评估步数,是指在训练过程中,模型会在每个evaluation_steps迭代中进行一次评估。

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

batch_size过大优点:

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

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

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

 batch_size过大缺点:

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

 

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

4.模型验证

使用新的验证数据集和微调后的新模型进行验证吧~
batch_size

标签:尝试,NLP,训练,模型,语义,train,import,path,model
From: https://www.cnblogs.com/suzumiyahr/p/17631275.html

相关文章

  • 大火的扩散模型终于杀到了NLP领域
    从2020年的初出茅庐,到2021年的日趋火热,再到2022年的大放异彩,扩散模型(DiffusionModels)如果还不是特别了解扩散模型的朋友,可以阅读卖萌屋的几篇历史推文《扩散模型在图像生成领域大火,风头超过GAN?》,《年末回顾:2021年AI领域十大研究趋势及必读论文》。扩散模型最早在图像生成领......
  • NLP文本匹配任务Text Matching 有监督训练:PointWise(单塔)、DSSM(双塔)、Sentence BERT(双
    NLP文本匹配任务TextMatching[无监督训练]:SimCSE、ESimCSE、DiffCSE项目实践文本匹配多用于计算两个文本之间的相似度,该示例会基于ESimCSE实现一个无监督的文本匹配模型的训练流程。文本匹配多用于计算两段「自然文本」之间的「相似度」。例如,在搜索引擎中,我们通常需要判断......
  • NLP、炼丹技巧和基础理论文章索引
    玩家你好恭喜你捡到了一个来自上古时期的*七*星*炼*丹*炉*,只见炉壁上镶嵌着自然语言处理、推荐系统、信息检索、深度炼丹、机器学习、数学与基础算法等失传已久的江湖秘术。熔炉中虽然已有一层厚厚尘土,却依然掩盖不住尘埃下那一颗颗躁动不安的仙丹。ps:喂喂喂,你萌不要只收藏不......
  • NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践
    NLP文本匹配任务TextMatching[无监督训练]:SimCSE、ESimCSE、DiffCSE项目实践文本匹配多用于计算两个文本之间的相似度,该示例会基于ESimCSE实现一个无监督的文本匹配模型的训练流程。文本匹配多用于计算两段「自然文本」之间的「相似度」。例如,在搜索引擎中,我们通常需要判断......
  • NLP文本匹配任务Text Matching 有监督训练:PointWise(单塔)、DSSM(双塔)、Sentence BERT(双
    NLP文本匹配任务TextMatching[有监督训练]:PointWise(单塔)、DSSM(双塔)、SentenceBERT(双塔)项目实践0背景介绍以及相关概念本项目对3种常用的文本匹配的方法进行实现:PointWise(单塔)、DSSM(双塔)、SentenceBERT(双塔)。文本匹配(TextMatching)是NLP下的一个分支,通常用于计算两个句子......
  • NLP与神经网络
    在NLP中使用神经网络,是现在主流的做法。神经网络神经网络,全称人工神经网络(ArtificialNeuralNetwork),模拟生物神经网络的工作方式。特点:是一种由人工神经元(虚拟的数学模型)构成的计算系统。它具有学习、泛化和适应性等能力能够对输入数据进行自动识别、分类、聚类等任务。广泛应用于......
  • air32f103之USB性能尝试——拉胯没法用
    之前有个通过stm32f103单片机usb导文件的小需求,功能已经开发完成,但是馋于air32f103到高主频,本想着切换过来,把性能再拔高拔高,苦于对usb协议栈不熟,一直没有付与实践。等了好几个月,好不容易等来了官方的Mass_Storage例程,迅速开干,先是在例程基础上实现了用内部flash模拟U盘,调好后U盘......
  • 对博客美化的尝试
    随手粘一个以前oi时期的博文看看效果今天考试T1考这个,以前只在床上看书时推过一遍,现在忘完了。复习(重学)一下。学习博客:CSDNOIWIKIDFS树树枝边:DFS时经过的边,即DFS搜索树上的边。前向边:与DFS方向一致,从某个结点指向其某个子孙的边。后向边:与DFS方向相反,从某个结点指向其......
  • Jenkinsfile使用k8s agent构建失败:Container jnlp was terminated (Exit Code: 1, Rea
    问题描述Jenkinsfile使用k8sagent构建失败jenkins报错截图:查看pod app-system-23-wmx8b-5lnl2-lxvlr的jnlp容器日志:分析处理一般构建失败大都是jnlp容器问题。经以下日志分析发现jenkins主节点和slave节点的jdk版本不一致导致该提示JavaJDK版本不对:hudson/slaves/SlaveComputer......
  • 【小沐学NLP】在线AI绘画网站(网易云课堂:AI绘画工坊)
    1、简介StableDiffusion是一种强大的图像生成AI,它可以根据输入的文字描述词(prompt)来绘制图像。在StableDiffusion上完成优秀图像的制作需要有正确的模型+准确的提示词+参数调整+后期处理技术。网易云课堂云课堂stablediffusion上线。1.1参与方式参与方式一①进入网易云......