hotchpotch commited on
Commit
c42c316
·
verified ·
1 Parent(s): 9ec4187

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +45 -11
README.md CHANGED
@@ -23,19 +23,20 @@ datasets:
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
- 文章の密ベクトルは、情報検索・文章判別・類似文章抽出など、さまざまな用途に使うことができます。しかしながら最先端のTransformerモデルは小さいモデルでも、とりわけCPUでは遅く、変換速度が実用でないこともしばしばです。
31
 
32
- しかしながら、先日公開されたTransformerモデル「ではない」 [StaticEmbeddingモデル](https://huggingface.co/blog/static-embeddings)は、例えば [intfloat/multilingual-e5-small](https://huggingface.co/intfloat/multilingual-e5-small) (以下mE5-small)とのベンチマーク比較では85%のスコアという実用できる性能で、かつCPUで動作時に126倍高速に文ベクトルを作成することができる、という驚きの速度です。
 
 
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 を使っていつもの方法で文ベクトルを作れます。今回はGPUを使わず、CPUで実行してみましょう。なお SentenceTransformer は 3.3.1 で試しています。
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
- また速度も、CPUで文ベクトルを作った方は少ない文章量でもだいぶ時間がかかるな、という経験をされた方も多いと思いますが、StaticEmbedding モデルではCPUがそこそこ速ければ一���で終わると思います。さすが100倍速。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
 
90
  ## なぜCPUで推論が高速なの?
91
 
92
- StaticEmbedding はTransformerモデルではありません。つまりTrasformerの特徴であるアテンションの計算が一切ないです。文章に出てくる単語トークンを1024次元のテーブルに保存して、文ベクトルではそれの平均をとっているだけです。なお、アテンションがないので、文脈の理解などはしていません。
93
 
94
- また PyTorch の nn.EmbeddingBag を使って、全てを連結したトークンとオフセットを渡して処理することで、PyTorch の最適化で高速なCPU並列処理とメモリアクセスがされているようです。
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 で評価された方は、mr-tidy タスクの700万文章のベクトル化に時間がかなりかかる(モデルにもよりますがRTX4090で1~4時間ほど)と思います。これもStaticEmbeddingsでは非常に速く、RTX4090では約4分で処理終えることができました。
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