🚀 Coba Zilliz Cloud, Milvus yang sepenuhnya terkelola, secara gratis—rasakan performa 10x lebih cepat! Coba Sekarang>>

milvus-logo
LFAI
  • Home
  • Blog
  • Cara Mendapatkan Penyematan Vektor yang Tepat

Cara Mendapatkan Penyematan Vektor yang Tepat

  • Engineering
December 08, 2023
Yujian Tang

Artikel ini awalnya diterbitkan di The New Stack dan dimuat ulang di sini dengan izin.

Pengantar komprehensif untuk penyematan vektor dan cara membuatnya dengan model sumber terbuka yang populer.

Image by Денис Марчук from Pixabay Gambar oleh Денис Марчук dari Pixabay

Penyematan vektor sangat penting ketika bekerja dengan kemiripan semantik. Namun, vektor hanyalah serangkaian angka; penyematan vektor adalah serangkaian angka yang mewakili data masukan. Dengan menggunakan penyematan vektor, kita dapat menyusun data yang tidak terstruktur atau bekerja dengan jenis data apa pun dengan mengubahnya menjadi serangkaian angka. Pendekatan ini memungkinkan kita untuk melakukan operasi matematika pada data input, daripada mengandalkan perbandingan kualitatif.

Penyematan vektor sangat berpengaruh pada banyak tugas, terutama untuk pencarian semantik. Namun, sangat penting untuk mendapatkan penyematan vektor yang sesuai sebelum menggunakannya. Misalnya, jika Anda menggunakan model gambar untuk membuat vektor teks, atau sebaliknya, Anda mungkin akan mendapatkan hasil yang buruk.

Dalam postingan ini, kita akan mempelajari apa arti dari vector embeddings, cara membuat vector embeddings yang tepat untuk aplikasi Anda dengan menggunakan model yang berbeda, dan cara menggunakan vector embeddings dengan database vektor seperti Milvus dan Zilliz Cloud.

Bagaimana embedding vektor dibuat?

Setelah kita memahami pentingnya embedding vektor, mari kita pelajari cara kerjanya. Vektor embedding adalah representasi internal dari data input dalam model pembelajaran mendalam, yang juga dikenal sebagai model embedding atau jaringan syaraf tiruan. Jadi, bagaimana cara mengekstrak informasi ini?

Kita mendapatkan vektor dengan menghapus lapisan terakhir dan mengambil output dari lapisan kedua hingga terakhir. Lapisan terakhir dari jaringan saraf biasanya menghasilkan prediksi model, jadi kami mengambil output dari lapisan kedua hingga terakhir. Penyematan vektor adalah data yang diumpankan ke lapisan prediktif jaringan saraf.

Dimensi dari sebuah embedding vektor setara dengan ukuran lapisan kedua hingga terakhir dalam model dan, dengan demikian, dapat dipertukarkan dengan ukuran atau panjang vektor. Dimensi vektor yang umum termasuk 384 (dihasilkan oleh Sentence Transformers Mini-LM), 768 (oleh Sentence Transformers MPNet), 1.536 (oleh OpenAI) dan 2.048 (oleh ResNet-50).

Apa yang dimaksud dengan penyematan vektor?

Seseorang pernah bertanya kepada saya tentang arti dari setiap dimensi dalam penyematan vektor. Jawaban singkatnya adalah tidak ada. Satu dimensi dalam embedding vektor tidak berarti apa-apa, karena terlalu abstrak untuk menentukan maknanya. Namun, ketika kita menggabungkan semua dimensi, mereka memberikan makna semantik dari data input.

Dimensi vektor adalah representasi abstrak tingkat tinggi dari atribut yang berbeda. Atribut yang direpresentasikan bergantung pada data pelatihan dan model itu sendiri. Model teks dan gambar menghasilkan penyematan yang berbeda karena mereka dilatih untuk jenis data yang pada dasarnya berbeda. Bahkan model teks yang berbeda menghasilkan penyematan yang berbeda. Kadang-kadang mereka berbeda dalam ukuran; di lain waktu, mereka berbeda dalam atribut yang mereka wakili. Sebagai contoh, model yang dilatih untuk data hukum akan mempelajari hal-hal yang berbeda dari model yang dilatih untuk data perawatan kesehatan. Saya telah membahas topik ini dalam postingan saya yang membandingkan penyematan vektor.

