日本語版 ModernBERT (310M) ファインチューニングなしのマスク穴埋めで JCommonsenseQA を解く実験をしてみました。より大きい LLM (Sarashina2.2(0.5B)) を上回る結果となりました。
はじめに
ちょっとしたテキスト分類をしたいとき、LLM に頼む? 分類器をつくる? 大きな LLM はコストがかかるし、かといって分類器のためにラベル付きデータを用意するのも手間です。
そんなとき、BERTのマスク穴埋め (fill-mask) を思い出しました。毎朝あなたのために[MASK]汁を作ります。 の [MASK] に何が入るか予測するあれです。これを使えば、BERT でも、ファインチューニングなしでテキスト分類や選択肢問題が解けるのでは?
最近の研究 Clavié+ (2025) "It's All in The [MASK]: Simple Instruction-Tuning Enables BERT-like Masked Language Models As Generative Classifiers" では、ModernBERT(英語版)の masked language modeling (MLM) で指示チューニングを行い、選択式ベンチマークを解いています。MMLU では同じ規模の LLM を上回るそうです。やるじゃん!
日本語版 ModernBERT では指示チューニング済みモデルないみたいですが、事前学習のみの LLM がベンチマークで評価されているように、BERT も事前学習のみで評価できるはずです。
そこで今回、日本語版 ModernBERT を使って常識推論の選択肢問題 JCommonsenseQA を fill-mask で解く実験をしてみました。
ちなみに、SB Intuitions による開発ブログ 日本語ModernBERTの開発: 開発と評価編 (1/3) - SB Intuitions TECH BLOGでは、ファインチューニング済み ModernBERT-Ja-310M は JCommonsenseQA で 93.53% を達成しています。
今回の実験は事前学習のみのモデルでどこまでできるかを確認することが目的です。
実験設定
- データセット: JCommonsenseQA: train 300件、validation 200件
- モデル:
- sbintuitions/modernbert-ja-310m (事前学習のみ)
- sbintuitions/sarashina2.2-0.5b (比較用、事前学習のみ)
- sbintuitions/sarashina2.1-1b (比較用、事前学習のみ)
- 推論環境: M1 Mac (8GB)
- Sarashina は評価ツール FlexEval を使用
- ModernBERT は自前のスクリプトを使用
プロンプト
ModernBERT の推論では、プロンプトの末尾に <mask>\n を追加し、fill-mask で回答を予測します。(逆にいうと、Sarashina の入力は、下記例から末尾の<mask>\nを除いたものです。)
few-shot では指示と4つのデモンストレーションを含むプロンプトを使用しました。
zero-shot では問題文と選択肢のみを使用しました。
例 (0-shot):
質問:青い道は?
選択肢:地平線,グリーンライン,ブルーライン,赤道,中華街
回答:<mask>
例 (few-shot)
以下はタスクを説明する指示と、追加の背景情報を提供する入力の組み合わせです。要求を適切に満たす回答を書いてください。
### 指示
質問と回答の選択肢を入力として受け取り、選択肢から回答を選択してください。回答の他には何も含めないことを厳守してください。
### 入力:
質問:主に子ども向けのもので、イラストのついた物語が書かれているものはどれ?
選択肢:世界,写真集,絵本,論文,図鑑
### 回答:
絵本
### 入力:
質問:未成年者を監護・教育し,彼らを監督し,彼らの財産上の利益を守る法律上の義務をもつ人は?
選択肢:浮浪者,保護者,お坊さん,宗教者,預言者
### 回答:
保護者
### 入力:
質問:数字の1を表すときに使う体は?
選択肢:胸,肉球,背中,人差し指,親指
### 回答:
人差し指
### 入力:
質問:火を起こすとあらわれるもくもくするものは?
選択肢:歯の変色,ガス,中毒,爆発,煙
### 回答:
煙
### 入力:
質問:青い道は?
選択肢:地平線,グリーンライン,ブルーライン,赤道,中華街
### 回答:
<mask>
fill-mask のコード例:
import torch
from transformers import AutoModelForMaskedLM, AutoTokenizer, pipeline
model = AutoModelForMaskedLM.from_pretrained("sbintuitions/modernbert-ja-310m", torch_dtype=torch.bfloat16)
tokenizer = AutoTokenizer.from_pretrained("sbintuitions/modernbert-ja-310m")
fill_mask = pipeline("fill-mask", model=model, tokenizer=tokenizer)
def _fill_mask(text):
results = fill_mask(text)
result = results[0]
if __name__ == "__main__":
text = "質問:青い道は?\n選択肢:地平線,グリーンライン,ブルーライン,赤道,中華街\n回答:<mask>\n"
print(_fill_mask(text))
予備実験
実験の前に、Sarashina2.1-1B を使用して、開発元の SB Intutions による公開スコアと、自分の環境&今回実験に使用するデータ(train 300件、valid 200件)でのスコアがおおむね一致することを確認しました。次のセクションに掲載するように、少し高めに出ていますが、データセットの規模が小さいことが主な原因と考えています。
制約
fill-mask は <mask> を埋めるトークンは1トークンしか予測できません。そのため、選択肢の中に複数トークンに分割されるもの(例:「ブルー」+「ライン」)が含まれる場合、その選択肢は予測候補に入らず、正解もできないことになります。
結果
今回の実験では、fill-maskで1トークンしか予測できない制約を考慮せずに、データセットに入っている全ての問題で評価しました。複数トークンの選択肢が正解になる問題では不利な条件にもかかわらず、日本語版 ModernBERT-Ja-310M は 45-52% の正答率を達成し、Sarashina2.2-0.5B (30-32%) を上回りました。
| few-shot train (300) exact_match |
zero-shot train (300) exact_match |
few-shot valid (200) exact_match |
SB Intuitions による公開スコア |
|
|---|---|---|---|---|
| Sarashina2.1-1B | 66.0 | - | 66.0 | 64.70 |
| Sarashina2.2-0.5B | 30.3 | 32.3 | 31.0 | - |
| ModernBERT-Ja-310M | 52.3 | 45.0 | 45.0 | - |
Sarashina2.2-0.5B では、zero-shot 設定では質問や選択肢を出力している事例が1,2件ありましたが、それ以外はふつうに回答できていました。
正答率にばらつきがあるのは、データセット規模が小さいこと (300-200件) と、プロンプト形式 (few-shot/zero-shot) の影響と考えられます。より大規模な評価が必要ですね。
今後やってみたいこと
- 全選択肢が1トークンの問題のみで評価: より公平な性能比較
- ラベルによる回答: 選択肢を 1,2,3,4,5 や A,B,C,D,E 等のラベルつきで提示し、fill-mask でラベルを予測する
-
他のタスクでの評価: この性能差は、他のタスクにも現れるのでしょうか?
BERTの双方向アテンションが有利になるタスクとそうでないものがあるのか、興味があります。