- 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
Ringkasan materinya luar biasa.
Opini Hacker News
Dalam aplikasi RAG yang menggunakan cosine similarity, sebaiknya hasil diurutkan ulang dengan menggunakan "semantic re-ranker" atau "L2 re-ranking model"
Vektor kata menyelesaikan masalah bahwa dua kata bisa sangat terkait meskipun tidak muncul dalam konteks yang sama
Di Amerika Serikat, word2vec bisa menganggap espresso dan cappuccino hampir identik, tetapi di Italia tidak demikian
Cosine similarity digunakan di sebagian besar semantic search berbasis deep learning
Membandingkan dua item dengan langsung menggunakan kueri LLM adalah pendekatan yang paling kuat
HyDE adalah metode yang menghasilkan jawaban hipotetis untuk sebuah pertanyaan lalu membandingkan kemiripannya
Cosine similarity dan top-k RAG terasa seperti pendekatan yang sudah usang
Setelah mencoba pendekatan RAG, ada rasa kecewa, dan muncul pemikiran bahwa model seharusnya distrukturkan agar bisa melakukan RAG saat pelatihan
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