Menghasilkan penyematan vektor yang tepat

Bagaimana Anda mendapatkan embedding vektor yang tepat? Semuanya dimulai dengan mengidentifikasi jenis data yang ingin Anda sematkan. Bagian ini mencakup penyematan lima jenis data yang berbeda: gambar, teks, audio, video, dan data multimodal. Semua model yang kami perkenalkan di sini adalah sumber terbuka dan berasal dari Hugging Face atau PyTorch.

Penyematan gambar

Pengenalan gambar mulai populer pada tahun 2012 setelah AlexNet muncul. Sejak saat itu, bidang visi komputer telah menyaksikan banyak kemajuan. Model pengenalan gambar terbaru yang terkenal adalah ResNet-50, jaringan residual sedalam 50 lapisan berdasarkan arsitektur ResNet-34 sebelumnya.

Jaringan saraf residual (ResNet) memecahkan masalah gradien yang menghilang dalam jaringan saraf convolutional yang dalam dengan menggunakan koneksi pintas. Koneksi ini memungkinkan output dari lapisan sebelumnya untuk pergi ke lapisan berikutnya secara langsung tanpa melewati semua lapisan perantara, sehingga menghindari masalah gradien yang hilang. Desain ini membuat ResNet tidak terlalu rumit dibandingkan dengan VGGNet (Visual Geometry Group), jaringan syaraf tiruan dengan performa terbaik sebelumnya.

Saya merekomendasikan dua implementasi ResNet-50 sebagai contoh: ResNet 50 pada Hugging Face dan ResNet 50 pada PyTorch Hub. Meskipun jaringannya sama, proses mendapatkan embedding berbeda.

Contoh kode di bawah ini menunjukkan cara menggunakan PyTorch untuk mendapatkan embedding vektor. Pertama, kita memuat model dari PyTorch Hub. Selanjutnya, kita menghapus layer terakhir dan memanggil .eval() untuk menginstruksikan model agar berperilaku seperti sedang menjalankan inferensi. Kemudian, fungsi embed menghasilkan penyematan vektor.

# Load the embedding model with the last layer removed
model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet50', pretrained=True) model = torch.nn.Sequential(*(list(model.children())[:-1]))
model.eval()


def embed(data):
with torch.no_grad():
output = model(torch.stack(data[0])).squeeze()
return output

HuggingFace menggunakan pengaturan yang sedikit berbeda. Kode di bawah ini menunjukkan bagaimana cara mendapatkan penyematan vektor dari Hugging Face. Pertama, kita membutuhkan ekstraktor fitur dan model dari perpustakaan transformers. Kita akan menggunakan ekstraktor fitur untuk mendapatkan input untuk model dan menggunakan model untuk mendapatkan output dan mengekstrak keadaan tersembunyi terakhir.

# Load model directly
from transformers import AutoFeatureExtractor, AutoModelForImageClassification


extractor = AutoFeatureExtractor.from_pretrained("microsoft/resnet-50")
model = AutoModelForImageClassification.from_pretrained("microsoft/resnet-50")


from PIL import Image


image = Image.open("<image path>")
# image = Resize(size=(256, 256))(image)


inputs = extractor(images=image, return_tensors="pt")
# print(inputs)


outputs = model(**inputs)
vector_embeddings = outputs[1][-1].squeeze()

Penyematan teks

Para insinyur dan peneliti telah bereksperimen dengan bahasa alami dan AI sejak penemuan AI. Beberapa eksperimen paling awal meliputi:

  • ELIZA, chatbot terapis AI pertama.
  • Chinese Room dari John Searle, sebuah eksperimen pemikiran yang meneliti apakah kemampuan untuk menerjemahkan antara bahasa Mandarin dan Inggris membutuhkan pemahaman bahasa tersebut.
  • Terjemahan berbasis aturan antara bahasa Inggris dan Rusia.

