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

ガウス減衰

ガウス減衰(正規減衰とも呼ばれます)は、検索結果に対して最も自然な感覚の調整を実現します。距離に応じて徐々にぼやける人間の視覚と同様に、ガウス減衰は滑らかな釣鐘型の曲線を作成し、アイテムが理想的な地点から離れるにつれて関連性を穏やかに低下させます。このアプローチは、優先範囲のすぐ外にあるアイテムに厳しいペナルティを与えず、遠くにあるアイテムの関連性は大幅に低下させる、バランスの取れた減衰が必要な場合に最適です。

他の減衰ランカーとは次の点が異なります。

  • 指数減衰は最初に急激に低下し、初期のペナルティがより強くなります。

  • 線形減衰はゼロに達するまで一定の割合で低下し、明確なカットオフを作成します。

ガウス減衰は、ユーザーにとって自然に感じられる、よりバランスの取れた直感的なアプローチを提供します。

ガウス減衰を使用する場面​

ガウス減衰は、次のような場面で特に効果を発揮します。

ユースケース例ガウス減衰が適している理由
位置情報に基づく検索レストラン検索アプリ、店舗ロケーター距離の関連性に対する人間の自然な知覚を模倣します。
コンテンツレコメンデーション記事の公開日時に基づく提案コンテンツの経過時間に応じて関連性が徐々に低下します。
商品リスト目標価格に近い価格のアイテム価格が目標値から外れるにつれて関連性が滑らかに低下します。
専門知識のマッチング関連する経験を持つ専門家の検索経験の関連性をバランスよく評価します。

アプリケーションで、厳しいペナルティや厳格なカットオフなしに、関連性が自然に低下する感覚が必要な場合、ガウス減衰が最適な選択肢となる可能性があります。

釣鐘型曲線の原理​

ガウス減衰は、理想的な地点からの距離が増すにつれて関連性を徐々に低下させる、滑らかな釣鐘型の曲線を作成します。数学者カール・フリードリヒ・ガウスにちなんで名付けられたこの分布は、自然界や統計で頻繁に見られるため、人間の知覚にとって非常に直感的に感じられる理由が説明できます。

DP1AbcqZPoyfqhxpJ2icptjQnfc

上のグラフは、モバイル検索アプリでガウス減衰がレストランのランキングにどのように影響するかを示しています。

  • origin(0 km):現在地であり、関連性が最大(1.0)になる地点です。

  • offset(±300 m):周囲の「満点ゾーン」です。300 メートル以内のすべてのレストランは満点の関連性スコア(1.0)を維持するため、ごく近い選択肢がわずかな距離の違いだけで不必要にペナルティを受けることはありません。

  • scale(±2 km):関連性が減衰値まで下がる距離です。ちょうど 2 キロメートル離れたレストランの関連性スコアは半分(0.5)になります。

  • decay(0.5):スケール距離でのスコアです。このパラメーターは、距離に応じてスコアがどれだけ早く減少するかを本質的に制御します。

曲線からわかるように、2 km を超えるレストランは関連性が低下し続けますが、完全にゼロに達することはありません。4-5 キロメートル離れたレストランでも最小限の関連性は保持されるため、優れていても遠くにあるレストランは(ランキングは低くなりますが)検索結果に引き続き表示されます。

この動作は、人が距離と関連性について自然に考える方法を模倣しています。近くの場所が好まれますが、優れた選択肢のためなら遠くまで移動することも厭いません。

計算式​

ガウス減衰スコアを計算する数式は次の通りです。

S(doc)=exp⁡(−(max⁡(0,∣fieldvaluedoc−origin∣−offset))22σ2)S(doc) = \exp\left( -\frac{\left( \max\left(0, \left|fieldvalue_{doc} - origin\right| - offset \right) \right)^2}{2\sigma^2} \right)

ここで、

σ2=−scale22⋅ln⁡(decay)\sigma^2 = -\frac{scale^2}{2 \cdot \ln(decay)}

これを平易な言葉で分解すると、次のようになります。

  1. フィールド値が原点からどれだけ離れているかを計算します: ∣fieldvaluedoc−origin∣|fieldvalue_{doc} - origin|

  2. オフセットがある場合はそれを減算しますが、ゼロを下回らないようにします: max⁡(0,distance−offset)\max(0, distance - offset)

  3. この調整済み距離を二乗します: (adjusted_distance)2(adjusted\_distance)^2

  4. スケールと減衰パラメーターから計算される $2\sigma^2$ で除算します。

  5. 負の指数を取ると、0 から 1 の間の値が得られます: exp⁡(−value)\exp(-value)

σ2\sigma^2 の計算では、スケールと減衰パラメーターがガウス分布の標準偏差の二乗に変換されます。これにより、この関数に特徴的な釣鐘型の形状が与えられます。

ガウス減衰を使用する​

ガウス減衰は、Zilliz Cloud の標準ベクトル検索とハイブリッド検索の両方に適用できます。以下は、この機能を実装するための主要なコードスニペットです。

Notes

減衰関数を使用する前に、まず減衰計算に使用する適切な数値フィールド(タイムスタンプ、距離など)を含むコレクションを作成する必要があります。コレクションの設定、スキーマ定義、データ挿入を含む完全な動作例については、チュートリアル: Milvus での時間ベースのランキングの実装 を参照してください。

減衰ランカーを作成する​

コレクションに数値フィールド(この例では、ユーザーからの距離をメートル単位で表す distance)が設定されたら、ガウス減衰ランカーを作成します。

python
from pymilvus import Function, FunctionType

# Create a Gaussian decay ranker for location-based restaurant search
rerank = Function(
name="restaurant_distance_decay", # Function identifier
input_field_names=["distance"], # Numeric field for distance in meters
function_type=FunctionType.RERANK, # Function type. Must be RERANK
params={
"reranker": "decay", # Specify decay reranker
"function": "gauss", # Choose Gaussian decay
"origin": 0, # Your current location (0 meters)
"offset": 300, # 300m no-decay zone
"decay": 0.5, # Half score at scale distance
"scale": 2000 # 2 km scale (2000 meters)
}
)

減衰ランカーを定義したら、検索操作時に ranker パラメーターに渡して適用できます。

python
# Apply decay ranker to restaurant vector search
result = milvus_client.search(
collection_name,
data=[your_query_vector], # Replace with your query vector
anns_field="dense", # Vector field to search
limit=10, # Number of results
output_fields=["name", "cuisine", "distance"], # Fields to return
ranker=rerank, # Apply the decay ranker
consistency_level="Strong"
)