🚀 BERT-base无大小写区分模型在SQuAD v1上的微调
本模型解决了在问答任务中模型推理速度和准确性平衡的问题,通过对BERT模型进行剪枝优化,在保证一定准确率提升的同时,显著提高了推理速度,为问答系统提供了更高效的解决方案。
🚀 快速开始
本模型使用 nn_pruning Python库创建,在使用时需注意相关依赖和优化步骤。
✨ 主要特性
- 权重剪枝:线性层包含原权重的30.0%,整体模型包含原权重的45.0%。
- 激活函数替换:使用ReLU代替GeLU,加快推理速度。
- 速度提升:在评估中运行速度比bert-base-uncased快2.01倍。
- 准确率提升:F1值达到89.19,相比bert-base-uncased提升了0.69。
📦 安装指南
安装nn_pruning库,它包含优化脚本,可通过移除空行/列将线性层打包成更小的层。
pip install nn_pruning
💻 使用示例
基础用法
from transformers import pipeline
from nn_pruning.inference_model_patcher import optimize_model
qa_pipeline = pipeline(
"question-answering",
model="madlag/bert-base-uncased-squadv1-x2.01-f89.2-d30-hybrid-rewind-opt-v1",
tokenizer="madlag/bert-base-uncased-squadv1-x2.01-f89.2-d30-hybrid-rewind-opt-v1"
)
print("bert-base-uncased参数数量: 200.0M")
print(f"参数数量(仅包括注意力头剪枝,不包括前馈层剪枝)={int(qa_pipeline.model.num_parameters() / 1E6)}M")
qa_pipeline.model = optimize_model(qa_pipeline.model, "dense")
print(f"完全优化后的参数数量={int(qa_pipeline.model.num_parameters() / 1E6)}M")
predictions = qa_pipeline({
'context': "Frédéric François Chopin, born Fryderyk Franciszek Chopin (1 March 1810 – 17 October 1849), was a Polish composer and virtuoso pianist of the Romantic era who wrote primarily for solo piano.",
'question': "Who is Frederic Chopin?",
})
print("预测结果", predictions)
📚 详细文档
模型剪枝细节
本模型从HuggingFace的 bert-base-uncased 检查点在 SQuAD1.1 上进行微调,并从 bert-large-uncased-whole-word-masking-finetuned-squad 模型进行蒸馏。模型不区分大小写。
块剪枝的一个副作用是部分注意力头被完全移除,在总共144个头中移除了55个(38.2%)。
SQuAD1.1数据集详情
数据集 |
分割 |
样本数量 |
SQuAD1.1 |
训练集 |
90.6K |
SQuAD1.1 |
评估集 |
11.1k |
微调信息
CPU: Intel(R) Core(TM) i7 - 6700K CPU
内存: 64 GiB
GPU: 1 GeForce GTX 3090,显存24GiB
GPU驱动: 455.23.05,CUDA: 11.1
结果
Pytorch模型文件大小:374MB
(原始BERT:420MB
)
指标 |
值 |
原始值 (表2) |
变化 |
EM |
82.21 |
80.8 |
+1.41 |
F1 |
89.19 |
88.5 |
+0.69 |
🔧 技术细节
本模型使用NoNorms代替LayerNorms,这一特性目前不被Transformers库原生支持,因此必须使用nn_pruning的 optimize_model
函数。同时,模型使用ReLU代替GeLU以加快推理速度,这在Transformers库中是被支持的,并在模型配置中通过 "hidden_act": "relu"
条目标记。剪枝方法使得矩阵具有结构化特征,通过可视化可以看到矩阵的非零/零部分。
📄 许可证
本模型采用MIT许可证。