Operasi AI pada bahasa alami telah berevolusi secara signifikan dari penyematan berbasis aturan. Dimulai dengan jaringan saraf primer, kami menambahkan hubungan pengulangan melalui RNN untuk melacak langkah-langkah dalam waktu. Dari sana, kami menggunakan transformer untuk menyelesaikan masalah transduksi urutan.

Transformator terdiri dari encoder, yang mengkodekan input ke dalam matriks yang mewakili keadaan, matriks perhatian dan decoder. Decoder menerjemahkan matriks state dan attention untuk memprediksi token berikutnya yang benar untuk menyelesaikan urutan output. GPT-3, model bahasa yang paling populer hingga saat ini, terdiri dari decoder yang ketat. Mereka menyandikan input dan memprediksi token berikutnya yang tepat.

Berikut adalah dua model dari perpustakaan sentence-transformers oleh Hugging Face yang dapat Anda gunakan sebagai tambahan untuk embedding OpenAI:

Anda dapat mengakses penyematan dari kedua model dengan cara yang sama.

from sentence_transformers import SentenceTransformer


model = SentenceTransformer("<model-name>")
vector_embeddings = model.encode(“<input>”)

Penyematan multimodal

Model multimodal kurang dikembangkan dengan baik dibandingkan model gambar atau teks. Model ini sering menghubungkan gambar dengan teks.

Contoh sumber terbuka yang paling berguna adalah CLIP VIT, sebuah model gambar-ke-teks. Anda dapat mengakses penyematan CLIP VIT dengan cara yang sama seperti yang Anda lakukan pada model gambar, seperti yang ditunjukkan pada kode di bawah ini.

# Load model directly
from transformers import AutoProcessor, AutoModelForZeroShotImageClassification


processor = AutoProcessor.from_pretrained("openai/clip-vit-large-patch14")
model = AutoModelForZeroShotImageClassification.from_pretrained("openai/clip-vit-large-patch14")
from PIL import Image


image = Image.open("<image path>")
# image = Resize(size=(256, 256))(image)


inputs = extractor(images=image, return_tensors="pt")
# print(inputs)


outputs = model(**inputs)
vector_embeddings = outputs[1][-1].squeeze()

Penyematan audio

AI untuk audio kurang mendapat perhatian dibandingkan AI untuk teks atau gambar. Kasus penggunaan yang paling umum untuk audio adalah ucapan-ke-teks untuk industri seperti pusat panggilan, teknologi medis, dan aksesibilitas. Salah satu model sumber terbuka yang populer untuk ucapan-ke-teks adalah Whisper dari OpenAI. Kode di bawah ini menunjukkan cara mendapatkan penyematan vektor dari model ucapan-ke-teks.

import torch
from transformers import AutoFeatureExtractor, WhisperModel
from datasets import load_dataset


model = WhisperModel.from_pretrained("openai/whisper-base")
feature_extractor = AutoFeatureExtractor.from_pretrained("openai/whisper-base")
ds = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
inputs = feature_extractor(ds[0]["audio"]["array"], return_tensors="pt")
input_features = inputs.input_features
decoder_input_ids = torch.tensor([[1, 1]]) * model.config.decoder_start_token_id
vector_embedding = model(input_features, decoder_input_ids=decoder_input_ids).last_hidden_state

Penyematan video

Penyematan video lebih kompleks daripada penyematan audio atau gambar. Pendekatan multimodal diperlukan ketika bekerja dengan video, karena video mencakup audio dan gambar yang disinkronkan. Salah satu model video yang populer adalah perceiver multimodal dari DeepMind. Tutorial buku catatan ini menunjukkan cara menggunakan model ini untuk mengklasifikasikan video.

Untuk mendapatkan penyematan input, gunakan outputs[1][-1].squeeze() dari kode yang ditunjukkan dalam buku catatan alih-alih menghapus output. Saya menyoroti cuplikan kode ini dalam fungsi autoencode.

