日本語テキスト埋め込みベンチマークJMTEBの構築

TL;DR

日本語テキスト埋め込みベンチマークJMTEBを構築・公開しました。2024年5月現在,6タスク・16データセットで構成されています。

ぜひ使ってみてください!

JMTEB とは

こんにちは,SB Intuitions の李聖哲,大萩雅也,李凌寒です。

今回紹介する日本語テキスト埋め込みベンチマーク(Japanese Massive Text Embedding Benchmark, JMTEB)とは,日本語のデータセットを収集・作成して構築したテキスト埋め込み (text embeddings) の評価ベンチマークです。テキスト埋め込みとは,テキストを,その意味の類似性を捉えたベクトルに変換したものであり,文の類似度判定や検索などに応用できる基礎技術です。LLM の能力を拡張する検索拡張生成(Retrieval Augmented Generation, RAG)への応用などでも注目を集めています。

これまで日本国内でも多くの日本語埋め込みモデルが作成されてきましたが,標準的なベンチマークが必要になってきます。英語の場合はMTEBなどがあるのですが,日本語では標準的なベンチマークが存在せず,各モデルの性能を統一的かつ横断的に評価することが困難でした。この問題を解決すべく構築したのが JMTEB です。JMTEBを用いると,モデル間の比較評価が簡単にできます。

JMTEBでは,多様なタスクおよびドメインで評価するため,2024年5月現在,6つのタスク,計16個のデータセットを収集しました。現在,全てのデータセットは公開データから収集した形になっています。

各タスクの概要は以下の通りです。

タスク名

データセット数

タスク概要

Clustering

2

意味の近い文章を同じクラスタに,遠い文章を異なるクラスタにまとめる。

Classification

4

文章がそのクラスに属するかを分類する。

STS

2

二つの文章の類似度を測る。

Pair Classification

1

二つの文章のペアが言い換えか,言い換えではないかに二値分類する。

Retrieval

6

特定のクエリから関連するドキュメントを検索する。

Reranking

1

クエリとそれと関連するドキュメントの関連性強弱で,ドキュメントをランキングする。

各データセットのソースを掲載します。本ベンチマークの作成にあたり,各データセットを制作・公開してくださった原著者の方々に深く感謝いたします。

各データセットのソース

タスク

データセット

Clustering

Livedoor-News, MewsC-16-ja

Classification

AmazonCounterfactualClassification, AmazonReviewClassification, MassiveIntentClassification, MassiveScenarioClassification

STS

JSTS, JSICK

Pair Classification

PAWS-X-ja

Retrieval

JAQKET (AIO ver.1), Mr.TyDi-ja, JaGovFaqs-22k, NLP Journal title-abs, NLP Journal title-intro, NLP Journal abs-intro

Reranking

esci

評価結果

本節では,JMTEBを用いた,既存のOSS日本語埋め込みモデルとOpenAI text embedding APIの性能評価結果を紹介します。

Model

Classification平均

Clustering平均

STS平均

PairClassification平均

Retrieval平均

Reranking平均

16データセットの平均

cl-nagoya/sup-simcse-ja-base

73.47

51.79

82.05

62.57

49.64

91.83

63.36

cl-nagoya/sup-simcse-ja-large

73.73

50.57

83.19

62.51

37.62

91.48

58.88

pkshatech/GLuCoSE-base-ja

76.83

49.79

78.72

66.39

59.02

91.90

67.29

intfloat/multilingual-e5-small

67.62

46.91

80.08

62.19

67.27

93.03

67.70

intfloat/multilingual-e5-base

69.31

48.26

79.84

62.26

68.21

92.85

68.61

intfloat/multilingual-e5-large

72.89

51.24

79.70

62.15

70.98

92.96

70.90

OpenAI-text-embedding-ada-002

69.75

50.52

79.02

62.40

64.38

93.04

67.49

OpenAI-text-embedding-3-small

73.06

51.06

79.46

62.27

66.54

92.92

69.23

OpenAI-text-embedding-3-large

77.58

53.32

82.52

62.35

74.48

93.58

74.05

全体の評価結果はページ最後の付録スライドに載せていますが,ここではその一部を紹介したいと思います。抜粋して

  • intfloat/multilingual-e5-largeが今回試したOSSモデルの中では最も検索タスクに強い性能を示しています。

  • pkshatech/GLuCoSE-base-jaが日本語のみで学習されたモデルの中では全体的に一番高い性能を示しました。検索タスクではintfloat/multilingual-e5-largeモデルほど高い性能ではないのですが,検索以外のタスクでは高い性能を示しています。

  • OpenAIのtext-embedding-3-largeは全体的にかなり高い性能を示し,特に検索タスクで特に優れた性能を示しています。

