hotchpotch
commited on
Update README.md
Browse files
README.md
CHANGED
@@ -117,6 +117,40 @@ tensor([[1.0000, 0.2814, 0.3620, 0.2818],
|
|
117 |
|
118 |
またTransformerモデルを利用してCPUで文章ベクトルを作った場合、少ない文章量でもだいぶ時間がかか、という経験をされた方も多いと思います。StaticEmbedding モデルではCPUがそこそこ速ければ一瞬で終わるはず。さすが100倍速。
|
119 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
120 |
## なぜCPUで推論が高速なの?
|
121 |
|
122 |
StaticEmbedding はTransformerモデルではありません。つまりTrasformerの特徴である "Attention Is All You Need" なアテンションの計算が一切ないのです。文章に出てくる単語トークンを1024次元のテーブルに保存して、文ベクトル作成時にはそれの平均をとっているだけです。なお、アテンションがないので、文脈の理解などはしていません。
|
|
|
117 |
|
118 |
またTransformerモデルを利用してCPUで文章ベクトルを作った場合、少ない文章量でもだいぶ時間がかか、という経験をされた方も多いと思います。StaticEmbedding モデルではCPUがそこそこ速ければ一瞬で終わるはず。さすが100倍速。
|
119 |
|
120 |
+
### 出力次元を小さくする
|
121 |
+
|
122 |
+
標準で作られる文ベクトルの次元は1024ですが、これをさらに小さく次元削減することもできます。例えば 128 を指定してみましょう。
|
123 |
+
|
124 |
+
```python
|
125 |
+
# truncate_dim は 32, 64, 128, 256, 512, 1024 から指定
|
126 |
+
model = SentenceTransformer(model_name, device="cpu", truncate_dim=128)
|
127 |
+
|
128 |
+
query = "美味しいラーメン屋に行きたい"
|
129 |
+
docs = [
|
130 |
+
"素敵なカフェが近所にあるよ。落ち着いた雰囲気でゆっくりできるし、窓際の席からは公園の景色も見えるんだ。",
|
131 |
+
"新鮮な魚介を提供する店です。地元の漁師から直接仕入れているので鮮度は抜群ですし、料理人の腕も確かです。",
|
132 |
+
"あそこは行きにくいけど、隠れた豚骨の名店だよ。スープが最高だし、麺の硬さも好み。",
|
133 |
+
"おすすめの中華そばの店を教えてあげる。とりわけチャーシューが手作りで柔らかくてジューシーなんだ。",
|
134 |
+
]
|
135 |
+
|
136 |
+
embeddings = model.encode([query] + docs)
|
137 |
+
print(embeddings.shape)
|
138 |
+
similarities = model.similarity(embeddings[0], embeddings[1:])
|
139 |
+
for i, similarity in enumerate(similarities[0].tolist()):
|
140 |
+
print(f"{similarity:.04f}: {docs[i]}")
|
141 |
+
```
|
142 |
+
|
143 |
+
```
|
144 |
+
(5, 128)
|
145 |
+
0.1464: 素敵なカフェが近所にあるよ。落ち着いた雰囲気でゆっくりできるし、窓際の席からは公園の景色も見えるんだ。
|
146 |
+
0.3094: 新鮮な魚介を提供する店です。地元の漁師から直接仕入れているので鮮度は抜群ですし、料理人の腕も確かです。
|
147 |
+
0.5923: あそこは行きにくいけど、隠れた豚骨の名店だよ。スープが最高だし、麺の硬さも好み。
|
148 |
+
0.3405: おすすめの中華そばの店を教えてあげる。とりわけチャーシューが手作りで柔らかくてジューシーなんだ。
|
149 |
+
```
|
150 |
+
|
151 |
+
128次元のベクトルになり、結果のスコアも若干変わりましたね。次元が小さくなったことで、性能が少々劣化しています(後半にベンチマークを記載)。ただ1024次元から128次元に減ることで、保存するストレージサイズが減ったり、検索時などに利用する類似度計算コストが約8倍速になったりとなったりと、用途によっては小さい次元の方が嬉しいことも多いでしょう。
|
152 |
+
|
153 |
+
|
154 |
## なぜCPUで推論が高速なの?
|
155 |
|
156 |
StaticEmbedding はTransformerモデルではありません。つまりTrasformerの特徴である "Attention Is All You Need" なアテンションの計算が一切ないのです。文章に出てくる単語トークンを1024次元のテーブルに保存して、文ベクトル作成時にはそれの平均をとっているだけです。なお、アテンションがないので、文脈の理解などはしていません。
|