実験設定・結果について詳細に記述したTechnical Reportをpreprintとして公開しました。
Tsukagoshi et al., 2023. Japanese SimCSE Technical Report
文埋め込みは自然言語文の密ベクトル表現であり、類似文検索や質問応答、最近では検索補助付き生成(Retrieval Augmented Generation: RAG)に盛んに利用されています。
文埋め込みを構成する方法には様々な種類がありますが、近年では事前学習済み言語モデルに対して対照学習(Contrastive Learning)によるfine-tuningを施す手法が高い性能を示しています。 その中でも代表的な手法がSimCSE (Simple Contrastive Sentence Embedding)です。
SimCSEには教師なし・教師ありの二つの設定があります。 教師なし設定では、事前学習済み言語モデル中に存在するDropoutモジュールをデータ拡張の手段とみなして「モデルに同じ文を2回入れて、同じ文同士を正例とする」ことで対照学習を行います。 教師あり設定では、自然言語推論(Natural Language Inference: NLI)データセットを利用して「同じ意味の文同士を正例とする」ことで対照学習を行います。
2021年に発表されたSimCSEはもはや文埋め込みのデファクトスタンダードと言えるほど広く高い性能を示しており、多くの派生研究が存在します。 しかし、多くの研究は英語のみで評価を行っており、日本語の文埋め込みモデルはそこまで多くなく、特に日本語文埋め込みを網羅的に評価した研究は存在しません。 ベクトル検索など文埋め込みの応用範囲を考えると、日本語文埋め込みについて網羅的に検証を行い、よいベースラインを構築することは重要です。
そこで、SimCSEをベースに多様な事前学習済み言語モデル・訓練データセット・ハイパーパラメータで訓練を行い、日本語文埋め込みの網羅的な評価を行いました。 具体的には、教師あり設定で7200回、教師なし設定で5760回の実験を実施しました。
本リポジトリではその結果と実験に用いたスクリプトを公開します。 また、実験の結果選定された設定でfine-tuningを行った、事前学習済みの日本語文埋め込みモデルを4つ公開し、また、それらの評価結果も示します。
Model | Dataset | JSICK (test) | JSTS (val) |
---|---|---|---|
cl-nagoya/sup-simcse-ja-large | JSNLI | 83.05 | 83.07 |
cl-nagoya/sup-simcse-ja-base | JSNLI | 82.75 | 80.86 |
cl-nagoya/unsup-simcse-ja-large | Wiki40b | 79.62 | 81.40 |
cl-nagoya/unsup-simcse-ja-base | Wiki40b | 79.01 | 78.95 |
これらのモデルは、文埋め込みモデルのライブラリSentence Transformersから簡単に利用できるようにしてあります。 実際の使用例は以下のとおりです。
# サンプルコード
from sentence_transformers import SentenceTransformer
sentences = ["こんにちは、世界!", "文埋め込み最高!文埋め込み最高と叫びなさい", "極度乾燥しなさい"]
model = SentenceTransformer("cl-nagoya/sup-simcse-ja-base")
embeddings = model.encode(sentences)
以降の節では、今回行った実験の詳細な設定と、評価結果について記述します。
本実験の目的は、日本語文埋め込みモデルの網羅的な評価を行い、よいベースラインとなる日本語文埋め込みモデルを構築することです。 そこで今回は、4つの設定について、それぞれの組み合わせで実験を行いました。 具体的には、24種類のモデル、5+4種類のデータセット、4つのバッチサイズ、3つの学習率の組み合わせについて実験を行いました。
より具体的には、以下の設定からそれぞれ実験を行いました。
- モデル: 24種類 (後述の表を参照)
- データセット
- バッチサイズ: 64, 128, 256, 512
- 学習率: 1e-5, 3e-5, 5e-5
手法の詳細についてここでは述べませんが、学習スクリプトについては、SimCSEの公式実装を参考に、より簡略化して実装したSimple-SimCSEをベースに実装しました。
また、温度パラメータについては、事前実験の結果を元に、ハイパーパラメータ探索の候補から外し、SimCSEのデフォルト値の0.05を用いました。
上記訓練データセットの作成には本リポジトリのsrc/datasets
以下のスクリプトを用いました。
異なる乱数シード値で5回ずつ実験を行い、その平均を評価スコアとしました。 結果として、教師あり設定では7200回、教師なし設定では5760回の実験を実施しました。 各実験では、一定の事例数ごとに開発セットでの評価を行い、最良のcheckpointを各実験の評価時に用いました。
また、各モデル・データセットごとに、各バッチサイズ・学習率の組み合わせについて、開発セットでのスピアマンの順位相関係数が最も高いハイパラを最終的な評価に用いました。 つまり、5回の実験のスコアを平均した結果、モデルごとに最もよいハイパーパラメータを選んで最終的な評価に用いました。
上記データセットのうち、NU-SNLI, NU-MNLI, NU-SNLI+MNLIは、それぞれ、Stanford NLI (SNLI)データセットとMulti-Genre NLI (MNLI)データセットをChatGPT (gpt-3.5-turbo)を用いて英日翻訳したデータから構成される独自のNLIデータセットです。 本来であればこれらをまとめてNU-NLIデータセット(仮称)として公開したかったのですが、ライセンスの問題から現在は公開を見送っている状況です。 ご了承ください。
評価タスクとして文類似度(Semantic Textual Similarity)タスクを用いました。 評価データセットとしてJSICK (GitHub, HuggingFace)とJSTSを用いました。
このうち、JSICKの開発(val)セットを文埋め込みモデル訓練中の開発セットとして用い、JSICKのテスト(test)セットとJSTSの訓練(train)・開発(val)セットを最終的な評価に用いました。 つまり、ハイパーパラメータ探索に利用した評価セットは、開発セットとして用いたJSICKの開発セットになります。 また、最終的な評価も5回の実験の平均をとっています。 SimCSEは乱数シード値やハイパラによって性能がブレやすい手法なので、複数回の実験の平均をとることで出来るだけブレを抑えています。
各モデル・データセットごとに最良のハイパラを選んだ際の評価結果を、教師あり・教師なしそれぞれresults/sup-simcse/best.csv
およびresults/unsup-simcse/best.csv
に格納してあります。
また、すべてのデータセット・すべてのモデル・すべてのハイパーパラメータでの平均スコアは本リポジトリのresults/sup-simcse/all.csv
およびresults/unsup-simcse/all.csv
に格納されています。
お好みのモデルで評価をしたい場合に、どのデータセットやハイパラを選べばいいかの参考にぜひお使いください。
以下の節では、教師あり・教師なしのそれぞれについて、実験の結果を示します。
まず、データセットとしてJSNLIを用いた場合の、教師あり設定でのモデルごとの結果を示します。 以下の表は比較的小さい(110M程度)の事前学習済み言語モデルを用いた際の結果です。
Base models | JSICK (val) | JSICK (test) | JSTS (train) | JSTS (val) | Avg. |
---|---|---|---|---|---|
cl-tohoku/bert-base-japanese-v3 | 83.60 | 82.66 | 77.34 | 80.70 | 80.23 |
cl-tohoku/bert-base-japanese-v2 | 84.20 | 83.39 | 77.03 | 80.70 | 80.37 |
cl-tohoku/bert-base-japanese | 83.39 | 82.44 | 75.25 | 78.46 | 78.72 |
cl-tohoku/bert-base-japanese-whole-word-masking | 83.29 | 82.32 | 75.79 | 79.01 | 79.04 |
studio-ousia/luke-japanese-base-lite | 82.89 | 81.72 | 75.64 | 79.34 | 78.90 |
ku-nlp/deberta-v2-base-japanese | 81.90 | 80.78 | 74.71 | 78.39 | 77.96 |
nlp-waseda/roberta-base-japanese | 82.94 | 82.00 | 75.65 | 79.63 | 79.09 |
megagonlabs/roberta-long-japanese | 82.25 | 80.77 | 72.39 | 76.54 | 76.57 |
cl-tohoku/bert-base-japanese-char-v3 | 82.57 | 81.35 | 75.75 | 78.62 | 78.57 |
cl-tohoku/bert-base-japanese-char-v2 | 83.38 | 81.95 | 74.98 | 78.64 | 78.52 |
cl-tohoku/bert-base-japanese-char | 82.89 | 81.40 | 74.35 | 77.79 | 77.85 |
ku-nlp/roberta-base-japanese-char-wwm | 82.80 | 80.62 | 74.35 | 78.54 | 77.84 |
bert-base-multilingual-cased | 83.46 | 82.12 | 73.33 | 76.82 | 77.42 |
xlm-roberta-base | 80.29 | 78.42 | 72.54 | 76.02 | 75.66 |
studio-ousia/mluke-base-lite | 83.48 | 81.96 | 74.97 | 78.47 | 78.47 |
JSICK (val)は実験時に開発セットとして用いたデータセットです。
そのため、JSICK (val)は最終的な評価スコアに含めるのに相応しくないため、平均性能を示すAvg.
はJSICK (test), JSTS (train), JSTS (val)の評価スコアを平均した値になっています。
表から、東北大BERTが比較的高い性能を示していることがわかり、早稲田大・京大のRoBERTaが近い性能を示していることがわかります。 また、文字レベルのモデルや、多言語モデルの性能は、比較的低めの性能になっています。
次に、比較的大きなモデルでの評価結果を以下に示します。
Large models | JSICK (val) | JSICK (test) | JSTS (train) | JSTS (val) | Avg. |
---|---|---|---|---|---|
cl-tohoku/bert-large-japanese-v2 | 83.97 | 82.63 | 79.44 | 82.98 | 81.68 |
cl-tohoku/bert-large-japanese | 83.70 | 82.54 | 76.49 | 80.09 | 79.71 |
studio-ousia/luke-japanese-large-lite | 83.82 | 82.50 | 78.94 | 82.24 | 81.23 |
nlp-waseda/roberta-large-japanese | 84.42 | 83.08 | 79.28 | 82.63 | 81.66 |
ku-nlp/deberta-v2-large-japanese | 79.81 | 79.47 | 77.32 | 80.29 | 79.03 |
cl-tohoku/bert-large-japanese-char-v2 | 83.63 | 82.14 | 77.97 | 80.88 | 80.33 |
ku-nlp/roberta-large-japanese-char-wwm | 83.30 | 81.87 | 77.54 | 80.90 | 80.10 |
xlm-roberta-large | 83.59 | 82.04 | 76.63 | 79.91 | 79.53 |
studio-ousia/mluke-large-lite | 84.02 | 82.34 | 77.69 | 80.01 | 80.01 |
表から、やはり東北大BERTの性能が高いことがわかります。 また、Studio Ousiaの日本語LUKEも高い性能を示しました。
次に、データセットとしてWiki40Bを用いた場合の、教師なし設定でのモデルごとの結果を示します。
Base models | JSICK (val) | JSICK (test) | JSTS (train) | JSTS (val) | Avg. |
---|---|---|---|---|---|
cl-tohoku/bert-base-japanese-v3 | 79.17 | 78.47 | 74.82 | 78.70 | 77.33 |
cl-tohoku/bert-base-japanese-v2 | 80.25 | 79.72 | 72.75 | 77.65 | 76.71 |
cl-tohoku/bert-base-japanese | 76.94 | 76.90 | 72.29 | 75.92 | 75.04 |
cl-tohoku/bert-base-japanese-whole-word-masking | 77.52 | 77.37 | 73.23 | 77.14 | 75.91 |
studio-ousia/luke-japanese-base-lite | 81.29 | 80.29 | 72.91 | 78.12 | 77.11 |
ku-nlp/deberta-v2-base-japanese | 75.51 | 75.23 | 72.07 | 76.54 | 74.61 |
nlp-waseda/roberta-base-japanese | 77.54 | 77.47 | 74.09 | 78.95 | 76.84 |
megagonlabs/roberta-long-japanese | 74.53 | 73.95 | 63.10 | 68.72 | 68.59 |
cl-tohoku/bert-base-japanese-char-v3 | 78.39 | 78.18 | 73.36 | 77.74 | 76.42 |
cl-tohoku/bert-base-japanese-char-v2 | 79.29 | 79.00 | 71.36 | 75.60 | 75.32 |
cl-tohoku/bert-base-japanese-char | 77.27 | 76.94 | 69.25 | 73.00 | 73.07 |
ku-nlp/roberta-base-japanese-char-wwm | 72.21 | 72.21 | 69.73 | 74.69 | 72.21 |
bert-base-multilingual-cased | 78.45 | 78.23 | 67.60 | 72.36 | 72.73 |
xlm-roberta-base | 78.70 | 78.37 | 66.63 | 71.28 | 72.09 |
studio-ousia/mluke-base-lite | 80.38 | 79.83 | 70.79 | 75.31 | 75.31 |
表から、教師なし設定においても、東北大BERT(の特にv3)が高い性能を示したことがわかります。
Large models | JSICK (val) | JSICK (test) | JSTS (train) | JSTS (val) | Avg. |
---|---|---|---|---|---|
cl-tohoku/bert-large-japanese-v2 | 79.54 | 79.14 | 77.18 | 81.00 | 79.11 |
cl-tohoku/bert-large-japanese | 78.54 | 78.30 | 72.87 | 76.74 | 75.97 |
studio-ousia/luke-japanese-large-lite | 79.02 | 78.64 | 75.61 | 79.71 | 77.99 |
nlp-waseda/roberta-large-japanese | 82.94 | 82.56 | 76.04 | 81.28 | 79.96 |
ku-nlp/deberta-v2-large-japanese | 74.60 | 74.95 | 73.49 | 77.34 | 75.26 |
cl-tohoku/bert-large-japanese-char-v2 | 79.07 | 78.73 | 75.68 | 79.10 | 77.83 |
ku-nlp/roberta-large-japanese-char-wwm | 76.89 | 76.88 | 72.93 | 77.52 | 75.78 |
xlm-roberta-large | 81.50 | 80.80 | 74.66 | 79.09 | 78.18 |
studio-ousia/mluke-large-lite | 80.38 | 79.44 | 73.11 | 77.66 | 76.74 |
表から、教師なし設定においても、東北大BERT(の特にv2)が高い性能を示しました。
次に、データセットに対するモデルの頑健性(データセットが変わってもちゃんと性能が出せるか)を調べるために、データセットごとにモデルの順位をつけ、その平均を計算しました。 その結果が以下の表です。
Model | Supervised | Unsupervised |
---|---|---|
nlp-waseda/roberta-large-japanese | 1.20 | 1.00 |
cl-tohoku/bert-large-japanese-v2 | 2.20 | 4.25 |
studio-ousia/luke-japanese-large-lite | 2.80 | 3.50 |
cl-tohoku/bert-base-japanese-v3 | 6.40 | 4.50 |
studio-ousia/mluke-large-lite | 6.60 | 8.00 |
cl-tohoku/bert-base-japanese-v2 | 6.80 | 10.25 |
cl-tohoku/bert-large-japanese-char-v2 | 7.00 | 5.00 |
ku-nlp/roberta-large-japanese-char-wwm | 8.00 | 15.25 |
cl-tohoku/bert-large-japanese | 9.00 | 10.50 |
studio-ousia/luke-japanese-base-lite | 10.00 | 7.00 |
xlm-roberta-large | 11.80 | 5.00 |
nlp-waseda/roberta-base-japanese | 12.80 | 8.50 |
ku-nlp/deberta-v2-large-japanese | 13.20 | 13.25 |
cl-tohoku/bert-base-japanese-whole-word-masking | 13.80 | 16.75 |
studio-ousia/mluke-base-lite | 15.00 | 17.00 |
ku-nlp/deberta-v2-base-japanese | 15.40 | 15.75 |
cl-tohoku/bert-base-japanese | 16.40 | 18.00 |
ku-nlp/roberta-base-japanese-char-wwm | 16.60 | 22.25 |
cl-tohoku/bert-base-japanese-char-v3 | 17.40 | 12.75 |
cl-tohoku/bert-base-japanese-char-v2 | 19.60 | 15.25 |
bert-base-multilingual-cased | 20.60 | 20.75 |
cl-tohoku/bert-base-japanese-char | 22.00 | 19.50 |
xlm-roberta-base | 22.60 | 22.00 |
megagonlabs/roberta-long-japanese | 22.80 | 24.00 |
表から、早稲田大RoBERTaが一貫して高い性能を示していることがわかりました。 早稲田大RoBERTaはJuman++による事前の分かち書きが必要ですが、概して高い性能を発揮しているので、検討する価値がある強いモデルだと思われます。
次に、データセットごとに分析を行った結果を示します。
以下の表は、教師あり設定において、モデルをcl-tohoku/bert-large-japanese-v2
に固定した際の、データセットごとの結果です。
Dataset | JSICK (val) | JSICK (test) | JSTS (train) | JSTS (val) | Avg. |
---|---|---|---|---|---|
JSNLI | 83.97 | 82.63 | 79.44 | 82.98 | 81.68 |
NU-SNLI | 83.62 | 82.49 | 79.20 | 82.34 | 81.34 |
NU-SNLI+MNLI | 82.44 | 81.87 | 79.59 | 82.81 | 81.43 |
JaNLI | 81.10 | 80.92 | 73.41 | 77.98 | 77.44 |
NU-MNLI | 75.65 | 75.39 | 81.13 | 83.53 | 80.02 |
今回の実験では、JSNLIが最も高い性能を示しました。 また、興味深いこととして、MNLIを機械翻訳したのNU-MNLIでの性能が、比較的低めになっていることがわかります。 英語文埋め込みモデルではMNLIを加えることで性能が向上することが多いため、これは意外な結果となりました。
この理由としては、以下が考えられそうです。
- 翻訳品質が悪い
- 高品質な翻訳は必ずしもSTSの性能に寄与しない
- ベンチマークデータセットの規模・多様性が不足している
- 運が悪かった
次に、モデルごとにデータセットの順位をつけ、その平均を計算したものが以下の表です。
Dataset | Supervised |
---|---|
JSNLI | 1.583 |
NU-SNLI+MNLI | 2.000 |
NU-SNLI | 2.417 |
NU-MNLI | 4.375 |
JaNLI | 4.625 |
表からも、とりあえずJSNLIを選んでおけば間違いなさそうなことがわかります。 JaNLIは比較的低めの結果になっていますが、これはデータセットの規模が小さく、一般的なNLIデータセットとは少し違う目的で作成されていることが理由だと思われます。
以下の表は、教師なし設定において、モデルをcl-tohoku/bert-large-japanese-v2
に固定した際の、データセットごとの結果です。
Dataset | JSICK (val) | JSICK (test) | JSTS (train) | JSTS (val) | Avg. |
---|---|---|---|---|---|
Wikipedia | 79.63 | 79.40 | 77.18 | 80.28 | 78.95 |
BCCWJ | 79.60 | 79.45 | 76.71 | 80.83 | 79.00 |
Wiki40B | 79.54 | 79.14 | 77.18 | 81.00 | 79.11 |
CC100 | 76.26 | 76.27 | 71.39 | 75.91 | 74.52 |
モデルとしてcl-tohoku/bert-large-japanese-v2
を使い場合、Wiki40Bが最も良い結果になりました。
また、モデルごとにデータセットの順位をつけ、その平均を計算しました。
Dataset | Unsupervised |
---|---|
Wikipedia | 1.875 |
BCCWJ | 2.083 |
Wiki40B | 2.208 |
CC100 | 3.833 |
上の表から、大雑把にですが、SimCSEの訓練にはWebコーパスよりWikipedia系を選んでおいた方がなんとなく良さそう、という傾向が読み取れます。
次に、ハイパーパラメータについての順位も算出しました。 具体的には、バッチサイズごとに学習率の順位をつけ、その平均を計算しました。
Supervised | 1e-5 | 3e-5 | 5e-5 | Avg. |
---|---|---|---|---|
64 | 2.750 | 2.700 | 2.742 | 2.731 |
128 | 2.683 | 2.500 | 2.550 | 2.578 |
256 | 2.242 | 2.400 | 2.442 | 2.361 |
512 | 2.325 | 2.400 | 2.267 | 2.331 |
Unsupervised | 1e-5 | 3e-5 | 5e-5 | Avg. |
---|---|---|---|---|
64 | 1.344 | 2.083 | 2.500 | 1.976 |
128 | 1.969 | 1.656 | 1.854 | 1.826 |
256 | 2.990 | 2.792 | 2.375 | 2.719 |
512 | 3.698 | 3.469 | 3.271 | 3.479 |
表から、教師あり設定ではどのバッチサイズとして512を、教師なし設定ではバッチサイズとして64か128くらいを選んでおくのが良さそうということが読み取れます。
最後に、公開した事前学習済み文埋め込みモデルについての詳細について説明します。
公開したモデルは、使いやすさ等の視点から選定したモデルについて、以下の表に示すハイパーパラメータでそれぞれのモデルをfine-tuningしたものです。
fine-tuning元のモデルとしては、cl-tohoku/bert-large-japanese-v2
とcl-tohoku/bert-base-japanese-v3
を用いています。
教師あり・教師なしの二つの設定について3回実験を行い、最も開発セットでの性能が高いモデルを公開用のモデルとして選定しています。
Model | Dataset | LR | Batch Size | STS Avg. |
---|---|---|---|---|
cl-nagoya/sup-simcse-ja-large | JSNLI | 5e-5 | 512 | 81.91 |
cl-nagoya/sup-simcse-ja-base | JSNLI | 5e-5 | 512 | 80.49 |
cl-nagoya/unsup-simcse-ja-large | Wiki40b | 3e-5 | 64 | 79.60 |
cl-nagoya/unsup-simcse-ja-base | Wiki40b | 5e-5 | 64 | 77.48 |
また、公開したモデルと、既存の日本語対応文埋め込みモデルについて、評価結果を比較したものが以下の表になります。
補助的な比較対象として、事前学習済み言語モデルをfine-tuningせずに、そのまま文埋め込みモデルとして用いた場合の結果も示しています。
評価にはsrc/evaluate.py
を用いました。
表から、全体として今回公開したモデルが最もよい性能を示していることがわかります。 また、OpenAIのtext-embedding-ada-002よりも高い性能になっている点は注目に値するでしょう。
さらに、cl-nagoya/unsup-simcse-ja-largeなどUnsupervised SimCSEによってfine-tuningされた文埋め込みモデルの性能が、教師あり学習された他のモデルと遜色ないレベルであることも特筆すべき点と言えるでしょう。
注意として、PKSHA社の文埋め込みモデルはJSTSの開発セットを訓練中の開発セットとして利用しているので、本実験の結果とは直接比較できません。 また、この評価結果はSTSタスクに限定されたものであり、情報検索タスクなど異なるタスクでの汎用性を保証するものではありません。 特に、PKSHA社のGLuCoSEは多様な用途に利用できる文埋め込みモデルとして構築されているため、他のタスクではGLuCoSEの方が性能が高い可能性はかなりあります。 その点についてもご注意ください。
- SimCSEをベースとした日本語文埋め込みモデルについて網羅的に評価・検証を行いました。
- 実験の結果得られた良さそうなモデル4種類をHuggingFace上に公開しました。
- 日本語文埋め込みモデルのベースとしては以下を選んでおくと良さそうです。
- 教師あり設定ではJSNLIを使うのが良さそうです。
- NU-MNLIを加えても性能が向上しなかった点は興味深く、以下の要因がありそうです。
- 翻訳品質が悪い
- 高品質な翻訳は必ずしもSTSの性能に寄与しない
- ベンチマークデータセットの規模・多様性が不足している
- 運が悪かった
- NU-MNLIを加えても性能が向上しなかった点は興味深く、以下の要因がありそうです。
- 教師なし設定ではWikipediaを適当に使っておくのが良さそうです。
- CC100の性能が悪かったので、綺麗さも大事そうです。
- データセットごとに大きな違いはなさそうなので、綺麗であればなんでも良いかもしれません。
- https://tech.yellowback.net/posts/sentence-transformers-japanese-models
- https://github.com/oshizo/JapaneseEmbeddingEval
@article{
tsukagoshi2023JapaneseSimCSE,
title={{Japanese SimCSE Technical Report}},
author={Hayato Tsukagoshi and Ryohei Sasano and Koichi Takeda},
year={2023},
eprint={2310.19349},
archivePrefix={arXiv},
primaryClass={cs.CL},
journal={arXiv:2310.19349},
url = {https://arxiv.org/abs/2310.19349},
}