首页 > 其他分享 >基于Sentence Transformer微调向量模型

基于Sentence Transformer微调向量模型

时间:2024-07-07 16:20:36浏览次数:19  
标签:Transformer 训练 Sentence dataset train steps eval model 向量

Sentence Transformer库升级到了V3,其中对模型训练部分做了优化,使得模型训练和微调更加简单了,跟着官方教程走了一遍,顺利完成向量模型的微调,以下是对官方教程的精炼和总结。

一 所需组件

使用Sentence Transformer库进行向量模型的微调需要如下的组件:

  1. 数据数据: 用于训练和评估的数据。
  2. 损失函数 : 一个量化模型性能并指导优化过程的函数。
  3. 训练参数 (可选): 影响训练性能和跟踪/调试的参数。
  4. 评估器 (可选): 一个在训练前、中或后评估模型的工具。
  5. 训练器 : 将模型、数据集、损失函数和其他组件整合在一起进行训练。

二 数据集

大部分微调用到的数据都是本地的数据集,因此这里只提供本地数据的处理方法。如用其他在线数据可参考相对应的API。

1 数据类型

常见的数据类型为json、csv、parquet,可以使用load_dataset进行加载:

from datasets import load_dataset

csv_dataset = load_dataset("csv", data_files="my_file.csv")
json_dataset = load_dataset("json", data_files="my_file.json")
parquet_dataset = load_dataset("parquet", data_files="my_file.parquet")

2 数据格式

数据格式需要与损失函数相匹配。如果损失函数需要计算三元组,则数据集的格式为['anchor', 'positive', 'negative'],且顺序不能颠倒。如果损失函数计算的是句子对的相似度或者标签类别,则数据集中需要包含['label']或者['score'],其余列都会作为损失函数的输入。常见的数据格式和损失函数选择见表1。

三 损失函数

链接整理了一些常见的数据格式和匹配的损失函数

Inputs Labels Appropriate Loss Functions
(sentence_A, sentence_B) pairs class SoftmaxLoss
(anchor, positive) pairs none MultipleNegativesRankingLoss
(anchor, positive/negative) pairs 1 if positive, 0 if negative ContrastiveLoss / OnlineContrastiveLoss
(sentence_A, sentence_B) pairs float similarity score CoSENTLoss / AnglELoss / CosineSimilarityLoss
(anchor, positive, negative) triplets none MultipleNegativesRankingLoss / TripletLoss

表1 常见的数据格式和损失函数

四 训练参数

配置训练参数主要是用于提升模型的训练效果,同时可以显示训练过程的进度或者其他参数信息,方便调试。

1 影响训练效果的参数

learning_rate lr_scheduler_type warmup_ratio num_train_epochs
max_steps per_device_train_batch_size per_device_evak_batch_size auto_find_batch_size
fp16 bf16 gradient_accumulation_steps gradient_checkpointing
eval_accmulation_steps optim batch_sampler multi_dataset_batch_sampler

2 观察训练过程的参数

eval_strategy eval_steps save_strategy save_steps
save_total_limit load_best_model_at_end report_to log_eval log_eval
logging_steps push_to_hub hub_model_id hub_strategy
hub_private_repo

五 评估器

评估器用于评估模型训练过程中的损失。同损失函数的选择一样,它也需要与数据格式相匹配,以下是评估器的选择依据。

Evaluator Required Data
BinaryClassificationEvaluator Pairs with class labels
EmbeddingSimilarityEvaluator Pairs with similarity scores
InformationRetrievalEvaluator Queries (qid => question), Corpus (cid => document), and relevant documents (qid => set[cid])
MSEEvaluator Source sentences to embed with a teacher model and target sentences to embed with the student model. Can be the same texts.
ParaphraseMiningEvaluator Mapping of IDs to sentences & pairs with IDs of duplicate sentences.
RerankingEvaluator List of {'query': '...', 'positive': [...], 'negative': [...]} dictionaries.
TranslationEvaluator Pairs of sentences in two separate languages.
TripletEvaluator (anchor, positive, negative) pairs.

六 训练器

训练器的作用是把先前的组件组合在一起使用。我们仅需要指定模型、训练数据、损失函数、训练参数(可选)、评估器(可选),就可以开始模型的训练。

from datasets import load_dataset
from sentence_transformers import (
SentenceTransformer,
SentenceTransformerTrainer,
SentenceTransformerTrainingArguments,
SentenceTransformerModelCardData,
)
from sentence_transformers.losses import MultipleNegativesRankingLoss
from sentence_transformers.training_args import BatchSamplers
from sentence_transformers.evaluation import TripletEvaluator

# 1. Load a model to finetune with 2. (Optional) model card data
model = SentenceTransformer(
    "microsoft/mpnet-base",
    model_card_data=SentenceTransformerModelCardData(
        language="en",
        license="apache-2.0",
        model_name="MPNet base trained on AllNLI triplets",
    )
)

# 3. Load a dataset to finetune on
dataset = load_dataset("sentence-transformers/all-nli", "triplet")
train_dataset = dataset["train"].select(range(100_000))
eval_dataset = dataset["dev"]
test_dataset = dataset["test"]

# 4. Define a loss function
loss = MultipleNegativesRankingLoss(model)

