language: zh
thumbnail:
license: mit
tags:
datasets:
- 斯坦福问答数据集(SQuAD)
metrics:
- 斯坦福问答数据集(SQuAD)
widget:
- text: "埃菲尔铁塔位于哪里?"
context: "埃菲尔铁塔是位于法国巴黎战神广场的一座锻铁格子塔,以工程师古斯塔夫·埃菲尔命名,其公司设计并建造了该塔。"
- text: "弗雷德里克·肖邦是谁?"
context: "弗雷德里克·弗朗索瓦·肖邦(1810年3月1日-1849年10月17日),原名弗里德里克·弗朗齐歇克·肖邦,是浪漫主义时期的波兰作曲家和钢琴演奏大师,主要为独奏钢琴创作。"
基于BERT-base无大小写模型在SQuAD v1上的微调
此模型使用nn_pruning Python库创建:线性层保留了原有权重的36.0%。
总体而言,该模型保留了**50.0%**的原始权重(嵌入层占模型重要部分,且此方法未对其进行剪枝)。
通过简单调整线性矩阵大小,其在评估时运行速度达到密集模型的1.84倍。这得益于剪枝方法生成的结构化矩阵:悬停下方图表可查看各矩阵非零/零部分分布。
准确率方面,其F1值为88.72,相比密集版的88.5,F1提升了0.22。
精细剪枝细节
本模型基于HuggingFace模型检查点在SQuAD1.1上微调,并从模型csarron/bert-base-uncased-squad-v1蒸馏得到。该模型不区分大小写:对"english"和"English"处理无差异。
块剪枝的副作用是部分注意力头被完全移除:144个注意力头中移除了48个(33.3%)。下图展示了剪枝后网络中剩余注意力头的详细分布。
SQuAD1.1数据集详情
数据集 |
划分 |
样本数 |
SQuAD1.1 |
训练集 |
90.6K |
SQuAD1.1 |
评估集 |
11.1K |
微调环境
CPU: Intel(R) Core(TM) i7-6700K
内存: 64 GiB
GPU: 1块GeForce GTX 3090,24GiB显存
显卡驱动: 455.23.05, CUDA: 11.1
性能结果
PyTorch模型文件大小:379MB
(原始BERT:420MB
)
指标 |
当前值 |
原始值(文献表2) |
变化量 |
EM |
81.69 |
80.8 |
+0.89 |
F1 |
88.72 |
88.5 |
+0.22 |
使用示例
安装nn_pruning(包含优化脚本,能通过移除空行/列来压缩线性层):
pip install nn_pruning
随后可近乎常规地使用transformers
库,只需在加载管道后调用optimize_model
:
from transformers import pipeline
from nn_pruning.inference_model_patcher import optimize_model
qa_pipeline = pipeline(
"question-answering",
model="madlag/bert-base-uncased-squadv1-x1.84-f88.7-d36-hybrid-filled-v1",
tokenizer="madlag/bert-base-uncased-squadv1-x1.84-f88.7-d36-hybrid-filled-v1"
)
print("初始参数:218.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': "弗雷德里克·弗朗索瓦·肖邦(1810年3月1日-1849年10月17日),原名弗里德里克·弗朗齐歇克·肖邦,是浪漫主义时期的波兰作曲家和钢琴演奏大师,主要为独奏钢琴创作。",
'question': "弗雷德里克·肖邦是谁?",
})
print("预测结果", predictions)