
1⃣ المركز في Sigir Ecom Challenge 2020
2⃣nd Place and Best Paper Award في WSDM Booking.com Challenge 2021
2⃣nd Place في Twitter Recsys Challenge 2021
المركز 3⃣ في كأس KDD 2021
كليورا هي جنس العث في عائلة Geometridae . يستمد اسمهم العلمي من الجغرافيا اليونانية القديم γῆ أو γαῖα "الأرض" ، و metron έτρον " قياس " في إشارة إلى الطريقة موضة.
Cleora هو نموذج للأغراض العامة للتعلم الفعال والقابل للتطوير لتضمينات الكيان المستقر والاستقرائي للبيانات العلائقية غير المتجانسة.
تثبيت
pip install pycleora
بناء التعليمات
# prepare python env
pip install maturin
# Install pycleora in current env (meant for development)
maturin develop
# Usage example below. More examples in examples/ folder.
Cleora متاح الآن كحزمة Python pycleora . التحسينات الرئيسية مقارنة بالإصدار السابق:
iterators Python بالإضافة إلى ملفات tsvNumPyتغيير التغييرات:
complex::reflexive لتضمينات فرط الخرف ، التي تم تجميعها بواسطة الكيان العابر يعطي نتائج أفضل. from pycleora import SparseMatrix
import numpy as np
import pandas as pd
import random
# Generate example data
customers = [f"Customer_{i}" for i in range(1, 20)]
products = [f"Product_{j}" for j in range(1, 20)]
data = {
"customer": random.choices(customers, k=100),
"product": random.choices(products, k=100),
}
# Create DataFrame
df = pd.DataFrame(data)
# Create hyperedges
customer_products = df.groupby('customer')['product'].apply(list).values
# Convert to Cleora input format
cleora_input = map(lambda x: ' '.join(x), customer_products)
# Create Markov transition matrix for the hypergraph
mat = SparseMatrix.from_iterator(cleora_input, columns='complex::reflexive::product')
# Look at entity ids in the matrix, corresponding to embedding vectors
print(mat.entity_ids)
# ['Product_5', 'Product_3', 'Product_2', 'Product_4', 'Product_1']
# Initialize embedding vectors externally, using text, image, random vectors
# embeddings = ...
# Or use built-in random deterministic initialization
embeddings = mat.initialize_deterministically(1024)
# Perform Markov random walk, then normalize however many times we want
NUM_WALKS = 3 # The optimal number depends on the graph, typically between 3 and 7 yields good results
# lower values tend to capture co-occurrence, higher iterations capture substitutability in a context
for i in range(NUM_WALKS):
# Can propagate with a symmetric matrix as well, but left Markov is a great default
embeddings = mat.left_markov_propagate(embeddings)
# Normalize with L2 norm by default, for the embeddings to reside on a hypersphere. Can use standardization instead.
embeddings /= np.linalg.norm(embeddings, ord=2, axis=-1, keepdims=True)
# We're done, here are our embeddings
for entity, embedding in zip(mat.entity_ids, embeddings):
print(entity, embedding)
# We can now compare our embeddings with dot product (since they are L2 normalized)
print(np.dot(embeddings[0], embeddings[1]))
print(np.dot(embeddings[0], embeddings[2]))
print(np.dot(embeddings[0], embeddings[3]))
س: ما الذي يجب أن أتضمنه؟
ج: أي كيانات تتفاعل مع بعضها البعض ، أو المشتركين أو يمكن القول أنها موجودة معًا في سياق معين. يمكن أن تشمل الأمثلة: المنتجات في سلة التسوق ، والمواقع التي يتردد عليها نفس الأشخاص في أوقات مماثلة ، والموظفين الذين يتعاونون معًا ، وجزيئات كيميائية موجودة في ظروف محددة ، بروتينات تنتجها نفس البكتيريا ، والتفاعلات الدوائية ، والمؤلفين المشاركين في نفس الأوراق الأكاديمية ، الشركات التي تحدث معًا في نفس ملامح LinkedIn.
س: كيف يمكنني بناء المدخلات؟
ج: ما يعمل بشكل أفضل هو تجميع الكيانات المشتركة في سياق مماثل ، وإطعامها في خطوط مفصولة بالمسافة البيضاء باستخدام complex::reflexive هو فكرة جيدة. على سبيل المثال ، إذا كان لديك بيانات منتج ، يمكنك تجميع المنتجات عن طريق سلال التسوق أو من قبل المستخدمين. إذا كان لديك عناوين URL ، فيمكنك تجميعها حسب جلسات المتصفح ، من قبل (المستخدم ، النافذة الزمنية). تحقق من مثال الاستخدام أعلاه. تجميع المنتجات من قبل العملاء هو مجرد احتمال واحد.
س: هل يمكنني تضمين المستخدمين والمنتجات في وقت واحد ، لمقارنتهم مع تشابه جيب التمام؟
ج: لا ، هذا نهج خاطئ من الناحية المنهجية ، ناتج عن أساليب معامل المصفوفة القديمة. ما يجب عليك فعله هو التوصل إلى تضمينات جيدة للمنتج أولاً ، ثم قم بإنشاء تضمينات المستخدم منها. إن تغذية عمودين على سبيل المثال ، سيؤدي user product إلى كليورا إلى رسم بياني من الثنائي. ستكون المنتجات المماثلة قريبة من بعضها البعض ، وسيكون المستخدمون المماثلون قريبين من بعضهم البعض ، لكن المستخدمين والمنتجات لن يشبهوا بعضهم البعض بالضرورة.
س: ما هو أبعاد التضمين للاستخدام؟
ج: كلما كان ذلك أفضل ، لكننا نعمل عادة من 1024 إلى 4096 . الذاكرة رخيصة والآلات قوية ، لذلك لا تبخل على حجم التضمين.
س: كم عدد تكرارات انتشار ماركوف التي يجب أن أستخدمها؟
ج: يعتمد على ما تريد تحقيقه. تميل التكرارات المنخفضة (3) إلى تقارب مصفوفة التزامن ، في حين أن التكرارات العالية (7+) تميل إلى إعطاء التشابه السياقي (فكر في Skip-Gram ولكن أكثر دقة وأسرع).
س: كيف يمكنني دمج المعلومات الخارجية ، مثل البيانات الوصفية للكيان ، الصور ، النصوص في التضمين؟
ج: ما عليك سوى تهيئة مصفوفة التضمين مع المتجهات الخاصة بك القادمة من محولات Set-Set-Set-Set-Set-Set-Set-Set-set ، لإسقاط عشوائي لميزاتك الرقمية. في هذا السيناريو ، تميل أعداد منخفضة من تكرارات ماركوف (1 إلى 3) إلى العمل بشكل أفضل.
س: لا تتناسب تضميناتي في الذاكرة ، ماذا أفعل؟
ج: تعمل كليورا على الأبعاد بشكل مستقل. تهيئة التضمينات الخاصة بك مع عدد أقل من الأبعاد ، تشغيل Cleora ، واستمر في القرص ، ثم كرر. يمكنك تسلسل ناقلات التضمين الناتجة بعد ذلك ، ولكن تذكر أن تطبيعها بعد ذلك!
س: هل هناك عدد أدنى من حوادث الكيانات؟
ج: لا ، كيان A ، سيشارك في وقت واحد فقط مع بعض الكيان الآخر B سيحصل على التضمين المناسب ، B سيكون أكثر تشابهًا مع A في العكس ، سيتم تصنيف A بشكل كبير بين أقرب جيران B ، والتي قد تكون أو لا تكون مرغوبة ، اعتمادًا على حالة الاستخدام الخاصة بك. لا تتردد في تقليم مدخلاتك إلى كليورا للتخلص من العناصر ذات التردد المنخفض.
س: هل هناك أي حالات حافة يمكن أن تفشل فيها كليورا؟
ج: يعمل Cleora بشكل أفضل للفرط المتفرق نسبيًا. إذا كانت جميع التزايز تحتوي على بعض الكيان الشائع للغاية X مثل حقيبة تسوق ، فسيؤدي ذلك إلى تدهور جودة التضمينات عن طريق تدهور أقصر المسارات في المشي العشوائي. إنها ممارسة جيدة لإزالة هذه الكيانات من Hypergraph.
س: كيف يمكن أن تكون كليورا سريعة ودقيقة في نفس الوقت؟
ج: عدم استخدام أخذ العينات السلبية هو نعمة رائعة. من خلال بناء مصفوفة انتقالية Markov (متناثرة) ، تقوم Cleora بشكل صريح بجميع المشي العشوائي الممكنة في فرط الخرف في خطوة واحدة كبيرة (مضاعفة مصفوفة واحدة). هذا ما نسميه تكرارًا واحدًا. نؤدي 3+ مثل هذه التكرارات. بفضل التنفيذ ذي الكفاءة العالية في الصدأ ، مع رعاية خاصة للتزامن وتخطيط الذاكرة وتماسك ذاكرة التخزين المؤقت ، فهو سريع للغاية. يميل أخذ العينات السلبية أو اختيار المشي العشوائي بشكل عشوائي إلى تقديم الكثير من الضوضاء - كليورا خالية من تلك الأعباء.
اقرأ الورقة البيضاء "Cleora: مخطط تضمين بسيط وقوي وقابل للتطوير"
تقوم كليورا بتضمين الكيانات في المساحات الكروية ذات الأبعاد ذات الأبعاد التي تستخدم توقعات عشوائية تكرارية سريعة للغاية ، والتي تسمح بأداء لا مثيل له وقابلية التوسع.
تشمل أنواع البيانات التي يمكن تضمينها على سبيل المثال:
!!! إخلاء المسئولية: الأرقام أدناه مخصصة لـ Cleora 1.x ، الإصدار الجديد أسرع بكثير ، ولكن يتعين عليهم إعادة تشغيل المعايير
المزايا التنافسية الرئيسية لكليورا:
أوقات التضمين - مثال:
| خوارزمية | مجموعة بيانات FB | مجموعة بيانات Roadnet | مجموعة بيانات LiveJournal |
| كليورا | 00:00:43 ح | 00:21:59 ح | 01:31:42 ح |
| Pytorch-biggraph | 00: 04.33 ح | 00:31:11 ح | 07:10:00 ساعة |
نتائج تنبؤ الارتباط - مثال:
| مجموعة بيانات FB | مجموعة بيانات Roadnet | مجموعة بيانات LiveJournal | ||||
| خوارزمية | MRR | hitrate@10 | MRR | hitrate@10 | MRR | hitrate@10 |
| كليورا | 0.072 | 0.172 | 0.929 | 0.942 | 0.586 | 0.627 |
| Pytorch-biggraph | 0.035 | 0.072 | 0.850 | 0.866 | 0.565 | 0.672 |
تم تصميم Cleora كأداة متعددة الأغراض "Just It It" ، وهي مناسبة للعديد من أنواع وتنسيقات البيانات المختلفة.
Cleora يستهين جدولًا علائقيًا من الصفوف يمثل فرطًا غير متجانس غير موجه وغير موجه ، والذي يمكن أن يحتوي على متعددة:
على سبيل المثال ، قد يحتوي الجدول العلائقي الذي يمثل سلال التسوق على الأعمدة التالية:
user <t> product <t> store
مع ملف الإدخال الذي يحتوي على القيم:
user_id <t> product_id product_id product_id <t> store_id
يحتوي كل عمود على نوع ، يتم استخدامه لتحديد ما إذا كانت مساحات المعرفات بين الأعمدة المختلفة مشاركة أو متميزة. من الممكن أن يشارك عمودان نوعًا ، وهو الحال بالنسبة للرسوم البيانية المتجانسة:
user <t> user
بناءً على مواصفات تنسيق العمود ، تنفذ كليورا:
يتكون الإخراج النهائي لكليورا من ملفات متعددة لكل زوج من أنواع الكيانات (غير الموجه) في الجدول.
يمكن بعد ذلك استخدام هذه التضمينات بطريقة جديدة بفضل خاصية استقلالها الخافتة ، والتي تم وصفها أدناه.
تختلف التضمينات التي تنتجها كليورا عن تلك التي تنتجها Node2Vec أو Word2Vec أو DeepWalk أو غيرها من الأنظمة في هذه الفئة من خلال عدد من الخصائص الرئيسية:
تشير الخصائص الفنية الموضحة أعلاه إلى استعداد جيد للإنتاج في كليورا ، والتي يمكن تلخيصها من منظور المستخدم النهائي على النحو التالي:
!!! إخلاء المسئولية الوثائق أدناه هي لـ Cleora 1.x ، ليتم تحديثها لـ 2.x
يمكن العثور على مزيد من المعلومات في الوثائق الكاملة.
للحصول على التفاصيل ، اتصل بنا على [email protected]
يرجى الاستشهاد بالورقة (والأوراق المعنية للطرق المستخدمة) إذا كنت تستخدم هذا الرمز في عملك الخاص:
@article{DBLP:journals/corr/abs-2102-02302,
author = {Barbara Rychalska, Piotr Babel, Konrad Goluchowski, Andrzej Michalowski, Jacek Dabrowski},
title = {Cleora: {A} Simple, Strong and Scalable Graph Embedding Scheme},
journal = {CoRR},
year = {2021}
}
تآمر كليورا مرخصة معهد ماساتشوستس للتكنولوجيا ، كما هو موجود في ملف الترخيص.
طلبات السحب موضع ترحيب.