语言: 英语
缩略图:
许可证: MIT
标签:
- 问答
数据集:
- squad
评估指标:
- squad
小部件示例:
- 文本: "埃菲尔铁塔位于哪里?"
上下文: "埃菲尔铁塔是一座位于法国巴黎战神广场的锻铁格子塔,以工程师古斯塔夫·埃菲尔的名字命名,其公司设计并建造了该塔。"
- 文本: "弗雷德里克·肖邦是谁?"
上下文: "弗雷德里克·弗朗索瓦·肖邦(1810年3月1日-1849年10月17日),原名弗里德里克·弗朗齐歇克·肖邦,是浪漫主义时期的波兰作曲家和钢琴演奏家,主要为独奏钢琴创作。"
基于BERT-base uncased模型在SQuAD v1上的微调
此模型使用nn_pruning Python库创建:**线性层保留了原模型26.0%**的权重。
整体而言,该模型保留了**42.0%**的原始权重(嵌入层占模型重要部分且未通过此方法修剪)。
通过简单调整线性矩阵尺寸,其在评估时运行速度达到原模型的2.44倍。这得益于修剪后形成的结构化矩阵:可视化图表中可悬停查看各矩阵非零/零部分分布。
准确率方面,其F1值为87.71,相比原模型的88.5,下降0.79。
精细修剪细节
本模型基于HuggingFace模型检查点在SQuAD1.1上微调,并从模型csarron/bert-base-uncased-squad-v1蒸馏所得。该模型不区分大小写:如english和English视为相同。
块修剪的副作用是部分注意力头被完全移除:144个注意力头中移除了80个(55.6%)。下图展示了修剪后网络中剩余注意力头的分布情况。
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模型文件大小: 355MB
(原BERT模型为420MB
)
指标 |
当前值 |
原论文值(表2) |
差异 |
EM |
80.03 |
80.8 |
-0.77 |
F1 |
87.71 |
88.5 |
-0.79 |
使用示例
安装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-x2.44-f87.7-d26-hybrid-filled-v1",
tokenizer="madlag/bert-base-uncased-squadv1-x2.44-f87.7-d26-hybrid-filled-v1"
)
print("原模型参数: 189.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)