終於,BERT的替代品來了
TL;DR
這篇博文介紹了ModernBERT,這是一系列最先進的僅編碼器模型,它們在各個方面都比老一代編碼器有所改進,具有8192的序列長度,更好的下游效能和更快的處理速度。
ModernBERT可作為任何BERT類模型的即插即用替代品,提供基礎版(1.49億引數)和大型版(3.95億引數)兩種模型尺寸。
點選檢視如何使用transformers
庫使用這些模型
ModernBERT將包含在transformers
的v4.48.0版本中。在此之前,需要從主分支安裝transformers。
pip install git+https://github.com/huggingface/transformers.git
由於ModernBERT是一個掩碼語言模型(MLM),您可以使用fill-mask
管道或透過AutoModelForMaskedLM
載入它。要將ModernBERT用於分類、檢索或問答等下游任務,請遵循標準的BERT微調方案進行微調。
⚠️ 如果您的GPU支援,我們建議使用Flash Attention 2來達到最高的ModernBERT效率。為此,請按以下方式安裝Flash Attention,然後正常使用模型:
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 = "The capital of France is [MASK]."
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)
# To get predictions for the mask:
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:", predicted_token)
# Predicted token: Paris
使用管道
import torch
from transformers import pipeline
from pprint import pprint
pipe = pipeline(
"fill-mask",
model="answerdotai/ModernBERT-base",
torch_dtype=torch.bfloat16,
)
input_text = "He walked to the [MASK]."
results = pipe(input_text)
pprint(results)
注意:ModernBERT不像一些早期的BERT模型那樣使用令牌型別ID。大多數下游用法與Hugging Face Hub上的標準BERT模型相同,只是您可以省略token_type_ids
引數。
引言
BERT於2018年釋出(在AI年代已是千年以前!),但至今仍被廣泛使用:事實上,它目前是HuggingFace Hub上下載量第二的模型,每月下載量超過6800萬次,僅次於另一個為檢索任務微調的編碼器模型。這是因為其僅編碼器架構使其非常適合日常出現的各種實際問題,例如檢索(如用於RAG)、分類(如內容稽核)和實體提取(如用於隱私和法規遵從)。
終於,6年之後,我們有了替代品!今天,我們Answer.AI和LightOn(以及朋友們!)正在釋出ModernBERT。ModernBERT是一個新的模型系列,在速度和準確性方面均優於BERT及其較年輕的兄弟模型。該模型汲取了近年來大型語言模型(LLM)的數十項進展,並將其應用於BERT風格的模型,包括架構和訓練過程的更新。
我們期望ModernBERT能夠成為僅編碼器模型現在部署的眾多應用中的新標準,例如RAG管道(檢索增強生成)和推薦系統。
除了更快更準確之外,ModernBERT還將上下文長度增加到8k令牌(大多數編碼器只有512),並且是第一個在訓練資料中包含大量程式碼的僅編碼器模型。這些功能開闢了以前透過開放模型無法訪問的新應用領域,例如大規模程式碼搜尋、新的IDE功能以及基於完整文件檢索而非小塊檢索的新型檢索管道。
但是,為了解釋我們到底做了什麼,我們首先回顧一下我們是從哪裡來的。
僅解碼器模型
最近LLM領域引人注目的進展體現在GPT、Llama和Claude等模型上。這些是僅解碼器模型,或者說生成模型。它們生成類人內容的能力使得像生成藝術和互動式聊天這樣的令人驚歎的GenAI應用領域成為可能。這些引人注目的應用吸引了大量投資,資助了蓬勃發展中的研究,並帶來了快速的技術進步。我們所做的,實質上,是將這些進步移植回僅編碼器模型。
為什麼?因為許多實際應用需要一個精簡而高效的模型!而且它不需要是生成模型。
更直白地說,對於許多工來說,僅解碼器模型太龐大、太慢、太私有且太昂貴。想想看,最初的GPT-1是一個擁有1.17億引數的模型。相比之下,Llama 3.1模型擁有4050億引數,其技術報告描述的資料合成和整理方法對於大多數公司來說過於複雜和昂貴,無法複製。因此,要使用像ChatGPT這樣的模型,您需要支付幾美分,並等待幾秒鐘才能從您無法控制的重量級伺服器獲得API回覆。
當然,這些巨型生成模型的開放式能力意味著您在緊急情況下可以將其用於非生成或判別性任務,例如分類。這是因為您可以用簡單的英語描述分類任務,然後……直接讓模型進行分類。但是,雖然這種工作流程非常適合原型設計,但一旦進入大規模生產,您就不希望支付原型階段的價格。
GenAI周圍的流行熱潮掩蓋了僅編碼器模型的作用。它們是實際語言處理的主力,是目前許多科學和商業應用中實際用於此類工作負載的模型。
僅編碼器模型
僅編碼器模型的輸出是一個數值列表(一個嵌入向量)。可以說,編碼器模型不是用文本回答,而是將其“答案”編碼成這種壓縮的數值形式。該向量是模型輸入的壓縮表示,這就是為什麼僅編碼器模型有時被稱為表示模型。
雖然僅解碼器模型(如GPT)可以完成僅編碼器模型(如BERT)的工作,但它們受到一個關鍵限制的束縛:由於它們是生成模型,它們在數學上“不允許”“偷看”後面的令牌。它們只能向後看。這與僅編碼器模型不同,後者被訓練成每個令牌都可以向前和向後看(雙向)。它們為此而生,這使得它們在工作中非常高效。
基本上,像OpenAI的O1這樣的前沿模型就像一輛法拉利SF-23。它顯然是工程學的勝利,旨在贏得比賽,這就是我們談論它的原因。但僅僅換輪胎就需要一支專業的維修團隊,而且你無法自己購買一輛。相比之下,BERT模型就像一輛本田思域。它也是工程學的勝利,但更微妙,因為它旨在經濟實惠、燃油效率高、可靠且極其有用。這就是為什麼它們無處不在。
你可以從以下幾個方面看出這一點。
支援生成模型:理解表示模型(僅編碼器)普遍存在的一種方式是注意它們在與僅解碼器模型協同工作時,如何頻繁地被用於構建安全高效的系統。
最明顯的例子是RAG。系統不依賴於LLM引數中訓練的知識,而是使用文件儲存為LLM提供與查詢相關的資訊。但這當然只是推遲了問題。如果LLM不知道哪些文件與查詢相關,那麼系統將需要其他流程來選擇這些文件?它將需要一個足夠快速和便宜的模型,以便能夠用於編碼使LLM有用所需的大量資訊。這個模型通常是BERT類僅編碼器模型。
另一個例子是監督架構,其中可以使用廉價的分類器來確保生成的文字不違反內容安全要求。
簡而言之,只要你在部署中看到僅解碼器模型,很可能僅編碼器模型也是系統的一部分。但反之則不成立。
基於編碼器的系統:在GPT出現之前,社交媒體和Netflix等平臺就有內容推薦。在這些地方、搜尋和其他地方都有廣告定位。還有用於垃圾郵件檢測、濫用檢測等的內容分類。這些系統不是建立在生成模型上的,而是建立在像僅編碼器模型這樣的表示模型上的。所有這些系統仍然存在,並且仍在以巨大的規模執行。想象一下全球每秒有多少廣告被定位!
下載量:在HuggingFace上,RoBERTa是領先的BERT類模型之一,其下載量超過HuggingFace上最受歡迎的10個LLM的總和。事實上,目前,僅編碼器模型的每月下載量總計超過10億次,幾乎是僅解碼器模型的每月3.97億次下載量的三倍。事實上,由ModernBERT等編碼器“基礎模型”組成的“填充掩碼”模型類別,隨時可以針對其他下游應用進行微調,是總體下載量最大的模型類別。
推理成本:上述內容表明,在單次推理的基礎上,僅編碼器模型每年的推理次數是僅解碼器或生成模型的多倍。一個有趣的例子是FineWeb-Edu,其中基於模型的質量過濾必須對超過15萬億個tokens進行。FineWeb-Edu團隊選擇使用僅解碼器模型Llama-3-70b-Instruct生成標註,並使用一個微調的基於BERT的模型執行大部分過濾。此過濾耗時6,000 H100小時,按照HuggingFace Inference Endpoints每小時10美元的定價,總計60,000美元。另一方面,將15萬億個tokens輸入到流行的僅解碼器模型中,即使使用最低成本的選項,即使用Google的Gemini Flash及其每百萬tokens0.075美元的低推理成本,也將花費超過一百萬美元!
效能
概述
以下是ModernBERT和其他模型在各種任務上的準確性快照,透過標準學術基準衡量——如您所見,ModernBERT是唯一一個在每個類別中都名列前茅的模型,這使其成為您可以用於所有基於編碼器任務的模型。
如果你參加過Kaggle上的NLP競賽,那麼你會知道DeBERTaV3多年來一直是冠軍們的選擇。但現在不再是了:ModernBERT不僅是第一個在GLUE上擊敗DeBERTaV3的基礎大小模型,而且其記憶體使用量還不到DeBERTa的五分之一。
當然,ModernBERT速度很快。它比DeBERTa快兩倍——事實上,在輸入長度混合的更常見情況下,它甚至快達四倍。其長上下文推理速度比其他高質量模型(如NomicBERT和GTE-en-MLM)快近三倍。
ModernBERT的上下文長度為8,192個標記,比大多數現有編碼器長16倍以上。這對於RAG管道至關重要,因為在這些管道中,較小的上下文通常會導致語義理解的塊太小。ModernBERT還是與ColBERT配合使用的最先進的長上下文檢索器,並且比其他長上下文模型高9個百分點。更令人印象深刻的是:這個訓練速度非常快的模型,簡單地為了與其他骨幹模型進行比較而進行調整,在長上下文任務上的效能甚至超過了廣泛使用的檢索模型!
對於程式碼檢索,ModernBERT是獨一無二的。實際上沒有什麼可以與之比較的,因為以前從未有過這樣的大量程式碼資料訓練的編碼器模型。例如,在混合了程式碼和自然語言的StackOverflow-QA資料集(SQA)上,ModernBERT的專業程式碼理解和長上下文能力使其成為唯一一個在該任務上得分超過80的骨幹模型。
這意味著全新的應用很可能將建立在這種能力之上。例如,想象一個與AI連線的IDE,它用ModernBERT嵌入索引了整個企業程式碼庫,能夠快速檢索所有倉庫中的相關程式碼,並提供長上下文。或者一個程式碼聊天服務,它描述瞭如何將數十個獨立專案整合在一起的應用程式功能。
與主流模型相比,ModernBERT在檢索、自然語言理解和程式碼檢索這三大任務類別中表現更佳。雖然在自然語言理解方面略低於DeBERTaV3,但其速度快了許多倍。請注意,ModernBERT與任何其他基礎模型一樣,開箱即用只能進行掩碼詞預測。要執行其他任務,基礎模型應按照這些樣板中的方法進行微調。
與專業模型相比,ModernBERT在大多數任務上具有可比性或更優。此外,ModernBERT在大多數任務上都比大多數模型更快,並且可以處理長達8,192個標記的輸入,比主流模型長16倍。
效率
以下是ModernBERT和其他解碼器模型在NVIDIA RTX 4090上的記憶體(最大批處理大小,BS)和推理(每秒千個令牌)效率結果。
您可能會注意到的第一件事是我們正在分析消費級GPU的效率,而不是最新的難以獲得的炒作硬體。首先也是最重要的是,ModernBERT注重實用性,而不是炒作。
作為這項重點的一部分,這還意味著我們確保ModernBERT在實際應用中表現良好,而不僅僅是在基準測試中。這類模型通常只在它們最擅長的單一精確尺寸——它們的最大上下文長度——上進行測試。這就是表格中“固定”列所顯示的內容。但在現實世界中,輸入大小是變化的,因此我們努力最佳化的是這種效能——“可變”列。如您所見,對於可變長度輸入,ModernBERT比所有其他模型都快得多。
對於長上下文輸入,我們相信這將是未來最有價值和最重要的應用的基礎,ModernBERT比下一個最快的模型快2-3倍。而且,在“實用性”方面,ModernBERT不需要額外的繁重“xformers”依賴,而只需現在常見的Flash Attention作為依賴項。
此外,得益於ModernBERT的高效性,它可以使用比幾乎任何其他模型都大的批處理大小,並且可以在更小、更便宜的GPU上有效使用。特別是基礎版本的高效性,可能催生直接在瀏覽器、手機等裝置上執行的新應用。
為什麼ModernBERT如此“現代”?
現在,我們已經闡述了為什麼我們應該給予編碼器模型更多關注的理由。作為值得信賴、被低估的主力,自2018年BERT釋出以來,它們幾乎沒有得到任何更新!
更令人驚訝的是:自RoBERTa之後,沒有一個編碼器在沒有權衡的情況下提供整體改進(花哨地稱為“帕累託改進”):DeBERTaV3在GLUE和分類效能方面表現更好,但犧牲了效率和檢索。其他模型,如AlBERT,或更新的模型,如GTE-en-MLM,都在某些方面優於原始BERT和RoBERTa,但在其他方面則有所退步。
然而,自從這兩個模型首次釋出以來,我們已經學到了大量關於如何構建更好的語言模型。如果您使用過LLM,您會非常清楚這一點:儘管在編碼器世界中它們很少見,但帕累託改進在解碼器世界中是持續不斷的,模型不斷在各個方面變得更好。而且我們現在都明白了:模型的改進部分是魔法,大部分是工程。
因此,ModernBERT專案(希望這個名字能恰如其分)的目標相當簡單:將這種現代工程帶到編碼器模型中。我們主要透過三種方式實現:
- 現代化Transformer架構
- 特別關注效率
- 現代資料規模和來源
新Transformer,舊Transformer
Transformer架構已成為主導,並且如今絕大多數模型都使用它。然而,重要的是要記住,Transformer不止一種,而是許多種。它們的主要共同點是堅信注意力機制確實是你所需要的一切,因此,圍繞注意力機制構建了各種改進。
ModernBERT從Transformer++(由Mamba創造)中汲取了巨大靈感,該模型首次由Llama2系列模型使用。具體來說,我們用改進後的等效模組替換了舊的BERT類構建模組,即我們:
- 用“旋轉位置嵌入” (RoPE) 替換舊的位置編碼:這使得模型更好地理解詞語之間的相對位置,並允許我們擴充套件到更長的序列長度。
- 將舊的MLP層替換為GeGLU層,改進了原始BERT的GeLU啟用函式。
- 透過移除不必要的偏置項來精簡架構,使我們能夠更有效地利用引數預算。
- 在嵌入後新增額外的歸一化層,有助於穩定訓練。
為賽道升級一輛本田思域
我們已經討論過了:編碼器不是法拉利,ModernBERT也不例外。然而,這並不意味著它不能快。當你上高速公路時,你通常不會把你的車換成賽車,而是希望你日常可靠的座駕能輕鬆達到限速。
事實上,對於我們上面提到的所有應用場景,速度都是必不可少的。編碼器在以下場景中非常受歡迎:它們要麼需要處理大量資料,即使微小的速度提升也能迅速累積;要麼延遲非常重要,例如在RAG中。在許多情況下,編碼器甚至在CPU上執行,在這種情況下,如果我們希望在合理的時間內獲得結果,效率就顯得更為重要。
和大多數研究一樣,我們站在巨人的肩膀上,並大量利用Flash Attention 2的速度改進。我們的效率改進依賴於三個關鍵組成部分:交替注意力,以提高處理效率;去填充和序列打包,以減少計算浪費;以及硬體感知模型設計,以最大化硬體利用率。
全域性與區域性注意力
ModernBERT 最具影響力的特點之一是交替注意力,而不是完全的全域性注意力。從技術上講,這意味著我們的注意力機制每3層才關注完整輸入(全域性注意力),而所有其他層都使用滑動視窗,其中每個令牌只關注離它最近的128個令牌(區域性注意力)。
由於注意力機制的計算複雜度隨著每個額外令牌的增加而迅速膨脹,這意味著ModernBERT可以比任何其他模型更快地處理長輸入序列。
從概念上講,這種方法奏效的原因很簡單:想象你正在讀一本書。對於你讀的每一句話,你需要完全瞭解整個情節才能理解大部分內容嗎(完全全域性注意力)?還是隻要了解當前章節就足夠了(區域性注意力),只要你偶爾回顧其對主線情節的意義即可(全域性注意力)?絕大多數情況下,是後者。
去填充和序列打包
ModernBERT 效率的另一個核心機制是其對去填充和序列打包的使用。
為了能夠在一個批次中處理多個序列,編碼器模型要求它們的長度相同,以便進行平行計算。傳統上,我們一直依賴填充來實現這一點:找出最長的句子,然後新增無意義的令牌(填充令牌)來填充其他所有序列。
雖然填充解決了問題,但它解決得並不優雅:大量的計算最終浪費在填充令牌上,而這些填充令牌不提供任何語義資訊。

