33 poin oleh GN⁺ 2025-01-16 | 2 komentar | Bagikan ke WhatsApp
  • Data scientist mengubah segala sesuatu menjadi vektor. Itulah bahasa AI
  • Namun, menerapkan cosine similarity secara membabi buta dapat mengarahkan kita ke arah yang salah
  • Artikel ini menjelaskan cara menggunakan similarity dengan lebih sengaja untuk mendapatkan hasil yang lebih baik.

Embedding

  • Embedding adalah representasi data dalam bentuk vektor, sangat berguna untuk merepresentasikan hubungan antar entitas atau menemukan item yang mirip
  • Misalnya, "brother" dan "sister" tidak memiliki hubungan jika hanya berupa ID mentah, tetapi setelah diubah menjadi vektor, hubungan semantiknya bisa direpresentasikan
  • Vektor digunakan sebagai struktur input untuk model machine learning atau dimanfaatkan langsung untuk pencarian kemiripan
  • Sentence embedding berbasis large language model (LLM) adalah salah satu kasus penggunaan embedding yang paling populer saat ini
  • Kemampuan yang kuat ini menuntut tanggung jawab terhadap keamanan data dan penggunaan yang disengaja

Contoh: membandingkan kalimat dengan cosine similarity

  • Membandingkan tiga kalimat
    • A: "Python can make you rich."
    • B: "Python can make you itch."
    • C: "Mastering Python can fill your pockets."
  • Perbandingan berbasis karakter
    • Jika membandingkan string mentah, A dan B berbeda 2 karakter, sedangkan A dan C berbeda 21 karakter
    • Namun secara makna, A dan C lebih mirip (sama-sama berkaitan dengan uang)
  • Perbandingan berbasis vektor
    • Menggunakan OpenAI text-embedding-3-large untuk menghasilkan vektor embedding berikut:
      • A: [-0.003738, -0.033263, -0.017596, 0.029024, -0.015251, ...]
      • B: [-0.066795, -0.052274, -0.015973, 0.077706, 0.044226, ...]
      • C: [-0.011167, 0.017812, -0.018655, 0.006625, 0.018506, ...]
    • Jumlah dimensi vektor: 3072 (panjang, tetapi bisa diperkecil tanpa penurunan kualitas)
  • Menghitung cosine similarity
    • A dan C: 0.750 (mirip secara semantik)
    • A dan B: 0.576 (mirip secara tekstual)
    • Hasil: makna adalah faktor kemiripan yang lebih penting daripada ejaan

Apa itu cosine similarity?

  • Cosine similarity mengukur kemiripan dengan menghitung kosinus sudut antara dua vektor
  • Karena vektor berada dalam ruang berdimensi tinggi, pemahaman geometris intuitif sering kali gagal
  • Secara matematis, ini adalah dot product dari vektor yang sudah dinormalisasi
  • Karakteristik utama:
    • Vektor yang identik bernilai 1
    • Vektor acak dekat dengan 0 (karena efek perataan di dimensi tinggi)
    • Nilainya berada di antara -1 dan 1
  • Kesederhanaan ini bisa menyesatkan
    • Hanya karena nilainya berada di antara 0 dan 1, bukan berarti itu probabilitas atau skala yang bermakna
      • Contoh: nilai 0.6 belum tentu menunjukkan kemiripan yang kuat
    • Nilai negatif kadang-kadang secara langka merepresentasikan kebalikan semantik
      • Dalam kebanyakan kasus, hasilnya tidak bermakna atau nyaris sekadar noise
  • Jika kita mencari kata yang mirip dengan "dog" menggunakan Glove(glove.6B.300d):
    • Kata-kata terdekat biasanya sesuai dugaan
    • Kata-kata terjauh sering menghasilkan hasil yang tidak bermakna
  • Cosine similarity seperti "duct tape": sederhana dan cepat untuk membandingkan berbagai jenis vektor
    • Bisa dipakai untuk membandingkan gambar, teks, audio, kode, dan lain-lain
  • Namun, itu hanya solusi tambal sulam yang bisa menutupi masalah yang lebih dalam
    • Misalnya seperti memperbaiki pipa dengan duct tape, sulit diandalkan dan tidak permanen
  • Kadang cosine similarity tampak efektif, tetapi ketika gagal, sulit mengetahui penyebabnya
    • Sering kali orang lalu mencari solusi dadakan, yang justru dapat menimbulkan masalah baru

Hubungan cosine similarity dan koefisien korelasi

  • Koefisien korelasi Pearson dihitung dalam tiga tahap:
    • Mengurangi rata-rata untuk memusatkan data
    • Menormalisasi vektor menjadi unit vector
    • Menghitung dot product dari dua vektor
  • Jika vektor sudah dipusatkan dan dinormalisasi:
    • Koefisien korelasi Pearson = cosine similarity = dot product
  • Cara penggunaan praktis
    • Kita tidak memusatkan atau menormalisasi vektor setiap kali membandingkan pasangan
      • Sebagai gantinya, lakukan pra-pemrosesan lalu hitung dot product saja
    • Jika cosine similarity bisa digunakan, maka koefisien korelasi Pearson pada dasarnya juga bisa digunakan dengan cara yang sama
      • Kedua ukuran ini secara praktis bisa dipakai dalam konteks yang sama

