Transformer模型实战篇

引入

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

其中对于这个+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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值