聊聊基于BERT模型实现多标签分类任务的实践与思考

多标签分类(四):Multi-Label Classification with Label Graph Superimposing 基于标签图叠加的多标签分类 摘要   图像或视频总是包含多个对象或动作。由于深度学习技术的快速发展,多标签识别已经实现了良好的性能.近年来,图卷积网络(GCN)被用来提高多标签识别的性能,然而,标签相关建模的最佳方式是什么,以及如何通过标签系统感知来改进特征学习,目前还不清楚.本文提出了一种标签图叠加框架,从以下两个方面对传统的多标签识别GCN+CNN框架进行改进.首先将统计共现信息构建的标签图叠加到标签知识先验构建的图中,建立标签相关性模型,然后对最终叠加的图进行多层卷积,实现标签的嵌入抽象 ... 阅读详情

概述

以预训练大模型为基座神经网络模型,通过模型预训练后的泛化能力与微调后的领域能力,作为NLP任务的解决方案。

在github上找了一个简单的仓库——multi_label_classification,该仓库基于BERT预训练大模型实现了多分类任务。通过对该仓库源码的分析,深入研究其逻辑原理。

代码文件的注释如下:
在这里插入图片描述

模型类定义

基于BERT预训练模型,结合线性层与sigmoid函数,输出多分类任务的概率分布

import torch
import torch.nn as nn
import torch.nn.functional as F
from transformers import BertModel

# 基于BERT模型的多分类模型定义
class BertMultiLabelCls(nn.Module):
    def __init__(self, hidden_size, class_num, dropout=0.1):
        super(BertMultiLabelCls, self).__init__()
        # 定义线性层(密集层)
        # 输入的维度是hidden_size;输出的维度是多分类的个数。
        self.fc = nn.Linear(hidden_size, class_num)
        self.drop = nn.Dropout(dropout)
        # 加载预训练模型
        self.bert = BertModel.from_pretrained("bert-base-chinese")

    def forward(self, input_ids, attention_mask, token_type_ids):
        # 将输入的input_ids(文本token的ID),
        # attention_mask(表示哪些token是重要的)
        # token_type_ids(区分不同类型的token,如句子A和句子B)传递给BERT模型,获取模型的输出。
        outputs = self.bert(input_ids, attention_mask, token_type_ids)
        # 打印输出
        # print(outputs)
        # 从BERT模型的输出中选择第一个元素(通常是[CLS]标记的输出),然后通过dropout层。
        cls = self.drop(outputs[1])
        # 将经过dropout层的[CLS]标记的输出传递到全连接层self.fc,然后应用sigmoid激活函数,将输出转换为概率分布。
        out = F.sigmoid(self.fc(cls))
        # 返回最终的输出概率分布,用于多分类任务。
        return out

Sigmoid函数通常用于二分类问题的神经网络中;Softmax函数通常用于多分类问题的神经网络中。而这里用到的是Sigmoid函数,这个原因在后面也会讲到。

数据预处理

一般都会有一个数据预处理的流程,因为模型的数据需要处理成指定的JSON格式后,才能喂到模型训练。为什么要有对应的格式?因为模型的训练与微调有对应的格式要求。

譬如,alpaca格式数据集与sharegpt格式数据集等常见格式要求。因此就会要求将原始数据处理成对应格式。

# -*- coding: utf-8 -*-
import json
import torch
from torch.utils.data import Dataset
from transformers import BertTokenizer
from data_preprocess import load_json


class MultiClsDataSet(Dataset):
    def __init__(self, data_path, max_len=128, label2idx_path="./data/label2idx.json"):
        self.label2idx = load_json(label2idx_path)
        self.class_num = len(self.label2idx)
        self.tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
        self.max_len = max_len
        self.input_ids, self.token_type_ids, self.attention_mask, self.labels = self.encoder(data_path)

    def encoder(self, data_path):
        texts = []
        labels = []
        with open(data_path, encoding="utf-8") as f:
            for line in f:
                line = json.loads(line)
                texts.append(line["text"])
                tmp_label = [0] * self.class_num
                for label in line["label"]:
                    tmp_label[self.label2idx[label]] = 1
                labels.append(tmp_label)

        tokenizers = self.tokenizer(texts,
                                    padding=True,
                                    truncation=True,
                                    max_length=self.max_len,
                                    return_tensors="pt",
                                    is_split_into_words=False)
        input_ids = tokenizers["input_ids"]
        token_type_ids = tokenizers["token_type_ids"]
        attention_mask = tokenizers["attention_mask"]

        return input_ids, token_type_ids, attention_mask, \
               torch.tensor(labels, dtype=torch.float)

    def __len__(self):
        return len(self.labels)

    def __getitem__(self, item):
        return self.input_ids[item],  self.attention_mask[item], \
               self.token_type_ids[item], self.labels[item]