Masalah saat menggunakan cosine similarity sebagai ukuran kemiripan

  • Menggunakan cosine similarity sebagai objective pelatihan model machine learning sah secara matematis
  • Masalah muncul di area yang melampaui kecocokan cosine similarity itu sendiri:
    • Ketika loss function yang dipakai untuk melatih model bukan cosine similarity
    • Ketika objective pelatihan berbeda dari kebutuhan aplikasi nyata
  • Secara umum, model dilatih dengan vektor yang tidak dinormalisasi:
    • Contoh: prediksi probabilitas berbasis dot product dan logistic loss function
    • Beberapa model meminimalkan jarak Euclidean agar item dalam kelas yang sama dipelajari menjadi berdekatan
  • Normalisasi memberikan sifat matematis tertentu (membatasi hasil antara -1 dan 1), tetapi ini adalah "solusi tambal sulam"
  • Hanya model yang dilatih dengan cosine similarity atau fungsi langsung turunannya yang aman untuk digunakan
  • Bahkan jika model secara eksplisit dilatih dengan cosine similarity, definisi kemiripan tetap tidak jelas:
    • Kritikus sastra: berbagi tema
    • Pustakawan: klasifikasi genre
    • Pembaca: respons emosional
    • Penata huruf: jumlah halaman dan format
  • Cosine similarity menyederhanakan berbagai definisi itu menjadi satu angka, sehingga mudah menyesatkan
  • Contoh: "espresso" dan "cappuccino"
    • word2vec menganggap kedua kata ini hampir identik (berdasarkan konteks Amerika Serikat)
    • Namun, di Italia keduanya tidak dianggap sama

Saat cosine similarity gagal

  • Contoh sederhana: pertanyaan mencari kunci
    • Pertanyaan: "What did I do with my keys?"
    • Kalimat pembanding:
      • "I left them in my pocket"
      • "They are on the table"
      • "What did I put my wallet?"
      • "What I did to my life?"
  • Masalahnya
    • Hasil dengan cosine similarity:
      • Kalimat terdekat justru pertanyaan lain, bukan jawaban yang tepat ("What I did to my life?")
      • Bergantung pada kemiripan struktur kalimat semata, bukan relevansi semantik
    • Kalimat yang terkait Python memiliki similarity yang nyaris 0, sehingga ketidakrelevanannya tercermin dengan benar
  • Keterbatasan di dunia nyata
    • Dalam aplikasi nyata, kita berurusan dengan ribuan dokumen
      • Pada dataset besar yang melampaui context window, sistem menjadi lebih sensitif terhadap noise yang lebih besar
    • Semakin besar ukuran dataset, skor kemiripan makin bekerja seperti permainan roulette berdimensi tinggi

Apa alternatif yang bisa dipakai selain cosine similarity?

Pendekatan paling kuat

  • Memanfaatkan kueri LLM:
    • Menggunakan language model yang kuat untuk membandingkan dua item
    • Contoh: "Is {sentence_a} a plausible answer to {sentence_b}?"
    • Dengan LLM, perbandingan yang bermakna menjadi mungkin:
      • Membedakan pertanyaan sederhana dan jawaban
      • Hasil dapat diberikan dalam format terstruktur seperti JSON
    • Namun, jika dataset besar, pendekatan ini tidak efisien dan mahal

Optimasi embedding

  • Membuat embedding spesifik tugas:
    • Fine-tuning yang menyesuaikan bobot model yang ada
    • Transfer learning yang memanfaatkan pengetahuan model untuk membuat embedding baru yang lebih terfokus
  • Kemiripan simetris:
    • Merepresentasikan pertanyaan "Apakah A dan B mirip?" di ruang vektor
    • Mengurangi dimensi yang tidak diperlukan dan mempertahankan hanya karakteristik yang relevan
  • Kemiripan asimetris:
    • Contoh: merepresentasikan "Apakah dokumen B adalah jawaban yang benar untuk pertanyaan A?" sebagai probabilitas
    • Mengubah query dan key ke ruang khusus masing-masing

Prompt engineering

  • Menambahkan prompt untuk menetapkan konteks:
    • Contoh: "Nationality of {person}" untuk menekankan konteks yang berkaitan dengan kewarganegaraan
    • Gunakan kalimat yang lebih spesifik daripada prompt sederhana:
      • "This is a country that has produced many influential historical figures, including {person}"
    • Kualitas hasil meningkat secara signifikan, meski tidak sempurna

