自然语言处理新宠——ModernBERT 剖析
引言
在自然语言处理(NLP)的漫长发展进程中,模型的迭代与创新始终是推动行业前进的核心动力。2018 年横空出世的 BERT 模型,无疑是该领域的一座重要里程碑,其在诸多自然语言处理任务中展现出的强大能力,为后续研究奠定了坚实基础。然而,科技的浪潮永不停歇,历经六年的沉淀与发展,ModernBERT 应运而生,宛如一颗璀璨的新星,在 NLP 苍穹中闪耀着独特光芒,为这一充满活力的领域注入了全新的活力与无限可能。 ModernBERT 作为仅编码器模型的杰出代表,其家族成员涵盖了 139M 参数的基础版和 395M 参数的大型版。这种参数规模的设计,在保证模型性能的同时,兼顾了模型的灵活性与适用性。相较于 BERT 及其同类模型,ModernBERT 在速度和准确性方面实现了令人瞩目的帕累托改进。在实际应用场景中,这一优势体现得淋漓尽致。以信息检索任务为例,在处理大规模文本数据时,ModernBERT 能够迅速筛选出与用户查询高度相关的文本片段,其响应速度相较于传统模型有了显著提升,大大缩短了用户获取信息的时间成本。在文本分类任务中,无论是对新闻文章的主题分类,还是对社交媒体文本的情感分析,ModernBERT 都能以更高的准确率精准判别,为企业和研究机构提供更可靠的数据洞察。在 transformers 库的应用方面,v4.48.0 版本前需从 main 安装,其作为掩码语言模型,可通过便捷的 fill - mask 管道或 AutoModelForMaskedLM 进行加载。在下游任务中,对其进行微调并结合 Flash Attention 2 在支持的 GPU 上使用,能够充分挖掘模型潜力,大幅提升处理效率,使得模型在实际业务流程中能够高效运行,满足企业对于实时性和准确性的双重需求。
模型对比
对比维度 | 解码器模型(如 GPT、Llama、Claude) | 编码器模型(如 BERT) | ModernBERT |
---|---|---|---|
模型体积 | 通常较大,如 Llama 可达 405B | 相对较小,BERT 有一定规模但小于部分解码器模型 | 基础版 139M、大型版 395M,较为精简 |
速度 | 较慢,常需等待几秒获取 API 回复 | 较快,在检索和分类任务表现良好 | 在 NVIDIA RTX 4090 上对可变长度输入比其他模型快,长上下文输入比次快模型快 2 - 3 倍 |
隐私性与成本 | 隐私保护难度较大,成本高昂,复制复杂 | 成本较低,推理成本有优势 | 成本效益高,可在小且便宜的 GPU 上有效使用 |
应用场景 | 生成艺术、交互式聊天等 | 检索、分类、实体提取等 | 在检索、自然语言理解和代码检索等任务表现优异,涵盖传统 NLU 场景及代码领域 |
标准学术基准测试
在标准学术基准测试中,ModernBERT 成绩亮眼。在 GLUE 任务上击败 DeBERTaV3,内存使用少且速度快,其 8192 的上下文长度远超现有编码器,在代码检索任务上更是独具优势。
模型架构改进
ModernBERT 架构改进显著。采用旋转位置嵌入(RoPE)取代旧位置编码、GeGLU 层替换旧 MLP 层等,去除不必要偏差项并添加归一化层。在效率提升上,交替注意力机制(每 3 层一次全局注意力,其余用滑动窗口局部注意力)、去除填充和序列打包及硬件感知设计等发挥关键作用。训练数据基于 2 万亿个来自网页文档、代码、科学文章等的标记,提升了多样性,还优化了训练目标与过程。
总之,ModernBERT 凭借诸多优势展现出强大潜力,期待其在未来为 NLP 领域带来更多突破与创新应用。
快速使用
在 transformers v4.48.0 版本正式发布之前,需要从 main 分支安装:
pip install git+https://github.com/huggingface/transformers.git
由于 ModernBERT 是掩码语言模型(MLM),你可以使用 fill-mask
pipeline 或通过 AutoModelForMaskedLM
加载它。
⚠️ 如果你的 GPU 支持,我们建议使用 Flash Attention 2 来获得最高效率。安装方法如下:
pip install flash-attn
使用 AutoModelForMaskedLM
:
from transformers import AutoTokenizer, AutoModelForMaskedLM
model_id = "answerdotai/ModernBERT-base"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForMaskedLM.from_pretrained(model_id)
text = "人工智能的未来是[MASK]。"
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)
# 获取掩码位置的预测
masked_index = inputs["input_ids"][0].tolist().index(tokenizer.mask_token_id)
predicted_token_id = outputs.logits[0, masked_index].argmax(axis=-1)
predicted_token = tokenizer.decode(predicted_token_id)
print("预测词:", predicted_token)
使用 pipeline:
import torch
from transformers import pipeline
from pprint import pprint
pipe = pipeline(
"fill-mask",
model="answerdotai/ModernBERT-base",
torch_dtype=torch.bfloat16,
)
input_text = "深度学习正在[MASK]发展。"
results = pipe(input_text)
pprint(results)
注意: ModernBERT 不使用 token type IDs,这与早期的 BERT 模型不同。在 Hugging Face Hub 上的大多数下游使用方式与标准 BERT 模型相同,只是可以省略 token_type_ids
参数。
模型微调
ModernBERT 支持使用 ms-swift 框架进行高效微调。ms-swift 是魔搭社区官方提供的大模型与多模态大模型微调部署框架。
环境准备
首先克隆并安装 ms-swift:
git clone https://github.com/modelscope/ms-swift.git
cd ms-swift
pip install -e .[llm]
微调示例
以下是使用 HC3 数据集进行分类任务微调的示例脚本:
CUDA_VISIBLE_DEVICES=0 \
swift sft \
--model answerdotai/ModernBERT-base \
--dataset simpleai/HC3:finance_cls#20000 \
--task_type seq_cls \
--num_labels 2 \
--train_type lora \
--torch_dtype bfloat16 \
--num_train_epochs 1 \
--per_device_train_batch_size 16 \
--per_device_eval_batch_size 16 \
--learning_rate 1e-4 \
--lora_rank 8 \
--lora_alpha 32 \
--target_modules all-linear \
--freeze_vit true \
--gradient_accumulation_steps 1 \
--eval_steps 100 \
--save_steps 100 \
--save_total_limit 5 \
--logging_steps 5 \
--max_length 2048 \
--output_dir output \
--warmup_ratio 0.05 \
--dataloader_num_workers 4
相关资源链接: