hotchpotch
commited on
Update README.md
Browse files
README.md
CHANGED
@@ -23,19 +23,20 @@ datasets:
|
|
23 |
library_name: sentence-transformers
|
24 |
---
|
25 |
|
26 |
-
|
27 |
|
28 |
# static-embedding-japanese
|
29 |
|
30 |
-
文章の密ベクトルは、情報検索・文章判別・類似文章抽出など、さまざまな用途に使うことができます。しかしながら最先端のTransformerモデルは小さいモデルでも、とりわけCPUでは遅く、変換速度が実用でないこともしばしばです。
|
31 |
|
32 |
-
|
|
|
|
|
33 |
|
34 |
というわけで、早速日本語(と英語)で学習させたモデル sentence-embedding-japanese を作成し、公開しました。
|
35 |
|
36 |
- https://huggingface.co/hotchpotch/static-embedding-japanese
|
37 |
|
38 |
-
日本語の文章ベクトルの性能を評価する [JMTEB](https://github.com/sbintuitions/JMTEB) の結果は以下です。総合スコアでは mE5-small には若干及ばないまでも、タスクによっては勝っていたりしますし、[他の日本語baseサイズbertモデルよりもスコアが高いこともある](https://github.com/sbintuitions/JMTEB/blob/main/leaderboard.md)
|
39 |
|
40 |
| Model | Avg(micro) | Retrieval | STS | Classification | Reranking | Clustering | PairClassification |
|
41 |
| ---------------------------------------- | ---------- | --------- | ----- | -------------- | --------- | ---------- | ------------------ |
|
@@ -48,7 +49,7 @@ library_name: sentence-transformers
|
|
48 |
|
49 |
## 利用方法
|
50 |
|
51 |
-
利用は簡単、SentenceTransformer
|
52 |
|
53 |
```
|
54 |
pip install "sentence-transformers>=3.3.1"
|
@@ -85,13 +86,46 @@ for i, similarity in enumerate(similarities[0].tolist()):
|
|
85 |
|
86 |
このように、queryにマッチする文章のスコアが高くなるように計算できてますね。この例文では、例えばBM25ではqueryに含まれる「ラーメン」のような直接的な単語が文章に出ていないため、うまくマッチさせることが難しいでしょう。
|
87 |
|
88 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
|
90 |
## なぜCPUで推論が高速なの?
|
91 |
|
92 |
-
StaticEmbedding はTransformerモデルではありません。つまりTrasformer
|
93 |
|
94 |
-
|
95 |
|
96 |
![](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/static-embeddings/similarity_speed.png)
|
97 |
|
@@ -99,7 +133,7 @@ StaticEmbedding はTransformerモデルではありません。つまりTrasform
|
|
99 |
|
100 |
## 評価結果
|
101 |
|
102 |
-
JMTEBでの全ての評価結果は[こちらJSONファイルに記載](https://huggingface.co/hotchpotch/static-embedding-japanese/blob/main/JMTEB/summary.json)しています。[JMTEB Leaderboard](https://github.com/sbintuitions/JMTEB/blob/main/leaderboard.md)で他のモデルと見比べると、相対的な差がわかるでしょう。JMTEBの全体の評価結果はモデルサイズを考えると、すこぶる良好です。なお、JMTEB
|
103 |
|
104 |
### 情報検索でBM25の置き換えができそうか?
|
105 |
|
@@ -113,7 +147,7 @@ JMTEBの中の情報検索タスクの[Retrievalの結果](https://huggingface.c
|
|
113 |
|
114 |
こちらも詳細は追っかけていませんが、スコア的には他のモデルよりもだいぶ悪い結果ですね。クラス分類タスクは悪くないので不思議です。埋め込み空間がマトリョーシカ表現学習で作られた影響もあるのでしょうか。
|
115 |
|
116 |
-
## JQaRA, JaCWIR
|
117 |
|
118 |
[JQaRA](https://huggingface.co/datasets/hotchpotch/JQaRA) の結果はこちら。
|
119 |
|
@@ -173,7 +207,7 @@ JMTEB では、出力時にモデルのパラメータを制御できるため
|
|
173 |
|
174 |
正直、単純なトークンのembeddingsの平均でそんなに性能出るのか半信半疑だったのですが、実際に学習させてみてシンプルなアーキテクチャなのに性能の高さにびっくりしました。Transformer 全盛のこの時代に、古き良き単語埋め込みの活用モデルで、実世界で利活用できそうなモデルの出現に驚きを隠せません。
|
175 |
|
176 |
-
CPUでの推論速度が速い文ベクトル作成モデルは、ローカルCPU環境で大量の文章の変換などはもとより、エッジデバイスだったりネットワークが遅い(リモートの推論サーバを叩けない)
|
177 |
|
178 |
---
|
179 |
|
|
|
23 |
library_name: sentence-transformers
|
24 |
---
|
25 |
|
26 |
+
以下の文章は、記事 [100倍速で実用的な文章ベクトルを作れる、日本語 StaticEmbedding モデルを公開](https://secon.dev/entry/2025/01/21/060000-static-embedding-japanese/) からの転載です。
|
27 |
|
28 |
# static-embedding-japanese
|
29 |
|
|
|
30 |
|
31 |
+
文章の密ベクトルは、情報検索・文章判別・類似文章抽出など、さまざまな用途に使うことができます。しかしながら最先端のTransformerモデルは小さいモデルでも、とりわけCPU環境では処理速度が遅いため実用でないこともしばしばあります。
|
32 |
+
|
33 |
+
しかしながら、先日公開されたTransformerモデル「ではない」 [StaticEmbeddingモデル](https://huggingface.co/blog/static-embeddings)は、例えば [intfloat/multilingual-e5-small](https://huggingface.co/intfloat/multilingual-e5-small) (以下mE5-small)とのベンチマーク比較では85%のスコアという最低十分な性能で、何よりCPUで動作時に126倍高速に文ベクトルを作成することができる、という驚きの速度です。
|
34 |
|
35 |
というわけで、早速日本語(と英語)で学習させたモデル sentence-embedding-japanese を作成し、公開しました。
|
36 |
|
37 |
- https://huggingface.co/hotchpotch/static-embedding-japanese
|
38 |
|
39 |
+
日本語の文章ベクトルの性能を評価する [JMTEB](https://github.com/sbintuitions/JMTEB) の結果は以下です。総合スコアでは mE5-small には若干及ばないまでも、タスクによっては勝っていたりしますし、[他の日本語baseサイズbertモデルよりもスコアが高いこともある](https://github.com/sbintuitions/JMTEB/blob/main/leaderboard.md)ぐらい、最低限実用できそうな性能が出ていますね。本当にそんなに性能が出るのか実際に学習させてみるまでは半信半疑でしたが、驚きです。
|
40 |
|
41 |
| Model | Avg(micro) | Retrieval | STS | Classification | Reranking | Clustering | PairClassification |
|
42 |
| ---------------------------------------- | ---------- | --------- | ----- | -------------- | --------- | ---------- | ------------------ |
|
|
|
49 |
|
50 |
## 利用方法
|
51 |
|
52 |
+
利用は簡単、SentenceTransformer を使っていつもの方法で文章ベクトルを作れます。今回はGPUを使わず、CPUで実行してみましょう。なお SentenceTransformer は 3.3.1 で試しています。
|
53 |
|
54 |
```
|
55 |
pip install "sentence-transformers>=3.3.1"
|
|
|
86 |
|
87 |
このように、queryにマッチする文章のスコアが高くなるように計算できてますね。この例文では、例えばBM25ではqueryに含まれる「ラーメン」のような直接的な単語が文章に出ていないため、うまくマッチさせることが難しいでしょう。
|
88 |
|
89 |
+
続いて、類似文章タスクの例です。
|
90 |
+
|
91 |
+
```python
|
92 |
+
sentences = [
|
93 |
+
"明日の午後から雨が降るみたいです。",
|
94 |
+
"来週の日曜日は天気が良いそうだ。",
|
95 |
+
"あしたの昼過ぎから傘が必要になりそう。",
|
96 |
+
"週末は晴れるという予報が出ています。",
|
97 |
+
]
|
98 |
+
|
99 |
+
embeddings = model.encode(sentences)
|
100 |
+
similarities = model.similarity(embeddings, embeddings)
|
101 |
+
|
102 |
+
print(similarities)
|
103 |
+
|
104 |
+
# 一つ目の文章と、その他の文章の類似度を表示
|
105 |
+
for i, similarity in enumerate(similarities[0].tolist()):
|
106 |
+
print(f"{similarity:.04f}: {sentences[i]}")
|
107 |
+
```
|
108 |
+
|
109 |
+
```
|
110 |
+
tensor([[1.0000, 0.2814, 0.3620, 0.2818],
|
111 |
+
[0.2814, 1.0000, 0.2007, 0.5372],
|
112 |
+
[0.3620, 0.2007, 1.0000, 0.1299],
|
113 |
+
[0.2818, 0.5372, 0.1299, 1.0000]])
|
114 |
+
1.0000: 明日の午後から雨が降るみたいです。
|
115 |
+
0.2814: 来週の日曜日は天気が良いそうだ。
|
116 |
+
0.3620: あしたの昼過ぎから傘が必要になりそう。
|
117 |
+
0.2818: 週末は晴れるという予報が出ています。
|
118 |
+
```
|
119 |
+
|
120 |
+
こちらも、類似文章が高スコアになる結果になりました。
|
121 |
+
|
122 |
+
またTransformerモデルを利用してCPUで文章ベクトルを作った場合、少ない文章量でもだいぶ時間がかか、という経験をされた方も多いと思います。StaticEmbedding モデルではCPUがそこそこ速ければ一瞬で終わるはず。さすが100倍速。
|
123 |
|
124 |
## なぜCPUで推論が高速なの?
|
125 |
|
126 |
+
StaticEmbedding はTransformerモデルではありません。つまりTrasformerの特徴である "Attention Is All You Need" なアテンションの計算が一切ないのです。文章に出てくる単語トークンを1024次元のテーブルに保存して、文ベクトル作成時にはそれの平均をとっているだけです。なお、アテンションがないので、文脈の理解などはしていません。
|
127 |
|
128 |
+
また内部実装では PyTorch の nn.EmbeddingBag を使って、全てを連結したトークンとオフセットを渡して処理することで、PyTorch の最適化で高速なCPU並列処理とメモリアクセスがされているようです。
|
129 |
|
130 |
![](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/static-embeddings/similarity_speed.png)
|
131 |
|
|
|
133 |
|
134 |
## 評価結果
|
135 |
|
136 |
+
JMTEBでの全ての評価結果は[こちらJSONファイルに記載](https://huggingface.co/hotchpotch/static-embedding-japanese/blob/main/JMTEB/summary.json)しています。[JMTEB Leaderboard](https://github.com/sbintuitions/JMTEB/blob/main/leaderboard.md)で他のモデルと見比べると、相対的な差がわかるでしょう。JMTEBの全体の評価結果はモデルサイズを考えると、すこぶる良好です。なお、JMTEB のmr-tidy タスクは700万文章のベクトル化を行うので処理に時間がかなりかかる(モデルにもよりますがRTX4090で1~4時間ほど)と思います。これもStaticEmbeddingsでは非常に速く、RTX4090では約4分で処理終えることができました。
|
137 |
|
138 |
### 情報検索でBM25の置き換えができそうか?
|
139 |
|
|
|
147 |
|
148 |
こちらも詳細は追っかけていませんが、スコア的には他のモデルよりもだいぶ悪い結果ですね。クラス分類タスクは悪くないので不思議です。埋め込み空間がマトリョーシカ表現学習で作られた影響もあるのでしょうか。
|
149 |
|
150 |
+
## JQaRA, JaCWIR でのリランキングタスク評価
|
151 |
|
152 |
[JQaRA](https://huggingface.co/datasets/hotchpotch/JQaRA) の結果はこちら。
|
153 |
|
|
|
207 |
|
208 |
正直、単純なトークンのembeddingsの平均でそんなに性能出るのか半信半疑だったのですが、実際に学習させてみてシンプルなアーキテクチャなのに性能の高さにびっくりしました。Transformer 全盛のこの時代に、古き良き単語埋め込みの活用モデルで、実世界で利活用できそうなモデルの出現に驚きを隠せません。
|
209 |
|
210 |
+
CPUでの推論速度が速い文ベクトル作成モデルは、ローカルCPU環境で大量の文章の変換などはもとより、エッジデバイスだったりネットワークが遅い(リモートの推論サーバを叩けない)環境だったり、色々と活用できそうですね。
|
211 |
|
212 |
---
|
213 |
|