2 points par GN⁺ 2024-05-02 | 1 commentaires | Partager sur WhatsApp
  • pykan est le dépôt GitHub des articles « KAN: Kolmogorov-Arnold Networks » et « KAN 2.0: Kolmogorov-Arnold Networks Meet Science », et fournit l’entraînement, des tutoriels, de la documentation et des exemples pour les KAN
  • Les KAN sont présentés comme une alternative aux MLP : de la même façon que les MLP reposent sur le théorème d’approximation universelle, les KAN reposent sur le théorème de représentation de Kolmogorov-Arnold
  • Sur le plan structurel, les MLP ont des fonctions d’activation sur les nœuds, tandis que les KAN ont des fonctions d’activation sur les arêtes ; ce changement pourrait améliorer la précision et l’interprétabilité du modèle
  • Les utilisateurs machine learning qui n’utilisent pas la branche de calcul symbolique doivent appeler model.speed() avant l’entraînement ; sinon, la symbolic branch non parallélisée peut rendre l’exécution très lente
  • Cette implémentation vise surtout de petits problèmes scientifiques ; il est difficile de la considérer comme un plugin prêt à l’emploi pour des tâches de machine learning, et elle nécessite du tuning d’hyperparamètres ainsi que des techniques spécifiques selon l’application

Aperçu de pykan et des KAN

  • pykan est le dépôt des articles « KAN: Kolmogorov-Arnold Networks » et « KAN 2.0: Kolmogorov-Arnold Networks Meet Science »
  • Le démarrage rapide est disponible dans hellokan, des exemples supplémentaires dans tutorials, et la documentation dans la documentation officielle
  • Les KANs sont présentés comme une alternative prometteuse aux Multi-Layer Perceptrons (MLPs)
    • Les MLP reposent sur le théorème d’approximation universelle
    • Les KAN reposent sur le théorème de représentation de Kolmogorov-Arnold
  • Les KAN et les MLP sont décrits comme des structures duales
    • Les KAN ont des fonctions d’activation sur les arêtes
    • Les MLP ont des fonctions d’activation sur les nœuds
  • Ce changement structurel est présenté comme pouvant rendre les KAN meilleurs que les MLP en précision et en interprétabilité

Installation et environnement d’exécution

  • pykan peut être installé depuis PyPI ou GitHub
  • Les prérequis sont Python 3.9.7 ou plus et pip
  • Méthode d’installation pour développeurs :
  • Installation depuis GitHub :
  • Installation depuis PyPI :
    • pip install pykan
  • Les principaux packages requis incluent matplotlib, numpy, scikit_learn, sympy, torch, tqdm, pandas, seaborn, pyyaml, entre autres
  • Les utilisateurs de Conda peuvent créer un environnement python=3.9.7, puis installer via GitHub ou PyPI

Modes de performance et besoins de calcul

  • Si un utilisateur machine learning écrit sa propre boucle d’entraînement, n’utilise pas model.fit() et n’utilise pas la symbolic branch, il est important d’appeler model.speed() avant l’entraînement
  • Si model.speed() n’est pas appelé, la symbolic branch reste activée et, comme le calcul symbolique n’est pas parallélisé, cela peut devenir très lent
  • Les exemples de tutorials s’exécutent généralement en moins de 10 minutes sur un seul CPU
  • Tous les exemples inclus dans les articles peuvent s’exécuter en moins d’une journée sur un seul CPU
  • L’entraînement des KAN pour les PDE est le plus coûteux et peut prendre de quelques heures à plusieurs jours sur un seul CPU
  • Si le CPU a été utilisé pour entraîner les modèles, c’est parce que l’objectif était d’obtenir la frontière de Pareto entre MLP et KAN via des balayages de paramètres sur des milliers de petits modèles
  • Pour les tâches de grande taille, l’usage d’un GPU est recommandé