if __name__ == '__main__':
    dataset = MultiClsDataSet(data_path="./data/train.json")
    print(dataset.input_ids)
    print(dataset.token_type_ids)
    print(dataset.attention_mask)
    print(dataset.labels)
# -*- coding: utf-8 -*-

"""
数据预处理
"""

import json


def load_json(data_path):
    with open(data_path, encoding="utf-8") as f:
        return json.loads(f.read())


def dump_json(project, out_path):
    with open(out_path, "w", encoding="utf-8") as f:
        json.dump(project, f, ensure_ascii=False)


def preprocess(train_data_path, label2idx_path, max_len_ratio=0.9):
    """
    :param train_data_path:
    :param label2idx_path:
    :param max_len_ratio:
    :return:
    """
    labels = []
    text_length = []
    with open(train_data_path, encoding="utf-8") as f:
        for data in f:
            data = json.loads(data)
            text_length.append(len(data["text"]))
            labels.extend(data["label"])
    labels = list(set(labels))
    label2idx = {label: idx for idx, label in enumerate(labels)}

    dump_json(label2idx, label2idx_path)

    text_length.sort()

    print("当设置max_len={}时,可覆盖{}的文本".format(text_length[int(len(text_length)*max_len_ratio)], max_len_ratio))


if __name__ == '__main__':
    preprocess("./data/train.json", "./data/label2idx.json")

训练

训练的源码如下:

# -*- coding: utf-8 -*-

import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from transformers import AdamW
import numpy as np
from data_preprocess import load_json
from bert_multilabel_cls import BertMultiLabelCls
from data_helper import MultiClsDataSet
from sklearn.metrics import accuracy_score

train_path = "./data/train.json"
dev_path = "./data/dev.json"
test_path = "./data/test.json"
label2idx_path = "./data/label2idx.json"
save_model_path = "./model/multi_label_cls.pth"
label2idx = load_json(label2idx_path)
class_num = len(label2idx)
device = "cuda" if torch.cuda.is_available() else "cpu"
lr = 2e-5
batch_size = 128
max_len = 128
hidden_size = 768
epochs = 10

# 预处理数据
train_dataset = MultiClsDataSet(train_path, max_len=max_len, label2idx_path=label2idx_path)
dev_dataset = MultiClsDataSet(dev_path, max_len=max_len, label2idx_path=label2idx_path)

# 从数据集中 批量 加载数据,批大小为batch_size
train_dataloader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
dev_dataloader = DataLoader(dev_dataset, batch_size=batch_size, shuffle=False)

# 计算准确率
def get_acc_score(y_true_tensor, y_pred_tensor):
    y_pred_tensor = (y_pred_tensor.cpu() > 0.5).int().numpy()
    y_true_tensor = y_true_tensor.cpu().numpy()
    return accuracy_score(y_true_tensor, y_pred_tensor)

# 训练
def train():
    model = BertMultiLabelCls(hidden_size=hidden_size, class_num=class_num)
    # 启用 batch normalization 和 dropout 。
    model.train()
    model.to(device)
    # 定义优化器
    optimizer = AdamW(model.parameters(), lr=lr)
    # 定义了一个二进制交叉熵损失函数(BCELoss),用于多标签分类问题,因为它可以处理多个标签。
    criterion = nn.BCELoss()

    dev_best_acc = 0.
    
    # 按epoch训练,即训练轮数
    for epoch in range(1, epochs):
        # 启用 batch normalization 和 dropout 。
        model.train()
        # 按batch训练,即训练批次
        for i, batch in enumerate(train_dataloader):
            # 清空梯度
            optimizer.zero_grad()
            batch = [d.to(device) for d in batch]
            # 获取批数据中的标签label数据
            labels = batch[-1]
            # 执行预训练模型的forward方法
            logits = model(*batch[:3])
            # 通过二分类交叉熵损失,计算模型返回值与标签实际值的损失概率
            loss = criterion(logits, labels)
            # 反向传播
            loss.backward()
            # 梯度更新
            optimizer.step()

            # 打印数据
            if i % 100 == 0:
                acc_score = get_acc_score(labels, logits)
                print("Train epoch:{} step:{}  acc: {} loss:{} ".format(epoch, i, acc_score, loss.item()))

        # 验证集合
        dev_loss, dev_acc = dev(model, dev_dataloader, criterion)
        print("Dev epoch:{} acc:{} loss:{}".format(epoch, dev_acc, dev_loss))
        if dev_acc > dev_best_acc:
            dev_best_acc = dev_acc
            torch.save(model.state_dict(), save_model_path)

    # 测试
    test_acc = test(save_model_path, test_path)
    print("Test acc: {}".format(test_acc))

