- Las redes neuronales de grafos (GNN) son modelos que manejan en conjunto nodos, aristas, contexto global y estructura de conexiones, y son adecuadas para datos donde el mismo grafo debe interpretarse con el mismo significado aunque cambie el orden de los nodos
- No solo moléculas, redes sociales y redes de citación, sino también la cuadrícula de píxeles de una imagen y la secuencia de tokens de un texto pueden verse como grafos, pero como los grafos tienen tamaños y conectividades muy distintos, es difícil tratarlos como una entrada de arreglo común
- Los problemas de predicción con GNN se dividen en nivel de grafo completo, nodo y arista, y una misma familia de modelos puede predecir etiquetas de distintos niveles preservando la estructura de entrada
- La operación clave es el message passing, que reúne y actualiza la información de nodos y aristas vecinas; al apilar varias capas, la representación incorpora también información de vecinos k-hop más lejanos
- El rendimiento real depende de la profundidad de las capas, la dimensión de los embeddings, la función de agregación y el flujo de mensajes entre representaciones de nodos, aristas y globales; aumentar parámetros o profundidad no siempre produce el mejor resultado
Datos de grafos y conceptos básicos de GNN
- Un grafo está compuesto por nodos (node), que representan entidades, y aristas (edge), que representan relaciones entre nodos
- En los nodos, las aristas y el grafo completo se puede almacenar información adicional
- En los nodos se pueden incluir características como tipo de átomo, valores RGB de píxeles o embeddings de documentos
- En las aristas se puede incluir información como tipo de enlace o tipo de relación
- En el grafo completo se puede tener un contexto global
- Las aristas pueden representarse como directed edge con dirección o undirected edge sin dirección
- Una GNN transforma nodos, aristas y contexto global de forma aprendible, y debe procesar la misma estructura de grafo con el mismo significado aunque cambie el orden de los nodos
Datos que pueden representarse como grafos
- Las imágenes normalmente se representan como arreglos del tipo 244×244×3, pero también pueden verse como un grafo regular donde cada píxel es un nodo y los píxeles adyacentes están conectados por aristas
- Los píxeles que no están en el borde tienen exactamente 8 vecinos
- En cada nodo se almacena un vector de 3 dimensiones que representa los valores RGB
- El texto puede verse como un grafo dirigido donde caracteres, palabras o tokens son nodos, y hay aristas hacia el siguiente token
- Esto se conecta con la representación secuencial de tokens de las RNN
- Un Transformer puede verse como un grafo completamente conectado que aprende relaciones entre tokens
- Como las imágenes y el texto tienen estructuras muy regulares, su representación como grafo puede ser redundante
- La matriz de adyacencia de una imagen tiene una estructura en bandas debido a la conectividad de la cuadrícula
- La matriz de adyacencia del texto se parece a una estructura diagonal porque cada palabra solo se conecta con las palabras anterior y siguiente
- Las moléculas son fáciles de representar como grafos con átomos como nodos y enlaces covalentes como aristas
- La distancia varía según el par de átomos y el tipo de enlace, como enlace simple o doble
- Las redes sociales modelan personas, instituciones y organizaciones como nodos, y sus relaciones como aristas
- Las redes de citación representan artículos como nodos y la relación de que un artículo cite a otro como una arista dirigida
- A cada nodo de artículo se le puede añadir información como embeddings de palabras del resumen
- Los objetos de una escena en visión por computadora, los modelos de machine learning, el código de programación y las ecuaciones matemáticas también pueden representarse como grafos donde variables u objetos son nodos, y operaciones o relaciones son aristas
Los tres niveles de problemas de predicción en grafos
- Una Graph-level task predice una sola propiedad del grafo completo
- Ejemplos: predecir qué olor tiene un grafo molecular o si se unirá a un receptor relacionado con una enfermedad
- Es como clasificación de imágenes o análisis de sentimiento de una oración, donde se asigna una sola etiqueta a toda la entrada
- Una Node-level task predice la propiedad o el rol de cada nodo dentro del grafo
- El dataset de Zach’s karate club consiste en clasificar cada nodo persona según a cuál de los dos clubes será leal después de un conflicto político
- Es similar a etiquetar el rol de cada píxel en segmentación de imágenes o predecir la categoría gramatical de cada palabra en una oración
- Una Edge-level task predice la propiedad o la existencia de una arista
- Un ejemplo es predecir si existe una relación entre objetos al modelar los objetos de una escena como nodos
- También puede construirse un grafo completamente conectado entre todos los pares de nodos y luego eliminar aristas para formar un grafo disperso según las predicciones
- La generación de grafos y la explicación de predicciones sobre grafos también pertenecen a esta línea de investigación
Dificultades al convertir un grafo en entrada para una red neuronal
- Los modelos típicos de machine learning están diseñados para entradas en forma de arreglos rectangulares o cuadrículas, así que es difícil introducir directamente la estructura de conexión de un grafo
- Un grafo puede tener hasta cuatro tipos de información
- Nodos
- Aristas
- Contexto global
- Conectividad
- Nodos, aristas y contexto global pueden convertirse en matrices de características, pero representar la conectividad es más complicado
- La matriz de adyacencia es fácil de convertir en tensor, pero tiene limitaciones
- Un grafo puede tener millones de nodos
- El número de aristas por nodo puede variar mucho
- La matriz de adyacencia puede ser muy dispersa, por lo que su eficiencia espacial es baja
- Un mismo grafo puede representarse con varias matrices de adyacencia distintas, así que no hay garantía de que la red neuronal produzca siempre el mismo resultado
- La lista de adyacencia es más adecuada para grafos dispersos
- La información de que la arista
e_kconecta los nodosn_iyn_jse almacena como la tupla(i, j) - En vez de la representación
O(n_nodes^2)de la matriz de adyacencia, permite una representaciónO(n_edges)proporcional al número de aristas
- La información de que la arista
- En una representación tensorial real, los valores de nodos, aristas y contexto global no son escalares sino vectores
- El tensor de nodos no tiene forma
[n_nodes], sino[n_nodes, node_dim]
- El tensor de nodos no tiene forma
Capas GNN y pooling
- La GNN más simple todavía no usa la conectividad del grafo dentro de la capa, y solo aplica un MLP separado a nodos, aristas y contexto global para aprender nuevos embeddings
- Cada vector de nodo se actualiza de la misma forma
- Cada vector de arista también se actualiza
- El vector de contexto global también se actualiza como un embedding
- Una GNN no cambia la conectividad del grafo de entrada
- El grafo de salida mantiene la misma lista de adyacencia y el mismo número de vectores de características
- Lo que cambia son los embeddings de nodos, aristas y contexto global
- Para predecir se usa pooling
- Se hace gather de los embeddings a reunir y se concatenan como una matriz
- Los embeddings reunidos suelen agregarse con una operación como sum
- Si en una predicción de nodos la información del nodo ya está disponible, se puede aplicar un clasificador lineal a cada embedding de nodo
- Si la información necesaria para predecir nodos solo está en las aristas, hay que hacer pooling de la información de aristas hacia los nodos
- Si la información necesaria para predecir aristas solo está en los nodos, se reúne la información de nodos hacia las aristas para usarla en la predicción
- En la predicción del grafo completo, se agregan todos los nodos o aristas en una representación global
- Cumple un papel similar al Global Average Pooling en CNN
- Ejemplos: predecir si una molécula es tóxica o si tiene cierto olor
Aprovechar la estructura de conexión con message passing
- Una GNN simple no usa la conectividad del grafo dentro de la capa, y solo la utiliza en el pooling justo antes de la predicción
- Una GNN más potente realiza message passing dentro de la capa para reflejar la estructura de conexión en la actualización de embeddings
- El message passing funciona en tres pasos
- Cada nodo hace gather de embeddings o mensajes de sus nodos vecinos
- Los mensajes se aggregate con una función como sum
- Los mensajes reunidos pasan por una función de actualización aprendible
- El message passing es similar a una convolución estándar
- En imágenes, un píxel reúne información de un número fijo de píxeles vecinos
- En grafos, un nodo reúne información de una cantidad variable de nodos vecinos
- Al apilar varias capas GNN, se incorpora información de nodos más lejanos
- Después de 3 capas, un nodo puede incluir información de nodos a 3 pasos de distancia
- El message passing puede realizarse no solo entre nodos, sino también entre aristas y entre nodos y aristas
Representaciones de aristas y representaciones globales
- Un dataset no siempre incluye a la vez información de nodos, aristas y contexto global
- Si solo hay información de aristas y se necesita predecir nodos, se puede hacer pooling de la información de aristas hacia los nodos
- La información de nodos y aristas puede tener tamaños o formas distintas, así que la forma de combinarlas es una decisión de diseño
- Se puede aprender un mapeo lineal del espacio de aristas al de nodos, o al revés
- También se pueden concatenar ambas representaciones y pasarlas a una función de actualización
- Qué propiedad del grafo actualizar y en qué orden es parte del diseño de una GNN
- Se pueden actualizar primero los nodos y luego las aristas
- Se pueden actualizar primero las aristas y luego los nodos
- También es posible un enfoque weave que combine representaciones node-to-node, edge-to-edge, node-to-edge y edge-to-node
- Entre nodos muy alejados, incluso con varios pasos de message passing, puede ser difícil intercambiar información de forma eficiente
- Con k capas, la información solo se propaga como máximo k pasos
- La representación global
Upuede funcionar como un master node o vector de contexto conectado a todos los nodos y aristas- Sirve como puente para transferir información entre nodos y aristas distantes
- Puede construir una representación más rica del grafo completo
- Un nuevo embedding de nodo puede condicionarse concatenando nodos vecinos, aristas conectadas e información global
- También se puede usar suma después de un mapeo lineal o aplicar feature-wise modulation
GNN Playground y ejemplo de predicción de olor molecular
- GNN Playground trata un problema de predicción graph-level sobre pequeños grafos moleculares
- Los datos provienen del Leffingwell Odor Dataset e incluyen moléculas y etiquetas de percepción de olor
- El experimento clasifica con una sola etiqueta binaria si un grafo molecular tiene olor “pungent”
- pungent se refiere a un olor fuerte y marcado
- Ejemplos: el ajo y la mostaza, que pueden incluir allyl alcohol, y el piperitone usado en caramelos sabor menta
- Las moléculas se representan con átomos como nodos y enlaces como aristas
- Los nodos tienen una codificación one-hot de la identidad atómica de Carbon, Nitrogen, Oxygen y Fluorine
- Las aristas tienen una codificación one-hot del tipo de enlace: single, double, triple y aromatic
- La plantilla del modelo consiste en capas GNN secuenciales seguidas de un modelo lineal con activación sigmoid
- Las decisiones de diseño se controlan en cuatro ejes
- Número de capas GNN, es decir, la profundidad
- Dimensión del embedding de cada propiedad
- Función de agregación del pooling: max, mean, sum
- Qué propiedades entre nodo, arista y representación global se actualizan y usan message passing
- El Playground, que corre en el navegador, funciona sobre tfjs
- El graph embedding de alta dimensión se reduce a 2D con PCA para visualizar las representaciones alrededor de la frontera de decisión
Tendencias de diseño de GNN observadas en los experimentos
- El rendimiento varía según los datos, la forma de construir el grafo y la forma de caracterizarlo
- Un mayor número de parámetros se correlacionó con mejor rendimiento, pero aun así fue posible encontrar modelos GNN de alto rendimiento con pocos parámetros
- Se encontraron modelos de alto rendimiento incluso con unos 3k parámetros
- A mayor dimensión de embedding, había tendencia a mejorar el rendimiento promedio y el rendimiento mínimo, pero los mejores modelos también aparecieron con dimensiones pequeñas
- Al aumentar el número de capas, había tendencia a mejorar el rendimiento promedio, pero los mejores modelos no aparecieron con 3 o 4 capas sino con 2 capas
- Con 4 capas, el rendimiento mínimo disminuía
- Más capas permiten difundir la información más lejos, pero también existe el riesgo de diluir la representación del nodo tras varias repeticiones
- En la función de agregación, sum parecía ligeramente mejor en rendimiento promedio, pero max y mean también podían producir modelos igual de buenos
- Cuanto más intercambio de mensajes había entre atributos de nodo, arista y globales, mejor tendía a ser el rendimiento promedio del modelo
- Como esta tarea estaba centrada en la representación global, aprender explícitamente atributos globales tendía a mejorar el rendimiento
- Las representaciones de nodo parecían más útiles que las de arista, probablemente porque contienen más información
Grafos más complejos y entrenamiento por lotes
- El marco de message passing puede aplicarse a estructuras de grafo más complejas
- En un Multigraph, un mismo par de nodos puede compartir varios tipos de aristas
- En una red social, relaciones como acquaintance, friend y family pueden usarse como tipos de arista
- Puede haber pasos de message passing distintos según el tipo de arista
- En un nested graph, un nodo puede volver a representar un grafo
- En una red de moléculas, un nodo puede ser una molécula y una arista puede representar una reacción que convierte una molécula en otra
- Se puede entrenar alternando una GNN a nivel molecular y una GNN a nivel de red de reacciones
- En un hypergraph, una arista puede conectarse no a dos nodos sino a varios
- Se pueden identificar comunidades de nodos y colocar una hyper-edge conectada a toda la comunidad
- Como los grafos no tienen un número fijo de nodos y aristas, el entrenamiento con mini-batches de tamaño fijo es difícil
- La clave del entrenamiento por lotes en grafos es construir subgrafos que preserven propiedades importantes del grafo grande
- En una citation network, el muestreo de subgrafos puede ser natural
- En moléculas, un subgrafo significaría una nueva molécula más pequeña, por lo que sería una manipulación fuerte
- Cuando un grafo grande no cabe en memoria, el muestreo de grafos es especialmente importante
- Estrategias de arquitectura y entrenamiento como Cluster-GCN y GraphSaint están relacionadas con esto
Sesgo inductivo adecuado para grafos
- Cuando un modelo se diseña para aprovechar las simetrías y regularidades de los datos, puede mostrar mejor rendimiento predictivo, menor tiempo de entrenamiento, menos parámetros y mejor generalización
- Los modelos de imágenes usan convoluciones translation invariant para aprovechar la propiedad de que un objeto sigue siendo el mismo sin importar en qué parte de la imagen aparezca
- En texto, como el orden de los tokens importa, las RNN procesan secuencialmente y los modelos de la familia Transformer pueden prestar atención a distintas partes de la oración
- En grafos, como importan las relaciones entre aristas, nodos y elementos globales, se necesita un sesgo inductivo relacional
- Debe preservarse la estructura de adyacencia como relación explícita
- Debe preservarse la simetría del grafo, es decir, la invariancia por permutación
- Debe funcionar sin depender del orden de nodos o aristas y manejar entradas de tamaño variable
Elección de la operación de agregación
- Hacer pooling de la información de nodos y aristas vecinas es un paso central en una arquitectura GNN potente
- Como cada nodo tiene un número distinto de vecinos y el resultado no debe depender del orden de entrada, se necesita una función de agregación diferenciable e invariante a permutaciones
- Los candidatos representativos son sum, mean, max
- Todos aceptan una cantidad variable de entradas y producen una salida independiente del orden
- Ninguna operación es siempre la mejor
- mean es útil cuando el número de vecinos varía mucho o se necesita una visión normalizada del vecindario local
- max es útil cuando se quiere resaltar una sola característica sobresaliente dentro del vecindario local
- sum muestra la distribución de características locales y, al no estar normalizada, también puede resaltar valores atípicos
- En la práctica, sum se usa con frecuencia
- Principal Neighborhood Aggregation concatena varias operaciones de agregación y añade una scaling function que cambia según el grado de conexión
- También pueden diseñarse operaciones de agregación específicas del dominio, como Tetrahedral Chirality
GCN, multiplicación de matrices y recorridos en grafos
- Un GCN o MPNN con k capas y consulta de vecinos de grado 1 puede verse como una red neuronal que opera sobre embeddings de subgrafos de tamaño k
- La representación actualizada de un nodo refleja de forma limitada la información de vecinos dentro de una distancia k
- Las representaciones de aristas pueden interpretarse de la misma manera
- El producto entre la matriz de adyacencia
Ay la matriz de características de nodosX, es decirAX, implementa un message passing simple que usa agregación sum- Que
A_i,ksea positivo significa que existe una arista entrenode_iynode_k - La multiplicación de matrices puede verse como una operación que reúne valores de una dimensión específica de característica de nodos vecinos
- Que
- Cuando
Aes dispersa, no hace falta sumar todos los términos cero, por lo que la lista de adyacencia es más eficiente - Una implementación basada en lista de adyacencia también facilita usar operaciones de agregación distintas de sum
- Las potencias de la matriz de adyacencia
A^Kestán relacionadas con recorridos de longitud KA^2_ijcuenta el número de recorridos de longitud 2 desdenode_ihastanode_j- Esta intuición se extiende desde
A^3hastaA^k
Attention, explicabilidad y modelos generativos
- Las Graph Attention Networks no reúnen la información vecina con una suma simple, sino con una suma ponderada
- La función de puntaje
f(node_i, node_j)calcula la relevancia entre el nodo central y el nodo vecino - Softmax normaliza los pesos para dar más importancia a los vecinos relevantes para la tarea
- El cálculo del puntaje por pares preserva la invariancia por permutación
- La función de puntaje
- Un Transformer puede verse como una GNN con mecanismo de attention
- Modela elementos como tokens de caracteres como nodos de un grafo completamente conectado
- La attention calcula embeddings y pesos de arista para cada par de nodos
- La diferencia es que una GNN asume un patrón de conexión disperso, mientras que un Transformer modela todas las conexiones
- La explicabilidad de las GNN puede ser importante para la confiabilidad del modelo, el debugging y el descubrimiento científico
- En moléculas, puede importar la presencia o ausencia de ciertos subgrafos
- En redes de citación, puede importar el grado de conexión de un artículo
- GNNExplainer aborda esto extrayendo subgrafos relevantes para la tarea
- Las técnicas de attribution asignan una clasificación de importancia a partes del grafo
- Los modelos generativos de grafos generan nuevos grafos a partir de la distribución aprendida o completan un grafo dado un punto de partida
- Una aplicación es diseñar nuevos grafos moleculares con propiedades específicas como candidatos a fármacos
- La principal dificultad de la generación de grafos es modelar la topología del grafo
- La topología puede variar mucho de tamaño y tener términos
N_nodes^2 - La matriz de adyacencia puede modelarse directamente como una imagen con un autoencoder
- También puede reducirse la carga
N_nodes^2prediciendo solo las aristas existentes y una parte de las no existentes - Otra forma es construir secuencialmente el grafo repitiendo acciones discretas como agregar o eliminar nodos y aristas
- La topología puede variar mucho de tamaño y tener términos
Resumen
- Los grafos son un tipo de dato estructurado con fortalezas y limitaciones distintas a las de imágenes y texto
- Las GNN actualizan nodos, aristas y contexto global del grafo mientras manejan la estructura de conexión y la invariancia por permutación
- El pooling, el message passing, las representaciones de aristas, las representaciones globales y la elección de la función de agregación son elementos clave en el diseño de GNN
- El rendimiento real depende en gran medida no solo de la profundidad, la dimensión y el número de parámetros, sino también de qué propiedades del grafo intercambian mensajes entre sí y de cómo se construye el grafo
1 comentarios
Opiniones de Hacker News
Hay muchos papers que usan GNN para simulación física (por ejemplo, dinámica de fluidos computacional). Esto se debe a que las mallas no estructuradas que discretizan el dominio del problema encajan muy bien con la estructura de grafos.
En la práctica, cada malla/grafo suele usarse una sola vez para resolver un problema específico, así que entrenar una GNN para un grafo concreto no tiene mucho sentido. Aun así, parece que la mayoría de los papers lo hicieron porque todavía no hemos encontrado cómo crear GNN que se adapten bien a distintas mallas/grafos y parámetros de simulación. Me pregunto si pronto habrá un avance que permita esa generalización.
Para lograr el mejor rendimiento, probablemente haría falta otro tokenizador.
La calidad del trabajo es muy alta, así que es una lástima que distill.pub no haya encontrado un camino sostenible [1].
Una de las razones por las que se habla menos de las GNN podría ser la falta de datasets [2]. Este fue un problema que también afectó al campo de la web semántica.
[1] https://distill.pub/2021/distill-hiatus/
[2] https://huggingface.co/datasets?task_categories=task_categor...
Si es un campo popular, hay mucha gente con incentivos para hacer videos cortos y atractivos, y la calidad suele ser buena incluso con matemáticas bastante abstractas. Los recursos visuales ayudan muchísimo a hacerse una idea de conceptos abstractos, y 3Blue1Brown ya lo demostró. Con las GNN también basta ver unos cuantos buenos videos de menos de 10 minutos para tener una base desde la cual entrar a la literatura.
Las GNN me decepcionaron bastante en lo personal. Intenté aplicarlas varias veces en investigación, pero nunca salieron bien.
Durante mucho tiempo las GNN se presentaron como una generalización de las CNN, pero las CNN son más potentes porque los “pesos de vecindad” tienen más significado: aprenden relaciones de posición relativa. Las GNN normalmente dependen del pooling, como se explica aquí. Las CNN pueden generar imágenes como salida, pero no es fácil generar grafos con GNN. La topología sigue teniendo que fijarse de antemano y, a veces, incluso durante el entrenamiento. El golpe final es el rendimiento: las GNN son increíblemente lentas en comparación con las CNN.
Hoy en día, por estas razones, siento que la atención ha reemplazado en gran medida a las GNN. Se pueden crear GNN que usen atención en vez de pooling, pero no aporta demasiado. Normalmente se recorre el grafo solo para crear una matriz de máscara, y para el resto se usa un transformer común y corriente. Para empezar, si ya existe alguna métrica de distancia, muchas veces ni siquiera hace falta la adyacencia del grafo.
Seguro que en algún lugar las GNN son muy útiles para alguien, pero en mi experiencia fueron más bien un martillo buscando un clavo.
En casi todos los demás casos se puede aprovechar alguna estructura adicional para hacerlo más eficiente. Si se puede definir un orden, modelos secuenciales; si hay estructura euclidiana/riemanniana, CNN o modelos conscientes de la variedad; si no hace falta estado global, redes de nubes de puntos; si hay una jerarquía explícita, alguna versión tipo U-Net para esa modalidad.
Lo interesante de las GNN es que 1) codifican el concepto mismo de relación y 2) se relacionan bien con ecuaciones diferenciales discretizadas completamente generales. Como alguien de sistemas complejos/dinámicos, me resulta interesante, pero si se puede especializar, también hay métodos más fáciles.
Por las razones mencionadas, no creo que sea casualidad que las GNN sean populares sobre todo en áreas donde el modelo de dominio se siente naturalmente como un grafo, como las recomendaciones. En esos dominios, el salto hacia una topología útil es menor.
Lo que personalmente me resultó más frustrante es que, en muchos de estos dominios tipo grafo, los datos son datos de máquinas/personas basados en comportamiento, como logs, y tienen muchísimas dimensiones categóricas. La parte del grafo ayuda, pero capturar bien las dimensiones categóricas es igual de importante, y para hacerlo bien muchas veces uno termina recurriendo a métodos fuera de esos modelos, como random forests. Es más fácil empezar por ahí, y la parte de GNN agrega mucho trabajo para una “mejora un poco mejor”.
Claro que, si esto es el negocio principal y hay millones de dólares en juego, se puede justificar. Aun así, para la mayoría de los equipos de operación es difícil. En la práctica, con usuarios de pygraphistry muchas veces terminamos haciendo cosas como xgboost + umap y seguimos adelante. Solo hacer que una RGCN funcione bien ya requiere bastante trabajo.
Las GNN parecen operar sobre una topología fija. ¿Qué habría que hacer si se quisiera aproximar alguna transformación de la topología del grafo? Por ejemplo, aprender el layout de un grafo o convertir el árbol de sintaxis abstracta de un programa en un grafo de flujo de datos.
La clave de las GNN es que generalizan a topologías arbitrarias al condicionar explícitamente el concepto de “vecindad” mediante el grafo que especifica la topología. El layout de grafos se intentó aquí y https://github.com/limbo018/DREAMPlace recibió mucha atención, pero recientemente también hay controversias relacionadas https://www.semanticscholar.org/paper/The-False-Dawn%3A-Reev...
También se están investigando las transformaciones de grafos https://arxiv.org/abs/2012.01470. Sin embargo, es un problema difícil porque implícitamente hay que resolver el problema de emparejamiento de grafos
Ojalá distill vuelva
Es una verdadera lástima que distill.pub ya no acepte nuevas contribuciones
Me pregunto qué software de visualización interactiva es ese. ¿D3.js?
Me siento demasiado tonto. En esa página hay un ejemplo con 4 nodos (a,b,c,d), y muestra que hay 24 combinaciones posibles
Me pregunto cuál es la fórmula generalizada para calcularlo dado un número de nodos, y cuando también hay que considerar las aristas. El artículo parece no explicarlo, y creo que quizá podría ser un factorial
Si quieres familiarizarte más, este sitio parece ofrecer un panorama bastante bueno: https://www.geeksforgeeks.org/mathematics-combinatorics-basi...
Como cada arista puede existir o no existir, quizá también se podría multiplicar el coeficiente binomial por 2