Penulisan ulang teks dan ekstraksi konteks

  • Pra-pemrosesan teks sebelum embedding:
    • Gunakan prompt sederhana seperti "Ringkas teks berikut dalam bahasa Inggris standar dalam maksimal 200 kata" untuk menghapus kemiripan permukaan
    • Abaikan elemen formal yang tidak perlu (typo, format, dan sebagainya) dan fokus pada isi
  • Membuat konteks terstruktur:
    • Ringkas percakapan pelanggan untuk mengekstrak kebutuhan dan masalah yang jelas:
      • "Ringkas percakapan dalam maksimal 10 poin Markdown"
    • Halaman juga bisa diubah ke format yang sama agar pencocokan lebih presisi

Kesimpulan

  • Berbagai metode alternatif dapat melengkapi kelemahan cosine similarity dan memberikan hasil yang lebih dapat diandalkan
  • Pilih dan terapkan pendekatan yang sesuai dengan kondisi proyek

Ringkasan

  • Keterbatasan cosine similarity:
    • Cosine similarity memberikan nilai antara -1 dan 1, tetapi nilainya tidak boleh dianggap sebagai probabilitas
    • Sebagian besar model tidak dilatih dengan objective cosine similarity, sehingga hasilnya tidak lebih dari korelasi yang tidak dijamin
    • Bahkan jika model mempelajari cosine similarity, kita tetap harus memahami apakah definisi kemiripan itu sesuai dengan kebutuhan kita
  • Cara menggunakan kemiripan vektor secara efektif:
    • Melatih embedding yang spesifik terhadap data
    • Merancang prompt yang berfokus pada aspek yang relevan
    • Membersihkan dan menstandarkan teks sebelum embedding

2 komentar

 
mhj5730 2025-01-20

Ringkasan materinya luar biasa.

 
GN⁺ 2025-01-16
Opini Hacker News
  • Dalam aplikasi RAG yang menggunakan cosine similarity, sebaiknya hasil diurutkan ulang dengan menggunakan "semantic re-ranker" atau "L2 re-ranking model"

    • Dalam contoh pgvector-python, pengurutan ulang dilakukan dengan model cross-encoder
    • Pengurutan ulang juga bisa dilakukan dengan model bahasa, tetapi performanya bisa lebih rendah dibanding model yang memang dikhususkan untuk reranking
    • Dalam pendekatan Azure RAG, digunakan AI Search semantic ranker yang dipakai Bing untuk mengurutkan ulang hasil pencarian
  • Vektor kata menyelesaikan masalah bahwa dua kata bisa sangat terkait meskipun tidak muncul dalam konteks yang sama

    • "Python" dan "Ruby" mungkin tidak muncul dalam konteks yang sama, tetapi "scripting" bisa ditemukan dalam konteks keduanya
    • Namun, ini sering tidak bekerja dengan baik karena curse of dimensionality
    • Diajukan ide apakah word embedding bisa direpresentasikan sebagai simpul alih-alih vektor
  • Di Amerika Serikat, word2vec bisa menganggap espresso dan cappuccino hampir identik, tetapi di Italia tidak demikian

    • Pendekatan terbaik adalah membandingkan dua item dengan langsung menggunakan kueri LLM
    • LLM dapat menilai "Di mana saya meletakkan dompet?" dan "Di mana saya meletakkan kunci?" sebagai sangat mirip
  • Cosine similarity digunakan di sebagian besar semantic search berbasis deep learning

    • Model seperti SentenceTransformers dilatih untuk menggunakan cosine similarity
    • Model seperti CLIP untuk representasi vektor gambar juga menggunakan cosine similarity
  • Membandingkan dua item dengan langsung menggunakan kueri LLM adalah pendekatan yang paling kuat

    • Cross encoder adalah solusi yang sangat baik dan cepat
  • HyDE adalah metode yang menghasilkan jawaban hipotetis untuk sebuah pertanyaan lalu membandingkan kemiripannya

    • Pendekatan yang lebih baik adalah menstandarkan format chunk dan menghasilkan jawaban hipotetis dalam format yang sama
  • Cosine similarity dan top-k RAG terasa seperti pendekatan yang sudah usang

    • Cosine similarity hanyalah sifat kebetulan dari data
    • Model embedding yang lebih baru dilatih untuk menggunakan cosine similarity sebagai ukuran kemiripan
  • Setelah mencoba pendekatan RAG, ada rasa kecewa, dan muncul pemikiran bahwa model seharusnya distrukturkan agar bisa melakukan RAG saat pelatihan

    • Pemodelan data pelatihan dapat ditingkatkan dengan membiarkan model mendefinisikan embedding, format, dan proses pencarian
  • Dalam grafik 3D dan fisika, pentingnya dan akurasinya jelas, tetapi dalam machine learning, ruang vektor merepresentasikan terlalu banyak hal sehingga penggunaan dot product terasa ambigu