# 验证
def dev(model, dataloader, criterion):
    all_loss = []
    # 切换成评估模式
    model.eval()
    true_labels = []
    pred_labels = []
    with torch.no_grad():
        for i, batch in enumerate(dataloader):
            input_ids, attention_mask, token_type_ids, labels = [d.to(device) for d in batch]
            logits = model(input_ids=input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids)
            loss = criterion(logits, labels)
            all_loss.append(loss.item())
            true_labels.append(labels)
            pred_labels.append(logits)
    true_labels = torch.cat(true_labels, dim=0)
    pred_labels = torch.cat(pred_labels, dim=0)
    acc_score = get_acc_score(true_labels, pred_labels)
    return np.mean(all_loss), acc_score

# 测试
def test(model_path, test_data_path):
    test_dataset = MultiClsDataSet(test_data_path, max_len=max_len, label2idx_path=label2idx_path)
    test_dataloader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
    model = BertMultiLabelCls(hidden_size=hidden_size, class_num=class_num)
    model.load_state_dict(torch.load(model_path))
    model.to(device)
    # 切换成评估模式
    model.eval()
    true_labels = []
    pred_labels = []
    with torch.no_grad():
        for i, batch in enumerate(test_dataloader):
            input_ids, attention_mask, token_type_ids, labels = [d.to(device) for d in batch]
            logits = model(input_ids=input_ids, attention_mask=attention_mask, token_type_ids=token_type_ids)
            true_labels.append(labels)
            pred_labels.append(logits)
    true_labels = torch.cat(true_labels, dim=0)
    pred_labels = torch.cat(pred_labels, dim=0)
    acc_score = get_acc_score(true_labels, pred_labels)
    return acc_score


if __name__ == '__main__':
    train()

在上面的代码中,可以看到很多熟悉的参数。譬如epochs、batch_size、max_len、hidden_size——这些参数一般在配置文件config中毕竟常见,而且都是有默认值。以chatglm3-6b的配置文件为例:

{
  "_name_or_path": "THUDM/chatglm-6b",
  "architectures": [
    "ChatGLMModel"
  ],
  "bos_token_id": 130004,
  "eos_token_id": 130005,
  "mask_token_id": 130000,
  "gmask_token_id": 130001,
  "pad_token_id": 3,
  "hidden_size": 4096,
  "inner_hidden_size": 16384,
  "layernorm_epsilon": 1e-05,
  "max_sequence_length": 2048,
  "model_type": "chatglm",
  "num_attention_heads": 32,
  "num_layers": 28,
  "position_encoding_2d": true,
  "torch_dtype": "float16",
  "use_cache": true,
  "vocab_size": 130528
}

在每个batch的训练中,其流程是这样的:

  1. 清空梯度
  2. 获取实际的标签
  3. 通过预训练模型输出预测值
  4. 基于二分类交叉熵损失函数,计算实际值与预测值的损失
  5. 将损失反向传播
  6. 更新梯度

严格来说,多分类任务应该用对应的损失函数,譬如CrossEntropyLoss或者NLLLoss( Negative Log Likelihood Loss)。这两个损失函数都是为多分类问题设计的,CrossEntropyLoss是更为常用的选择。

不过这里用二分类交叉熵损失函数也可以,即将多分类问题转化为多个二分类问题。所以在模型的定义中,使用了Sigmode函数。

预测

推理预测的代码如下:

# -*- coding: utf-8 -*-

import torch
from data_preprocess import load_json
from bert_multilabel_cls import BertMultiLabelCls
from transformers import BertTokenizer

hidden_size = 768
class_num = 3
label2idx_path = "./data/label2idx.json"
save_model_path = "./model/multi_label_cls.pth"
label2idx = load_json(label2idx_path)
idx2label = {idx: label for label, idx in label2idx.items()}
device = "cuda" if torch.cuda.is_available() else "cpu"
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
max_len = 128