Tuning des hyperparamètres des KAN

  • L’intuition acquise avec les MLP et d’autres réseaux ne s’applique pas forcément telle quelle aux KAN
  • Le conseil de base est de commencer avec une configuration simple
    • une petite shape de KAN
    • une petite grid size
    • peu de données
    • pas de régularisation, lamb=0
  • Par exemple, pour une tâche avec 5 entrées et 1 sortie, on peut commencer avec une configuration très simple comme KAN(width=[5,1,1], grid=3, k=3)
  • Si cela ne fonctionne pas, il est recommandé d’augmenter d’abord la width, puis, si nécessaire, la depth
  • Une fois qu’un niveau de performance acceptable est atteint, il est possible d’affiner vers un KAN plus précis ou plus interprétable
  • Si la priorité est la précision, on peut essayer la technique de grid extension, en restant attentif au surapprentissage
  • Si la priorité est l’interprétabilité, on peut sparsifier le réseau avec une approche comme model.train(lamb=0.01)
    • Il est recommandé d’augmenter progressivement lamb
    • Si, après l’entraînement, le graphique montre des neurones manifestement inutiles, on peut obtenir un modèle élagué avec pruned_model = model.prune()
    • Ensuite, on peut poursuivre l’entraînement pour améliorer la précision ou la sparsité, ou effectuer une symbolic regression
  • La précision, l’interprétabilité et l’efficacité en paramètres ne sont pas toujours en conflit ; selon les cas, elles peuvent être positivement corrélées ou impliquer un tradeoff
  • S’il existe un grand écart entre la train loss et la test loss, il faut envisager soit d’augmenter les données, soit de réduire le modèle
    • Comme grid est plus important que width, il est proposé de réduire d’abord grid, puis width
  • Il est recommandé de partir d’un modèle simple, de vérifier d’abord une situation d’underfitting, puis d’augmenter progressivement la complexité pour atteindre la bonne zone

Champ d’application et limites

  • Le code a été conçu en pensant à des petits problèmes scientifiques, comme des exemples en mathématiques ou en physique
  • Comme l’efficacité et la réutilisabilité n’ont pas été fortement privilégiées, l’auteur indique accepter les critiques sur ces aspects
  • Les utilisateurs initialement visés sont ceux qui s’intéressent à la découverte scientifique et au calcul scientifique, et le dépôt devrait continuer à servir principalement cet objectif
  • Des implémentations axées sur l’amélioration de l’efficacité sont mentionnées : efficientkan et FourierKAN
  • Pour les utilisateurs davantage centrés sur le machine learning, les KAN ne sont pas encore un simple plugin out-of-the-box
    • un tuning des hyperparamètres est nécessaire
    • des techniques spécifiques à chaque application peuvent s’ajouter
  • GraphKAN suggère qu’il vaut mieux utiliser les KAN dans l’espace latent, et mentionne la nécessité d’une embedding/unembedding linear layer après l’entrée et avant la sortie
  • KANRL suggère, en apprentissage par renforcement, qu’il est préférable de figer certains paramètres entraînables afin d’améliorer la stabilité de l’entraînement
  • Concernant la possibilité que les KAN deviennent la prochaine génération de LLM, l’auteur indique ne pas avoir de bonne intuition
    • Les KAN sont conçus pour des applications où la haute précision et l’interprétabilité sont importantes
    • L’interprétabilité dans les LLM peut être très différente de l’interprétabilité en sciences
    • Il semble difficile de transposer directement les conclusions des articles aux LLM ou aux tâches générales de machine learning
  • Les KAN et les MLP ne peuvent pas se remplacer mutuellement ; chacun présente des avantages et des limites selon les configurations

