Desarrollo de redes Kolmogorov-Arnold
(github.com/KindXiaoming)- pykan es un repositorio de GitHub para los artículos “KAN: Kolmogorov-Arnold Networks” y “KAN 2.0: Kolmogorov-Arnold Networks Meet Science”, y ofrece entrenamiento, tutoriales, documentación y ejemplos de KAN
- KAN se presenta como una alternativa a los MLP, y así como los MLP se basan en el teorema de aproximación universal, KAN se basa en el teorema de representación de Kolmogorov-Arnold
- En términos estructurales, los MLP tienen funciones de activación en los nodos, mientras que KAN tiene funciones de activación en las aristas, y se explica que este cambio puede mejorar la precisión del modelo y su interpretabilidad
- Los usuarios de machine learning que no usen la rama de cálculo simbólico deben llamar a
model.speed()antes del entrenamiento; de lo contrario, la symbolic branch no paralelizada puede volverlo extremadamente lento - Esta implementación está orientada principalmente a pequeños problemas científicos, y no es fácil verla como un plugin listo para conectar directamente a tareas de machine learning; requiere ajuste de hiperparámetros y técnicas específicas según la aplicación
Resumen de pykan y KAN
- pykan es el repositorio para “KAN: Kolmogorov-Arnold Networks” y “KAN 2.0: Kolmogorov-Arnold Networks Meet Science”
- El inicio rápido está en hellokan, los ejemplos adicionales en tutorials, y la documentación en la documentación oficial
- KANs se presentan como una alternativa prometedora a los Multi-Layer Perceptrons (MLPs)
- Los MLP se basan en el universal approximation theorem
- KAN se basa en el Kolmogorov-Arnold representation theorem
- KAN y MLP se describen como estructuras duales
- KAN tiene funciones de activación en las aristas
- MLP tiene funciones de activación en los nodos
- Se explica que este cambio estructural puede hacer que la precisión y la interpretabilidad de KAN sean mejores que las de los MLP
Instalación y entorno de ejecución
- pykan puede instalarse desde PyPI o GitHub
- Los requisitos previos son Python 3.9.7 o superior y
pip - Instalación para desarrolladores:
git clone https://github.com/KindXiaoming/pykan.gitcd pykanpip install -e .
- Instalación desde GitHub:
pip install git+https://github.com/KindXiaoming/pykan.git
- Instalación desde PyPI:
pip install pykan
- Entre los paquetes principales requeridos están
matplotlib,numpy,scikit_learn,sympy,torch,tqdm,pandas,seaborn,pyyaml, entre otros - Los usuarios de Conda pueden crear un entorno con
python=3.9.7y luego instalarlo desde GitHub o PyPI
Modo de rendimiento y requisitos de cómputo
- Si un usuario de machine learning escribe su propio loop de entrenamiento, no usa
model.fit()y no utiliza la symbolic branch, es importante llamar amodel.speed()antes del entrenamiento - Si no se llama a
model.speed(), la symbolic branch permanece activa y, como el cálculo simbólico no está paralelizado, puede volverse muy lenta - Los ejemplos de tutorials normalmente pueden ejecutarse en menos de 10 minutos en una sola CPU
- Todos los ejemplos incluidos en los artículos pueden ejecutarse en menos de un día en una sola CPU
- El entrenamiento de KAN para PDE es el más costoso, y puede tardar desde varias horas hasta varios días en una sola CPU
- La razón de usar CPU para entrenar los modelos fue que se realizaron barridos de parámetros sobre miles de modelos pequeños para obtener la frontera de Pareto entre MLP y KAN
- Para tareas de mayor escala, se recomienda el uso de GPU
Ajuste de hiperparámetros de KAN
- La intuición obtenida de los MLP y otras redes puede no aplicarse directamente a KAN
- El consejo básico es empezar con una configuración simple
- KAN shape pequeño
- grid size pequeño
- pocos datos
- sin regularización,
lamb=0
- Por ejemplo, en una tarea con 5 entradas y 1 salida, se puede empezar con una configuración muy simple como
KAN(width=[5,1,1], grid=3, k=3) - Si no funciona, se recomienda primero aumentar
width, y si aun así no funciona, entonces aumentardepth - Cuando el rendimiento llegue a un nivel aceptable, se puede refinar hacia un KAN más preciso o más interpretable
- Si se prioriza la precisión, puede probarse la técnica de grid extension, aunque hay que tener cuidado con el sobreajuste
- Si se prioriza la interpretabilidad, puede sparsificarse la red con algo como
model.train(lamb=0.01)- Se recomienda aumentar
lambgradualmente - Si después del entrenamiento en la gráfica se observan neuronas claramente inútiles, puede obtenerse un modelo podado con
pruned_model = model.prune() - Después, puede hacerse entrenamiento adicional para mejorar la precisión o la dispersión, o realizar regresión simbólica
- Se recomienda aumentar
- La precisión, la interpretabilidad y la eficiencia de parámetros no siempre están en conflicto entre sí; según el caso, puede haber correlación positiva o un tradeoff
- Si hay una gran diferencia entre la pérdida de train y la de test, debe considerarse aumentar los datos o reducir el modelo
- Como
grides más importante quewidth, se propone reducir primerogridy luegowidth
- Como
- Se recomienda empezar con un modelo simple, confirmar primero un estado de underfitting y expandirlo gradualmente hasta moverse a una región adecuada
Alcance y limitaciones
- El código fue diseñado pensando en pequeños problemas científicos, como ejemplos de matemáticas y física
- Como no se consideraron mucho la eficiencia ni la reutilización, se indica que se aceptan las críticas en esos aspectos
- El público objetivo original son usuarios interesados en descubrimiento científico y computación científica, y se planea que el repositorio mantenga principalmente ese propósito
- Se mencionan efficientkan y FourierKAN como implementaciones con mejoras de eficiencia
- Para usuarios centrados en machine learning, KAN todavía no es un plugin out-of-the-box
- requiere ajuste de hiperparámetros
- puede requerir técnicas especiales según la aplicación
- GraphKAN sugiere que es mejor usar KAN en el espacio latente, y menciona que se necesitan capas lineales de embedding/unembedding después de la entrada y antes de la salida
- KANRL propone que, para mejorar la estabilidad del entrenamiento en aprendizaje por refuerzo, conviene fijar algunos parámetros entrenables
- Sobre si KAN será la próxima generación de LLM, se afirma que no hay una buena intuición al respecto
- KAN fue diseñado para aplicaciones que priorizan alta precisión e interpretabilidad
- La interpretabilidad en LLM y la interpretabilidad en ciencia pueden ser muy diferentes
- Se considera difícil trasladar directamente las conclusiones de los artículos a LLM o a tareas generales de machine learning
- KAN y MLP no pueden reemplazarse mutuamente, y cada uno tiene ventajas y limitaciones según la configuración
1 comentarios
Opiniones en Hacker News
Revisé el paper por encima y quise simplificarlo aún más, así que hice una capa de PyTorch: https://github.com/GistNoesis/FourierKAN/
La idea central en realidad son solo unas cuantas líneas. El código del paper parece pensado para una escala más pequeña, usando interpolación por splines para representar funciones unidimensionales y luego sumando los resultados
En cambio, elegí otra representación que usa coeficientes de Fourier para interpolar la función de cada coordenada, y creo que puede ayudar a darse una idea de la capacidad de representación de las redes Kolmogorov-Arnold. Puede que converja más fácilmente que la versión con splines, pero la de splines requiere menos operaciones
Claro, que mi código no funcione no significa que el del paper no funcione. Si quieren, pueden experimentar con él y hasta publicar un paper
También probé con coeficientes de Fourier porque se paralelizan bien y son fáciles de escribir, pero en el entrenamiento las funciones de base radial dieron mejores resultados
efficientKAN primero calcula funciones base compartidas para todas las activaciones de los bordes, y la salida se obtiene como una combinación lineal de esas bases
Si la función base es Fourier, la capa KAN puede verse como una capa lineal de pesos fijos + activación Sin + capa lineal de pesos entrenables, lo que sería una forma especial de Siren
Podría ser un ejemplo que muestra la conexión entre KAN y MLP
Dices “que mi código no funcione no significa que el del paper no funcione”, pero da curiosidad si realmente funciona
Estuve jugando un poco con los cuadernos Jupyter de los autores y, personalmente, Example_3_classfication.ipynb(https://github.com/KindXiaoming/pykan/blob/master/tutorials/Example_3_classfication.ipynb) fue el más útil
Con los parámetros elegidos por los autores funciona como se describe, pero en la configuración de clasificación de la parte final del tutorial, si cambias la forma de la red de (2, 2) a (2, 2, 2), falla en generalizar
La pérdida de entrenamiento baja hasta 1e-9, pero la pérdida de prueba se queda cerca de 3e-1, y pasar a una red más grande tampoco ayudó
Hace falta un ejemplo con parámetros y complejidad de datos mucho mayores, y también ver si realmente se puede entrenar. MNIST parece un buen punto de partida
Actualización: al aumentar 100 veces el tamaño del conjunto de entrenamiento, el sobreajuste bajó, pero ahora ya no logro llevar la pérdida de entrenamiento por debajo de 1e-2. Sigo experimentando y necesito con urgencia aceleración por GPU. Ahora mismo la velocidad de CPU está limitando el avance
Hice tres cambios. Aumenté el conjunto de entrenamiento de 1,000 a 100k muestras para resolver el sobreajuste, y en la generación de datos bajé un poco el ruido de 0.1 a 0.07 para evitar que las clases se encimaran
Lo más importante, y específico de KAN, fue entrenar 30 pasos con grid=5, luego inicializar desde el modelo anterior y entrenar 30 pasos con grid=10, y después otros 30 pasos con grid=20. Esta es una práctica habitual en KAN y aparece en Example_1_function_fitting.ipynb(https://github.com/KindXiaoming/pykan/blob/master/tutorials/Example_1_function_fitting.ipynb)
Mi impresión general es que sí funciona, que la implementación de referencia es muy lenta y por eso una implementación con GPU es indispensable, y que se siente más no lineal que un MLP + ReLU y con menos estabilidad de entrenamiento
Todavía no hay garantía de que escale bien, y de verdad habría que ver si este enfoque puede resolver MNIST. Pienso seguir observándolo
Si ideas grandes como Transformer, LSTM o ADAM se hubieran probado solo con una curva y=sin(x) y un conjunto de entrenamiento de 50 números, probablemente habríamos descartado mal esas ideas
Ejecutarlo en GPU no siempre significa que vaya a ser más rápido, sobre todo cuando hay muchas bifurcaciones
Por desgracia, no todos los tensores estaban en el dispositivo correcto, así que tuve que modificar KAN.py y KANLayer.py. En algunos formatos incluso parece haber rastros de que antes existía un argumento
deviceEn la estadística clásica existe un modelo inspirado en Kolmogorov-Arnold llamado GAM(https://en.wikipedia.org/wiki/Generalized_additive_model), desarrollado por Hastie y Tibshirani como una extensión de GLM(https://en.wikipedia.org/wiki/Generalized_linear_model)
Los GLM generalizan la regresión logística, la regresión lineal y varios modelos de regresión populares
Ya se habían propuesto redes neuronales GAM que usan funciones base aprendidas, así que sorprende un poco que este nuevo paper no mencione trabajos previos. Las aplicaciones anteriores estaban más enfocadas en la interpretabilidad
El éxito de las redes neuronales está estrechamente ligado a la escalabilidad. El algoritmo no solo debe escalar a más capas, sino también acoplarse bien al hardware.
Las redes neuronales están compuestas en su mayoría por multiplicaciones de matrices, y las GPU tienen aceleración dedicada para multiplicación de matrices. Una de las razones por las que AlexNet tuvo tanto impacto fue que mostró que las redes neuronales podían llevarse a GPU para escalar y acelerarse.
Qué tan bien escalará este algoritmo no queda claro solo con el paper. Sigue siendo incierto tanto si, desde el punto de vista algorítmico, aprende bien al aumentar el número de capas, como si puede aprovechar bien la aceleración por hardware.
En particular, no está claro si una estructura donde cada peso tiene su propia función de activación puede aprovechar la aceleración rápida de multiplicación de matrices.
Es una idea interesante que funciona bien a pequeña escala y tiene buenas propiedades, pero todavía no se sabe si es una arquitectura adecuada para cosas como ImageNet o los LLM.
La aceleración rápida de multiplicación de matrices originalmente se implementó en hardware porque era útil para problemas específicos, como los gráficos.
Si las funciones de activación por peso realmente resultan tan efectivas, la gente encontrará rápido la forma de ejecutarlas en hardware.
Se siente refrescante ver investigación nueva en IA que no sea la típica de “cambiamos el Transformer de tal o cual manera y mejoró un poco en tal o cual benchmark”.
Esos papers de mejoras incrementales también son importantes, pero mucha gente ya se está cansando un poco, y la evidencia anecdótica junto con investigaciones recientes sugiere que quizá nos estemos acercando a los límites fundamentales propios del Transformer, así que podríamos necesitar nuevas alternativas(https://news.ycombinator.com/item?id=40179232).
Lo mejor de este trabajo es que no es una disyuntiva excluyente. Las funciones de activación de interpolación spline aprendibles propuestas también pueden incorporarse a redes neuronales profundas existentes para aumentar su capacidad de representación.
Ahora solo falta probar si en la práctica realmente funcionan mejor.
El PR se ha vuelto una fuerza demasiado poderosa; antes también pasaba, pero ahora parece tener todavía más influencia.
Podemos contrarrestarlo dando votos a este tipo de publicaciones y, si somos quienes revisamos, evitando centrarnos solo en romper el estado del arte. Ese criterio ya fue totalmente gamificado y está claro que nos empuja en la dirección equivocada.
Visto desde hoy, lo que aparecía en el libro era ridículamente básico, pero la motivación que se presentaba era el teorema de representación de Kolmogorov. La idea era que una red adecuada de tres capas con funciones de activación apropiadas podía representar cualquier función continua de m a n.
Quizá por eso, en esa época la mayor parte de la investigación se centraba en redes de tres capas, las activaciones Sigmoid eran lo dominante y el principal problema era el desvanecimiento del gradiente.
Tuvieron que pasar 20 años para que AlexNet reviviera la investigación en redes neuronales después del invierno de la IA de los años 90.
Al ver el preprint, consideran que 100 dimensiones de entrada son “muchas”, y en la mayoría de los problemas que tratan la dimensión de entrada es de 5 o menos.
Es algo muy típico en configuraciones de aprendizaje automático inspiradas en la física que he visto.
El siguiente paso sería mostrarlo en MNIST, y las 784 dimensiones de MNIST también son muy pocas según los estándares actuales.
Pero en la mayoría de esos problemas, los árboles de decisión siguen siendo competitivos frente a las redes neuronales o incluso funcionan mejor.
Interesante. Las redes de Kolmogorov pueden representar funciones discontinuas(https://arxiv.org/abs/2311.00049), pero me preguntaba qué tan aplicables eran en la práctica.
Este repositorio al menos parece mostrar que sí tienen cierta utilidad.
El paper incluso dice que “para funciones acotadas discontinuas y no acotadas, todavía no se conoce un método práctico para construir g”.
Si ves el enlace de arXiv del OP(https://arxiv.org/abs/2404.19756), ellos están usando splines.
Sigue siendo interesante y potencialmente útil, pero sin descubrimientos adicionales no sirve para funciones discontinuas. Si estoy equivocado, agradecería un enlace, porque es un tema que me interesa mucho.
Puede que sea una reacción apresurada, pero ¿una combinación lineal de B-splines no es simplemente otro B-spline de grado más alto?
Me pregunto si al final no se trata solo de ajustar B-splines de alto grado a la función.
Curiosamente, este enfoque y la base de los MLP se inventaron o descubrieron casi al mismo tiempo, hace unos 66 años
1957: https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Arnold_representation_theorem
1958: https://en.wikipedia.org/wiki/Multilayer_perceptron
Otra ventaja es que este enfoque solo tiene un tipo de parámetro, los coeficientes de las funciones de activación locales, mientras que el MLP tiene tres tipos de parámetros: pesos, sesgos y una función de activación globalmente idéntica
Todos hablan de los Transformer, pero yo quiero ver un modelo de difusión que use este enfoque
Tampoco parece haber una gran diferencia entre los pesos de la suma lineal y los coeficientes de los splines
Hay U-Net con autoatención y atención cruzada, Vision Transformer, Diffusion Transformer, etc.
Supongo que se podría argumentar desde la perspectiva de la simplicidad, es decir, la navaja de Occam, pero me pregunto si va por ahí o si hay otra razón
Se siente como si alguien hubiera metido splines en un árbol de decisión
En la página 2 del PDF dice: “los nodos de KAN simplemente suman las señales entrantes sin aplicar no linealidad”