
1️⃣st Place no Sigir ECom Challenge 2020
2️⃣nd Place and Best Paper Award no WSDM Booking.com Desafio 2021
2️⃣nd Place no Twitter Recsys Challenge 2021
3️⃣rd Place na KDD Cup 2021
Cleora é um gênero de mariposas na família Geometridae . Seu nome científico deriva do antigo geo grego γῆ ou γαῖα "The Earth", e Metron μέτρον "Medida" em referência à maneira como suas larvas, ou "minhocas", parecem " medir a terra " à medida que se movem em um looping moda.
Cleora é um modelo de uso geral para uma aprendizagem eficiente e escalável de incorporações estáveis e indutivas para dados relacionais heterogêneos.
Instalação
pip install pycleora
Construir instruções
# 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 agora está disponível como um pacote Python pycleora . Melhorias importantes em comparação com a versão anterior:
iterators , além de arquivos tsvNumPyBreaking mudanças:
complex::reflexive para incorporações de hipergrafos, agrupadas pela entidade transitória fornece melhores resultados. 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]))
P: O que devo incorporar?
R: Quaisquer entidades que interagem entre si, co-ocorrem ou podem ser consideradas presentes juntas em um determinado contexto. Exemplos podem incluir: produtos em uma cesta de compras, locais frequentados pelas mesmas pessoas em momentos semelhantes, funcionários colaborando juntos, moléculas químicas presentes em circunstâncias específicas, proteínas produzidas pelas mesmas bactérias, interações medicamentosas, co-autores dos mesmos trabalhos acadêmicos , empresas que ocorrem juntas nos mesmos perfis do LinkedIn.
P: Como devo construir a entrada?
R: O que funciona melhor é agrupar entidades co-ocorridas em um contexto semelhante, e alimentá-las em linhas separadas por espaço em branco usando complex::reflexive é uma boa idéia. Por exemplo, se você tiver dados do produto, pode agrupar os produtos por compras ou por usuários. Se você possui URLs, poderá agrupar -os por sessões do navegador, de pares por (usuário, janela de tempo). Confira o exemplo de uso acima. Agrupar produtos dos clientes é apenas uma possibilidade.
P: Posso incorporar usuários e produtos simultaneamente, para compará -los com a similaridade de cosseno?
R: Não, esta é uma abordagem metodologicamente errada, decorrente de abordagens desatualizadas da fatoração matricial. O que você deve fazer é criar boas incorporações de produtos primeiro e, em seguida, criar incorporação de usuário a partir deles. A alimentação de duas colunas, por exemplo, user product em Cleora resultará em um gráfico bipartido. Produtos semelhantes estarão próximos um do outro, usuários semelhantes serão próximos um do outro, mas usuários e produtos não serão necessariamente semelhantes um ao outro.
P: Qual dimensionalidade de incorporação para usar?
R: Quanto mais, melhor, mas normalmente trabalhamos de 1024 a 4096 . A memória é barata e as máquinas são poderosas; portanto, não economize no tamanho da incorporação.
P: Quantas iterações da propagação de Markov devo usar?
R: Depende do que você deseja alcançar. As iterações baixas (3) tendem a aproximar a matriz de co-ocorrência, enquanto iterações altas (7+) tendem a dar similaridade contextual (pense em grama de pular, mas muito mais precisa e mais rápido).
P: Como faço para incorporar informações externas, por exemplo, metadados da entidade, imagens, textos nas incorporações?
R: Basta inicializar a matriz de incorporação com seus próprios vetores provenientes de um VIT, Setrence-Transformers, de uma projeção aleatória de seus recursos numéricos. Nesse cenário, o baixo número de iterações de Markov (1 a 3) tende a funcionar melhor.
P: Minhas incorporações não se encaixam na memória, o que eu faço?
R: Cleora opera em dimensões de forma independente. Inicialize suas incorporações com um número menor de dimensões, execute Cleora, persista no disco e repita. Você pode concatenar seus vetores de incorporação resultante depois, mas lembre -se de normalizá -los depois!
P: Existe um número mínimo de ocorrências de entidade?
R: Não, uma entidade A co-ocorrência apenas uma vez com outra entidade B receberá uma incorporação adequada, ou seja, B será a mais semelhante a A . No contrário, A será altamente classificado entre os vizinhos mais próximos de B , que podem ou não ser desejáveis, dependendo do seu caso de uso. Sinta-se à vontade para podar sua opinião para a Cleora para eliminar itens de baixa frequência.
P: Existem casos de borda em que Cleora pode falhar?
R: Cleora funciona melhor para hipergrafos relativamente esparsos. Se todas as suas hiperedges contiverem uma entidade muito comum X , por exemplo, uma sacola de compras , isso degradará a qualidade das incorporações, degenerando caminhos mais curtos na caminhada aleatória. É uma boa prática remover essas entidades da hipergraf.
P: Como Cleora pode ser tão rápido e preciso ao mesmo tempo?
R: Não usar amostragem negativa é um grande benefício. Ao construir a matriz de transição (esparsa) de Markov, Cleora executa explicitamente todos os possíveis caminhadas aleatórias em um hipergraph em uma grande etapa (uma única multiplicação de matriz). Isso é o que chamamos de iteração única. Realizamos mais de 3 iterações. Graças a uma implementação altamente eficiente em ferrugem, com cuidados especiais para simultaneidade, layout de memória e coerência de cache, é incrivelmente rápido. Amostragem negativa ou caminhadas aleatórias de seleção aleatória tendem a introduzir muito ruído - Cleora está livre desses encargos.
Leia o whitepaper "Cleora: um esquema de incorporação de gráficos simples, forte e escalável"
Cleora incorpora entidades em espaços esféricos n-dimensionais, utilizando projeções aleatórias iterativas extremamente rápidas, o que permite desempenho e escalabilidade incomparáveis.
Os tipos de dados que podem ser incorporados incluem, por exemplo,:
!!! Isenção de responsabilidade: os números abaixo são para o cleora 1.x, a nova versão é significativamente mais rápida, mas ainda precisa executar novamente os benchmarks
Principais vantagens competitivas de Cleora:
Incorporar os tempos - Exemplo:
| Algoritmo | Conjunto de dados 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 |
Resultados da previsão do link - Exemplo:
| Conjunto de dados FB | DataSet RoadNet | DataSet LiveJournal | ||||
| Algoritmo | 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 |
O Cleora é construído como uma ferramenta "Just Incled It" multifuncional, adequada para muitos tipos e formatos de dados diferentes.
Cleora ingere uma tabela relacional de linhas que representam um hiperágrafo heterogêneo digitado e não direcionado, que pode conter múltiplo:
Por exemplo, uma tabela relacional que representa cestas de compras pode ter as seguintes colunas:
user <t> product <t> store
Com o arquivo de entrada que contém valores:
user_id <t> product_id product_id product_id <t> store_id
Cada coluna possui um tipo, que é usado para determinar se os espaços de identificadores entre diferentes colunas são compartilhados ou distintos. É possível que duas colunas compartilhem um tipo, o que é o caso de gráficos homogêneos:
user <t> user
Com base na especificação do formato da coluna, Cleora executa:
A saída final do Cleora consiste em vários arquivos para cada par de tipos de entidades (não direcionados) na tabela.
Essas incorporações podem então ser utilizadas de uma maneira nova, graças à sua propriedade de independência, que é descrita mais adiante.
As incorporações produzidas por Cleora são diferentes das produzidas por Node2vec, Word2vec, Deepwalk ou outros sistemas nesta classe por várias propriedades -chave:
As propriedades técnicas descritas acima implicam uma boa prontidão para produção de Cleora, que da perspectiva do usuário final pode ser resumida da seguinte forma:
!!! Isenção de responsabilidade A documentação abaixo é para Cleora 1.x, a ser atualizado para 2.x
Mais informações podem ser encontradas na documentação completa.
Para detalhes, entre em contato conosco em [email protected]
Cite nosso artigo (e os respectivos papéis dos métodos utilizados) se você usar este código em seu próprio trabalho:
@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}
}
Synerry Cleora é licenciada pelo MIT, conforme encontrado no arquivo de licença.
Solicitações de tração são bem -vindas.