これらの傾向の一部は,各モデルの学習データの影響によるものと解釈できます。例えば,intfloat/multiligual-e5-baseはMS MARCO, Trivia QA, SQuAD, Quora, Mr.TyDiなどの検索データセットを使用して学習されているため,これがRerankingとRetrievalにおける高い性能に繋がっていると考えられます。pkshatech/GLuCoSE-base-jaの学習データにはPAWS-Xが含まれており,同データセットを含むPairClassificationの評価において一際高いスコアを示しています。

はじめてのJMTEB

本節では,前節のようなJMTEBによる埋め込みモデルの評価結果を導出する手順を紹介します。さらなる詳細についてはレポジトリ内のREADMEもご参照ください。

まず,依存ライブラリをインストールし,テストを実行してプログラム実行の準備が整っているかを確認します。

git clone git@github.com:sbintuitions/JMTEB
cd JMTEB
poetry install
poetry run pytest tests

準備ができたら,コマンドを実行してみましょう。お試しなので--eval_includeで,比較的計算が軽いタスクのみを対象とします。

export MODEL="cl-nagoya/sup-simcse-ja-base"
poetry run python -m jmteb \
  --embedder SentenceBertEmbedder \
  --embedder.model_name_or_path $MODEL \
  --save_dir "output/$MODEL" \
  --eval_include "['jsts', 'livedoor_news']"

結果は,output/$MODELに出力されます。各タスクのフォルダにキャッシュと詳細な評価結果が保存され,全てのタスクが完了したらsummary.jsonも出力され,各タスクのmain metricの数値が記録されます。

summary.jsonの一例
{
    "STS": {
        "jsts": {
            "spearman": 0.8085303298649549
        }
    },
    "Clustering": {
        "livedoor_news": {
            "v_measure_score": 0.5341039101076804
        },
    },
}

ベンチマークを用いた分析例: 正規化に関する考察

二つのベクトル e1 , e2 の類似度を測るため,内積(e1 ⋅ e2)がよく用いられます。これは二つのベクトルの長さとなす角から計算される尺度です。もう一つよく用いられる尺度にコサイン類似度(e1 ⋅ e2 / |e1| |e2|)があり,これは2つのベクトルのなす角のみで近さを計算する尺度で,ベクトルを正規化(ベクトルの長さを一律1にすること)してから内積をとることに相当します。

正規化すべきかどうかについては,検証が少なく,定説がないところで,正規化の効果を検証してみました。ベンチマークの構築により,このような検証を簡単に行うことができます。

実験設定は簡単です:モデルを正規化あり・なしの設定でそれぞれスコアを測定します。対象となるモデルは,学習時にコサイン類似度を用いた損失関数が用いられたと確認できた,計18個のモデルです。OpenAIのtext embedding APIは正規化済みの結果を返すため,対象となりません。実験結果は下表の通りです。

Model

正規化

Classification平均

Clustering平均

STS平均

PairClassification平均

Retrieval平均

Reranking平均

16データセット平均

18モデルの平均スコア

69.08

50.68

79.44

62.55

50.67

91.98

61.97

73.82

49.84

79.48

62.65

52.35

92.08

63.92

cl-nagoya/sup-simcse-ja-base

67.38

51.34

81.84

62.40

46.35

91.62

60.50

73.47

51.79

82.05

62.57

49.64

91.83

63.36

pkshatech/GLuCoSE-base-ja

74.35

48.06

78.37

65.89

58.96

91.95

66.37

76.83

49.79

78.72

66.39

59.02

91.90

67.29

この結果より,下記のような考察ができます。

  • STS,Clustering,PairClassificationとRerankingにおいては,顕著な差がないですが,ClassificationとRetrievalにおいては,明らかに正規化しない方がスコアが高いです。

  • 実際,16データセットの中,「正規化あり > 正規化なし」のようなタスクがMewsC-16-jaのみです。

  • 正規化により,ベクトルのスケール情報が消えてしまいます。そのため,埋め込み表現に含まれる情報量が低減し,それにセンシティブなタスクにおいて性能劣化が発生するという推測できます。

結論としては,大体のタスクでは,正規化する必要がありません。

おわりに

今回公開した日本語テキスト埋め込みベンチマーク (JMTEB) を使えば,日本語埋め込みモデルを統一的かつ横断的に評価することができます。より細かい使い方・分析などは,付録のスライドをご参照ください。皆様の日本語埋め込みモデルの構築・評価の作業に少しでもお役に立てれば嬉しく思います。

また,弊社も独自の日本語埋め込みモデルの構築を進めています。続報をお待ちください。

付録

スライドもご参照ください。