model = BertMultiLabelCls(hidden_size=hidden_size, class_num=class_num)
model.load_state_dict(torch.load(save_model_path))
model.to(device)
# 切换评估模式
model.eval()

def predict(texts):
    # 加载分词器分词
    outputs = tokenizer(texts, return_tensors="pt", max_length=max_len,
                        padding=True, truncation=True)
    # 加载模型
    logits = model(outputs["input_ids"].to(device),
                   outputs["attention_mask"].to(device),
                   outputs["token_type_ids"].to(device))
    logits = logits.cpu().tolist()
    # print(logits)
    result = []
    for sample in logits:
        pred_label = []
        for idx, logit in enumerate(sample):
            if logit > 0.5:
                pred_label.append(idx2label[idx])
        result.append(pred_label)
    return result


if __name__ == '__main__':
    texts = ["中超-德尔加多扳平郭田雨绝杀 泰山2-1逆转亚泰", "今日沪深两市指数整体呈现震荡调整格局"]
    result = predict(texts)
    print(result)

推理预测的对象是用户,这个流程一般就两个:分词器、模型。分词器会将输入文本处理后输出各种维度的数据,并将其作为模型的输入,最终返回分类的概率分布。

总结

从上面来看,所谓基于预训练大模型来做解决方案,总的来说就是接入大模型,利用大模型已有的泛化能力,训练/微调出一个"领域任务",使其在某个任务上更具有领域性与专业性。

归根来说,其流程就是神经网络模型建模与训练的过程:在基座大模型的基础上,再次训练了一个多分类任务的神经网络模型,以满足特定任务的需要;但模型的基本信息,都是基于基座大模型的。

如果对这里不了解的话,建议可以先去看看神经网络模型的建模与训练推理流程——基于Pytorch建模一个简单的神经网络模型,再做训练与推理;与这里面的流程做一个比对。

​

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

多标签分类(三): Multi-Label Image Recognition with Graph Convolutional Networks 基于卷积网络的多标签图像识别 摘要   多标签图像识别的任务是预测图像中出现的一组目标标签。由于目标通常同时出现在图像中,为了提高识别性能,需要对标签依赖进行建模。为了捕获和探索这种重要的依赖关系,我们提出了一种基于图卷积网络(Graph Convolutional Network GCN)的多标签分类模型。该模型在对象标签上构建了一个有向图,其中每个节点(标签)用标签的单词嵌入表示,GCN学习了如何将这个标签图映射到一组相互依赖的对象分类器中,这些分类器应用于由另一子网提取出来的图像描述符,使整个网络具有 阅读详情

相关推荐

多标签学习模型(一):Multi Label Knn

1.什么是多标签分类问题 2.传统的KNN算法 3.为什么传统的KNN算法不能够处理多标签问题 4.ML KNN的推导 5.ML KNN是如何解决多标签问题的 6.总结

weixin_42892235的博客 2606

【机器学习】多标签分类怎么做?(Python)

一、基本介绍首先简单介绍下,多标签分类与多分类、多任务学习的关系:多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类多标签学习(Multi-label ):对于每一个样本可能有多个类别(标签)的任务,不像多分类任务...

fengdu78的博客 4866

BERT 相关介绍以及EMLo、transformer等模型简介

翻译自:Blog of Jay Alammar;http://jalammar.github.io/illustrated-bert/ ;翻译的同时增加了部分修改以及注解。 介绍 2018年是机器学习文本处理领域(或者更准确地说,是自然语言处理或简称为NLP)的一个转折点。我们对如何以最佳方式(能够最好地捕捉潜在的含义和关系)表示单词和句子正在迅速发展。此外,NLP社区已经提出了非常强大的组件,您...

hjzgj263446的博客 1525

BERT如何做分类任务

BERT(Bidirectional Encoder Representations from Transformers)是一种用于自然语言处理任务的神经网络模型,它可以用于分类任务。 对于分类任务,BERT可以在输入文本之后添加一个分类层,然后训练模型来预测输入文本属于哪一类。 举个例子,假设我们要对一些新闻文本进行分类,分为“体育”、“娱乐”、“政治”三类。我们可以使用BERT将新闻文本编码为...

weixin_35754962的博客 1174

Transformer模型在法律AI中的应用:从BERT理解到GPT生成

