引入
基于Transformers的NLP解决方案的步骤如下:(以文本分类为例)
- 导入相关包,General,可以询问ai需要导什么包
- 加载数据集,Data_loader,Datasets
- 数据集划分,测试机,验证集,训练集,Datasets
- 数据集预处理,处理空的部分,Tokenizer+Datasets
- 创建模型,Model
- 设置评估函数,可以去hugging face上查看这个相应的评估指标有哪些,Evaluate
- 配置训练参数,训练批次,输出大小,日志打印频率,Training Argument
- 创建训练器,Trainer+Data Collator
- 模型训练,评估,预测,Trainer
- 如果只是想要用模型进行预测使用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表示一个词单独形成一个
命名实体

评估指标
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

最低0.47元/天 解锁文章
716

被折叠的 条评论
为什么被折叠?



