BGE-M3 文本情感分类实战:预训练模型微调,导出ONNX并测试

BGE M3-Embedding 模型介绍 BGE M3-Embedding来自BAAI和中国科学技术大学,是BAAI开源的模型。相关论文在https://arxiv.org/abs/2402.03216,论文提出了一种新的embedding模型,称为M3-Embedding,它在多语言性(Multi-Linguality)、多功能性(Multi-Functionality)和多粒度性(Multi-Granularity)方面表现出色。 阅读详情

基于BGE-M3开源模型(由智谱 AI 开发的中英双语通用向量表征模型),实现一个简单的二分类情感分析任务(积极 / 消极文本判断)。通过微调预训练模型,展示 NLP 中经典的 “预训练 + 微调” 范式。微调采用基于 [CLS] token 的单特征提取或者基于池化策略的多特征融合。并导出ONNX模型,进行测试,以适应生产环境。

微调步骤

  1. 加载预训练模型与分词器;
  2. 构建分类头并整合到模型中;
  3. 数据预处理与 DataLoader 构建;
  4. 定义优化器、损失函数与训练循环;
  5. 验证与推理。
    实际应用中,需根据数据规模和任务复杂度调整模型结构与训练策略。BGE-M3 在语义表征任务中表现优异,适合作为文本分类、语义搜索等下游任务的基础模型。

微调代码

from transformers import AutoModel, AutoTokenizer,  get_linear_schedule_with_warmup
import torch
from torch.optim import AdamW  
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
import numpy as np
from sklearn.model_selection import train_test_split
from tqdm import tqdm

# 加载模型和分词器
tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-m3")
model = AutoModel.from_pretrained("BAAI/bge-m3")

# 定义分类模型
class TextClassifier(nn.Module):
    def __init__(self, model, hidden_size=1024, num_classes=2):
        super().__init__()
        self.model = model
        self.classifier = nn.Sequential(
            nn.Dropout(0.1),
            nn.Linear(hidden_size, hidden_size),
            nn.ReLU(),
            nn.Linear(hidden_size, num_classes)
        )
    
    def forward(self, inputs):
        # 获取模型输出
        outputs = self.model(**inputs)
        # 使用 [CLS] token
        cls_embedding = outputs.last_hidden_state[:, 0, :]
        # 通过分类器
        logits = self.classifier(cls_embedding)
        return logits

# 模拟数据集
class TextDataset(Dataset):
    def __init__(self, texts, labels, tokenizer, max_length=128):
        self.texts = texts
        self.labels = labels
        self.tokenizer = tokenizer
        self.max_length = max_length
        
    def __len__(self):
        return len(self.texts)
    
    def __getitem__(self, idx):
        text = self.texts[idx]
        label = self.labels[idx]
        
        encoding = self.tokenizer.encode_plus(
            text,
            add_special_tokens=True,
            max_length=self.max_length,
            padding='max_length',
            truncation=True,
            return_tensors='pt'
        )
        print(torch.tensor(label, dtype=torch.long))
        return {
   
   
            'input_ids': encoding['input_ids'].flatten(),
            'attention_mask': encoding['attention_mask'].flatten(),
            'label': torch.tensor(label, dtype=torch.long)
        }

# 初始化分类器
classifier = TextClassifier(model)

# 模拟数据
texts = [
    "这是一个积极的句子,充满了正能量。",
    "这是一个消极的句子,感觉非常糟糕。",
    "今天天气真好,阳光明媚。",
    "这个电影太无聊了,浪费时间。",
    "我喜欢这个产品,质量非常好。",
    "这个服务太差劲了,非常不满意。",
    "大模型对程序员来说是一个很好的工具。",
    "大模型对初级开发者来说是一个坏消息。"
]
#  PyTorch 的交叉熵损失函数 nn.CrossEntropyLoss 要求标签必须是从 0 开始的连续整数(如 0、1、2...)
labels = [1, 0, 1, 0, 1, 0,1,0]  # 1表示积极,0表示消极

# 划分训练集和验证集
train_texts, val_texts, train_labels, val_labels = train_test_split(texts, labels, test_size=0.2, random_state=42)

# 创建数据加载器
train_dataset = TextDataset(train_texts, train_labels, tokenizer)
val_dataset = TextDataset(val_texts, val_labels, tokenizer)

