ModernBERTは、Answer.AIとLightOnを中心に開発され、2024年12月に公開されたBERT後継のエンコーダ型モデルです。2018年のBERTと同じく文章を読んでベクトルにする役割を担い、扱える長さを512トークンから8,192トークンへ広げ、学習データにコードを含めて検索・分類の精度と処理速度を引き上げました。この記事では、BERTから変わった点、base(149M)とlarge(395M)の性能差、DeBERTaV3に負ける領域、日本語で使うときのモデル選び、Transformersでの使い方を、論文とモデルカードの数値、手元のCPUで動かした結果をもとに整理します。
まとめ:ModernBERTの要点
- 正体:文章を理解してベクトル化するエンコーダ専用モデル。文章生成はできず、検索・RAGの埋め込み・分類・固有表現抽出(NER)に使う。
- BERTからの変更:文脈長512→8,192トークン、RoPE、3層に1回だけ全体を見る交互アテンション、unpadding、学習データ2兆トークン(コード含む)。
- サイズは2つ:ModernBERT-base(149M・22層)とModernBERT-large(395M・28層)。30M〜310Mは日本語版ModernBERT-Jaのサイズで本家とは別物。
- 性能:GLUEはbase 88.4/large 90.4。baseはDeBERTaV3-base(88.1)を上回るが、largeはDeBERTaV3-large(91.4)に届かない。検索とコード検索では大差で上回る。
- 日本語:本家は英語とコード中心。日本語ならSB IntuitionsのModernBERT-Ja(MIT)か、LLM-jpのllm-jp-modernbert(Apache 2.0)を選ぶ。
- 使い方:Transformers 4.48.0以降で読み込める。ライセンスはApache 2.0で商用利用可。
ModernBERTとは:エンコーダ型モデルの立ち位置と公開時期
ModernBERTは、Answer.AIとLightOnを中心にHugging Faceの研究者らも加わって開発されました。2024年12月19日にAnswer.AIの公式ブログで発表され、論文「Smarter, Better, Faster, Longer」はarXiv:2412.13663(初版の提出は2024年12月18日)で読めます。
エンコーダ専用(encoder-only)モデルは、入力文を前後両方向から読み、単語や文の意味を数値ベクトルで返します。ChatGPTのようなデコーダ型が次の単語を予測して文章を書くのに対し、エンコーダは「この2文は似ているか」「この問い合わせはどの部署宛てか」「この語は組織名か」を判定する側です。生成モデルより小さく速いため、検索エンジンのランキングや大量文書の分類のように、件数が多くコストに厳しい処理で使われます。Answer.AIのブログは、BERTが当時Hugging Faceで月6,800万回以上ダウンロードされていたことを、エンコーダの需要が今も大きい根拠に挙げています。
ModernBERT自体も広く使われています。Hugging FaceのAPIで2026年10月18日に確認したところ、ModernBERT-baseの累計ダウンロードは約6,909万回、直近30日で約390万回でした。
BERTから何が変わったか:8192トークンと高速化の中身
BERTとの違いを先に表で押さえます。BERT側の値は手元で読み込んだbert-base-uncasedの設定、ModernBERT側はModernBERT-baseの設定と論文の記述です。
| 項目 | BERT-base(2018) | ModernBERT-base(2024) |
|---|---|---|
| 最大文脈長 | 512トークン | 8,192トークン |
| 位置表現 | 学習する絶対位置埋め込み | RoPE(回転位置埋め込み) |
| アテンション | 全層で全体を見る | 3層に1回だけ全体・他は前後各64トークン |
| 事前学習タスク | MLM+次文予測(NSP) | MLMのみ(マスク率30%) |
| 学習データ | 約33億語(英語) | 2兆トークン(英語+コード) |
| 語彙数 | 30,522 | 50,368 |
| 層数 | 12 | 22 |
| token_type_ids | 使う | 使わない |
層を深くしたぶんパラメータは増えています(手元の計測でBERT-baseは約1.10億、ModernBERT-baseは約1.50億)。それでもGPUで速いのは、次の設計で無駄な計算を削っているためです。
文脈長512→8,192トークンへの拡張
BERTは一度に512トークンまでしか読めません。手元でbert-base-uncasedに1,024トークンを入れると、位置埋め込みの範囲外でエラーになりました。ModernBERTは8,192トークンまで受け付けるため、長い技術文書やソースファイルを分割せずに埋め込みにできます。学習は系列長1,024で1.7兆トークン、8,192へ広げて2,500億トークン、仕上げに500億トークンの3段階で進めたとブログに書かれています。
ただし、長く入れられることと長く入れるべきことは別です。RAGの検索精度はチャンクの粒度にも左右されるので、8,192トークンを使い切る前提で設計するより、文書の意味の切れ目で区切るほうが無難です。
RoPEと交互ローカル/グローバルアテンション
位置情報はRoPEに置き換えられました。さらに、全層で文章全体を見るのをやめ、3層に1回だけ全体を見るグローバルアテンションを入れ、残りの層は現在位置の前後各64トークンの範囲を見ます。手元で読み込んだ設定ファイルでもglobal_attn_every_n_layers=3、local_attention=128でした(論文の「128トークンの窓」はこの窓全体の幅で、Transformersの実装では前後に64ずつ割り振ります)。論文の予備実験では、この構成でも全層グローバルの場合と下流タスクの性能が変わらなかったと報告されています。長文では全体を見る計算が系列長の2乗で増えるため、それを3分の1の層に絞ることが長文での速度に効きます。
FlashAttention・unpaddingによる高速化
unpaddingは、長さの異なる入力をまとめて処理するときの計算の無駄を減らす仕組みです。バッチ処理では長さの違う文をパディング(詰め物)で揃えますが、詰め物の計算は無駄です。ModernBERTは詰め物を取り除いて実データだけをつなぎ、FlashAttentionで一括計算します。論文は、層ごとにパディングを除去・復元する従来のunpadding実装に対し、モデル全体で除去状態を保つ実装で10〜20%高速化したと報告しています。仕組みの詳細はFlashAttentionの解説記事で扱っています。
論文のTable 2(RTX 4090)では、512トークン固定長の処理速度がModernBERT-base 148.1千トークン/秒、DeBERTaV3-base 70.2千トークン/秒で約2.1倍でした。8,192トークンではModernBERT-baseが123.7千トークン/秒、同じ長さを扱えるGTE-en-MLM(xformers版)が47.5千トークン/秒です。この差はGPUでFlashAttentionが効く前提の数字です(CPUでの挙動は後述の実測を参照)。
学習タスクと学習データの見直し
BERTの次文予測(NSP)は廃止され、事前学習はマスク言語モデル(MLM)だけになりました。マスク率はBERTの15%から30%に上げています。学習データは英語のWeb文書・論文にソースコードを加えた2兆トークンで、論文はコードを大量に学習したエンコーダであることを強みに挙げています。後述のコード検索の数値が大きく伸びているのはこのためです。
ModernBERT-baseとModernBERT-largeの違い:性能と速度の数値
本家ModernBERTはbaseとlargeの2サイズだけです。どちらも8,192トークン・語彙50,368・Apache 2.0で、違いは層の深さと幅です。
| モデル | パラメータ | 層数 | 隠れ次元 | GLUE | BEIR(DPR) | CSN(コード) | StackQA |
|---|---|---|---|---|---|---|---|
| ModernBERT-base | 149M | 22 | 768 | 88.4 | 41.6 | 56.4 | 73.6 |
| DeBERTaV3-base | – | – | – | 88.1 | 20.2 | 17.5 | 18.6 |
| ModernBERT-large | 395M | 28 | 1024 | 90.4 | 44.0 | 59.5 | 83.9 |
| DeBERTaV3-large | – | – | – | 91.4 | 25.6 | 21.2 | 19.7 |
評価値は論文のTable 1、層数と次元はModernBERT-baseのモデルカードによります。largeはbaseの約2.6倍のパラメータで、GLUEは2.0ポイント、StackQAは10.3ポイント高くなります。論文の速度表では512トークン固定長でlargeが52.3千トークン/秒と、baseの約3分の1です。
baseとlargeの選び分け基準
最初はbaseで試すべきです。8,192トークン対応と高速化の仕組みはlargeと共通なので、まずbaseで業務データの精度と処理時間を測り、要件を満たせるかを判定します。largeに上げる価値があるのは、オフラインのバッチ処理で精度を1〜2ポイントでも上げたい場合や、コードとQ&Aの検索(StackQAで差が10ポイント)を扱う場合です。応答時間に上限があるAPIや、GPUメモリが限られる環境ではbaseに留めます。
DeBERTaV3との比較:largeのGLUEスコア差
ModernBERTは何にでも勝つわけではありません。自然言語理解のGLUEでは、largeがDeBERTaV3-largeに1.0ポイント負けます。モデルカード自身も「DeBERTa-v3-largeに次ぐ」と書いています。文分類の精度だけを最優先し、入力が512トークンに収まるなら、DeBERTaV3-largeを残す判断はあり得ます。一方、論文のDPR評価では、BEIRのスコアはDeBERTaV3比でbaseが約2.1倍、largeが約1.7倍です。コード検索のスコア比は約2.8〜4.3倍で、RTX 4090の512トークン固定長の処理速度は両サイズとも約2.1倍でした。検索・RAG用途や長い入力がある場合はModernBERTを選ぶ、というのが数値から言える線引きです。
日本語で使うModernBERT:ModernBERT-Ja・llm-jp-modernbertの選び方
本家ModernBERTは英語とコードで学習しているため、日本語は苦手です(後述の実測を参照)。日本語の文書を扱うなら、日本語で事前学習した次のモデルから選びます。
| モデル | 開発元 | パラメータ | 語彙数 | 文脈長 | ライセンス |
|---|---|---|---|---|---|
| modernbert-ja-30m | SB Intuitions | 37M | 102,400 | 8,192 | MIT |
| modernbert-ja-70m | SB Intuitions | 70M | 102,400 | 8,192 | MIT |
| modernbert-ja-130m | SB Intuitions | 132M | 102,400 | 8,192 | MIT |
| modernbert-ja-310m | SB Intuitions | 315M | 102,400 | 8,192 | MIT |
| llm-jp-modernbert-base | LLM-jp(NII) | – | – | 8,192 | Apache 2.0 |
ModernBERT-Ja(SB Intuitions)のサイズ別性能
SB Intuitionsが公開した日本語ModernBERTで、4サイズがそろいます。130Mのモデルカードによると、日本語と英語の4.39兆トークンで学習し、語彙は102,400です。130Mは同社の公式モデル一覧で2025年2月12日公開とされています。同社はLLMのSarashinaも公開しており、系列の全体像はSarashinaの解説記事にまとめています。
モデルカードの微調整後の評価値は次のとおりです。JSTSはSpearmanの順位相関係数、ほかの掲載タスクは正解率を百分率で示しています。
| サイズ | JCommonsenseQA | JNLI | JSTS | MARC-ja | JCoLA |
|---|---|---|---|---|---|
| 30m | 80.95 | 88.69 | 85.94 | 95.87 | 78.85 |
| 70m | 85.65 | 90.33 | 87.59 | 96.13 | 80.26 |
| 130m | 91.01 | 92.03 | 89.20 | 96.48 | 84.18 |
| 310m | 93.53 | 92.93 | 90.53 | 96.39 | 84.81 |
70mから130mでJCommonsenseQAが5.4ポイント上がるのに対し、130mから310mは2.5ポイントで、MARC-ja(感情分類)はむしろ130mが上です。迷ったら130mから始め、常識推論や含意判定の精度が足りないときだけ310mに上げるのが費用対効果のよい順番です。30mはCPUやエッジで動かす前提の選択肢になります。
llm-jp-modernbert(LLM-jp/NII)の公開データと評価
国立情報学研究所を中心とするLLM-jpが公開した日本語ModernBERTで、論文はarXiv:2504.15544(2025年4月22日提出)です。モデルカードによれば、llm-jp-corpus v4の日本語サブセット(3.4TB)で学習し、トークナイザーはllm-jp-tokenizer、文脈長は8,192トークン、ライセンスはApache 2.0です。論文の要旨は、下流タスクでは既存のベースラインを上回らない一方、穴埋め評価では良い結果を出したと述べています。分類精度を求めるならModernBERT-Ja、学習コーパスと学習コードが公開されていることを重視するならllm-jp-modernbert、と使い分けます。
mmBERTの多言語対応とモデルサイズ
日本語と英語、ほかの言語が混在する文書を1つのモデルで扱いたい場合は、ジョンズ・ホプキンス大学のmmBERTが候補です。ModernBERTのアーキテクチャをもとに3兆トークン超で学習し、最終段階では1,833言語まで広げています。サイズはsmall(140M)とbase(307M)、ライセンスはMITで、論文はarXiv:2509.06888です。日本語だけの用途ではModernBERT-Jaも候補になります。mmBERTとのトークン効率の差は、対象文書を両モデルのトークナイザーで分割して比較してください。
ModernBERTをインストールして動かす:Transformersでのコード例
ModernBERTはHugging Face Transformersから使います。対応はTransformers 4.48.0で入ったので、それより古い環境では読み込めません。2026年10月16日時点の最新版は5.20.1です。Hugging Faceそのものの使い方はHugging Faceの解説記事を参照してください。
pip install -U "transformers>=4.48.0" torch sentence-transformers
# GPU(Ampere以降)で速度を出す場合のみ
pip install flash-attn --no-build-isolation
以下のコードは、Intel Mac(x86_64)のCPU、torch 2.2.2・transformers 4.48.3で動作確認しています。意味検索の例ではsentence-transformers 3.4.1を使用しました。導入コマンドは更新版を取得するため、この検証環境を固定して再現するものではありません。FlashAttentionは入れていません。
穴埋め(Fill-Mask)による動作確認
最初はマスクした単語を予測させ、モデルが正しく読み込めたかを確かめます。マスク記号は本家が[MASK]、ModernBERT-Jaが<mask>とモデルごとに違うので、トークナイザーから取ります。
from transformers import AutoTokenizer, pipeline
for model_id, text in [
("answerdotai/ModernBERT-base", "The capital of France is {}."),
("sbintuitions/modernbert-ja-130m", "日本の首都は{}です。"),
]:
tok = AutoTokenizer.from_pretrained(model_id)
fill = pipeline("fill-mask", model=model_id, device="cpu")
for r in fill(text.format(tok.mask_token))[:3]:
print(model_id, repr(r["token_str"]), round(r["score"], 4))
実行すると、本家は「Paris」を0.9233、日本語版は「東京」を0.8292の確率で1位に挙げました。
分類・固有表現抽出(NER)用ヘッドの初期化
TransformersにはModernBertForSequenceClassification・ModernBertForTokenClassification・ModernBertForQuestionAnsweringなどタスク別のクラスがあり、AutoModelFor...で読めばヘッドが付きます。文書分類ならSequenceClassification、NERのように単語ごとにラベルを付けるならTokenClassificationです。
from transformers import AutoModelForSequenceClassification, AutoModelForTokenClassification
# 日本語の文書分類(例: 3クラス)
clf = AutoModelForSequenceClassification.from_pretrained(
"sbintuitions/modernbert-ja-130m", num_labels=3)
# 英語のNER(例: BIO形式で9ラベル)
ner = AutoModelForTokenClassification.from_pretrained(
"answerdotai/ModernBERT-base", num_labels=9)
# このあと Trainer で自分のデータに微調整する
読み込み直後の分類ヘッドはランダム初期化なので、そのままでは使えません。NERの例を英語の本家にしているのは、ModernBERT-Jaのモデルカードが「Unigramのトークン境界が形態素境界と揃わないことが多く、NERやスパン抽出のようなトークン分類の性能が低くなる」と明記しているためです。日本語のNERでModernBERT-Jaを使うなら、ラベルを付ける単位とトークン境界のずれを先に確認してください。学習データの作り方と実行環境はファインチューニングの実行環境と実装、GPUメモリを抑えて学習するならPEFTとLoRAの違いを参照してください。ModernBERTはtoken_type_idsを使わないので、BERT用のコードから移すときはtoken_type_idsを渡している箇所を外します。
Ruri v3による日本語の意味検索
素のModernBERTは埋め込み用に学習されていないため、文の類似度を測るなら、ModernBERTを基に埋め込み向けに追加学習したモデルを使います。日本語なら名古屋大学のRuri v3がModernBERT-Jaを基盤にしており、30m〜310mの4サイズがあります。クエリと文書の頭に決まった接頭辞を付けるのが使い方の要点です。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("cl-nagoya/ruri-v3-30m", device="cpu")
docs = [
"検索文書: ModernBERTは最大8192トークンを扱えるエンコーダです。",
"検索文書: 東京は日本の首都で、人口が最も多い都市です。",
"検索文書: LoRAは少ない追加パラメータでモデルを微調整する手法です。",
]
query = "検索クエリ: 長い文章を一度に読めるBERT系モデルは?"
emb = model.encode([query] + docs, convert_to_tensor=True)
scores = model.similarity(emb[0:1], emb[1:])[0]
for doc, s in sorted(zip(docs, scores.tolist()), key=lambda x: -x[1]):
print(round(s, 4), doc)
実行すると、ModernBERTの説明文が0.8549で1位、LoRAの文が0.7841、東京の文が0.7442と、意図どおりの順に並びました。ruri-v3-30mの出力は256次元です。
埋め込みモデルの選び方全般は埋め込みモデルの解説記事、得られたベクトルで検索する設計はベクトル検索とセマンティック検索の違いで扱っています。社内文書の検索基盤まで含めて任せたい場合は、RAG構築支援で埋め込みモデルの選定から相談できます。
手元のCPUで動かした実測:トークン数と入力長ごとの推論時間
論文の数値はGPUとFlashAttentionが前提です。GPUの無い環境で使う読者向けに、Intel Mac(x86_64)のCPU 4スレッド、torch 2.2.2・transformers 4.48.3で確かめた結果を載せます。計測中は別の処理も動いていたため、時間の絶対値だけでなくモデル間・入力長間の比率も参考値です。
日本語文のトークン数:本家は日本語版の2倍超
39文字の文「ModernBERTは長い文書をまとめて読み込める日本語対応のエンコーダです。」を各トークナイザーで分割しました(先頭・末尾の特殊トークンを含む)。
| トークナイザー | トークン数 | 分割の例 |
|---|---|---|
| ModernBERT-base(本家) | 36 | 日本語がバイト単位の断片になる |
| bert-base-uncased | 33 | 長/い/文/書と1文字ずつ |
| modernbert-ja-130m | 16 | 長い/文書/読み/込める |
この例文では、本家は日本語版の2倍超のトークンを使いました。ただし、分割数の比率は文章によって変わるため、8,192トークンに収まる日本語の量が常に半分以下になるわけではありません。本家に「日本の首都は[MASK]です。」を解かせると、1位は「日本」(0.2652)で、「東京」は上位3件に入らず、3位に英語の「Tokyo」(0.0702)が出ました。日本語の文書で日本語版を選ぶ根拠として、この2つの結果は分かりやすい材料です。トークン分割の方式の違いはトークナイザーの解説記事で詳しく扱っています。
入力長ごとのCPU推論時間とSDPA実装の制約
ModernBERT-baseにランダムなトークンID列を1件ずつ入力し、ウォームアップ1回後の3回の推論から最速値を採用しました。評価モードとtorch.inference_modeを使用しています。
| モデル | 入力長 | 推論時間 |
|---|---|---|
| ModernBERT-base | 256 | 0.96秒 |
| ModernBERT-base | 512 | 2.46秒 |
| ModernBERT-base | 1,024 | 6.07秒 |
| ModernBERT-base | 2,048 | 19.60秒 |
| bert-base-uncased | 512 | 1.30秒 |
入力を256から2,048トークンへ8倍にすると、時間は約20倍になりました。512トークンでは、層の少ないBERT-baseのほうが約1.9倍速く終わっています。8,192トークンはメモリを圧迫したため計測を打ち切りました。
原因はTransformersの実装にあります。手元のtransformers 4.48.3のソースを読むと、unpaddingと前後各64トークンの局所範囲に計算を限定する仕組みはattn_implementationがflash_attention_2のときだけ働きます。CPUで使われるsdpaでは、この幅128トークンの窓は「見てはいけない位置を隠すマスク」として全体の計算にかけられるだけで、計算量は減りません。GPUとFlashAttentionが無い環境では、ModernBERTの速さの大半は得られないと考えてください。CPUで大量の文書を処理するなら、入力を512トークン前後のチャンクに切るか、ModernBERT-Ja-30mやRuri v3-30mのような小さいモデルを選ぶほうが現実的です。
ModernBERTを基盤にした派生モデル:埋め込み・リランカー・Ettin
ModernBERTには、埋め込みやリランキングなどの用途に追加学習された派生モデルがあります。用途別に主なものを挙げます。
| モデル | 用途 | 基盤 | ライセンス |
|---|---|---|---|
| Alibaba-NLP/gte-modernbert-base | 英語の埋め込み | ModernBERT-base | Apache 2.0 |
| Alibaba-NLP/gte-reranker-modernbert-base | 英語のリランカー | ModernBERT-base | Apache 2.0 |
| nomic-ai/modernbert-embed-base | 英語の埋め込み | ModernBERT-base | Apache 2.0 |
| cl-nagoya/ruri-v3-30m〜310m | 日本語の埋め込み | ModernBERT-Ja | Apache 2.0 |
| jhu-clsp/mmBERT-small・base | 多言語エンコーダ | ModernBERTの構成 | MIT |
| jhu-clsp/ettin-encoder-17m〜1b | エンコーダ(6サイズ) | 独自に学習 | MIT |
gte-modernbert-baseのモデルカードは、149M・8,192トークン・768次元で、BEIR 55.33、MTEB(英語)64.38を報告しています。論文のBEIR(DPR)41.6も検索向けに微調整した後の値です。gte-modernbert-baseとは学習条件が異なるため、55.33との差を追加学習の有無による効果とは断定できません。英語の検索ならこれを、日本語ならRuri v3を出発点にします。検索結果を並べ替えるリランカーの位置づけはColBERTの解説記事で比較しています。
Ettinは、エンコーダとデコーダを同じデータ・同じ学習手順で対にして学習したシリーズで、17Mから1Bまでの6サイズがあります。モデルカードは、同じ規模でエンコーダがModernBERTを上回ると主張しています。より小さいモデルや1B級のエンコーダが必要なときの選択肢です。
ModernBERTを選ぶべき場面・避けるべき場面
選ぶべき場面は、GPUがある環境での英語・コードを含む文書の検索・RAG、長い文書の分類、コード検索です。
避けるべき場面は、文章生成・要約・対話(エンコーダ専用でテキストを出力しない)、日本語主体のタスクへの本家の流用、512トークンに収まる英語の文分類で精度だけを競う場合(DeBERTaV3-largeが上)、GPUなしで長文を大量に処理する場合です。
避けたい実装は、本家ModernBERTを検索向けに追加学習せず、日本語の社内文書検索にそのまま使うことです。日本語ならまずRuri v3のような日本語の埋め込みモデルで検索の基準値を取り、そのうえで微調整するかを判断します。
よくある質問
ModernBERTはいつ公開されましたか?
2024年12月19日にAnswer.AIのブログで発表されました。論文はarXiv:2412.13663で、初版の提出は2024年12月18日です。
ModernBERTのサイズ(パラメータ数)はどれくらいですか?
本家はbaseが149M(22層)、largeが395M(28層)の2サイズです。30M・70M・130M・310Mは日本語版ModernBERT-Jaのサイズです。
ModernBERTは日本語で使えますか?
本家は英語とコード中心のため、日本語の精度は低くなります。日本語ならSB IntuitionsのModernBERT-Ja、LLM-jpのllm-jp-modernbert、埋め込み用途ならRuri v3を使います。
ModernBERTは商用利用できますか?
本家はApache 2.0、ModernBERT-JaはMIT、llm-jp-modernbertはApache 2.0で、いずれも商用利用できます。派生モデルはそれぞれのモデルカードでライセンスを確認してください。
ModernBERTでChatGPTのように文章を生成できますか?
できません。ModernBERTは文章を理解してベクトル化するエンコーダで、文章生成には対応しません。生成が目的ならGPTやLlamaなどのデコーダ型モデルを使います。