自然语言处理(NLP)领域的Transformer架构,凭借其核心的注意力机制,彻底改变了机器理解人类语言的方式。该机制通过全局关联建模,使模型能够捕捉文本中的长程依赖和深层语义,为处理复杂、严谨的专业文本提供了技术基础。在工程实践中,Transformer的价值在于能够解决传统方法难以应对的上下文依赖和逻辑结构分析问题,尤其在需要高度精确性和逻辑性的场景中表现突出。在法律科技领域,这种能力被应用于合同审阅、法律检索和文书生成等核心任务,通过领域自适应预训练和检索增强生成等技术,显著提升了自动化处理的准确性

weixin_26913055的博客 241

MAX96724解串器拨码配置实战:从COAX/GMSL2模式到IIC地址设定

本文详细解析了MAX96724解串器的拨码配置方法,涵盖电源管理模式、I2C地址设定及COAX/GMSL2视频传输模式。通过实战案例和故障排查技巧,帮助工程师快速掌握xcDeserializer4.0版本的配置要点,避免常见错误,提升车载摄像头和工业视觉系统的调试效率。

weixin_29243279的博客 577

基于BERT文本分割的Java面试题智能解析与分类实战

本文介绍了如何在星图GPU平台上自动化部署BERT文本分割-中文-通用领域镜像,实现Java面试题的智能解析与分类。该方案利用模型的语义理解能力,自动识别题目中的核心知识点(如JVM、多线程),从而将海量非结构化面试题高效归类,便于快速检索和组卷,显著提升题库管理效率。

weixin_33240461的博客 276

Windows版MySQL8.4.2LTS解压直用(下载免安装-绿色-项目打包直接使用-含卸载)

安装前运行微软常用运行库全集(也可能称为依赖)关于MySQL8中相关参数配置,可通过。选择8.5.2LTS长期服务版。选中密码,右键会直接复制。

xzzteach的博客 1440

bert-base-chinese在舆情监测中的应用:快速实现文本情感分析与分类

本文介绍了如何在星图GPU平台上自动化部署bert-base-chinese预训练模型,快速构建中文文本情感分析系统。该模型经过微调后,可高效应用于电商评论、社交媒体等场景的舆情监测,自动识别用户评论的情感倾向(正面/负面),助力企业实时把握用户反馈与市场动态。

weixin_35732273的博客 139

Arduino安装图文教程:小白也能轻松上手

手把手带你完成Arduino安装全过程,无论你是编程新手还是硬件小白,都能快速搭建开发环境。结合arduino安装教程与实操步骤,避开常见错误,让创作即刻启程。

weixin_35509395的博客 1107

西门子S7-1500 PLC模块化编程与生产线自动化实践

PLC(可编程逻辑控制器)作为工业自动化核心设备,其模块化编程技术能显著提升产线控制系统的开发效率。通过SCL高级语言实现算法封装、功能块(FB)复用等工程实践,可构建稳定可靠的分层式控制架构。本文以西门子TIA Portal平台为例,详解S7-1500系列PLC在汽车零部件产线中的标准化应用方案,包含配方管理、设备联动等典型场景的SCL实现,以及Profinet通信、虚拟轴同步等进阶技巧。特别适用于需要快速实施中大型生产线自动化改造的工程师,提供经过验证的异常处理机制和模块化设计规范。

weixin_34341229的博客 457

StructBERT情感分类模型多任务学习实践

本文介绍了如何在星图GPU平台上自动化部署StructBERT情感分类-中文-通用-base镜像,实现多任务情感分析。该镜像能够同时处理情感倾向判断、情感强度分类和方面提取等任务,典型应用于电商评论的自动化情感解析,提升内容理解效率与一致性。

weixin_32673065的博客 249

运维与软件实施课表

运维与软件实施课表 课程 章节编号 章节 课程地址 软件及操作系统基础 ch01 软件及操作系统基础01 实施、运维工程师基本技能:https://blog.youkuaiyun.com/qq_28189423/article/details/82700539 老毛桃制作winPE镜像:https://blog.youkuaiyun.com/qq_2818942...

Mr.O~的博客 1万+

利用NLP-StructBERT构建智能邮件分类与归档系统

本文介绍了如何利用星图GPU平台,自动化部署nlp_structbert_sentence-similarity_chinese-large镜像,快速构建智能邮件处理系统。该系统能深度理解邮件语义,实现精准的自动分类与归档,有效提升邮件处理效率,是智能办公的典型应用。

weixin_28999139的博客 24

YOLO11改进策略【独家融合改进】| RCSOSA + SPD + WFU

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。WFU模块通过小波变换的频率分解与跨尺度融合机制,解决了传统上采样过程中的混叠和细节丢失问题,实现了高效、高保真的面部细节重建。

Limiiiing的博客 449

从代码仓库到知识库:自动化构建与RAG技术实践

在软件工程领域,代码库的规模与复杂性日益增长,如何高效管理和利用其中的知识成为关键挑战。传统文档工具主要依赖注释提取API信息,而现代知识构建技术则通过抽象语法树(AST)解析、自然语言处理等手段,深入理解代码结构、调用关系和业务逻辑。其核心价值在于将非结构化代码转化为机器可理解、可检索的结构化知识,显著提升代码资产的可维护性和团队协作效率。这一过程通常涉及代码解析、信息提取、向量化表示和存储索引四个关键阶段,其中向量化技术将代码语义转化为高维向量,为语义搜索奠定基础。结合检索增强生成(RAG)架构,开发者

weixin_42545292的博客 415

PyTorch 常见的损失函数:从基础到大模型的应用

揭秘一下 GPT、BERT、LLaMA 等大模型用的是哪些损失函数。

阿正的梦工坊 2249

宇树科技嵌入式面试题及参考答案(春晚机器人的公司)

内存对齐是指在内存中为数据对象分配存储空间时,按照一定的规则将数据存储在特定的地址上,以提高内存访问效率。不同的数据类型在内存中都有其特定的对齐要求,例如,int类型通常要求 4 字节对齐,double类型通常要求 8 字节对齐。这意味着数据的存储地址必须是其对齐字节数的整数倍。如果不进行内存对齐,处理器在访问数据时可能需要进行多次内存访问,从而降低了访问效率。指令可以用于控制结构体内存布局,它允许程序员指定结构体成员的对齐方式。其基本用法是在结构体定义之前使用来指定对齐字节数n,其中n。

大模型大数据攻城狮的专栏 3226

如何与机器愉快地聊聊天(一) :飞桨对话通用理解模型DGU详解

导读:人机对话是人工智能的重要挑战,近几年随着人工智能的兴起,人机对话系统的研究也越来越火热。为了帮助广大开发者们更快捷地实现对话系统的开发,飞桨在自然语言处理模型库(P...

PaddlePaddle 658

Statistics and Machine Learning Toolbox

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

AI应用安全护栏:从原理到实践,构建大模型内容安全防线

在自然语言处理(NLP)与人工智能应用开发领域,内容安全与风险控制是保障系统可靠运行的核心技术。其基本原理在于通过语义理解模型对输入输出文本进行多维度实时分析,识别潜在风险。这项技术的核心价值在于为AI应用提供主动防御能力,防止生成有害内容、抵御恶意攻击,并确保数据隐私合规。在实际应用场景中,无论是智能客服、内容生成平台还是对话式AI产品,都需要构建涵盖输入检测、输出过滤与行为分析的多层防护体系。本文聚焦于**AI安全护栏**的设计与实现,深入探讨如何通过**提示词攻击**防御、敏感信息识别与分级处置策略,

weixin_34197488的博客 394

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

AISTATS2018|密歇根大学提出新型在线boosting算法用于多标签排序(已开源)

Online Boosting Algorithms for Multi-label RankingYoung Hun Jung, Ambuj TewariUniversity of M...

hestendelin的专栏 660

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

boosting算法_AISTATS2018|密歇根大学提出新型在线boosting算法用于多标签排序(已开源)...

Online Boosting Algorithms for Multi-label RankingYoung Hun Jung, Ambuj TewariUniversity of Michiganhttp://proceedings.mlr.press/v84/jung18a/jung18a.pdf这篇文章主要讨论多标签排序。Boosting是一种比较适合多标签排序的方法,它能够通过...

weixin_39622628的博客 212

Stable-Diffusion-V1-5 安全与合规部署:防范恶意提示词与不当内容生成

本文介绍了在星图GPU平台上自动化部署stable-diffusion-v1-5-archive镜像,并构建多层安全防护体系的重要性。通过关键词过滤、AI意图分类及图像安全检测三道防线,有效防范恶意提示词与不当内容生成,确保AI图片生成服务在合规前提下稳定运行,适用于需要安全可控的内容创作场景。

weixin_36464343的博客 143
上一篇: 一文讲明白初学者怎么入门大语言模型(LLM)?
下一篇: 基于transformer一步一步训练一个多标签文本分类的BERT模型
少喝冰美式
博客等级 码龄3年 6839粉丝 517原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值