def autoencode_video(images, audio):
     # only create entire video once as inputs
     inputs = {'image': torch.from_numpy(np.moveaxis(images, -1, 2)).float().to(device),
               'audio': torch.from_numpy(audio).to(device),
               'label': torch.zeros((images.shape[0], 700)).to(device)}
     nchunks = 128
     reconstruction = {}
     for chunk_idx in tqdm(range(nchunks)):
          image_chunk_size = np.prod(images.shape[1:-1]) // nchunks
          audio_chunk_size = audio.shape[1] // SAMPLES_PER_PATCH // nchunks
          subsampling = {
               'image': torch.arange(
                    image_chunk_size * chunk_idx, image_chunk_size * (chunk_idx + 1)),
               'audio': torch.arange(
                    audio_chunk_size * chunk_idx, audio_chunk_size * (chunk_idx + 1)),
               'label': None,
          }
     # forward pass
          with torch.no_grad():
               outputs = model(inputs=inputs, subsampled_output_points=subsampling)


          output = {k:v.cpu() for k,v in outputs.logits.items()}
          reconstruction['label'] = output['label']
          if 'image' not in reconstruction:
               reconstruction['image'] = output['image']
               reconstruction['audio'] = output['audio']
          else:
               reconstruction['image'] = torch.cat(
                    [reconstruction['image'], output['image']], dim=1)
               reconstruction['audio'] = torch.cat(
                    [reconstruction['audio'], output['audio']], dim=1)
          vector_embeddings = outputs[1][-1].squeeze()
# finally, reshape image and audio modalities back to original shape
     reconstruction['image'] = torch.reshape(reconstruction['image'], images.shape)
     reconstruction['audio'] = torch.reshape(reconstruction['audio'], audio.shape)
     return reconstruction


     return None

Menyimpan, mengindeks, dan mencari embedding vektor dengan database vektor

Sekarang kita telah memahami apa itu penyematan vektor dan cara membuatnya menggunakan berbagai model penyematan yang kuat, pertanyaan selanjutnya adalah bagaimana cara menyimpan dan memanfaatkannya. Database vektor adalah jawabannya.

Basis data vektor seperti Milvus dan Zilliz Cloud sengaja dibuat untuk menyimpan, mengindeks, dan mencari di seluruh kumpulan data yang sangat besar dari data yang tidak terstruktur melalui penyematan vektor. Database ini juga merupakan salah satu infrastruktur yang paling penting untuk berbagai tumpukan AI.

Basis data vektor biasanya menggunakan algoritme Approximate Nearest Neighbor (ANN ) untuk menghitung jarak spasial antara vektor kueri dan vektor yang tersimpan di dalam basis data. Semakin dekat jarak kedua vektor tersebut, semakin relevan kedua vektor tersebut. Kemudian algoritme menemukan k tetangga terdekat dan memberikannya kepada pengguna.

Basis data vektor sangat populer dalam kasus penggunaan seperti LLM retrieval augmented generation (RAG), sistem tanya jawab, sistem pemberi rekomendasi, pencarian semantik, dan pencarian kemiripan gambar, video, dan audio.

Untuk mempelajari lebih lanjut tentang penyematan vektor, data tidak terstruktur, dan basis data vektor, pertimbangkan untuk memulai dengan seri Basis Data Vektor 101.

Ringkasan

Vektor adalah alat yang kuat untuk bekerja dengan data yang tidak terstruktur. Dengan menggunakan vektor, kita dapat secara matematis membandingkan berbagai bagian data tidak terstruktur berdasarkan kesamaan semantik. Memilih model penyematan vektor yang tepat sangat penting untuk membangun mesin pencari vektor untuk aplikasi apa pun.

Dalam artikel ini, kita telah mempelajari bahwa penyematan vektor adalah representasi internal dari data input dalam jaringan saraf. Akibatnya, mereka sangat bergantung pada arsitektur jaringan dan data yang digunakan untuk melatih model. Tipe data yang berbeda (seperti gambar, teks, dan audio) memerlukan model yang spesifik. Untungnya, banyak model open source yang sudah terlatih tersedia untuk digunakan. Dalam tulisan ini, kami membahas model untuk lima jenis data yang paling umum: gambar, teks, multimodal, audio, dan video. Selain itu, jika Anda ingin memanfaatkan penyematan vektor dengan sebaik-baiknya, basis data vektor adalah alat yang paling populer.

Like the article? Spread the word

Terus Baca