メインコンテンツまでスキップ

Dense Vector

Dense vector は、機械学習やデータ分析で広く使用される数値データ表現です。実数の配列で構成され、そのほとんどまたはすべての要素がゼロではありません。疎ベクトルと比較して、dense vector は同じ次元レベルでより多くの情報を含みます。これは、各次元が意味のある値を保持しているためです。この表現は、複雑なパターンや関係性を効果的に捉えることができ、高次元空間でのデータの分析や処理を容易にします。Dense vector は通常、固定された次元数を持ち、その数は特定のアプリケーションや要件に応じて、数十次元から数百次元、場合によっては数千次元に及びます。

Dense vector は主に、セマンティック検索やレコメンデーションシステムなど、データの意味理解を必要とするシナリオで使用されます。セマンティック検索では、dense vector はクエリとドキュメントの間にある基盤的なつながりを捉えるのに役立ち、検索結果の関連性を向上させます。レコメンデーションシステムでは、ユーザーとアイテムの類似性を特定し、よりパーソナライズされた提案を提供するのに役立ちます。

Overview

Dense vector は通常、[0.2, 0.7, 0.1, 0.8, 0.3, ..., 0.5] のような固定長の浮動小数点数配列として表されます。これらのベクトルの次元数は通常、128、256、768、1024 のように数百から数千に及びます。各次元はオブジェクトの特定のセマンティック特徴を捉え、類似度計算を通じてさまざまなシナリオに適用できます。

QOgMwbrhLhvvtbbk5TxcarhEn8i

上の画像は、2D 空間における dense vector の表現を示しています。実際のアプリケーションにおける dense vector ははるかに高次元であることが多いですが、この 2D 図は以下のいくつかの重要な概念を効果的に伝えています。

  • 多次元表現: 各点は概念的なオブジェクト(Milvusvector databaseretrieval system など)を表し、その位置は各次元の値によって決まります。

  • セマンティックな関係性: 点間の距離は、概念間のセマンティック類似度を反映します。近い点は、より意味的に関連性の高い概念を示します。

  • クラスタリング効果: 関連する概念(Milvusvector databaseretrieval system など)は空間内で互いに近くに配置され、セマンティッククラスターを形成します。

以下は、テキスト "Milvus is an efficient vector database" を表す実際の dense vector の例です。

json
[
-0.013052909,
0.020387933,
-0.007869,
-0.11111383,
-0.030188112,
-0.0053388323,
0.0010654867,
0.072027855,
// ... more dimensions
]

Dense vector は、画像向けの CNN モデル(ResNetVGG など)や、テキスト向けの言語モデル(BERTWord2Vec など)といった、さまざまな embedding モデルを使用して生成できます。これらのモデルは、生データを高次元空間内の点へ変換し、データのセマンティック特徴を捉えます。さらに、Zilliz Cloud は、ユーザーが dense vector を生成および処理するのに役立つ便利な方法を提供しており、詳細は Embeddings で説明しています。

データがベクトル化されると、管理および vector 検索のために Zilliz Cloud cluster に保存できます。以下の図は基本的なプロセスを示しています。

No8KwR6wPhTIP6bKEqGcbBDWngc

📘注意

dense vector に加えて、Zilliz Cloud は sparse vector と binary vector もサポートしています。sparse vector は、キーワード検索や用語一致など、特定の用語に基づく正確な一致に適しています。一方、binary vector は、画像パターンマッチングや一部のハッシュアプリケーションなど、二値化されたデータを効率的に扱うために一般的に使用されます。詳細については、Binary Vector および Sparse Vector を参照してください。

Use dense vectors

Add vector field

Zilliz Cloud cluster で dense vector を使用するには、まず collection の作成時に dense vector を保存するための vector field を定義します。このプロセスには以下が含まれます。

  1. datatype を、サポートされている dense vector データ型に設定します。サポートされている dense vector データ型については、Data Types を参照してください。

  2. dim パラメータを使用して、dense vector の次元数を指定します。

