كيفية الحصول على تضمينات المتجهات الصحيحة
نُشرت هذه المقالة في الأصل في The New Stack وأعيد نشرها هنا بإذن.
مقدمة شاملة عن التضمينات المتجهة وكيفية إنشائها باستخدام النماذج مفتوحة المصدر الشائعة.
صورة بواسطة Денис Марчук من Pixabay
يعد تضمين المتجهات أمرًا بالغ الأهمية عند العمل مع التشابه الدلالي. ومع ذلك، فإن المتجه هو ببساطة سلسلة من الأرقام، أما تضمين المتجهات فهو سلسلة من الأرقام التي تمثل البيانات المدخلة. باستخدام التضمينات المتجهية، يمكننا هيكلة البيانات غير المنظمة أو العمل مع أي نوع من البيانات من خلال تحويلها إلى سلسلة من الأرقام. يسمح لنا هذا النهج بإجراء عمليات رياضية على البيانات المدخلة، بدلاً من الاعتماد على المقارنات النوعية.
تُعد التضمينات المتجهة مؤثرة في العديد من المهام، خاصةً في البحث الدلالي. ومع ذلك، من الضروري الحصول على التضمينات المتجهة المناسبة قبل استخدامها. على سبيل المثال، إذا كنت تستخدم نموذج صورة لتضمين نص متجه، أو العكس، فمن المحتمل أن تحصل على نتائج سيئة.
سنتعرف في هذا المنشور على معنى التضمينات المتجهة وكيفية إنشاء التضمينات المتجهة المناسبة لتطبيقاتك باستخدام نماذج مختلفة وكيفية تحقيق أفضل استخدام للتضمينات المتجهة مع قواعد البيانات المتجهة مثل Milvus و Zilliz Cloud.
كيف يتم إنشاء التضمينات المتجهة؟
الآن بعد أن فهمنا أهمية التضمينات المتجهية، دعونا نتعرف على كيفية عملها. التضمين المتجه هو التمثيل الداخلي للبيانات المدخلة في نموذج التعلم العميق، والمعروف أيضًا باسم نماذج التضمين أو الشبكة العصبية العميقة. إذن، كيف نستخرج هذه المعلومات؟
نحصل على المتجهات عن طريق إزالة الطبقة الأخيرة وأخذ المخرجات من الطبقة قبل الأخيرة. عادةً ما تقوم الطبقة الأخيرة من الشبكة العصبية بإخراج تنبؤات النموذج، لذلك نأخذ مخرجات الطبقة قبل الأخيرة. التضمين المتجه هو البيانات التي يتم تغذية الطبقة التنبؤية للشبكة العصبية.
إن بُعدية التضمين المتجه تعادل حجم الطبقة ما قبل الأخيرة في النموذج، وبالتالي يمكن استبدالها بحجم المتجه أو طوله. تشمل الأبعاد المتجهة الشائعة 384 (التي تم إنشاؤها بواسطة محولات الجمل المصغرة (Sentence Transformers Mini-LM) و768 (بواسطة محولات الجمل MPNet) و1536 (بواسطة OpenAI) و2048 (بواسطة ResNet-50).
ماذا يعني تضمين المتجهات؟
سألني أحدهم ذات مرة عن معنى كل بُعد في تضمين المتجهات. الإجابة المختصرة هي لا شيء. لا يعني بُعد واحد في التضمين الاتجاهي أي شيء، لأنه مجرّد للغاية بحيث لا يمكن تحديد معناه. ومع ذلك، عندما نأخذ جميع الأبعاد معًا، فإنها توفر المعنى الدلالي للبيانات المدخلة.
أبعاد المتجه هي تمثيلات مجردة عالية المستوى لسمات مختلفة. تعتمد السمات الممثلة على بيانات التدريب والنموذج نفسه. تولد نماذج النصوص ونماذج الصور تضمينات مختلفة لأنها مدربة على أنواع بيانات مختلفة بشكل أساسي. حتى النماذج النصية المختلفة تولد تضمينات مختلفة. أحياناً تختلف في الحجم، وأحياناً أخرى تختلف في السمات التي تمثلها. على سبيل المثال، النموذج المدرّب على البيانات القانونية سيتعلم أشياء مختلفة عن النموذج المدرّب على بيانات الرعاية الصحية. لقد استكشفتُ هذا الموضوع في منشوري الذي يقارن بين تضمينات المتجهات.
توليد التضمينات المتجهة الصحيحة
كيف تحصل على التضمينات المتجهة المناسبة؟ يبدأ كل شيء بتحديد نوع البيانات التي ترغب في تضمينها. يغطي هذا القسم تضمين خمسة أنواع مختلفة من البيانات: الصور، والنصوص، والصوت، ومقاطع الفيديو، والبيانات متعددة الوسائط. جميع النماذج التي نقدمها هنا مفتوحة المصدر وتأتي من Hugging Face أو PyTorch.
تضمين الصور
انطلق مجال التعرّف على الصور في عام 2012 بعد ظهور AlexNet في المشهد. ومنذ ذلك الحين، شهد مجال الرؤية الحاسوبية العديد من التطورات. أحدث النماذج البارزة في مجال التعرف على الصور هو ResNet-50، وهي شبكة متبقية عميقة مكونة من 50 طبقة تعتمد على بنية ResNet-34 السابقة.
تعمل الشبكات العصبية المتبقية (ResNet) على حل مشكلة التدرج المتلاشي في الشبكات العصبية التلافيفية العميقة باستخدام وصلات مختصرة. تسمح هذه الوصلات بانتقال المخرجات من الطبقات السابقة إلى الطبقات اللاحقة مباشرةً دون المرور عبر جميع الطبقات الوسيطة، وبالتالي تجنب مشكلة التدرج المتلاشي. يجعل هذا التصميم شبكة ResNet أقل تعقيدًا من شبكة VGGNet (مجموعة الهندسة البصرية)، وهي شبكة عصبية تلافيفية كانت الأفضل أداءً في السابق.
أوصي باثنين من تطبيقات ResNet-50 كأمثلة: ResNet 50 على Hugging Face و ResNet 50 على PyTorch Hub. في حين أن الشبكات هي نفسها، تختلف عملية الحصول على التضمينات.
يوضح نموذج التعليمات البرمجية أدناه كيفية استخدام PyTorch للحصول على تضمينات المتجهات. أولاً، نقوم بتحميل النموذج من PyTorch Hub. بعد ذلك، نزيل الطبقة الأخيرة ونستدعي .eval()
لتوجيه النموذج للتصرف كما لو كان يعمل للاستدلال. بعد ذلك، تقوم الدالة embed
بإنشاء التضمين المتجه.
# 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 إعدادًا مختلفًا قليلاً. يوضح الرمز أدناه كيفية الحصول على تضمين متجه من Hugging Face. أولاً، نحتاج أولاً إلى مستخرج ميزات ونموذج من مكتبة transformers
. سوف نستخدم مستخرج الميزة للحصول على مدخلات للنموذج ونستخدم النموذج للحصول على المخرجات واستخراج آخر حالة مخفية.
# 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()
تضمين النص
يجري المهندسون والباحثون تجارب على اللغة الطبيعية والذكاء الاصطناعي منذ اختراع الذكاء الاصطناعي. تتضمن بعض التجارب المبكرة ما يلي:
- ELIZA، أول روبوت معالج بالذكاء الاصطناعي.
- غرفة جون سيرل الصينية، وهي تجربة فكرية تدرس ما إذا كانت القدرة على الترجمة بين اللغتين الصينية والإنجليزية تتطلب فهم اللغة.
- الترجمة القائمة على القواعد بين الإنجليزية والروسية.
لقد تطورت عملية الذكاء الاصطناعي على اللغة الطبيعية بشكل كبير من التضمينات القائمة على القواعد. بدءًا من الشبكات العصبية الأولية، أضفنا العلاقات التكرارية من خلال الشبكات العصبية العصبية الشبكية RNNs لتتبع الخطوات في الوقت المناسب. من هناك، استخدمنا المحولات لحل مشكلة تحويل التسلسل.
تتكون المحولات من مشفر، والذي يشفر المدخلات إلى مصفوفة تمثل الحالة، ومصفوفة انتباه ومفك تشفير. تقوم وحدة فك التشفير بفك تشفير الحالة ومصفوفة الانتباه للتنبؤ بالرمز التالي الصحيح لإنهاء تسلسل المخرجات. يتألف نموذج GPT-3، وهو النموذج اللغوي الأكثر شيوعًا حتى الآن، من أجهزة فك تشفير صارمة. فهي تشفر المدخلات وتتنبأ بالرمز (الرموز) التالية الصحيحة.
إليك نموذجين من مكتبة sentence-transformers
من Hugging Face يمكنك استخدامهما بالإضافة إلى تضمينات OpenAI:
- MiniLM-LM-L6-v2: نموذج 384 بُعداً
- MPNet-Base-V2: نموذج 768 بُعدًا
يمكنك الوصول إلى التضمينات من كلا النموذجين بنفس الطريقة.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("<model-name>")
vector_embeddings = model.encode(“<input>”)
التضمينات متعددة الوسائط
النماذج متعددة الوسائط أقل تطوراً من نماذج الصور أو النماذج النصية. فهي غالبًا ما تربط الصور بالنصوص.
المثال مفتوح المصدر الأكثر فائدة هو نموذج CLIP VIT، وهو نموذج من صورة إلى نص. يمكنك الوصول إلى تضمينات CLIP VIT بنفس الطريقة التي تصل بها إلى نموذج الصورة، كما هو موضح في الكود أدناه.
# 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()
تضمينات الصوت
حظي الذكاء الاصطناعي للصوت باهتمام أقل من الذكاء الاصطناعي للنصوص أو الصور. حالة الاستخدام الأكثر شيوعًا للصوت هي تحويل الكلام إلى نص في صناعات مثل مراكز الاتصال والتكنولوجيا الطبية وإمكانية الوصول. أحد النماذج مفتوحة المصدر الشائعة لتحويل الكلام إلى نص هو Whisper من OpenAI. يوضح الرمز أدناه كيفية الحصول على تضمينات المتجهات من نموذج تحويل الكلام إلى نص.
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
تضمينات الفيديو
تعد تضمينات الفيديو أكثر تعقيدًا من تضمينات الصوت أو الصورة. من الضروري اتباع نهج متعدد الوسائط عند العمل مع مقاطع الفيديو، لأنها تتضمن صوتًا وصورًا متزامنة. أحد نماذج الفيديو الشائعة هو المدرك متعدد الوسائط من DeepMind. يوضح هذا الدليل التعليمي كيفية استخدام النموذج لتصنيف مقطع فيديو.
للحصول على تضمينات المدخلات، استخدم outputs[1][-1].squeeze()
من الكود الموضح في الدفتر بدلاً من حذف المخرجات. أبرز مقتطف الكود هذا في الدالة 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
تخزين وفهرسة والبحث في التضمينات المتجهة باستخدام قواعد البيانات المتجهة
الآن بعد أن فهمنا ما هي التضمينات المتجهة وكيفية توليدها باستخدام نماذج تضمين قوية مختلفة، فإن السؤال التالي هو كيفية تخزينها والاستفادة منها. قواعد البيانات المتجهة هي الحل.
قواعد البيانات المتجهة مثل ميلفوس وزيليز كلاود مصممة خصيصًا لتخزين وفهرسة والبحث عبر مجموعات بيانات ضخمة من البيانات غير المنظمة من خلال تضمينات المتجهات. كما أنها واحدة من أهم البنى التحتية لمختلف مكدسات الذكاء الاصطناعي.
تستخدم قواعد البيانات المتجهة عادةً خوارزمية الجار الأقرب التقريبي (ANN) لحساب المسافة المكانية بين متجه الاستعلام والمتجهات المخزنة في قاعدة البيانات. وكلما اقترب المتجهان من بعضهما البعض، كلما كانت المسافة بينهما أكثر صلة. ثم تقوم الخوارزمية بالعثور على أقرب جيران k الأعلى وتسليمها للمستخدم.
تحظى قواعد البيانات المتجهة بشعبية في حالات الاستخدام مثل الجيل المعزز لاسترجاع LLM (RAG)، وأنظمة الأسئلة والأجوبة، وأنظمة التوصية، وعمليات البحث الدلالية، وعمليات البحث عن التشابه في الصور والفيديو والصوت.
لمعرفة المزيد حول تضمينات المتجهات والبيانات غير المهيكلة وقواعد البيانات المتجهة، يمكنك البدء بسلسلة قواعد البيانات المتجهة 101.
الملخص
المتجهات هي أداة قوية للعمل مع البيانات غير المنظمة. باستخدام المتجهات، يمكننا رياضياً مقارنة أجزاء مختلفة من البيانات غير المهيكلة بناءً على التشابه الدلالي. يعد اختيار نموذج التضمين المتجه الصحيح أمرًا بالغ الأهمية لبناء محرك بحث متجه لأي تطبيق.
في هذا المنشور، تعلمنا أن تضمينات المتجهات هي التمثيل الداخلي للبيانات المدخلة في الشبكة العصبية. ونتيجة لذلك، فإنها تعتمد بشكل كبير على بنية الشبكة والبيانات المستخدمة لتدريب النموذج. تتطلب أنواع البيانات المختلفة (مثل الصور والنصوص والصوت) نماذج محددة. لحسن الحظ، يتوفر العديد من النماذج مفتوحة المصدر المدربة مسبقًا للاستخدام. في هذا المنشور، قمنا بتغطية النماذج للأنواع الخمسة الأكثر شيوعًا من البيانات: الصور، والنصوص، والوسائط المتعددة، والصوت، والفيديو. بالإضافة إلى ذلك، إذا كنت ترغب في تحقيق أفضل استخدام لتضمينات المتجهات، فإن قواعد البيانات المتجهة هي الأداة الأكثر شيوعًا.
- كيف يتم إنشاء التضمينات المتجهة؟
- ماذا يعني تضمين المتجهات؟
- توليد التضمينات المتجهة الصحيحة
- تخزين وفهرسة والبحث في التضمينات المتجهة باستخدام قواعد البيانات المتجهة
- الملخص
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word