
Tempat ke -1 di Sigir ECOM Challenge 2020
2️⃣nd Place and Best Paper Award di WSDM Booking.com Challenge 2021
Tempat ke -2 di Twitter Recsys Challenge 2021
Tempat ke -3 ⃣rd di KDD Cup 2021
Cleora adalah genus ngengat di keluarga Geometridae . Nama ilmiah mereka berasal dari geo Yunani kuno γῆ atau γαῖα "bumi", dan metron μέτρον "mengukur" dengan mengacu pada cara larva mereka, atau "cacing inci", tampak " mengukur bumi " ketika mereka bergerak dalam looping mode.
Cleora adalah model tujuan umum untuk pembelajaran yang efisien dan dapat diskalakan dari embedding entitas yang stabil dan induktif untuk data relasional yang heterogen.
Instalasi
pip install pycleora
Bangun instruksi
# 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 sekarang tersedia sebagai paket Python pycleora . Perbaikan kunci dibandingkan dengan versi sebelumnya:
iterators Python Selain File tsvNumPyBreaking Changes:
complex::reflexive untuk Embeddings Hypergraph, dikelompokkan oleh entitas sementara memberikan hasil yang lebih baik. 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]))
T: Apa yang harus saya embed?
A: Setiap entitas yang berinteraksi satu sama lain, terjadi bersama atau dapat dikatakan hadir bersama dalam konteks tertentu. Contoh dapat meliputi: Produk dalam keranjang belanja, lokasi yang sering dikunjungi oleh orang yang sama pada waktu yang sama, karyawan berkolaborasi bersama, molekul kimia hadir dalam keadaan tertentu, protein yang diproduksi oleh bakteri yang sama, interaksi obat, rekan penulis dari makalah akademik yang sama , perusahaan yang terjadi bersama dalam profil LinkedIn yang sama.
T: Bagaimana saya harus membangun input?
A: Yang paling berhasil adalah pengelompokan entitas yang terjadi bersamaan dalam konteks yang sama, dan memberi makan mereka dalam garis-garis yang dipisahkan oleh whitesparasi menggunakan complex::reflexive adalah ide yang bagus. Misalnya jika Anda memiliki data produk, Anda dapat mengelompokkan produk dengan keranjang belanja atau oleh pengguna. Jika Anda memiliki URL, Anda dapat mengelompokkannya berdasarkan sesi browser, dari oleh (pengguna, jendela waktu). Lihat contoh penggunaan di atas. Mengelompokkan produk oleh pelanggan hanyalah satu kemungkinan.
T: Dapatkah saya menyematkan pengguna dan produk secara bersamaan, untuk membandingkannya dengan kesamaan kosinus?
A: Tidak, ini adalah pendekatan yang salah secara metodologis, yang berasal dari pendekatan faktorisasi matriks yang sudah ketinggalan zaman. Apa yang harus Anda lakukan adalah menghasilkan embedding produk yang baik terlebih dahulu, kemudian buat embeddings pengguna dari mereka. Memberi makan dua kolom misalnya user product ke Cleora akan menghasilkan grafik bipartit. Produk serupa akan dekat satu sama lain, pengguna serupa akan dekat satu sama lain, tetapi pengguna dan produk tidak harus serupa satu sama lain.
T: Dimensi penyematan apa yang akan digunakan?
A: Semakin banyak, semakin baik, tetapi kami biasanya bekerja dari 1024 hingga 4096 . Memori murah dan mesinnya kuat, jadi jangan berhemat pada ukuran embedding.
T: Berapa banyak iterasi perambatan Markov yang harus saya gunakan?
A: Tergantung pada apa yang ingin Anda capai. Iterasi rendah (3) cenderung mendekati matriks co-kejadian, sedangkan iterasi tinggi (7+) cenderung memberikan kesamaan kontekstual (pikirkan Skip-Gram tetapi jauh lebih akurat dan lebih cepat).
T: Bagaimana cara memasukkan informasi eksternal, misalnya metadata entitas, gambar, teks ke dalam embeddings?
A: Cukup inisialisasi matriks embedding dengan vektor Anda sendiri yang berasal dari vit, setence-transformer, dari proyeksi acak fitur numerik Anda. Dalam skenario itu rendahnya jumlah iterasi Markov (1 hingga 3) cenderung bekerja paling baik.
T: Embeddings saya tidak cocok dalam memori, apa yang harus saya lakukan?
A: Cleora beroperasi pada dimensi secara mandiri. Inisialisasi embeddings Anda dengan jumlah dimensi yang lebih kecil, jalankan cleora, bertahan hingga disk, lalu ulangi. Anda dapat menggabungkan vektor penyematan yang dihasilkan setelah itu, tetapi ingatlah untuk menormalkannya setelah itu!
T: Apakah ada jumlah minimum kejadian entitas?
A: Tidak, entitas A yang terjadi bersama hanya 1 kali dengan beberapa entitas lain B akan mendapatkan embedding yang tepat, yaitu B akan menjadi yang paling mirip dengan A . Sebaliknya, A akan berperingkat tinggi di antara tetangga terdekat B , yang mungkin atau mungkin tidak diinginkan, tergantung pada kasus penggunaan Anda. Jangan ragu untuk memangkas input Anda ke Cleora untuk menghilangkan item frekuensi rendah.
T: Apakah ada kasus tepi di mana Cleora bisa gagal?
A: Cleora bekerja paling baik untuk hypergraphs yang relatif jarang. Jika semua hyperedges Anda mengandung beberapa X yang sangat umum, misalnya tas belanja , maka itu akan menurunkan kualitas embedding dengan merosot jalur terpendek dalam jalan acak. Ini adalah praktik yang baik untuk menghapus entitas semacam itu dari hypergraph.
T: Bagaimana Cleora bisa begitu cepat dan akurat sekaligus?
A: Tidak menggunakan pengambilan sampel negatif adalah anugerah yang bagus. Dengan membangun matriks transisi Markov (jarang), Cleora secara eksplisit melakukan semua kemungkinan berjalan acak dalam hypergraph dalam satu langkah besar (multiplikasi matriks tunggal). Itulah yang kami sebut satu iterasi . Kami melakukan 3+ iterasi seperti itu. Berkat implementasi yang sangat efisien di Rust, dengan perawatan khusus untuk konkurensi, tata letak memori dan koherensi cache, sangat cepat. Pengambilan sampel negatif atau pemilihan jalan acak secara acak cenderung memperkenalkan banyak kebisingan - Cleora bebas dari beban tersebut.
Baca whitepaper "Cleora: Skema Embedding Grafik yang Sederhana, Kuat dan Dapat Diukur"
Cleora menyematkan entitas dalam ruang bola N-dimensi yang menggunakan proyeksi acak yang sangat stabil dan berulang, yang memungkinkan kinerja dan skalabilitas yang tak tertandingi.
Jenis data yang dapat disematkan termasuk misalnya:
!!! Penafian: Angka-angka di bawah ini adalah untuk Cleora 1.x, versi baru secara signifikan lebih cepat, tetapi belum harus menjalankan kembali tolok ukur
Keuntungan kompetitif utama Cleora:
Waktu penyematan - Contoh:
| Algoritma | Dataset FB | Dataset Roadnet | Dataset LiveJournal |
| Cleora | 00:00:43 h | 00:21:59 h | 01:31:42 h |
| Pytorch-Biggraph | 00: 04.33 h | 00:31:11 h | 07:10:00 h |
Hasil Prediksi Tautan - Contoh:
| Dataset FB | Dataset Roadnet | Dataset LiveJournal | ||||
| Algoritma | MRR | Hitrate@10 | MRR | Hitrate@10 | MRR | Hitrate@10 |
| Cleora | 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 dibangun sebagai alat multi-guna "Just Estance It", cocok untuk banyak jenis dan format data yang berbeda.
Cleora menelan tabel relasional baris yang mewakili hypergraph heterogen yang diketik dan tidak terarah, yang dapat mengandung banyak:
Misalnya tabel relasional yang mewakili keranjang belanja mungkin memiliki kolom berikut:
user <t> product <t> store
Dengan file input yang berisi nilai:
user_id <t> product_id product_id product_id <t> store_id
Setiap kolom memiliki jenis, yang digunakan untuk menentukan apakah spasi pengidentifikasi antara kolom yang berbeda dibagi atau berbeda. Dimungkinkan untuk dua kolom untuk berbagi jenis, yang merupakan kasus untuk grafik homogen:
user <t> user
Berdasarkan spesifikasi format kolom, Cleora melakukan:
Output akhir Cleora terdiri dari beberapa file untuk masing -masing (tidak terarah) pasangan jenis entitas dalam tabel.
Embeddings tersebut kemudian dapat digunakan dengan cara baru berkat properti kemerdekaannya yang redup, yang dijelaskan lebih lanjut di bawah ini.
Embeddings yang diproduksi oleh Cleora berbeda dari yang diproduksi oleh Node2Vec, Word2Vec, Deepwalk atau sistem lain di kelas ini oleh sejumlah properti utama:
Sifat teknis yang dijelaskan di atas menyiratkan kesiapan produksi Cleora yang baik, yang dari perspektif pengguna akhir dapat diringkas sebagai berikut:
!!! Penafian Dokumentasi di bawah ini adalah untuk Cleora 1.x, untuk diperbarui untuk 2.x
Informasi lebih lanjut dapat ditemukan dalam dokumentasi lengkap.
Untuk detailnya, hubungi kami di [email protected]
Harap kutip makalah kami (dan makalah masing -masing dari metode yang digunakan) jika Anda menggunakan kode ini dalam pekerjaan Anda sendiri:
@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}
}
Synerise Cleora berlisensi MIT, seperti yang ditemukan dalam file lisensi.
Permintaan tarik dipersilakan.