Jarak vs Kemiripan

Keluarga ukuran kemiripan vektor: cosine, dot product, dan Euclidean (L2), beserta konteks penggunaannya.

Daftar isi

Pencarian vektor membutuhkan definisi tegas tentang seberapa mirip dua vektor, dan definisi tersebut tidak tunggal. Kemiripan dapat diukur dari sudut antara dua arah, dari perkalian komponen, atau dari jarak antar posisi. Topik ini membahas tiga ukuran yang paling sering digunakan pada pencarian vektor, yaitu cosine similarity, dot product, dan jarak Euclidean (L2), beserta rentang nilai dan konteks penggunaannya untuk vektor embedding, yaitu representasi numerik dari teks atau objek lain. Setelah topik ini, pemilihan ukuran dilakukan dengan alasan yang jelas, bukan dengan kebiasaan.

Tiga ukuran, tiga makna#

Cosine similarity mengukur sudut antara dua vektor dan mengabaikan panjang keduanya. Nilainya 1 ketika kedua vektor searah, 0 ketika keduanya saling tegak lurus, dan -1 ketika keduanya berlawanan arah. Untuk dua vektor aa dan bb yang membentuk sudut θab\theta_{ab}, cosine similarity dihitung dengan rumus berikut.

cos⁡(θab)=a⋅b∥a∥ ∥b∥ \cos(\theta_{ab}) = \frac{a \cdot b}{\lVert a \rVert \, \lVert b \rVert}

Dot product mengalikan komponen dua vektor lalu menjumlahkannya. Nilainya dipengaruhi oleh sudut sekaligus panjang kedua vektor, sehingga dua pasang vektor dengan sudut yang sama dapat menghasilkan nilai dot product yang berbeda apabila panjangnya berbeda. Pada dokumentasi mesin pencari vektor, dot product sering disebut inner product.

a⋅b=∑iai bi a \cdot b = \sum_{i} a_i \, b_i

Jarak L2 adalah panjang garis lurus yang menghubungkan dua vektor bila keduanya diperlakukan sebagai titik. Ukuran ini juga dikenal sebagai jarak Euclidean atau norma L2.

dL2(a,b)=∑i(ai−bi)2 d_{L2}(a, b) = \sqrt{\sum_{i} (a_i - b_i)^2}

Ketiganya menjawab pertanyaan yang berbeda. Cosine similarity mengukur kesamaan arah, dot product mengukur kesamaan arah yang ditimbang panjang vektor, sedangkan jarak L2 mengukur kedekatan posisi.

Rentang nilai dan arah peringkat#

Ketiga ukuran memiliki rentang nilai dan arah peringkat yang berbeda, dan perbedaan ini menentukan cara membaca hasil pencarian. Tabel berikut merangkum rentang nilai setiap ukuran, arah peringkatnya, serta konteks penggunaan yang paling cocok.

UkuranRentang nilaiArah peringkatKonteks yang cocok
Cosine similarity-1 sampai 1makin besar, makin miripteks dan embedding umum
Dot producttanpa batasmakin besar, makin miripmodel yang dilatih dengan inner product
Jarak L20 sampai tak berbatasmakin kecil, makin miripfitur numerik pendek

Arah peringkat pada jarak L2 berlawanan dengan dua ukuran lainnya. Pada cosine similarity dan dot product, skor yang makin besar berarti pasangan vektor makin mirip, sedangkan pada jarak L2, nilai yang makin kecil berarti pasangan vektor makin mirip. Nilai cosine similarity yang negatif menandakan kedua vektor berlawanan arah dan praktis tidak mirip, sedangkan nilai dot product yang besar tidak menyatakan apa-apa sebelum panjang vektornya diperhitungkan. Angka dari ukuran yang berbeda juga tidak dapat dibandingkan satu sama lain karena skalanya berbeda, sehingga nilai cosine 0,9 dan jarak L2 0,9 tidak menyimpan makna yang sederajat.

Menghitung ketiganya dengan NumPy#

Perhitungan ketiga ukuran dapat diuji dengan beberapa vektor kecil. Vektor a dan b sengaja dipilih dengan panjang yang sama, yaitu lima, sedangkan vektor c lebih pendek dan berada pada arah yang berbeda. Skrip berikut mendefinisikan tiga vektor konstanta tersebut, menghitung ketiga ukurannya untuk setiap pasangan, lalu menampilkannya sebagai tabel kecil.

python hitung-metrik.py
import numpy as np

a = np.array([3.0, 4.0])
b = np.array([4.0, 3.0])
c = np.array([-1.0, 2.0])


def cosine(u, v):
    return np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v))


def jarak_l2(u, v):
    return np.linalg.norm(u - v)


pasangan = [("a vs b", a, b), ("a vs c", a, c), ("b vs c", b, c)]