1 commentaires

 
GN⁺ 2024-05-02
Avis sur Hacker News
  • J’ai parcouru rapidement l’article et, comme j’avais envie d’en faire une version plus simplifiée, j’ai créé une couche PyTorch : https://github.com/GistNoesis/FourierKAN/
    L’essentiel tient vraiment en quelques lignes. Dans l’article, le code semble pensé pour une plus petite échelle : il utilise une interpolation par splines pour représenter des fonctions unidimensionnelles, puis additionne les résultats.
    À la place, j’ai choisi une autre représentation, qui utilise des coefficients de Fourier pour interpoler la fonction de chaque coordonnée ; cela devrait aider à se faire une idée du pouvoir d’expression des réseaux de Kolmogorov-Arnold. La convergence peut être plus facile qu’avec la version à splines, mais les splines demandent moins d’opérations.
    Bien sûr, si mon code ne fonctionne pas, cela ne veut pas dire que l’article, lui, ne fonctionne pas. Si vous voulez, vous pouvez expérimenter et en faire un article.

    • Quand j’ai bricolé l’implémentation hier soir, l’usage de fonctions à base radiale plutôt que de coefficients de Fourier s’est avéré plus stable pour entraîner des réseaux de profondeur supérieure à 2.
      J’ai aussi essayé les coefficients de Fourier, parce qu’ils se parallélisent bien et sont faciles à écrire, mais le comportement à l’entraînement était meilleur avec les fonctions à base radiale.
    • Si l’on combine l’implémentation de Noesis avec efficientKAN de Blealtan (https://github.com/Blealtan/efficient-kan), on obtient une structure très proche de Siren (un MLP utilisant une fonction d’activation sinusoïdale).
      efficientKAN calcule d’abord des fonctions de base communes pour toutes les activations d’arêtes, puis calcule la sortie comme une combinaison linéaire de ces bases.
      Si les fonctions de base sont de Fourier, une couche KAN peut être vue comme une couche linéaire à poids fixes + une activation Sin + une couche linéaire à poids apprenables, ce qui correspond à une forme particulière de Siren.
      Cela pourrait être un exemple montrant le lien entre les KAN et les MLP.
    • Le code fonctionne-t-il réellement ? L’as-tu entraîné ? Y a-t-il des graphiques ?
      Tu dis : « si mon code ne fonctionne pas, cela ne veut pas dire que l’article, lui, ne fonctionne pas », mais ce qui m’intéresse, c’est de savoir s’il fonctionne vraiment.
    • Je me demande dans quelle mesure cette famille de modèles est adaptée aux GPU.
  • J’ai un peu joué avec les notebooks Jupyter des auteurs, et personnellement, c’est Example_3_classfication.ipynb (https://github.com/KindXiaoming/pykan/blob/master/tutorials/Example_3_classfication.ipynb) que j’ai trouvé le plus utile.
    Avec les paramètres choisis par les auteurs, cela fonctionne comme décrit, mais si, dans la configuration de classification de la seconde moitié du tutoriel, on change la forme du réseau de (2, 2) à (2, 2, 2), la généralisation échoue.
    La perte d’entraînement descend jusqu’à 1e-9, mais la perte de test reste autour de 3e-1, et passer à un réseau plus grand n’a pas aidé.
    Il faudrait des exemples avec des paramètres et une complexité de données bien plus importants, et j’aimerais aussi voir si cela peut réellement s’entraîner. MNIST serait un bon point de départ.
    Mise à jour : en multipliant par 100 la taille du jeu d’entraînement, le surapprentissage a diminué, mais maintenant je n’arrive plus à faire descendre la perte d’entraînement sous 1e-2. Je continue les expériences, et l’accélération GPU devient vraiment indispensable. Pour l’instant, la vitesse du CPU limite les progrès.

    • Mise à jour 2 : avec la forme (2, 2, 2), j’ai atteint 100 % de précision à l’entraînement et 99 % de précision en test.
      J’ai changé trois choses. J’ai fait passer le jeu d’entraînement de 1 000 à 100k échantillons pour résoudre le surapprentissage, et j’ai légèrement réduit le bruit dans la génération des données, de 0,1 à 0,07, afin d’éviter le chevauchement des classes.
      Le point le plus important, et spécifique aux KAN, est que j’ai entraîné 30 étapes avec grid=5, puis initialisé depuis le modèle précédent pour entraîner 30 étapes avec grid=10, puis encore 30 étapes avec grid=20. C’est une pratique courante avec les KAN, décrite dans Example_1_function_fitting.ipynb (https://github.com/KindXiaoming/pykan/blob/master/tutorials/Example_1_function_fitting.ipynb).
      Mon impression générale : ça fonctionne, l’implémentation de référence est très lente et une implémentation GPU est absolument nécessaire ; cela donne une impression de non-linéarité plus forte qu’un MLP + ReLU, avec une stabilité d’entraînement plus faible.
      Rien ne garantit encore que cela passera bien à l’échelle, et il faut vraiment voir si cette approche peut résoudre MNIST. Je vais continuer à suivre ça.
    • Je suis d’accord qu’il faut des exemples plus grands. Pour les techniques modernes de machine learning, je ne trouve pas les exemples jouets très utiles.
      Si de grandes idées comme Transformer, LSTM ou ADAM n’avaient été testées que sur une courbe y=sin(x) avec 50 points d’entraînement, il est probable qu’on les aurait écartées à tort.
    • Il est possible de l’exécuter avec CUDA, et l’un des exemples montre comment faire. Cela dit, quand j’ai essayé, c’était plus lent que sur CPU.
      Le fait de lancer quelque chose sur GPU ne le rend pas toujours plus rapide, surtout quand il y a beaucoup de branchements, ce qui n’est pas surprenant.
      Malheureusement, comme les tenseurs concernés n’étaient pas tous placés sur le bon appareil, j’ai dû modifier KAN.py et KANLayer.py. Certains formats laissent aussi penser qu’il y avait auparavant un argument device.
  • En statistique classique, il existe un modèle appelé GAM (https://en.wikipedia.org/wiki/Generalized_additive_model), inspiré de Kolmogorov-Arnold, que Hastie et Tibshirani ont développé comme une extension des GLM (https://en.wikipedia.org/wiki/Generalized_linear_model).
    Les GLM généralisent la régression logistique, la régression linéaire et plusieurs modèles de régression populaires.
    Des GAM neuronaux utilisant des fonctions de base apprises ont aussi déjà été proposés, donc je suis un peu surpris que ce nouvel article ne mentionne pas ces travaux antérieurs. Les applications précédentes se concentraient davantage sur l’interprétabilité.

    • Exact. Je suis arrivé ici en cherchant KAN et GAM, et c’est précisément la première chose qui m’est venue à l’esprit.
  • Le succès des réseaux de neurones est étroitement lié à leur scalabilité. L’algorithme lui-même doit non seulement pouvoir passer à davantage de couches, mais aussi bien s’adapter au matériel
    Les réseaux de neurones sont en grande partie constitués de multiplications matricielles, et les GPU disposent d’une accélération dédiée à ces multiplications. Si AlexNet a eu un tel impact, c’est aussi parce qu’il a montré qu’on pouvait déployer les réseaux de neurones sur GPU pour les faire monter en échelle et les accélérer
    Il n’est pas évident, à la seule lecture de l’article, de savoir à quel point cet algorithme passera bien à l’échelle. Sur le plan algorithmique, on ne sait pas s’il s’entraîne bien avec beaucoup de couches, ni s’il peut exploiter efficacement l’accélération matérielle
    En particulier, je ne sais pas vraiment si une structure où chaque poids est associé à une fonction d’activation peut tirer parti de l’accélération rapide des multiplications matricielles
    C’est une idée intéressante, qui fonctionne bien à petite échelle et possède de bonnes propriétés, mais on ne sait pas encore si c’est une architecture adaptée à ImageNet ou aux LLM

    • Les fonctions d’activation par poids donnent l’impression de pouvoir être approximées par une transformée en cosinus discrète. La compression JPEG l’utilise aussi, et il existe une accélération matérielle pour cela
      L’accélération rapide des multiplications matricielles a d’abord été implémentée en matériel parce qu’elle était utile pour des problèmes spécifiques, comme le graphisme
      Si les fonctions d’activation par poids se révèlent vraiment efficaces, les gens trouveront rapidement un moyen de les exécuter en matériel
  • C’est rafraîchissant de voir une nouvelle recherche en IA qui ne soit pas du type habituel « on a modifié Transformer de telle ou telle façon et obtenu un léger gain sur tel ou tel benchmark »
    Ces articles d’améliorations incrémentales sont importants eux aussi, mais tout le monde commence à s’en lasser un peu, et les preuves anecdotiques comme les recherches récentes donnent l’impression qu’on approche des limites fondamentales propres aux Transformers, si bien que de nouvelles alternatives pourraient devenir nécessaires (https://news.ycombinator.com/item?id=40179232)
    Le meilleur aspect de ce travail, c’est qu’il ne s’agit pas d’un choix binaire. Les fonctions d’activation par interpolation spline apprenables proposées peuvent aussi être intégrées aux réseaux de neurones profonds existants afin d’augmenter leur pouvoir d’expression
    Il ne reste plus qu’à tester si cela fonctionne effectivement mieux

    • En réalité, il existe pas mal de recherches de ce genre. Mais elles passent souvent par un examen supplémentaire, ou ne sont tout simplement pas acceptées, et sans un pedigree particulier comme le MIT ou le CIT, elles n’arrivent pas jusqu’à HN
      Les RP sont devenues une force énorme ; elles existaient déjà avant, mais leur influence semble encore plus grande aujourd’hui
      On peut y résister en votant pour ce genre d’articles et, si l’on participe à l’évaluation, en ne se concentrant pas uniquement sur le nouvel état de l’art. Ce critère a déjà été gamifié et il est clair qu’il nous entraîne dans la mauvaise direction
    • En 1989, au milieu de l’engouement pour les réseaux de neurones, j’ai lu le livre de Robert Hecht-Nielsen sur les réseaux de neurones. C’était probablement la deuxième vague d’engouement ; la première était sans doute celle partie du perceptron matériel de Rosenblatt, puis retombée après le manuscrit « Perceptrons » de Minsky et Papert
      Vu d’aujourd’hui, le contenu du livre était presque risiblement élémentaire, mais la motivation avancée était le théorème de représentation de Kolmogorov. Il dit qu’un réseau approprié à 3 couches, avec de bonnes fonctions d’activation, peut représenter n’importe quelle fonction continue de m vers n
      C’est peut-être pour cette raison que la plupart des recherches de l’époque se concentraient sur les réseaux à 3 couches ; les activations sigmoïdes dominaient, et la disparition du gradient était un problème majeur
      Il a fallu 20 ans, jusqu’à ce qu’AlexNet ravive la recherche sur les réseaux de neurones après l’hiver de l’IA des années 1990
    • La science a toujours cet aspect-là. 95 % du travail consiste à produire des améliorations ordinaires à correctes de ce qui existe déjà, et c’est au fil de ce processus que les chercheurs progressent jusqu’à faire des choses vraiment intéressantes
  • En lisant le préprint, ils considèrent que 100 dimensions d’entrée, c’est « élevé », et la plupart des problèmes traités ont au plus 5 dimensions d’entrée
    C’est assez typique des configurations de machine learning inspirées de la physique que j’ai vues
    L’étape suivante consiste à le montrer sur MNIST, et même les 784 dimensions de MNIST sont très peu nombreuses selon les standards modernes

    • Dans les processus métier réels, il existe beaucoup de problèmes de machine learning avec moins de 100 dimensions d’entrée
      Mais pour la plupart de ces problèmes, les arbres de décision restent compétitifs face aux réseaux de neurones, voire font mieux
  • Intéressant. Les réseaux de neurones de Kolmogorov peuvent représenter des fonctions discontinues (https://arxiv.org/abs/2311.00049), mais je me demandais dans quelle mesure ils pouvaient réellement être appliqués
    Ce dépôt semble tout de même montrer qu’ils ont une certaine utilité

    • Ce n’est pas encore pratique pour les fonctions discontinues. Comme l’explique aussi l’article cité, on sait qu’il existe une fonction g pour les fonctions discontinues bornées, mais on ne sait pas comment la trouver
      L’article indique aussi que « dans le cas des fonctions discontinues bornées et non bornées, on ne connaît pas encore de méthode pratique pour construire g »
      Si l’on regarde le lien arXiv de l’OP (https://arxiv.org/abs/2404.19756), ils utilisent des splines
      Cela reste intéressant et potentiellement utile, mais sans découverte supplémentaire, ce ne sera pas utile pour les fonctions discontinues. Si je me trompe, j’aimerais beaucoup recevoir un lien ; c’est un sujet qui m’intéresse énormément
  • C’est peut-être une réaction hâtive, mais une combinaison linéaire de B-splines n’est-elle pas simplement une autre B-spline d’ordre plus élevé ?
    Je me demande si, au final, il ne s’agit pas seulement d’ajuster une B-spline d’ordre élevé à la fonction

    • Pour un nœud unique ou une couche unique, oui. Mais quand la sortie d’une couche devient l’entrée de la suivante, ce n’est plus une simple combinaison linéaire de splines
  • Fait intéressant, cette approche et les fondements des MLP ont été inventés ou découverts presque à la même époque, il y a environ 66 ans
    1957 : https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Arnold_representation_theorem
    1958 : https://en.wikipedia.org/wiki/Multilayer_perceptron
    Un autre avantage est que cette approche n’a qu’un seul type de paramètres, les coefficients des fonctions d’activation locales, tandis que les MLP en ont trois : les poids, les biais et une fonction d’activation identique globalement
    Tout le monde parle des Transformers, mais j’aimerais voir un modèle de diffusion utilisant cette approche

    • Un biais n’est rien d’autre qu’un poids appliqué à une entrée toujours activée
      Il ne me semble pas non plus y avoir de grande différence entre les poids d’une somme linéaire et les coefficients d’une spline
    • Sur le troisième point, la plupart des modèles de diffusion utilisent déjà des architectures basées sur les Transformers
      Il y a notamment les U-Net avec auto-attention et attention croisée, les Vision Transformers, les Diffusion Transformers, etc.
    • Le point 2 est bien une différence. Mais je me demande pourquoi ce serait un avantage
      On peut sans doute l’argumenter du point de vue de la concision, c’est-à-dire du rasoir d’Occam, mais je me demande si c’est bien cette idée-là ou s’il y a une autre raison
    • Je peux me tromper, mais il me semble que les LLM modernes utilisent très peu les biais
  • On dirait que quelqu’un a fourré des splines dans un arbre de décision

    • Pour les splines, oui, mais pour l’arbre de décision, je ne suis pas sûr. Est-ce que j’ai raté quelque chose ?
      À la page 2 du PDF, il est écrit : « les nœuds de KAN n’appliquent pas de non-linéarité et se contentent de sommer les signaux entrants »