
1⃣stสถานที่ที่ Sigir Ecom Challenge 2020
2⃣nd Place and Best Paper Award ที่ WSDM Booking.com Challenge 2021
2⃣สถานที่ที่ Twitter Recsys Challenge 2021
3⃣สถานที่ที่ KDD Cup 2021
Cleora เป็นสกุลของแมลงเม่าในตระกูล Geometridae ชื่อทางวิทยาศาสตร์ของพวกเขามาจาก Geo Geo γῆหรือγαῖα "โลก" และ Metron μέτρον " วัด " ในการอ้างอิงถึงวิธีที่ตัวอ่อนของพวกเขาหรือ "inchworms" แฟชั่น.
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 Modifier เป็นความคิดที่ดี เช่นหากคุณมีข้อมูลผลิตภัณฑ์คุณสามารถจัดกลุ่มผลิตภัณฑ์ด้วยตะกร้าช้อปปิ้งหรือโดยผู้ใช้ หากคุณมี URL คุณสามารถจัดกลุ่มโดยเซสชันเบราว์เซอร์โดยคู่ (ผู้ใช้หน้าต่างเวลา) ตรวจสอบตัวอย่างการใช้งานด้านบน การจัดกลุ่มผลิตภัณฑ์โดยลูกค้าเป็นเพียงความเป็นไปได้เพียงอย่างเดียว
ถาม: ฉันสามารถฝังผู้ใช้และผลิตภัณฑ์ไว้พร้อมกันเพื่อเปรียบเทียบกับความคล้ายคลึงกันของโคไซน์ได้หรือไม่?
ตอบ: ไม่นี่เป็นวิธีการที่ผิดวิธีการเกิดจากวิธีการแยกตัวประกอบเมทริกซ์ที่ล้าสมัย สิ่งที่คุณควรทำคือการฝังผลิตภัณฑ์ที่ดีก่อนจากนั้นสร้างการฝังผู้ใช้จากพวกเขา การให้อาหารสองคอลัมน์เช่น user product ลงใน Cleora จะส่งผลให้กราฟ bipartite ผลิตภัณฑ์ที่คล้ายกันจะอยู่ใกล้กันผู้ใช้ที่คล้ายกันจะอยู่ใกล้กัน แต่ผู้ใช้และผลิตภัณฑ์จะไม่จำเป็นต้องคล้ายกัน
ถาม: มิติการฝังที่จะใช้อะไร?
ตอบ: ยิ่งดีกว่า แต่เรามักจะทำงานตั้งแต่ ปี 1024 ถึง 4096 หน่วยความจำราคาถูกและเครื่องจักรมีประสิทธิภาพดังนั้นอย่าใช้ขนาดการฝังขนาด
ถาม: ฉันควรใช้การแพร่กระจายของมาร์คอฟกี่ครั้ง?
ตอบ: ขึ้นอยู่กับสิ่งที่คุณต้องการบรรลุ การทำซ้ำต่ำ (3) มีแนวโน้มที่จะประมาณเมทริกซ์การเกิดร่วมในขณะที่การทำซ้ำสูง (7+) มีแนวโน้มที่จะให้ความคล้ายคลึงกันตามบริบท (คิดว่า skip-gram แต่แม่นยำมากขึ้นและเร็วขึ้น)
ถาม: ฉันจะรวมข้อมูลภายนอกได้อย่างไรเช่นข้อมูลเมตาของเอนทิตี, รูปภาพ, ข้อความลงใน embeddings ได้อย่างไร
ตอบ: เพียงแค่เริ่มต้นเมทริกซ์การฝังด้วยเวกเตอร์ของคุณเองที่มาจาก VIT, setence-transformers ของการฉายแบบสุ่มของคุณสมบัติตัวเลขของคุณ ในสถานการณ์นั้นจำนวนการทำซ้ำของมาร์คอฟจำนวนน้อย (1 ถึง 3) มีแนวโน้มที่จะทำงานได้ดีที่สุด
ถาม: การฝังตัวของฉันไม่พอดีกับความทรงจำฉันจะทำอย่างไร?
ตอบ: Cleora ทำงานในมิติอย่างอิสระ เริ่มต้นการฝังตัวของคุณด้วยจำนวนขนาดที่น้อยกว่าใช้ cleora คงอยู่ที่ดิสก์จากนั้นทำซ้ำ คุณสามารถเชื่อมต่อเวกเตอร์ฝังที่เกิดขึ้นของคุณหลังจากนั้น แต่อย่าลืมทำให้พวกเขาเป็นปกติในภายหลัง!
ถาม: มีจำนวนกิจการน้อยที่สุดที่เกิดขึ้นหรือไม่?
ตอบ: ไม่เอน A ตีร่วมกันเพียง 1 ครั้งกับเอนทิตีอื่น ๆ B จะได้รับการฝังที่เหมาะสมเช่น B จะคล้ายกับ A อีกวิธีหนึ่ง A ได้รับการจัดอันดับอย่างสูงในหมู่เพื่อนบ้านที่ใกล้ที่สุดของ B ซึ่งอาจหรือไม่อาจเป็นที่ต้องการขึ้นอยู่กับกรณีการใช้งานของคุณ อย่าลังเลที่จะตัดอินพุตของคุณไปยัง Cleora เพื่อกำจัดรายการความถี่ต่ำ
ถาม: มีกรณีขอบที่ Cleora ล้มเหลวได้หรือไม่?
ตอบ: Cleora ทำงานได้ดีที่สุดสำหรับไฮเปอร์กราฟที่ค่อนข้างกระจัดกระจาย หาก Hyperedges ทั้งหมดของคุณมีเอนทิตีที่พบบ่อยมาก X เช่น ถุงช้อปปิ้ง มันจะลดคุณภาพของการฝังโดยเส้นทางที่สั้นที่สุดในการเดินแบบสุ่ม มันเป็นวิธีปฏิบัติที่ดีในการลบเอนทิตีดังกล่าวออกจากไฮเปอร์กราฟ
ถาม: Cleora จะเร็วและแม่นยำได้อย่างไรในเวลาเดียวกัน?
ตอบ: การไม่ใช้การสุ่มตัวอย่างเชิงลบเป็นสิ่งที่ดี ด้วยการสร้างเมทริกซ์การเปลี่ยนมาร์คอฟ (กระจัดกระจาย) Cleora ทำการเดินแบบสุ่มที่เป็นไปได้ทั้งหมดอย่างชัดเจนในไฮเปอร์กราฟในขั้นตอนใหญ่ครั้งเดียว (การคูณเมทริกซ์เดี่ยว) นั่นคือสิ่งที่เราเรียกว่า การทำซ้ำ ครั้งเดียว เราทำการทำซ้ำ 3+ ต้องขอบคุณการใช้งานที่มีประสิทธิภาพสูงในการเกิดสนิมด้วยการดูแลเป็นพิเศษสำหรับการเกิดขึ้นพร้อมกันเค้าโครงหน่วยความจำและการเชื่อมโยงกันของแคชมันรวดเร็วอย่างน่าทึ่ง การสุ่มตัวอย่างเชิงลบหรือการสุ่มเลือกเดินแบบสุ่มมักจะแนะนำเสียงรบกวนมากมาย - Cleora ปราศจากภาระเหล่านั้น
อ่านกระดาษสีขาว "Cleora: รูปแบบการฝังกราฟที่เรียบง่ายแข็งแรงและปรับขนาดได้"
Cleora ฝังเอนทิตีใน พื้นที่ทรงกลม N มิติ โดยใช้การคาดการณ์แบบสุ่มแบบสุ่มที่มีความเสถียรอย่างรวดเร็วมากซึ่งช่วยให้ประสิทธิภาพและความสามารถในการปรับขนาดไม่มีใครเทียบได้
ประเภทของข้อมูลที่สามารถฝังได้รวมถึงตัวอย่างเช่น:
- ข้อจำกัดความรับผิดชอบ: ตัวเลขด้านล่างนี้มีไว้สำหรับ Cleora 1.x เวอร์ชันใหม่นั้นเร็วขึ้นอย่างมาก แต่ยังต้องเรียกใช้มาตรฐานอีกครั้ง
ข้อได้เปรียบในการแข่งขันที่สำคัญของ Cleora:
การฝังเวลา - ตัวอย่าง:
| อัลกอริทึม | ชุดข้อมูล FB | ชุดข้อมูล Roadnet | ชุดข้อมูล LiveJournal |
| คลอรารา | 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 |
ผลการทำนายลิงก์ - ตัวอย่าง:
| ชุดข้อมูล 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 ถูกสร้างขึ้นเป็นเครื่องมือ "แค่ฝังมัน" อเนกประสงค์ซึ่งเหมาะสำหรับประเภทข้อมูลและรูปแบบที่แตกต่างกันมากมาย
Cleora Ingests ตารางความสัมพันธ์ของแถวที่แสดงถึงไฮเปอร์กราฟที่มีการพิมพ์และไม่ได้ทิศทางซึ่งสามารถมีได้หลายอย่าง:
ตัวอย่างเช่นตารางเชิงสัมพันธ์ที่เป็นตัวแทนของตะกร้าช้อปปิ้งอาจมีคอลัมน์ต่อไปนี้:
user <t> product <t> store
ด้วยไฟล์อินพุตที่มีค่า:
user_id <t> product_id product_id product_id <t> store_id
ทุกคอลัมน์มีประเภทซึ่งใช้เพื่อตรวจสอบว่าช่องว่างของตัวระบุระหว่างคอลัมน์ที่แตกต่างกันมีการแชร์หรือแตกต่างกัน เป็นไปได้ที่สองคอลัมน์จะแบ่งปันประเภทซึ่งเป็นกรณีของกราฟที่เป็นเนื้อเดียวกัน:
user <t> user
ตามข้อกำหนดของรูปแบบคอลัมน์ Cleora ดำเนินการ:
เอาต์พุตสุดท้ายของ Cleora ประกอบด้วยหลายไฟล์สำหรับแต่ละประเภทของเอนทิตี (ไม่ได้กำกับ) ในตาราง
การฝังตัวเหล่านั้นสามารถนำไปใช้ในลักษณะใหม่ด้วยคุณสมบัติความเป็นอิสระที่ชาญฉลาดซึ่งอธิบายเพิ่มเติมด้านล่าง
Embeddings ที่ผลิตโดย Cleora นั้นแตกต่างจากที่ผลิตโดย Node2Vec, Word2vec, Deepwalk หรือระบบอื่น ๆ ในคลาสนี้โดยคุณสมบัติหลักจำนวนมาก:
คุณสมบัติทางเทคนิคที่อธิบายไว้ข้างต้นบ่งบอกถึงความพร้อมในการผลิตที่ดีของ Cleora ซึ่งจากมุมมองของผู้ใช้ปลายทางสามารถสรุปได้ดังนี้:
- ข้อจำกัดความรับผิดชอบเอกสารด้านล่างนี้มีไว้สำหรับ 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}
}
Synerise Cleora ได้รับใบอนุญาต MIT ตามที่พบในไฟล์ใบอนุญาต
ยินดีต้อนรับคำขอดึง