ModernBERT 发布说明
ModernBERT 是一系列新的仅编码器模型,旨在作为 BERT 类模型的插槽内替代品。它在速度和准确性方面相较于之前的编码器提供了帕累托改进,具有 8,192 个标记的序列长度,并在其训练数据中融入了大量代码。
模型变体和可用性
ModernBERT 提供两种规格:
- Base:1.49 亿参数
- Large:3.95 亿参数
这些模型已集成到 transformers v4.48.0。为了达到最高效率,开发者建议将 ModernBERT 与 Flash Attention 2 一起使用。与早期的 BERT 模型不同,ModernBERT 不使用 token type IDs。
性能和效率
ModernBERT 在检索、自然语言理解和代码检索任务中优于之前的编码器模型。
基准测试
- Accuracy:ModernBERT 是首个在 GLUE 上击败 DeBERTaV3 的 base-size 模型,同时使用的内存不到 DeBERTa 的五分之一。
- Speed:对于混合长度输入,其速度最高可达 DeBERTa 的 4 倍;在长上下文推理方面,它比 NomicBERT 和 GTE-en-MLM 等高质量模型快近 3 倍。
- Context Length:凭借 8,192 个标记的上下文窗口,ModernBERT 的容量比大多数现有编码器大超过 16 倍,显著提升了 RAG 流水线和长上下文检索的性能。
- Code Retrieval:ModernBERT 是首个在大规模代码数据上训练的编码器模型,在 StackOverflow-QA (SQA) 数据集上的得分超过 80。
硬件效率
在 NVIDIA RTX 4090 GPU 上进行测试,ModernBERT 对变长输入展现出卓越的效率。它避免了对 xformers 的重度依赖,仅需 Flash Attention。其设计允许使用更大的批次大小,使能够在更小、更便宜的 GPU 上部署,或直接在浏览器和手机上运行。
技术架构
ModernBERT 通过融合最近大型语言模型(LLM)研究的进展,更新了经典的 Transformer 架构,具体而言,它从 Transformer++ 中汲取了灵感。
架构改进
- Rotary Positional Embeddings (RoPE):取代旧的位置编码,以提升相对词义理解并实现对更长序列的缩放。
- GeGLU Layers:取代标准 MLP 层,以改进原始 GeLU 激活函数。
- Symmetry and Stability:架构移除了不必要的偏置项,并在嵌入后添加了额外的归一化层以稳定训练。
效率机制
- Alternating Attention:为了降低计算复杂度,ModernBERT 每三层仅使用一次全局注意力(关注完整输入);其他层使用滑动窗口为 128 个标记的局部注意力。
- Unpadding and Sequence Packing:ModernBERT 移除填充标记并将序列连接成小批次,以消除浪费的计算。此实现利用 Flash Attention 的 RoPE 支持,相比之前的未填充方法实现了 10-20% 的加速。
- Hardware-Aware Design:通过网格搜索优化模型维度,以适应常见的推理 GPU(RTX 3090/4090、A10、T4、L4),同时保持与 BERT 兼容的嵌入大小(base 为 768,large 为 1024)。
训练过程
ModernBERT 在来自多样化英文来源的 2 万亿个标记上进行了训练,包括网页文档、科学文章和代码,减少了对旧编码器中常见的重复数据的依赖。
训练阶段
- 初始阶段:在序列长度为 1,024 的 1.7 万亿个标记上进行训练。
- 长上下文适应:在序列长度为 8,192 的 2500 亿个标记上进行训练。
- 退火:最终阶段使用基于 ProLong 的采样混合进行 500 亿个标记的训练。
训练优化
- 掩码率:从 15% 提高到 30%。
- 目标:移除下一句预测(NSP)目标以减少开销。
- 批次大小预热:逐步增加批次大小以加速初始学习。
- 权重平铺:ModernBERT-Large 通过将 ModernBERT-Base 的权重进行平铺来初始化,而不是使用随机初始化,这提高了训练速度和性能。