
Sigir Ecom挑战2020
WSDM Booking.com挑战2021的2️⃣ndand and the Paper Award
2️⃣nd在Twitter Recsys Challenge 2021
KDD杯2021的3️⃣RD
克利奥拉(Cleora)是家族地层科中的飞蛾属。它们的科学名称源自古希腊地理γῆ或γαῖα“地球”,以及Metronμέτρον“测量”“测量”,指的是其幼虫或“ Inch虫”的方式,似乎是“测量地球”,因为它们以循环方式移动时时尚。
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提供。与以前的版本相比,关键改进:
tsv文件外,还可以从Python iterators创建图形NumPy无缝集成破裂的变化:
complex::reflexive由瞬态实体分组的HyperGraph Embeddings的反射列可提供更好的结果。 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馈入CLEORA将导致两部分图。类似的产品将彼此接近,相似的用户将彼此接近,但是用户和产品不一定彼此相似。
问:要使用什么嵌入维度?
答:越多,越好,但我们通常从1024到4096的工作。内存便宜,机器功能强大,因此请勿在嵌入尺寸上跳过。
问:我应该使用多少马尔可夫传播的迭代?
答:取决于您要实现的目标。低迭代(3)倾向于近似共发生矩阵,而高迭代(7+)倾向于给出上下文相似性(想想跳过,但更准确,更快)。
问:如何将外部信息(例如实体元数据,图像,文本)合并到嵌入式中?
答:只需将嵌入矩阵初始化,您自己的向量来自VIT,Setence-Transformers,它们会随机投影您的数字功能即可。在这种情况下,马尔可夫迭代数量很少(1至3)往往效果最好。
问:我的嵌入不适合记忆,我该怎么办?
答:Cleora独立在尺寸上运作。用较小数量的尺寸初始化嵌入,运行cleora,持续到磁盘,然后重复。之后,您可以将产生的嵌入向量加成,但请记住之后将它们归一化!
问:是否有最少的实体发生?
答:不,一个与其他实体A仅1次共归还的实体B获得适当的嵌入,即B将与A最相似。另一方面,根据您的用例, A将高度排名在B的最近邻居中,这可能是理想的,也可能是不可取的。随意将您的意见缩减到Cleora,以消除低频物品。
问:是否有任何边缘案例可以失败?
答:Cleora最适合相对稀疏的超图。如果您所有的Hypereed都包含一些非常常见的实体X ,例如购物袋,那么它将通过随机步行中的最短路径退化来降低嵌入的质量。从超图中删除此类实体是一种很好的做法。
问:Cleora如何同时如此快速准确?
答:不使用负抽样是一个很棒的福音。通过构建(稀疏)马尔可夫过渡矩阵,Cleora在一个大步骤(单个矩阵乘法)中明确地在超图中进行所有可能的随机步行。这就是我们所说的单个迭代。我们执行3次此类迭代。由于在Rust中实现了高效的实现,并特别注意并发,内存布局和缓存连贯性,它的速度非常快。负采样或随机选择随机步行往往会引入很多噪音 - Cleora不受那些负担。
阅读白皮书“ cleora:一种简单,坚固且可扩展的图形嵌入方案”
Cleora利用非常快的稳定,迭代的随机投影嵌入了N维球形空间中,从而实现无与伦比的性能和可伸缩性。
可以嵌入的数据类型包括:
!!!!免责声明:以下数字适用于Cleora 1.x,新版本的速度明显更快,但必须重新运行基准测试
Cleora的主要竞争优势:
嵌入时间 - 示例:
| 算法 | FB数据集 | 路网数据集 | 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数据集 | 路网数据集 | 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 Enged It”工具构建的,适用于许多不同的数据类型和格式。
Cleora摄入了一个关系表的关系表,代表一个键入且无方向性的异质性超图,其中可能包含多个:
例如,代表购物篮的关系表可以具有以下列:
user <t> product <t> store
使用包含值的输入文件:
user_id <t> product_id product_id product_id <t> store_id
每个列都有一种类型,该类型用于确定不同列之间的标识符空间是共享的还是不同的。两列可能共享一种类型,这是均匀图的情况:
user <t> user
根据列格式规范,Cleora执行:
CLEORA的最终输出由表中的每对(无向)类型类型的多个文件组成。
这些嵌入可以通过新颖的方式来利用这些嵌入,这要归功于它们的昏暗独立性,这将在下面进一步描述。
CLEORA产生的嵌入与Node2Vec,Word2Vec,DeepSwalk或该类别中其他许多关键属性所产生的嵌入不同:
上述技术属性意味着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许可。
欢迎拉动请求。