以下の例では、dense vector を保存するために dense_vector という名前の vector field を追加しています。この field のデータ型は FLOAT_VECTOR、次元数は 4 です。

python
from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")

schema = client.create_schema(
auto_id=True,
enable_dynamic_fields=True,
)

schema.add_field(field_name="pk", datatype=DataType.VARCHAR, is_primary=True, max_length=100)
schema.add_field(field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=4)

dense vector field でサポートされるデータ型:

Data TypeDescription
FLOAT_VECTOR32 ビットの浮動小数点数を格納します。科学計算や機械学習における実数表現で一般的に使用されます。類似したベクトルを区別するような高精度が求められるシナリオに最適です。
FLOAT16_VECTOR16 ビットの半精度浮動小数点数を格納します。深層学習や GPU 計算で使用されます。レコメンデーションシステムの低精度リコールフェーズのように、精度の重要性が比較的低いシナリオでストレージ容量を節約できます。
BFLOAT16_VECTOR16 ビットの Brain Floating Point(bfloat16)数値を格納します。Float32 と同じ指数範囲を持ちながら、精度は低くなります。大規模画像検索のように、大量のベクトルを高速に処理する必要があるシナリオに適しています。
INT8_VECTOR各次元の各要素が 8 ビット整数(int8)であるベクトルを格納し、各要素の範囲は –128 から 127 です。量子化された深層学習モデル(例: ResNet、EfficientNet)向けに設計されており、INT8_VECTOR はモデルサイズを削減し、精度低下を最小限に抑えながら推論を高速化します。

Set index params for vector field

セマンティック検索を高速化するには、vector field に対して index を作成する必要があります。index 作成により、大規模な vector データの検索効率を大幅に向上できます。

python
index_params = client.prepare_index_params()

index_params.add_index(
field_name="dense_vector",
index_name="dense_vector_index",
index_type="AUTOINDEX",
metric_type="IP"
)

上記の例では、AUTOINDEX index type を使用して、dense_vector field に対して dense_vector_index という名前の index を作成しています。metric_typeIP に設定されており、内積が距離メトリックとして使用されることを示しています。

Zilliz Cloud は他の metric type もサポートしています。詳細については、Metric Types を参照してください。

Create collection

dense vector と index param の設定が完了したら、dense vector を含む collection を作成できます。以下の例では、create_collection メソッドを使用して my_collection という名前の collection を作成します。

python
client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params
)

Insert data

collection を作成したら、insert メソッドを使用して dense vector を含むデータを追加します。挿入する dense vector の次元数が、dense vector field を追加したときに定義した dim の値と一致していることを確認してください。

python
data = [
{"dense_vector": [0.1, 0.2, 0.3, 0.7]},
{"dense_vector": [0.2, 0.3, 0.4, 0.8]},
]

client.insert(
collection_name="my_collection",
data=data
)

密ベクトルに基づくセマンティック検索は、Zilliz Cloud クラスターの中核機能の 1 つであり、ベクトル間の距離に基づいてクエリベクトルに最も類似したデータをすばやく見つけることができます。類似検索を実行するには、クエリベクトルと検索パラメータを準備してから、search メソッドを呼び出します。

python
search_params = {
"params": {"nprobe": 10}
}

query_vector = [0.1, 0.2, 0.3, 0.7]

res = client.search(
collection_name="my_collection",
data=[query_vector],
anns_field="dense_vector",
search_params=search_params,
limit=5,
output_fields=["pk"]
)

print(res)

# Output
# data: ["[{'id': '453718927992172271', 'distance': 0.7599999904632568, 'entity': {'pk': '453718927992172271'}}, {'id': '453718927992172270', 'distance': 0.6299999952316284, 'entity': {'pk': '453718927992172270'}}]"]

類似検索パラメータの詳細については、Basic ANN Search を参照してください。

Ctrl I