
ベクトル埋め込みとは?
**ベクトル埋め込みとは、高次元空間におけるデータ点の数値表現であり、類似のデータ点ほど近く、非類似のデータ点ほど離れている。例えば、単語間の距離は、ベクトル空間における意味的類似性を示すことができる。パリと東京は互いに近いが、アップルからは遠い。
ベクトル埋め込みは、機械学習や人工知能において、非構造化データ(テキスト、動画、画像、音声など)の意味的な意味を捉え、より効率的で正確な分析、検索、取得を可能にするためによく使われる。ベクトル埋め込みは、通常、ニューラルネットワークモデル(または、より現代的なトランスフォーマーアーキテクチャ)モデルによって生成される。
ベクトル類似検索](https://zilliz.com/blog/similarity-metrics-for-vector-search)は、"密ベクトル検索 "あるいは "埋め込みベクトル検索 "と呼ばれることもあります。これは、検索語と返されたデータが完全に一致しなければならない従来のキーワード検索とは異なります。「レキシカル検索」や「スパース・ベクトル検索」は、通常、従来のキーワード検索を指す用語である。
ベクトル埋め込みは通常、索引付けと効率的な類似検索のために、最新のベクトルデータベースに格納される。
ベクトル埋め込みはどのように作成されるのか?
ベクトル埋め込みは、生データをベクトル空間にマッピングすることを学習する機械学習モデル(埋め込みモデルとも呼ばれます)を用いて作成されます。埋め込みモデルは、情報の各単位を数値のベクトルに変換し、2つのベクトル間の距離は、それらが意味的にどれだけ類似しているかを意味します。
**以下は、ベクトル埋め込みを作成するための主なステップです。
- 最初のステップは、データを選択し、どの変数がベクトルを形成するかを決定することです。このような変数には、テキストコーパスの単語、視覚的なイメージ、ユーザの嗜好などがあります。
次に、トークン化とステミングを使用して、データから関連する特徴を抽出し、テキストデータの単語除去を停止する。画像データの認識と画像特徴の抽出には、畳み込みニューラルネットワーク (CNN)の使用を検討する。
データを前処理した後、Word2Vec、GloVe、OpenAI、または他のディープニューラルネットワークモデルなどの機械学習モデルに入力する。学習中、モデルはデータセット内の各アイテムのベクトル表現を作成するよう学習する。モデルはこれらのベクトルを再スケーリングし、類似項目間の差異を最小化する一方で、異なる項目間の差異を増加させる。
その結果、特定のベクトルがデータセット内の各アイテムを表す多次元ベクトル空間ができる。この空間では、類似項目はより近くにあり、非類似項目はより離れている。
スパース、デンス、2値ベクトル埋め込み
ベクトル埋め込みは、その表現と性質から大きく3つのタイプに分類できる:密な埋め込み、疎な埋め込み、バイナリ埋め込みです。それぞれのタイプには、独自の利点と使用例があります。
密埋め込み(密ベクトル)
密な埋め込みまたは密なベクトルは、ほとんどの要素が0でないベクトルであり、コンパクトな数値表現を提供し、豊かで連続的なデータの特徴を捉えます。一般に、低次元で密な埋め込みは、情報をより小さな空間に効率的に凝縮することができ、ストレージや計算に有用です。高密度埋め込みは、単語埋め込み(例:Word2Vec、GloVe、FastText)、文埋め込み(例:Universal Sentence Encoder、InferSent、Sentence-BERT)、畳み込みニューラルネットワークから得られる画像埋め込み(例:ResNet、VGG)などのアプリケーションで一般的に見られる。高密度の埋め込みは、意味情報をキャプチャするのに非常に有利である。特に、分類、クラスタリング、類似検索タスクのためにこのような詳細な表現に依存する、ニューラルネットワークベースのモデルやディープラーニングに適している。
スパース埋め込み(スパースベクトル)
スパース埋め込み(スパースベクトル)とは、ほとんどの要素がゼロであるベクトルのことで、特定の特徴の有無を強調する高次元表現になることが多い。これらの埋め込みは、TF-IDF(Term Frequency-Inverse Document Frequency)やbag-of-wordsのような手法を通して、テキストマイニングや情報検索で使われます。スパース埋め込みは理解も実装も簡単なので、従来の機械学習アルゴリズムや線形モデルに効果的である。
バイナリ埋め込み(バイナリベクトル)
バイナリ埋め込みまたはバイナリベクトルは、各要素が0か1のどちらかであるベクトルです。これらのエンベッディングは、高次元空間における近似最近傍探索(ANN)のためのLSH(locality-sensitive hashing)や、重みと活性度が2値である2値ニューラルネットワーク、大きなカテゴリ特徴を固定サイズの2値ベクトルに変換する特徴ハッシュ(ハッシュトリック)など、高い効率が要求されるアプリケーションでよく使われます。バイナリベクトル埋め込みは、記憶と計算の効率化を助け、大規模データ処理やリアルタイムアプリケーションに最適です。バイナリベクトル埋め込みは、そのコンパクトな性質から、類似検索タスクに特に有用である。
ベクトル埋め込みを作成するための簡単なガイド
ここでは、事前に訓練された埋め込みモデルを使って、私たち自身の単語の埋め込みを生成する例を示します。Pythonをインストールし、Milvusのベクトルデータベースをセットアップしてください。
まず、milvus、pymilvus、gensimをインストールします。pymilvusはMilvus用のPython SDKで、gensimは自然言語処理(NLP)用のPythonライブラリです。
Gensimは、様々な教師なしアルゴリズムを用いたトピックモデリングと文書類似性分析のためのオープンソースのPythonライブラリです。大規模なテキストコーパスの処理に特化しており、自然言語処理(NLP)タスクで広く利用されている。Gensimは、Word2Vec、FastText、Doc2Vecのような機械学習モデルを通して、単語の埋め込みを学習し、使用することができます。これらの埋め込みは、単語間の意味的関係をキャプチャし、様々な自然言語処理タスクに使用することができます。
pip install milvus, pymilvus, gensim
ライブラリをインポートする。
api として gensim.downloader をインポートする。
from pymilvus import (
connections、
フィールドスキーマ
コレクションスキーマ
DataType、
コレクション)
Milvusサーバーへの接続を作成する。
connections.connect(
alias="default"、
user='username'、
password='パスワード'、
host='localhost'、
ポート='19530'
)
コレクションを作成する。
#コレクションを作成する:
fields = [
FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=False)、
FieldSchema(name="words",dtype=DataType.VARCHAR,max_length=50)、
FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=50)
]
schema = CollectionSchema(fields, "Demo to store and retrieve embeddings")
demo_milvus = Collection("milvus_demo", schema)
gensimから学習済みモデルをロードします。
model = api.load("glove-wiki-gigaword-50")
サンプル単語に使用するテキスト埋め込みを生成する。
ice = model['ice']
water = model['water'] (水)
cold = model['cold'] (コールド = モデル['コールド'])
tree = model['tree'] ツリー
man = model['man']
woman = model['woman'] (ウーマン = モデル['ウーマン'])
child = model['child']
female = model['female']
以下は、"female" という単語に対するベクトル埋め込みの例です。
array([-0.31575 , 0.74461 , -0.11566 , -0.30607 , 1.524 , 1.9137 、
-0.392 , -0.67556 , -0.1051 , -0.17457 , 1.0692 , -0.68617 ,
1.2178 , 1.0286 , 0.35633 , -0.40842 , -0.34413 , 0.67533 ,
-0.5443 , -0.21132 , -0.61226 , 0.95619 , 0.43981 , 0.59639 ,
0.02958 , -1.1064 , -0.48996 , -0.82416 , -0.97248 , -0.059594,
2.396 , 0.74269 , -0.16044 , -0.69316 , 0.55892 , 0.22892 ,
0.013605, -0.44858 , -0.52965 , -0.96282 , -0.54444 , 0.18284 ,
0.16551 , 0.33446 , 0.53432 , -1.4824 , -0.34574 , -0.82834 ,
0.10107 , 0.024414], dtype=float32)
生成されたベクトル埋め込みをコレクションに挿入する。
#コレクションにデータを挿入する
data = [
[1,2,3,4,5,6,7,8], # フィールド pk
['ice','water','cold','tree','man','woman','child','female'], # field words
[氷、水、冷たい、木、男、女、子供、女], # field embeddings
]
insert_result = demo_milvus.insert(data)
# 最終的なエンティティが挿入された後、メモリに成長中のセグメントが残らないようにフラッシュを呼び出すのがベスト
demo_milvus.flush()
エンティティにインデックスを作成する。
index = {
"index_type":"IVF_FLAT"、
"metric_type":"L2",
「params":params": {"nlist":128},
}
demo_milvus.create_index("embeddings", index)
コレクションをメモリにロードしてアップロードの成功を確認し、vector similarity searchを行う。
demo_milvus.load()
# ベクトル類似性検索を行う:
data = [cold]
search_params = {
"metric_type":"L2",
「params":{"nprobe":10},
}
result = demo_milvus.search(data, "embeddings", search_params, limit=4, output_fields=["words"])
結果をループし、単語を表示する。
for i in range(0,4):
ヒット = result[0][i]
print(hit.entity.get('words'))
そして、これが期待される出力です。
冷たい
氷
水
男
エンベッディングはどのように機能するか?
画像、テキスト、音声などのデータを数値表現に変換することで、エンベッディングは、機械が生データ内の根本的な意味や関係を理解することを可能にします。これにより、多様な領域にわたる革新的なアプリケーションへの扉が開かれます。
類似画像、動画、音声ファイルの検索
キーワードだけでなく、その内容に基づいて類似した写真やビデオを検索することを想像してみてください。例えば、音による画像検索(鳥は見るよりも聞く方が簡単です)や、画像による動画検索などです。ベクトル埋め込みは、このような検索を可能にします。畳み込みニューラルネットワーク(CNN)](https://zilliz.com/glossary/convolutional-neural-network)のような技術によって、画像、ビデオフレーム、オーディオセグメントから埋め込みを抽出することで、これらの埋め込みをMilvusやZilliz Cloudのようなベクトルデータベースに保存することができます。ユーザがクエリ画像、ビデオ、オーディオクリップで検索を行うと、システムは逐次データと埋め込まれたベクトル表現を比較することで、類似アイテムを検索する。
創薬の加速
創薬は複雑で長いプロセスである。ベクトル埋め込みは、科学者が有望な薬剤候補を特定するのを助けることによって、このプロセスを加速することができる。上記で生成されたベクター埋め込みに化合物の化学構造をエンコードすることで、標的タンパク質との類似性を測定することができます。これにより、研究者は最も有望なリード化合物に焦点を当てることができ、創薬と開発の迅速化につながります。
セマンティック検索による検索関連性の向上
従来の検索エンジンは、ユーザーのクエリの背後にある真の意図を理解するのに苦労することが多く、無関係な結果を導く。ある企業が社内文書をベクターに埋め込み、ベクターデータベースに保存したとしよう。そして、社員はそのドキュメントを通常の人間のチャットで検索することができる。従業員のチャットの質問の埋め込みに最も近いデータの埋め込みは、ベクトルデータベースによって取得され、従業員の質問に対する人間のようなテキストの答えを生成するプロンプトの一部としてChatGPTに送信されます。その答えは、会社のデータに基づいて最も近い答えとなります。この全体的なプロセスはRAG(Retrieval Augmented Generation)と呼ばれる。企業の文書の意味理解を加えることで、その企業の内部検索の関連性を大幅に高め、AIの幻覚を避けることができる。
推薦システム
レコメンダー・システムはオンライン・プラットフォームにとって極めて重要だが、一般的なレコメンデーションは期待外れとなる可能性がある。ベクトル埋め込みは、ユーザーとアイテムの両方を埋め込みとして表現することを可能にすることで、解決策を提供する。ユーザとアイテムの類似度を測定してベクトル埋め込みを生成することで、各ユーザの嗜好に合わせたパーソナライズされた推薦を行うことができる。これは、より効果的なレコメンデーションシステムにつながり、うまくいけば、ユーザーのエンゲージメントを高めることができる。
異常検知
データ中の異常なパターンを識別することは、詐欺検出、ネットワークセキュリティ、産業機器監視のような様々なアプリケーションにとって極めて重要です。ベクトル埋め込みは、異常検出のための強力なツールを提供する。データ点を埋め込みとして表現することで、データ点間の距離や非類似度を計算することができる。かなりの距離は、調査が必要な潜在的な異常のシグナルかもしれない。これにより、問題を積極的に特定することができ、早期の異常識別と予防に役立つ。
表現されるデータの性質に基づく様々なタイプのベクトル埋め込み
ベクトル埋め込みは、アプリケーションや表現されるデータの性質によって、単語埋め込み、画像埋め込み、グラフ埋め込み、マルチモーダル埋め込みなどにも分けられます。ここでは、最も一般的なベクトル埋め込みを紹介します。
- 単語埋め込み:** 単語埋め込みは、単語を連続ベクトル空間の数値ベクトルとして表現します。これらは、Word2Vec、GloVe、fastTextのような様々なモデルを使用して、Wikipediaのような大規模なテキストコーパス上で学習されます。これらのモデルは、各単語を数値のベクトルとして表現するために様々なメカニズムを使用する。Word2Vecは、膨大なテキストコーパス中の単語を予測することで、単語の埋め込みを生成する。単語間の言語的関係を定義する。例えば、"king "と "queen "を空間上で近接したベクトルとして表現し、それらの意味的類似性を示すことができる。一方、GloVeは、単語の共起データに依存してベクトルを構築する。GloVeは、"ice "と "water "という単語を、テキスト中にしばしば一緒に出現し、意味的な関係を共有していることから、近接したベクトルとして表現することができる。fastTextは、単語埋め込みをサブワードレベルまで高め、語彙外(OOV)単語や変種を扱うことができる。
- 文と文書の埋め込み**:文と文書の埋め込みは、Doc2Vec や BERT のようなモデルを使用して、文全体や文書を数値ベクトルとして表現します。Doc2Vecは、Word2Vecのパラダイムをベースにして、文書レベルの埋め込みを生成し、文書全体や文章のエンコードを可能にします。BERT (Bidirectional Encoder Representations from Transformers) は、文中の各用語の文脈を考慮し、文脈を意識した埋め込みベクトルを生成します。
- 画像埋め込み**:CNNは、様々なネットワーク層での特徴抽出を通して、画像埋め込みを生成することができる。これは画像の分類と検索に貴重なアプローチを提供する。例えば、猫の写真は、その耳、毛皮、尻尾を表す特徴を持つ画像埋め込みベクトルを持つかもしれない。InceptionやResNetのような他のモデルも、画像から特徴を抽出する層を持っています。Inceptionモデルは、オブジェクトやパターンなど、画像の視覚的属性を表す埋め込みを生成することができます。
- 時系列埋め込み**:時系列データを埋め込むには、LSTM(Long Short Memory)やGRU(Gated Recurrent Unit)ニューラルネットワークを使用します。LSTMやGRUベースの埋め込みは、株価のような時系列データの時間依存性を捉えることができます。例えば、これらのベクトル埋め込みは、株価の動きのパターンを表現することができる。
- 音声埋め込み**:音声処理では、MFCC(mel-frequency cepstral coefficients)埋め込みは、音声分類タスクのための音声データを表現します。音声認識では、MFCC埋め込みは音声信号の音響特性を捉える。例えば、話し言葉のスペクトル内容を表すことができる。
- グラフ埋め込みソーシャルネットワークグラフを考える。Node2Vecは、似たようなユーザ(ノード)がより近いベクトルを持つようなノード埋め込みを生成することができます。例えば、似たような興味を持つユーザは似たようなベクトルの埋め込みを持つかもしれません。また、グラフ・ニューラル・ネットワーク(GNN)を使って、ノードの埋め込みを生成し、グラフの複雑な関係を捉えることもできます。GNNは推薦システムにおいてユーザーとアイテムを表現し、ユーザーとアイテムの相互作用を予測することができる。
ベクトル埋込みの応用例
ベクトル埋め込みを様々なドメインで応用する方法を紹介します。
- 画像・動画・音声のベクトル類似度検索**:画像や特徴抽出のためのCNNのような技術を用いて、画像、ビデオフレーム、オーディオセグメントから埋め込みを抽出することができます。これらの埋め込みをベクトル・データベースに格納する。ユーザが画像、ビデオフレーム、オーディオクリップをクエリすると、それらの埋め込み間の類似度を測定することにより、類似アイテムを検索する。
- AI創薬**:化合物の化学構造を埋め込みにエンコードすることで、これらの埋め込みを使用して化合物間の類似性を測定し、化合物の潜在的な標的タンパク質を予測することができます。
- 意味検索エンジン:ベクトル埋め込みは、クエリの意味を関連文書にマッチングさせることで、検索エンジンの機能を強化し、検索の関連性を向上させます。
- レコメンダーシステム**:ユーザとアイテムを埋め込みとして表現できる。ユーザーとアイテムの類似度を測定し、パーソナライズされたレコメンデーションを行います。オーダーメイドのレコメンデーションはユーザエクスペリエンスを向上させます。
- 異常検知**:データ点を埋め込みとして表現することで、データ内の異常なパターンを特定することができます。データポイント間の距離や非類似度を計算することでこれを実現する。巨大な距離を持つデータポイントは潜在的な異常である。これは不正検知、ネットワーク・セキュリティ、産業機器、プロセス監視などに役立つ。
ベクトル埋め込みとベクトルデータベースの使用例をもっと見る。
なぜベクトル埋め込みを使うのか
- パターン認識ベクトル埋め込みは、データのパターン、類似性、非類似性を捉える。機械学習モデルは、意味のあるパターンを表現する埋め込みから恩恵を受け、分類やクラスタリングのようなタスクのパフォーマンスを向上させます。
- 次元削減**:埋め込みはデータの次元を減らします。エンベッディングは高次元のデータを低次元のベクトルに変換し、計算タスクを単純化し、しばしば効率を向上させます。
- 意味理解**:ベクトル埋め込みはデータポイント間の意味的関係を符号化し、機械が複雑な情報を理解・解釈することを容易にする。
- 効率的な処理**:数値ベクトルは計算効率が高い。機械学習アルゴリズムは数値データをより速く、より少ない計算コストで処理できる。
- 移項学習**:NLP](https://zilliz.com/learn/A-Beginner-Guide-to-Natural-Language-Processing)における単語埋め込みや、コンピュータ・ビジョンにおける画像埋め込みなど、事前に訓練された埋め込みは、特定のタスクのために微調整することができる。これにより、膨大な量のラベル付きデータの必要性を減らし、モデルの収束を早め、モデルの性能を向上させることができる。
ベクトル埋め込みFAQ
ベクトル埋め込みはどこに保存されますか?
ベクトル埋め込みは、Milvusのようなベクトルデータベース、Redisのようなインメモリデータベース、PostgreSQLのようなデータベース、またはファイルシステムに格納することができます。ベクトル埋め込みをどこに格納するかは、データ量、アクセスパターン、アプリケーション固有の要件などの要因に依存します。
ベクターデータベースとベクター埋め込みは何が違うのか?
ベクトルデータベースは、ベクトルデータのインデックス付け、保存、検索を行う特殊なデータベースです。これに対して、ベクトル埋め込みは、連続ベクトル空間におけるデータ点(文章、画像、その他のオブジェクトなど)の数値表現です。埋め込みはデータ内の意味のある関係やパターンを捉え、データベースはベクトルを保存し、ベクトル類似度メトリクスに基づいて類似度検索を最適化します。
ベクトルとは何か?
ベクトルは、数値の多次元配列を使って非構造化データを表します。例えば、音声ベクトル、画像ベクトル、動画、テキストなどです。ベクトルは、ベクトル検索のような操作を可能にします。KNN](https://zilliz.com/blog/k-nearest-neighbor-algorithm-for-machine-learning)、ANNS、HNSWのような検索アルゴリズムは、ベクトル間の距離を高速に計算できるようにデータを整理する。ベクトル間の距離は類似性を決定し、最も近いベクトルが検索で返されます。これは、クラスタリング、異常検出、逆画像検索、チャットでの質問への回答、推奨の作成などに役立ちます。効率的なベクトル検索のためのデータ構造を作成することを、ベクトル・インデックスの作成と呼ぶ。
埋め込みはベクトルと違うのか?
エンベッディングとベクトル:技術的には、ベクトルは数値の多次元配列で表現される基本的な数学的オブジェクトです。一方、エンベッディングは、データポイント間の意味的関係を捉える数学的演算を使用して、非構造化データをベクトル表現に変換する技術です。しかし、ほとんどの場合、特に機械学習の文脈では、「ベクトル」と「埋め込み」は同じ意味で使われます。
ベクトル・インデックスとは?
ベクトルインデックス](https://zilliz.com/learn/choosing-right-vector-index-for-your-project)は、ベクトルデータベースインデックスまたは類似度インデックスとも呼ばれ、ベクトルデータベースにおいて、類似度メトリクスに基づいてベクトルデータを整理し、検索を最適化するために使用されるデータ構造です。インデックスの例としては、CPUベースのANN検索ではFLAT、IVF_FLAT、IVF_PQ、IVF_SQ8、HNSW、SCANN、GPUベースのANN検索ではGPU_IVF_FLAT、GPU_IVF_PQがあります。
事前に訓練されたエンベッディングとカスタムエンベッディングの違いは何ですか?
事前訓練されたエンベッディングは、チェックポイントと呼ばれる事前訓練されたディープラーニングモデルから得られます。これらのチェックポイントは通常、オープンソースのトランスフォーマーモデルで、公開データでトレーニングされたものです。カスタムエンベッディングは、あなた自身のディープラーニングモデルを、あなた自身のカスタム、ドメイン固有のトレーニングデータでトレーニングしたものです。
Zillizベクトルデータベースはベクトル埋め込みを作成しますか?
はい。Zilliz Cloudは、Milvusのフルマネージドベクトルデータベースサービスで、数十億のベクトル埋め込みを作成、保存、検索することができます。
Zilliz Cloudは、非構造化データを高品質で検索可能なベクトル埋め込みデータに変換できる強力なパイプライン機能を誇ります。この機能は、開発者のベクトル化ワークフローを合理化し、ベクトルの作成、検索、削除をカバーし、迅速かつ効率的な運用を実現します。また、アプリケーションを構築するためにエンベッディングモデルなどの追加技術スタックを採用する必要がないため、開発者や企業のメンテナンスコストを最小限に抑えることができます。
ベクトル埋め込みに最適なベクトルデータベース
普遍的な「ベスト」ベクトルデータベースはありません。したがって、ベクターデータベースのスケーラビリティ、機能性、パフォーマンス、および特定のユースケースとの互換性を評価することが重要です。
最新のベクトル埋め込みデータベースは、効率的にベクトルを検索し、メタデータを使用してフィルタリングし、セマンティック検索とキーワード検索の両方を実行できる必要があります。また、エンタープライズレベルのワークロードを処理するために、スケーラブルで、設定可能で、高性能でなければなりません。
評価に役立つよく知られたオープンソースのベンチマークツールのひとつに、ANN-Benchmarkがある。ANN-Benchmarkは、事前に計算された多くのデータセットに基づき、様々なアルゴリズムの1秒あたりのリコール/クエリのテスト結果をグラフ化することができる。これはY軸のQPSに対してX軸のリコール率をプロットし、検索精度の異なるレベルにおける各アルゴリズムのパフォーマンスを示している。
ベンチマークツールの使用に加えて、主流のオープンソースベクターデータベースとフルマネージドベクターデータベースサービスのアーキテクチャ、スケーラビリティ、パフォーマンス、ユースケース、コスト、機能セットに関する比較チャートを参照することもできます。