【深度学习1】ModernBert学习
ModernBERT 是一系列最先进的encoder-only模型,全面超越了旧一代BERT模型,在各个方面都有所改进,支持8192的token长度(原始bert512),下游性能更好,处理速度也更快。
1.1 模型结构设计的优化
(a)架构的优化:
Modern Transformer:
(1)偏差项的禁用(bias terms),禁用所有线性层偏差项,除了解码器的最后一层线性层。禁用所有Layer Norms的偏差项。(将更多的计算资源节约至线性层)(2)位置编码的选择:采用旋转位置编码(Rotary positional embeddings,RoPE),而不是绝对位置编码。RoPE在长-短语境语言模型中有更好的表现。(3)归一化(Noemalization,有助于稳定训练)。采用预归一化模块(pre-normalization block)和标准层归一化(standard layer normalizaiton)。在embedding层后添加一个layerNorm,并移除第一个注意力层的第一个layerNorm。(4)激活函数。使用GeGLU激活函数,基于门控线性单元(Gated-LInear Units,GLU)对原始bert激活函数GeLU的改进。
(b)效率的优化
(1)交替注意力机制。采用全局注意力和局部注意力交替堆叠,每个第三层采用全局注意力,其余层使用128个token长的滑动窗口的局部注意力。全局注意力每个token慧珠其它所有token,局部注意力token只关注当前滑动窗口中的token。(2)不再填充(unpadding)。在训练推理过程中均不对token进行填充补齐。将过短的token补齐存在浪费计算资源。modernbert移除padding,将小批量的所有sequence合并为一个sequence,将其作为一个batch处理。采用flash attention的可变长度注意力机制(jagged attention mask)和旋转位置编码实现。(3)flash attention。全局注意力使用flash attention v3,局部注意力使用flash attention v2.
训练出ModernBERT-base和ModernBERT-Large两个模型
layers | 参数量 | hidden size | GLU | expansion |
---|---|---|---|---|
ModernBERT-base | 22层 | 149M | 768 | 2304 |
ModernBERT-Large | 28层 | 395M | 2304 | 5248 |
1.2 训练
(a)数据处理
(1)数据。2万亿以英文为主的网络文档、代码和科学文献。
(2)分词器。采用现代的BPE分词器(OLMo),并保留原始bert的特殊标记(【CLS】、【SEP】等),词汇表大小50368,是64的倍数,并包含83个未使用的toekn以供下游任务应用。
(3)sequence packing的应用。解决未填充的数据中出现高方差。
(b)训练设置
(1)移除【下一句预测】预训练任务。
(2)采用StableAdamW优化器。对每个参数都进行学习率的调整。
(3)学习率的调整。采用Warmup-Stable-Decay。梯形调度经过短暂的LR热启动,然后保持一段时间的学习旅恒定,在进行短暂衰减。衰减采用1-sqrt衰减。
(4)batchsize。采用不固定的batchsize设置,确保不同batchsize有相同数量的更新步骤,可提高训练效率。从小批量逐渐增加至全局。
ModernBERT-base:将batchsize从768提升至4608(基于500亿个token)
ModernBERT-large:将batchsize从448提升至4928(基于100亿个token)
(5)权重的初始化和tiling(平铺)。采用Megetron初始化方法。
(6)文本长度的拓展。对1.7万亿tokens进行训练,序列长度为1024,RoPE参数为10000后,将全局注意力层的RoPE参数提升至160000,将Modernbert的上下文长度拓展到8192个token,并继续训练3000亿个tokens。
(c)下游任务的评估
与多个大语言模型在多个任务上进行性能对比,包括自然语言理解(NLU),文本检索(Single vector retrieval、Multi vector retrieval)、长上下文检索、Code Retrieval
github链接:https://github.com/AnswerDotAI/ModernBERT