去填充解決了這個問題:我們不保留這些填充令牌,而是將它們全部刪除,並將它們連線成批大小為一的迷你批次,從而避免所有不必要的計算。如果您正在使用Flash Attention,我們實現的去填充甚至比以前的方法更快,以前的方法嚴重依賴於序列在模型中進行時進行去填充和重新填充:我們更進一步,引入了我們自己的去填充實現,這嚴重依賴於Flash Attention的RoPE支援的最新發展。這使得ModernBERT只需要去填充一次,並且可以選擇在處理後重新填充序列,從而比以前的方法提高了10-20%的速度。
為了進一步加快預訓練速度,去填充在我們的模型中得到了很好的配合,因為它與序列打包結合使用。這裡的序列打包是一個合乎邏輯的下一步:由於我們將輸入連線成一個單一序列,並且GPU非常擅長並行化,我們希望最大限度地提高單個前向模型傳遞所能擠出的計算效率。為此,我們使用貪婪演算法將單個序列分組為連線後的序列,使其儘可能接近模型的最大輸入長度。
關注硬體
最後,ModernBERT 效率的第三個方面是硬體設計。
我們試圖平衡先前研究中強調的兩點見解:
- 深而窄 vs 寬而淺:研究表明,更深、更窄的模型通常比層數更少、更寬的模型表現更好。然而,這是一把雙刃劍:模型越深,並行性越差,因此在相同引數數量下執行速度越慢。
- 硬體效率:模型維度需要與GPU硬體良好對齊以實現最大效能,不同的目標GPU會導致不同的限制。
遺憾的是,沒有一種神奇的秘訣能讓模型在各種GPU上都執行得同樣好,但有一本優秀的“菜譜”:《共同設計模型架構與硬體的案例》,其中詳細闡述瞭如何針對給定GPU最佳化模型架構的方法。我們提出了一種啟發式方法,將其擴充套件到一系列GPU,同時尊重一組給定的約束條件。邏輯上,第一步是定義這些約束條件,在我們的案例中:
- 將我們的目標GPU定義為常見的推理GPU(RTX 3090/4090、A10、T4、L4)
- 大致將我們的目標模型尺寸定義為ModernBERT-Base的1.3億到1.5億引數,以及ModernBERT-Large的3.5億到4.2億引數。
- 最終的嵌入大小必須與原始BERT的維度匹配,基礎版為768,大型版為1024,以最大化向後相容性。
- 設定在所有GPU上都通用的效能約束
此後,我們透過約束網格搜尋,改變層數和層寬度,對多種模型設計進行了實驗。一旦我們確定了看起來最有效的形狀,我們就確認了我們的啟發式方法與實際GPU效能相符,並確定了最終的模型設計。
訓練
def data(): return ['text', 'bad_text', 'math', 'code']
編碼器在訓練資料方面一直落後。這通常被理解為僅僅是訓練資料規模,但事實並非如此:以前的編碼器,例如DeBERTaV3,訓練時間足夠長,甚至可能已經達到了萬億令牌的規模!
問題在於訓練資料多樣性:許多舊模型在有限的語料庫上進行訓練,通常包括維基百科和維基書籍。這些資料混合物非常明顯是單一文字模態:它們只包含高質量的自然文字。
相比之下,ModernBERT的訓練資料來自多種英語來源,包括網路文件、程式碼和科學文章。它在2萬億個標記上進行訓練,其中大部分是獨一無二的,而不是像以前的編碼器那樣通常重複20到40次。
其影響立竿見影:在所有現有的開源編碼器中,ModernBERT在程式設計相關任務方面獨樹一幟。我們特別感興趣的是這將帶來哪些下游應用,以改進程式設計助手。
流程
我們沿用了原始BERT的訓練方案,並對其進行了一些輕微升級,這些靈感來源於後續的工作:我們移除了下一句預測目標,因為它已被證明會增加開銷而沒有明顯收益,並將掩位元速率從15%提高到30%。
這兩個模型都採用三階段訓練過程。首先,我們以1024的序列長度訓練1.7T個token。然後,我們進行長上下文適應階段,以8192的序列長度訓練250B個token,同時透過降低批次大小來保持每個批次中看到的總token數基本一致。最後,我們按照ProLong強調的長上下文擴充套件理想混合,對50億個不同取樣的token進行退火。
分三個階段訓練是我們的方法,旨在確保模型全面表現出色,這在其結果中得到了體現:它在長上下文任務上具有競爭力,同時不影響其處理短上下文的能力……
……但這還有一個額外的好處:對於前兩個階段,我們在預熱階段完成後使用恆定的學習率進行訓練,並且只在最後50億個令牌上執行學習率衰減,遵循梯形(或預熱-穩定-衰減)學習率。更重要的是:我們將釋出這些穩定階段的每一箇中間檢查點,靈感來自Pythia。我們這樣做的主要原因是為了支援未來的研究和應用:任何人都可以從我們的任何預衰減檢查點重新開始訓練,並根據其預期用途,對領域相關資料進行退火!
技巧,一切都是技巧!
如果你已經讀到這份公告的這裡,你可能已經習慣了:當然,我們在這裡也使用技巧來加快速度。確切地說,我們有兩個主要技巧。
我們從第一個開始,這很常見:由於初始訓練步驟正在更新隨機權重,我們採用批處理大小熱身:我們從較小的批處理大小開始,以便相同數量的令牌更頻繁地更新模型權重,然後逐漸增加批處理大小到最終訓練大小。這顯著加快了模型訓練的初始階段,模型在該階段學習其對語言的最基本理解。
第二個技巧遠不常見:透過平鋪進行較大模型尺寸的權重初始化,靈感來自微軟的Phi系列模型。這個技巧基於以下認識:既然我們有一套完美(恕我們自誇)的ModernBERT-base權重就在那裡,為什麼還要用隨機數初始化ModernBERT-large的初始權重呢?
事實上,事實證明,將ModernBERT-base的權重平鋪到ModernBERT-large上比從隨機權重初始化效果更好。它還具有與批次大小熱身相結合的額外好處,可以進一步加快初始訓練速度。
結論
在這篇博文中,我們介紹了ModernBERT模型,這是一個新的最先進的小型高效僅編碼器模型系列,終於為BERT帶來了急需的改進。
ModernBERT證明,僅編碼器模型可以透過現代方法得到改進。它們在某些任務上繼續提供非常強大的效能,提供極具吸引力的尺寸/效能比。
最重要的是,我們非常期待看到社群將如何創造性地使用這些模型!為了鼓勵這一點,我們正在發起一個演示徵集活動,截止日期為2025年1月10日:其中5個最佳演示將被新增到本帖的展示部分,並贏得100美元(或等值的當地貨幣)的亞馬遜禮品卡,以及為期6個月的HuggingFace Pro訂閱!如果您需要一些入門提示,這裡有一個我們考慮過的演示:程式碼相似性HF空間!請記住,這是一個編碼器模型,所以所有最酷的下游應用可能都需要某種形式的微調(在真實資料或可能是解碼器模型合成數據上?)。幸運的是,有很多很棒的框架支援編碼器微調:🤗Transformers本身支援各種任務,包括分類;GliNER用於零樣本命名實體識別;或Sentence-Transformers用於檢索和相似性任務!
連結
LightOn 贊助了本專案在 Orange Business Cloud Avenue 上的計算資源。