Tech Explorer Logo

搜索内容

自然语言处理新宠——ModernBERT 剖析

8 min read
Cover image for 自然语言处理新宠——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

相关资源链接:

Share

更多文章