引入

基于Transformers的NLP解决方案的步骤如下:(以文本分类为例)

  1. 导入相关包,General,可以询问ai需要导什么包
  2. 加载数据集,Data_loader,Datasets
  3. 数据集划分,测试机,验证集,训练集,Datasets
  4. 数据集预处理,处理空的部分,Tokenizer+Datasets
  5. 创建模型,Model
  6. 设置评估函数,可以去hugging face上查看这个相应的评估指标有哪些,Evaluate
  7. 配置训练参数,训练批次,输出大小,日志打印频率,Training Argument
  8. 创建训练器,Trainer+Data Collator
  9. 模型训练,评估,预测,Trainer
  10. 如果只是想要用模型进行预测使用pipeline即可,不用子啊设置评估和训练函数了。Pipeline

显存优化分析

显存占用分析
  • 模型权重

    • 4Bytes*模型参数(因为每一个参数都是32bit的)
  • 优化器状态

    • 8Bytes*模型参数量,对于常用的AdamW优化器而言
  • 梯度

    • 4Bytes*模型参数量
  • 前向激活值

    • 取决于序列长度,隐层额外i都,Batch大小等多个因素
显存优化策略

使用hfl/chinese-macbert-large,330M进行测试

优化策略优化对象显存占用训练时间
Baseline(BS 32 ,MaxLength 128)-15.2G64s
+Gradient Accumulation (BS 1, GA 32)
gradient_accumulation_steps=32 梯度累加
前向激活值,一次只计算一个批次是数据,为了防止效果变差,我们设置计算32个batch之后才进行参数优化7.4G260s
+Gradient Checkpoints (BS 1, GA 32)
gradient_checkpointing=True梯度检查点
前向激活值 ,训练的过程中会存储很多没必要存储的信息,对于没有存储的激活值,可有在反向传播计算梯度的时候,让它重新计算即可。7.2G422s
+Adafactor Optiomizer(BS 1,GA32)
optim="adafactor" adafactor优化器
优化器状态,默认的adaw优化器占用较大,可以用占用比较小的优化器5.0G406s
+Freeze Model(BS 1,GA32)前向激活值/梯度,冻结一部分参数,只训练分类器部分,模型效果会变差3.5G178s
+DataLength(BS1,GA32,MaxLength64)
在数据集中的maxlength处进行修改
前向激活值,缩短数据长度3.4G126s