# 5. (Optional) Specify training arguments
args = SentenceTransformerTrainingArguments(
    # Required parameter:
    output_dir="models/mpnet-base-all-nli-triplet",
    # Optional training parameters:
    num_train_epochs=1,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=16,
    learning_rate=2e-5,
    warmup_ratio=0.1,
    fp16=True,  # Set to False if you get an error that your GPU can't run on FP16
    bf16=False,  # Set to True if you have a GPU that supports BF16
    batch_sampler=BatchSamplers.NO_DUPLICATES,  # MultipleNegativesRankingLoss benefits from no duplicate samples in a batch
    # Optional tracking/debugging parameters:
    eval_strategy="steps",
    eval_steps=100,
    save_strategy="steps",
    save_steps=100,
    save_total_limit=2,
    logging_steps=100,
    run_name="mpnet-base-all-nli-triplet",  # Will be used in W&B if `wandb` is installed
)

# 6. (Optional) Create an evaluator & evaluate the base model
dev_evaluator = TripletEvaluator(
    anchors=eval_dataset["anchor"],
    positives=eval_dataset["positive"],
    negatives=eval_dataset["negative"],
    name="all-nli-dev",
)
dev_evaluator(model)

# 7. Create a trainer & train
trainer = SentenceTransformerTrainer(
    model=model,
    args=args,
    train_dataset=train_dataset,
    eval_dataset=eval_dataset,
    loss=loss,
    evaluator=dev_evaluator,
)
trainer.train()

# (Optional) Evaluate the trained model on the test set
test_evaluator = TripletEvaluator(
    anchors=test_dataset["anchor"],
    positives=test_dataset["positive"],
    negatives=test_dataset["negative"],
    name="all-nli-test",
)
test_evaluator(model)

# 8. Save the trained model
model.save_pretrained("models/mpnet-base-all-nli-triplet/final")

标签:Transformer,训练,Sentence,dataset,train,steps,eval,model,向量
From: https://www.cnblogs.com/deeplearningmachine/p/18288618

相关文章

  • SCI一区级 | Matlab实现BO-Transformer-GRU多特征分类预测/故障诊断
    SCI一区级|Matlab实现BO-Transformer-GRU多特征分类预测/故障诊断目录SCI一区级|Matlab实现BO-Transformer-GRU多特征分类预测/故障诊断效果一览基本介绍程序设计参考资料效果一览基本介绍1.【SCI一区级】Matlab实现BO-Transformer-GRU特征分类预测......
  • SCI一区级 | Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断
    SCI一区级|Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断目录SCI一区级|Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断效果一览基本介绍程序设计参考资料效果一览基本介绍1.【SCI一区级】Matlab实现BO-Transformer-LSTM特征分类......
  • 支持向量机的参数调整优化
     一、支持向量机简介    svm(支持向量机)以感知机为原型,但是它的能力要远远强于感知机,svm在回归,分类和异常检测上都有重要作用,并且可以通过kerneltrick实现高维数据的非线性分类。sklearn里面提供了很多svm及其变种,本篇将详细介绍其中的分类器之一svc。二、SVC变量详......
  • 使用Python和scikit-learn实现支持向量机(SVM)
            支持向量机(SupportVectorMachine,SVM)是一种强大的监督学习算法,广泛用于分类和回归问题。它能够有效处理线性和非线性数据,并在复杂数据集中表现出色。本文将介绍如何使用Python和scikit-learn库实现SVM,以及如何通过可视化不同参数设置来理解其工作原理。一、......
  • 结合RNN与Transformer双重优点,深度解析大语言模型RWKV
    本文分享自华为云社区《【云驻共创】昇思MindSpore技术公开课RWKV模型架构深度解析》,作者:Freedom123。一、前言Transformer模型作为一种革命性的神经网络架构,于2017年由Vaswani等人提出,并在诸多任务中取得了显著的成功。Transformer的核心思想是自注意力机制,通过全局建模和并......
  • Non-stationary Transformers: Exploring the Stationarity in Time Series Forecasti
    文章目录摘要1引言2相关工作2.1时间序列预测的深度模型2.2时间序列预测的平稳化3非平稳变压器3.1序列平稳化3.2去平稳化注意力核心思想数据平稳化自注意力机制中的去平稳化操作具体流程为什么需要去平稳化操作总结为什么最终预测结果还要进行去平稳化调整后的......
  • SCI一区级 | Matlab实现BO-Transformer-GRU时间序列预测
    SCI一区级|Matlab实现BO-Transformer-GRU时间序列预测目录SCI一区级|Matlab实现BO-Transformer-GRU时间序列预测效果一览基本介绍程序设计参考资料效果一览基本介绍1.【SCI一区级】Matlab实现BO-Transformer-GRU时间序列预测,贝叶斯优化Transformer......
  • 与传统RNN相比,AI模型当红大神Transformer有什么新魔法呢?
       在上一篇文章“AI模型大宗师Transformer的Encoder工具”里面提到“自注意力机制”,有些伙伴可能不太理解,今天我再用个例子细说一下。   下面,我们用一个实际的文本处理例子来看看传统的循环神经网络(RNN)和引入自注意力机制的Transformer模型在处理长距离依赖关系......
  • 点云分割网络---Point Transformer V2
    PDF:《PointTransformerV2:GroupedVectorAttentionandPartition-basedPooling》CODE:https://github.com/Gofinge/PointTransformerV2一、大体内容前面一篇文章介绍了PointTransformer,这一篇在其基础上进行改进,提出了强大且高效的PointTransformerV2模型,考虑到原......
  • 从GPT-1看Transformer的崛起
    要深入理解大语言模型(LLM)的内部工作机制,不妨先从GPT-1模型开始。一、发展历程2017年,Google推出了Transformer模型,这一架构因其在性能上的显著优势迅速吸引了OpenAI团队的注意。《AttentionIsAllYouNeed》https://arxiv.org/abs/1706.03762OpenAI随后将研发重点转移到Tra......