header = f"{'pasangan':<9} {'cosine':>7}   {'dot':>8}   {'L2':>7}"
print(header)
for nama, u, v in pasangan:
    print(f"{nama:<9} {cosine(u, v):7.4f}   {np.dot(u, v):8.4f}   {jarak_l2(u, v):7.4f}")
text Keluaran
pasangan   cosine        dot        L2
a vs b     0.9600    24.0000    1.4142
a vs c     0.4472     5.0000    4.4721
b vs c     0.1789     2.0000    5.0990

Keluaran memperlihatkan tiga perilaku yang telah dibahas. Nilai dot product untuk pasangan a dan b mencapai 24,0000, jauh melampaui rentang cosine similarity, karena panjang kedua vektornya ikut menaikkan hasil perkaliannya. Pasangan a dan c memiliki dot product 5,0000 meskipun arahnya cukup berbeda, dan perbedaan arah itu baru terlihat jelas pada kolom cosine yang telah menetralkan panjang vektor. Kolom L2 dibaca dari arah sebaliknya, karena nilai yang makin kecil berarti makin mirip. Urutan pasangan pada kolom cosine dan kolom L2 kebetulan sejalan pada contoh ini, tetapi kecocokan semacam itu tidak dijanjikan untuk data apa pun karena kedua ukuran mengukur hal yang berbeda. Nilai dalam keluaran juga dapat dihitung ulang dengan tangan karena vektornya hanya dua dimensi.

Kapan masing-masing cocok#

Pemilihan ukuran mengikuti jenis data dan cara model embedding membentuk vektornya. Untuk teks dan dokumen umum, cosine similarity menjadi pilihan baku karena panjang vektor hasil model cenderung mengikuti panjang dokumen, sedangkan makna yang dicari berada pada arah vektornya. Cosine similarity menetralkan perbedaan panjang tersebut dan menyisakan sudut sebagai dasar peringkat.

Untuk model yang dilatih dengan inner product, gunakan dot product sebagai metrik pencarian. Panjang vektor pada model semacam ini memang bagian dari sinyal yang dipelajari, sehingga menetralkannya justru membuang informasi. Untuk data fitur numerik pendek, misalnya catatan pengukuran suhu dan kelembapan dari sensor, jarak L2 cocok karena selisih besaran antar titik benar-benar bermakna.

Nama metrik pada mesin pencari mengikuti tiga ukuran ini. Qdrant dan Milvus menawarkan COSINE, L2, dan IP (inner product), sedangkan pgvector menyediakan operator jarak cosine, L2, dan inner product. Kesesuaian antara metrik pencarian dan fungsi pelatihan model pembentuk vektor menjadi penentu utama pilihannya. Bila ragu antara dua metrik, periksa peringkatnya pada sampel kecil yang jawabannya sudah diketahui, lalu terapkan keputusannya pada seluruh koleksi.

Kesalahan umum#

Tiga kesalahan berikut sering muncul ketika ukuran kemiripan baru dipraktikkan pada koleksi nyata.

  • Membandingkan angka antar ukuran menyesatkan karena skalanya berbeda, misalnya cosine 0,9 dan jarak L2 0,9 tidak bermakna sederajat. Perbandingan yang sah dilakukan antar nilai dalam satu ukuran, misalnya cosine 0,95 dibandingkan cosine 0,60. Perbaikannya, bandingkan angka hanya di dalam satu ukuran yang sama.
  • Mengurutkan jarak dengan arah yang salah membalik seluruh hasil karena jarak L2 harus diurutkan menaik, sedangkan skor diurutkan menurun. Contoh kecil dua titik sudah cukup untuk menampakkan kesalahannya. Perbaikannya, tetapkan arah pengurutan sekali dan uji dengan contoh kecil yang jawabannya sudah diketahui.
  • Menganggap cosine dan L2 selalu sejalan keliru pada vektor dengan panjang berbeda karena L2 ikut menghitung selisih panjang. Misalnya, dua vektor dengan sudut yang sama tetapi panjang yang berbeda menghasilkan cosine yang sama, sedangkan jarak L2 keduanya berbeda. Perbaikannya, periksa sifat ukuran yang digunakan sebelum menyimpulkan hanya dari salah satunya.

Ringkasan#

  • Cosine similarity mengukur sudut antara dua vektor pada rentang -1 sampai 1 dan mengabaikan panjang keduanya.
  • Dot product mengalikan komponen dua vektor tanpa batas rentang, sehingga panjang vektor ikut menentukan nilainya.
  • Jarak L2 adalah panjang garis penghubung dua vektor, dan nilainya yang makin kecil berarti makin mirip.
  • Cosine cocok untuk teks umum, dot product untuk model yang dilatih dengan inner product, dan L2 untuk fitur numerik pendek.

Referensi#