其中对于这个+Freeze Model(BS 1,GA32作用就是冻结这个模型的bert部分,只训练这个模型的全连接层部分。

  • 这是因为:
    预训练模型(bert)已经学了很多中文知识,像「词典+语法」。
    我们的任务只是影评情感二分类,不想让它从头再学中文,只想让它学「如何把已掌握的知识转成情感标签」。
    所以把 bert 的大部分权重「冻住」,只训练后面新加的分类层,既省显存省时间,还能防止过拟合。

  • 具体操作

    for name, param in model.bert.named_parameters():param.requires_grad = False
    model.bert 就是原始 BERT 的所有层
    循环把每一层的权重 param 设置成 requires_grad=False → 不再更新(梯度不计算)
    练时只有没被冻结的层(例如你后面接的 classifier 或 pooler)才会更新。
    

实战演练之命名实体识别

命名实体识别任务介绍

介绍

命名实体识别(Named Entity Recognition,简称NER)是指识别文本中具有特定意义的实体,
主要包括人名、地名、机构名、专有名词等。通常包括两部分:
(1)实体边界识别(从哪里到哪里是一个实体);(2)确定实体类别(人名、地名、机构名或其他)

eg 小明在北京上班

实体类别实体
地点北京
人物小明
数据标注体系

常见的数据标注有IOB1、IOB2、IOE1、IOE2、IOBES、BILOU

其中IOB2标注

  • I表示实体内部,,O表示实体外部,B表示实体开始
  • B/I-XXX,XXX表示具体的类别

IOBES标注

  • I或者M表示实体内部,O表示实体外部,B表示实体开始,E表示实体结束,S表示一个词单独形成一个
    命名实体

image

评估指标

Precision,Recall,f1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于Transfromers的解决方案

  • ModelForTokenClassification的源码分析,这个地方看不太懂,先放在这里

评估函数

  • 需要额外安装seqeval

    • pip install seqeval
    • 安装过程中报错Microsoft Visual C++14.0 or greater is required.Getitwith
      "Microsoft C++ Build Tools
    • 进入https://my.visualstudio.com,下载C++buildtools,安装
  • evaluate.load(“seqeval”)

代码实战演练

数据集:peoples_daily_ner

预训练模型:hfl/chinese-macbert-base

代码如下所示:

导入相关包,加载数据集
导包
import evaluate
from datasets import load_dataset
from transformers  import AutoTokenizer,AutoModelForTokenClassification,TrainingArguments,Trainer,DataCollatorForTokenClassification导入训练集
ner_datasets = load_dataset("peoples_daily_ner",cache_dir="./data" ,trust_remote_code=True)
ner_datasets查看训练集第0个数据
ner_datasets["train"][0]
查看训练集数据的特征,包括模型是什么类型的数据,以及数据标注体系
ner_datasets["train"].features获取模型的标注类型
label_list = ner_datasets["train"].features["ner_tags"].feature.names
label_list
数据集预处理

使用模型为:hfl/chinese-macbert-base

由于模型中的tokens是已经划分好了, 直接用tokenizer进行分词的话,它会将每一个划分好的词,当成一个句子
tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-macbert-base")
tokenizer(ner_datasets["train"][0]["tokens"])
我们可以使用is_split_into_words=True 来讲这个不要当成一个句子
tokenizer(ner_datasets["train"][0]["tokens"],is_split_into_words=True)

一个单词可能被 tokenizer 拆成好几块积木(sub-word),我们要保证同一块原单词的每一块积木都贴上同一个标签

返回的字典里多了一组 “word_ids()” 索引,告诉你每块积木属于原列表里的第几个单词。

还有一个问题就是英文中可能会出现分词现象,一个单词被拆分成了多个,所以我们要写代码,进行判断哪些id是属于一个单词的。例如下面这个
res = tokenizer("interesting word")
res就会讲这个interestion划分为id,但是interesting并不是单独一个,而是多个值
res.word_ids(),这个word_ids可以用来判断这些id哪些是一组的。

具体实现如下所示:(这段代码的功能就类似于:给一串已经被切成小积木的乐高贴标签的过程)

假设原始数据如下:

原始 tokens(已分词)ner_tags(标签)
[“我”, “去”, “北京”][O, O, B-LOC]
  • O 表示“不是实体”
  • B-LOC 表示“地点实体的开头”
# 借助word_ids 实现标签映射
def process_function(examples):tokenized_exmaples = tokenizer(examples["tokens"], max_length=128, truncation=True, is_split_into_words=True)labels = []# 遍历这个标签for i, label in enumerate(examples["ner_tags"]):# word_ids() 返回 [None, 0, 1, 2, 2, None],0 → 原词列表第 0 个词“我”,2 → 原词列表第 2 个词“北京”(被拆成两块积木,都标 2)word_ids = tokenized_exmaples.word_ids(batch_index=i)label_ids = []for word_id in word_ids:  # 逐块积木if word_id is None: # [CLS]、[SEP]、PADlabel_ids.append(-100)else:# word_id=0 → 原词0 → label[0]=O# word_id=1 → 原词1 → label[1]=O# word_id=2 → 原词2 → label[2]=B-LOClabel_ids.append(label[word_id])# 执行上述循环后,label_ids = [-100, O, O, B-LOC, B-LOC, -100],实际代码里 O 和 B-LOC 会被替换成数字 id,如 0 和 1labels.append(label_ids)tokenized_exmaples["labels"] = labelsreturn tokenized_exmaplestokenized_datasets = ner_datasets.map(process_function, batched=True)
tokenized_datasets
print(tokenized_datasets["train"][0])
创建评估函数
  • predictions:模型猜的 数字标签 id(一排排学号)

  • labels:真正的 数字标签 id(一排排正确答案学号)

  • label_list:把数字翻译成文字标签的小词典
    例:label_list = [“O”, “B-PER”, “I-PER”, “B-LOC”, “I-LOC”]

    • 其中这个[label_list[p] for p, l in zip(prediction, label) if l != -100]
      1. 取一对 (p, l)
      2. 如果 l 不是 -100(不是特殊符号)
      3. 就把 p 转成文字标签 label_list[p] 存进列表
# seqeval 是专门给序列标注任务打分的裁判,支持 BIO / IOB2 等格式。
seqeval = evaluate.load("seqeval_metric.py")
seqevalimport numpy as np
def eval_metric(pred):predictions, labels = predpredictions = np.argmax(predictions, axis=-1) #每个位置取分数最高的索引,得到“预测标签 id”。# 将id转换为原始的字符串类型的标签true_predictions = [[label_list[p] for p, l in zip(prediction, label) if l != -100]for prediction, label in zip(predictions, labels) ]true_labels = [[label_list[l] for p, l in zip(prediction, label) if l != -100]for prediction, label in zip(predictions, labels) ]result = seqeval.compute(predictions=true_predictions, references=true_labels, mode="strict", scheme="IOB2")return {"f1": result["overall_f1"]}
创建训练器
args = TrainingArguments(output_dir="models_for_ner",per_device_train_batch_size=64,per_device_eval_batch_size=128,eval_strategy="epoch",save_strategy="epoch",metric_for_best_model="f1",load_best_model_at_end=True,logging_steps=50,num_train_epochs=1
)trainer = Trainer(model=model,args=args,tokenizer=tokenizer,train_dataset=tokenized_datasets["train"],eval_dataset=tokenized_datasets["validation"],compute_metrics=eval_metric,data_collator=DataCollatorForTokenClassification(tokenizer=tokenizer)
)
模型训练
trainer.train()
trainer.evaluate(eval_dataset=tokenized_datasets["test"])
模型预测
from transformers import pipeline# 使用pipeline进行推理,要指定id2label
model.config.id2label = {idx: label for idx, label in enumerate(label_list)}
model.config# 如果模型是基于GPU训练的,那么推理时要指定device
# 对于NER任务,可以指定aggregation_strategy为simple,得到具体的实体的结果,而不是token的结果
ner_pipe = pipeline("token-classification", model=model, tokenizer=tokenizer, device=0, aggregation_strategy="simple")res = ner_pipe("小明在北京上班")
res# 根据start和end取实际的结果
ner_result = {}
x = "小明在北京上班"
for r in res:if r["entity_group"] not in ner_result:ner_result[r["entity_group"]] = []ner_result[r["entity_group"]].append(x[r["start"]: r["end"]])ner_result

后续

后续博主讲的课还包括机器阅读理解,多项选择,文本相似度,检索机器人,文本摘要,生成对话机器人等实战演练课程。由于我没有做这些实验的需求,后续的实验演练课程笔记就不再做了。

我只通过这个命名实体的识别来了解这个Transformer模型实验的大致流程即可。后续如果有这些方面的实验需要去做,可以通过继续学习相关视频知识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919672.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919672.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919672.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入(流批【牛批】框架)Flink的机制

flink本身是专注有状态的无限流处理,有限流处理【batch批次】是无限流处理的一中特殊情况!应用场景实时ETL 集成流计算现有的诸多数据通道和SQL灵活的加工能力,对流式数据进行实时清洗、归并和结构化 处理;同时,对离线…

Git 2.15.0 64位安装步骤Windows详细教程从下载到验证(附安装包下载)

一、下载后双击运行 安装包下载:https://pan.quark.cn/s/7200b32a1ecf,找到下载好的文件:​Git-2.15.0-64-bit.exe​双击这个文件,就会弹出安装向导窗口,点 ​​“Next”(下一步)​​ 二、选择…

在职老D渗透日记day23:sqli-labs靶场通关(第29关-31关)http参数过滤

5.29.第29关 http参数过滤 闭合5.29.1.手动注入(1)判断注入类型、注入点闭合(2)有回显,优先用联合查询注入,判读字段数?id1&id2 order by 3 -- ?id1&id2 order by 4 --(3)…

Spring Boot整合Amazon SNS实战:邮件订阅通知系统开发

Spring Boot整合Amazon SNS实战引言配置服务总结新用户可获得高达 200 美元的服务抵扣金 亚马逊云科技新用户可以免费使用亚马逊云科技免费套餐(Amazon Free Tier)。注册即可获得 100 美元的服务抵扣金,在探索关键亚马逊云科技服务时可以再额…

LeetCode_动态规划1

动态规划1.动态规划总结1.1 01背1.1.1 二维数组1.1.2 一维数组1.2 完全背包2.斐波那契数(力扣509)3.爬楼梯(力扣70)4.使用最小花费爬楼梯(力扣746)5.不同路径(力扣62)6.不同路径 II(力扣63)7.整数拆分(力扣343)8.不同的二叉搜索树(力扣96)9.分割等和子集(力扣416)10.最后一块石…

【STM32】HAL库中的实现(九):SPI(串行外设接口)

SPI 接口通信原理 SPI(Serial Peripheral Interface)是全双工主从通信协议,特点是: 信号线功能SCK串行时钟MOSI主设备输出,从设备输入MISO主设备输入,从设备输出CS(NSS)片选信号&am…

Git常用操作大全(附git操作命令)

Git常用操作大全 一、基础配置 1.1 设置用户名和邮箱 git config --global user.name "你的名字" git config --global user.email "你的邮箱"1.2 查看配置 git config --list二、仓库管理 2.1 初始化本地仓库 git init2.2 克隆远程仓库 git clone <仓库…

详解flink table api基础(三)

文章目录1.使用flink的原因&#xff1a;2. Flink支持两种模式&#xff1a;3. flink table api工作原理&#xff1a;4. Flink table api 使用5. select语句&flink table api&#xff1a;6. 使用flink table api 创建table7. 使用flink table api 写流式数据输出到表或sink8.…

Vue2+Vue3前端开发_Day5

参考课程: 【黑马程序员 Vue2Vue3基础入门到实战项目】 [https://www.bilibili.com/video/BV1HV4y1a7n4] ZZHow(ZZHow1024) 自定义指令 基本语法&#xff08;全局 & 局部注册&#xff09; 介绍&#xff1a;自己定义的指令&#xff0c;可以封装一些 DOM 操作&#xff0c…

机器学习--决策树2

目录 第一代裁判&#xff1a;ID3 与信息增益的 “偏爱” 第二代裁判&#xff1a;C4.5 用 “增益率” 找平衡 第三代裁判&#xff1a;CART 的 “基尼指数” 新思路 遇到连续值&#xff1f;先 “砍几刀” 再说 给决策树 “减肥”&#xff1a;剪枝的学问 动手试试&#xff1…

yggjs_react使用教程 v0.1.1

yggjs_react是一个用于快速创建React项目的工具&#xff0c;它集成了Vite、TypeScript、Zustand和React Router等现代前端技术栈&#xff0c;帮助开发者快速搭建高质量的React应用。 快速入门 快速入门部分将指导您如何安装yggjs_react工具、创建新项目并启动开发服务器。 安…

vulhub可用的docker源

这一块不太容易找&#xff0c;我试了好几个源&#xff0c;下面是20250820测试可用源 编辑方法sudo mkdir -p /etc/docker sudo vim /etc/docker/daemon.json 配置内容 [1] {"registry-mirrors" : ["https://docker.registry.cyou", "https://docker-…

基于YOLOv8-SEAttention与LLMs融合的农作物害虫智能诊断与防控决策系统

1. 引言 1.1 研究背景与意义 农作物虫害是制约农业产量与质量的重要因素。据FAO报告&#xff0c;全球每年因病虫害造成的粮食损失高达 20%–40%。传统人工巡查与经验诊断具有时效性差、成本高与专业人才不足等缺陷。近年来&#xff0c;计算机视觉特别是目标检测技术在农业检测…

从零开始构建GraphRAG红楼梦知识图谱问答项目(三)

文章结尾有CSDN官方提供的学长的联系方式&#xff01;&#xff01; 欢迎关注B站从零开始构建一个基于GraphRAG的红楼梦项目 第三集01 搭建后端服务 创建一个python文件server.py 完整源码放到文章最后了。 1.1 graphrag 相关导入 # GraphRAG 相关导入 from graphrag.query.cont…

S32K328(Arm Cortex-M7)适配CmBacktrace错误追踪

CmBacktrace 相当于重写了hard_fault函数&#xff0c;在hard_fault函数里面去分析SCB寄存器的信息和堆栈信息&#xff0c;然后把这些信息打印出来(或者写到flash)&#xff1b;通过使用串口输出产生hard_fault的堆栈信息&#xff0c;然后利用addr2line工具反推出具体的代码执行函…

AI研究引擎的简单技术实现步骤

产品愿景与核心功能 1.1 产品使命 “洞见 Weaver”是一个全栈AI Web应用,旨在将用户的复杂研究问题,通过AI驱动的动态思维导图和结构化报告,转化为一次沉浸式的、可追溯的视觉探索之旅。我们的使命是,将AI复杂的推理过程透明化,将人类的探索直觉与AI的分析能力无缝结合,…

open webui源码分析5-Tools

本文从最简单的时间工具入手&#xff0c;分析Tools相关的代码。一、安装工具git clone https://github.com/open-webui/openapi-servers cd openapi-servers# 进入时间工具目录 cd servers/timepip install -r requirements.txt# 启动服务 uvicorn main:app --host 0.0.0.0 --r…

windows下通过vscode远程调试linux c/cpp程序配置

windows下通过vscode远程调试linux c/cpp程序配置vscode插件配置linux依赖工具安装launch.json配置vscode插件配置 CodeLLDB插件需要提前下载&#xff1a; linux依赖工具安装 sudo apt update sudo apt install cmake clangdlaunch.json配置 {"version": "0…

IDEA报JDK版本问题

解决思路&#xff1a;1.找到配置jdk的IDEA配置位置settings和project structure2.先配置setting3.再修改项目结构

VirtualBox 安装 Ubuntu Server 系统及 Ubuntu 初始配置

文章目录简介VirtualBoxUbuntu Server 简介Ubuntu Server 下载安装 Ubuntu Server首选项配置导入系统镜像配置系统用户配置内存 CPU 虚拟硬盘开始安装 Ubuntu安装完成登录系统配置网络Ubuntu 系统配置安装常用工具安装 SSH设置 root 密码配置 IP 地址&#xff08;推荐自动分配I…