train_dataloader = DataLoader(train_dataset, batch_size=2, shuffle=True)
val_dataloader = DataLoader(val_dataset, batch_size=2)

# 训练配置
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
classifier.to(device)

optimizer = AdamW(classifier.parameters(), lr=2e-5)
epochs = 3
total_steps = len(train_dataloader) * epochs
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=total_steps)

# 训练循环
def train_epoch(model, dataloader, optimizer, 
使用Java ONNXRuntime进行语义相似度计算 使用Java进行文本语义相似度计算, ONNXRuntime, Deep Java Library 阅读详情

相关推荐

动手学习RAG: 迟交互模型colbert微调实践 bge-m3

本文我们来进行ColBERT模型的实践,按惯例,还是以中的代码为蓝本。在RAG兴起之后,ColBERT也获得了更多的关注。ColBERT整体结构和双塔特别相似,但迟交互式也就意味着比起一般ranking模型,交互来的更晚一些。

yuetan的博客 3201

BGE-M3微调情感分类:Pytorch转ONNX的Python与Java部署实战

文本情感分类是NLP中最常见的工程任务之一,但如何从众多预训练模型中选型,并高效落地到生产环境,仍是不少开发者的困扰。以BGE-M3为代表的多语言嵌入模型,凭借强大的语义表示能力,在中文口语化和长文本场景中表现出色,可作为分类底座进行微调。其核心原理是借助预训练模型的通用语言理解能力,通过轻量任务头迁移到具体业务中,免去从零训练的算力和数据成本。微调后的PyTorch模型通过导出为ONNX中间格式,即可利用ONNX Runtime实现跨语言、跨平台的快速推理,显著压缩体积并降低延迟。该方案不仅适合评论情绪分

weixin_29061425的博客 313

BGE-M3情感分析实战:从微调到ONNX部署的完整避坑指南

本文详细介绍了BGE-M3预训练模型在文本情感分类任务中的实战应用,涵盖从微调到ONNX部署的全流程。通过对比不同池化策略的效果和性能,提供优化方案和常见问题解决方案,帮助开发者高效完成情感分析模型的部署与优化。

weixin_29032489的博客 394

向量嵌入技术:从原理到工程实践

向量嵌入(Vector Embedding)是AI领域将离散数据(如文本、图像)转换为连续向量空间的核心技术。其数学本质是通过降维保留原始数据的语义关系,使相似概念在向量空间中距离相近。基于余弦相似度等度量方法,这项技术支撑着语义搜索、推荐系统等关键应用。在实际工程中,从Word2Vec到Sentence-BERT等模型的选择,需权衡维度、精度与计算成本。特别是在处理中文文本时,需注意标点符号的情感信息保留。当前前沿应用已扩展到多模态检索和动态增量学习,结合LoRA等参数高效微调技术,显著提升了电商推荐等场

aodanchui1057的博客 448

从离散Token到稠密向量:Embedding核心原理与工程实践全解析

在自然语言处理与机器学习中,Embedding(嵌入)是一项基础且关键的技术,它通过将离散的符号(如单词、Token ID)映射为连续的稠密向量,为计算机理解语言提供了数学基础。其核心原理在于构建一个高维语义空间,使得语义相似的词语在向量空间中距离相近,从而将符号化的语言转化为可计算的数学对象。这一技术不仅解决了传统One-Hot编码的维度灾难和语义缺失问题,还通过向量间的距离计算实现了语义相似性的度量,为下游任务提供了通用、高效的表示。在工程实践中,Embedding是构建智能搜索、推荐系统、聊天机器人及

germmy-神一样的开发 442

行空板K10边缘AI实践:离线语音识别与VITS+WeNet诗词交互系统

语音识别(ASR)和语音合成(TTS)是人工智能与物联网(AIoT)领域的关键技术,它们使设备能够“听懂”和“说出”人类语言。其原理涉及信号处理、深度学习模型对音频特征的提取与转换。在嵌入式与边缘计算场景中,这些技术的价值在于实现低延迟、高隐私的本地化智能交互,摆脱对云端的强依赖。应用场景广泛,从智能家居的语音控制,到工业环境的离线语音指令,再到如本文探讨的文化类交互设备。本文聚焦于在行空板K10这类资源受限的边缘设备上,部署轻量化的**VITS** TTS模型与**WeNet** ASR引擎,构建一个能进

weixin_33717117的博客 442

医学图像处理入门:如何用Python将CT灰度图转换为伪彩色图像(附代码)

本文详细介绍了如何使用Python将CT灰度图转换为伪彩色图像,提升医学图像的可读性和诊断效率。通过OpenCV和Matplotlib等工具,实现灰度值到彩色空间的映射,特别适用于突出显示特定组织密度差异。文章包含完整代码示例和临床实用技巧,适合医学影像分析初学者和Python开发者。

gitlab7runner的博客 324

Opencv计算相机响应函数(Camera Response Function)与Radiance

本文主要用于记录自己在学习CRF过程中遇到的一些问题。 CRF模型 I=f(V(t⋅L))I=f(V( t\cdot L))I=f(V(t⋅L)) 其中III为相机灰度值Intensity,LLL为环境中irradiance,ttt为曝光时间,VVV为相机镜头参数,fff为相机响应函数CRF。 有些论文中认为相机镜头参数是线性的不考虑,但有些考虑了衰减即靠近图像边缘亮度会暗一些,但没有看到二者同时计算的,如果同时计算两个非线性的函数,我觉得可能会有不确定性,在这里还请教一下了解的朋友。 控制

larrydong的博客 5990

【多媒体交互】Unity+普通摄像头实现UI事件分析

利用摄像头捕捉用户的手势或动作,结合坐标映射与事件系统触发UI交互

qq_38350004的博客 1299

SpringBoot实现电子发票生成

电子发票是近年来比较流行的一种票据形式,它取代了以往传统的纸质发票,具有减少纸张浪费、方便有效查验等优点。本文将介绍如何使用Spring Boot和Vue.js构建一个仿真电子发票生成应用程序,借助微信二维码扫描功能和第三方库,实现用户扫描二维码获取发票信息并填写相关开票信息,最后生成电子发票。在本文中,我们介绍了如何使用Spring Boot和Vue.js构建一个仿真电子发票生成应用程序,借助微信二维码扫描功能和第三方库,实现用户扫描二维码获取发票信息并填写相关开票信息,最后生成电子发票。

不愧是暮言的博客 6085

SpringBoot 中 @RequestMapping 及衍生注解的全面解析与实践

本文全面解析Spring Boot中@RequestMapping及其衍生注解的使用,涵盖核心功能、HTTP方法特定注解(@GetMapping/@PostMapping等)、属性详解(路径/参数/头信息等)以及路径变量处理。文章详细介绍了注解的组合使用、继承特性、版本控制策略等高级应用,并针对405/404等常见错误提供解决方案。通过学习这些注解的规范用法,开发者能够构建符合RESTful风格的API接口,提升代码可读性和可维护性。建议优先使用HTTP方法特定注解,合理规划URL结构,并注意避免路径冲突。

Java&AI小吕布的博客 2032

ROM和RAM在单片机程序运行理解

ROM和RAM是电子设备中两种核心存储组件,主要区别在于:ROM用于长期存储系统程序、用户文件等固定数据,断电后数据不丢失,但写入速度较慢;RAM则用于临时存储运行中的程序和数据,读写速度快但断电后数据会清空。在单片机中,ROM存储程序代码和常量,RAM存储运行时的变量和数据。两者协同工作,ROM如同"永久档案库"保存必要信息,RAM则像"临时工作台"支持高速运算,共同确保设备正常运行。

qq_37999850的博客 1616

深入解析 Multi-Agent 协同决策机制与架构设计

让我们从一些基础定义开始,为后续的讨论建立共同的语言。在计算机科学和人工智能领域,智能体(Agent)是指一个能够感知环境、做出决策并执行动作的实体。智能体是任何可以通过传感器感知环境,并通过执行器作用于该环境的事物。atπstat​πst​sts_tst​是时刻ttt的环境状态(或智能体的观测)π\piπ是智能体的策略(Policy),即从状态到动作的映射ata_tat​是智能体在时刻ttt选择执行的动作多智能体系统(MAS)

AI天才研究院 534

寻路最终版哦

相信大家用unity3d寻路的时候,一定会碰到多人

yxriyin的专栏 6949

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 语义向量的形状:各向异性与锥形分布
下一篇: 基于 LoRA 和 GRPO 的 Qwen2.5-3B 数学推理模型微调示例
大鹏的NLP博客
博客等级 码龄16年 375粉丝 350原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值