
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許可。
歡迎拉動請求。