Desenvolvimento de redes Kolmogorov-Arnold
(github.com/KindXiaoming)- pykan é o repositório GitHub dos artigos “KAN: Kolmogorov-Arnold Networks” e “KAN 2.0: Kolmogorov-Arnold Networks Meet Science”, oferecendo treinamento, tutoriais, documentação e exemplos de KAN
- KAN é apresentado como uma alternativa às MLPs; assim como as MLPs se baseiam no teorema da aproximação universal, KAN se baseia no teorema de representação de Kolmogorov-Arnold
- Estruturalmente, MLPs têm funções de ativação nos nós, enquanto KAN tem funções de ativação nas arestas; essa mudança é descrita como capaz de melhorar a acurácia e a interpretabilidade do modelo
- Usuários de machine learning que não usam o branch de computação simbólica devem chamar
model.speed()antes do treinamento; caso contrário, o symbolic branch não paralelizado pode tornar a execução muito lenta - Esta implementação tem como alvo principal pequenos problemas relacionados à ciência; é difícil vê-la como um plugin pronto para uso direto em tarefas de machine learning, e são necessários ajuste de hiperparâmetros e técnicas específicas por aplicação
Visão geral do pykan e do KAN
- pykan é o repositório dos artigos “KAN: Kolmogorov-Arnold Networks” e “KAN 2.0: Kolmogorov-Arnold Networks Meet Science”
- O guia de início rápido está em hellokan, exemplos adicionais estão em tutorials, e a documentação está na documentação oficial
- KANs são apresentadas como uma alternativa promissora às Multi-Layer Perceptrons (MLPs)
- MLPs se baseiam no universal approximation theorem
- KAN se baseia no Kolmogorov-Arnold representation theorem
- KAN e MLP são descritas como estruturas duais
- KAN tem funções de ativação nas arestas
- MLP tem funções de ativação nos nós
- Essa mudança estrutural é descrita como algo que pode tornar a acurácia e a interpretabilidade de KAN melhores que as de MLPs
Instalação e ambiente de execução
- pykan pode ser instalado pelo PyPI ou pelo GitHub
- Os pré-requisitos são Python 3.9.7 ou superior e
pip - Modo de instalação para desenvolvedores:
git clone https://github.com/KindXiaoming/pykan.gitcd pykanpip install -e .
- Instalação pelo GitHub:
pip install git+https://github.com/KindXiaoming/pykan.git
- Instalação pelo PyPI:
pip install pykan
- Os principais pacotes exigidos incluem
matplotlib,numpy,scikit_learn,sympy,torch,tqdm,pandas,seaborn,pyyamletc. - Usuários de Conda podem criar um ambiente com
python=3.9.7e depois instalar pelo GitHub ou pelo PyPI
Modo de desempenho e requisitos de computação
- Para usuários de machine learning que escrevem diretamente o loop de treinamento, não usam
model.fit()e não usam o symbolic branch, é importante chamarmodel.speed()antes do treinamento - Se
model.speed()não for chamado, o symbolic branch fica ativado, e a computação simbólica não é paralelizada, podendo ficar muito lenta - Os exemplos em tutorials geralmente podem ser executados em menos de 10 minutos em uma única CPU
- Todos os exemplos incluídos nos artigos podem ser executados em menos de um dia em uma única CPU
- O treinamento de KAN para PDE é o mais custoso e pode levar de algumas horas a alguns dias em uma única CPU
- O motivo de usar CPU para treinar os modelos foi a realização de varreduras de parâmetros em milhares de modelos pequenos para obter a Pareto Frontier de MLP e KAN
- Para tarefas em maior escala, recomenda-se o uso de GPU
Ajuste de hiperparâmetros de KAN
- Intuições obtidas com MLPs e outras redes podem não se aplicar diretamente a KAN
- A recomendação básica é começar com uma configuração simples
- KAN shape pequeno
- grid size pequeno
- poucos dados
- sem regularização,
lamb=0
- Por exemplo, em uma tarefa com 5 entradas e 1 saída, pode-se começar testando uma configuração muito simples, como
KAN(width=[5,1,1], grid=3, k=3) - Se não funcionar, recomenda-se primeiro aumentar a width e, se ainda assim não der certo, aumentar a depth
- Quando o desempenho chegar a um nível aceitável, é possível refinar para uma KAN mais precisa ou mais interpretável
- Se a prioridade for acurácia, pode-se tentar a técnica de grid extension, mas é preciso tomar cuidado com overfitting
- Se a prioridade for interpretabilidade, a rede pode ser esparsificada com algo como
model.train(lamb=0.01)- Recomenda-se aumentar
lambgradualmente - Após o treinamento, se o plot mostrar neurônios claramente inúteis, é possível obter um modelo podado com
pruned_model = model.prune() - Depois disso, é possível fazer treinamento adicional para acurácia ou esparsidade, ou realizar symbolic regression
- Recomenda-se aumentar
- Acurácia, interpretabilidade e eficiência de parâmetros nem sempre entram em conflito; dependendo do caso, podem ter correlação positiva ou envolver tradeoff
- Se houver uma grande diferença entre train/test loss, deve-se considerar aumentar os dados ou reduzir o modelo
- Como
gridé mais importante quewidth, sugere-se reduzir primeirogride depoiswidth
- Como
- Recomenda-se começar por um modelo simples, primeiro confirmar o estado de underfitting e então expandir gradualmente para chegar a uma região adequada
Escopo de aplicação e limitações
- O código foi projetado tendo em mente pequenos problemas científicos, como exemplos de matemática e física
- Como eficiência e reutilização não foram muito consideradas, os autores afirmam aceitar críticas nesses aspectos
- O público-alvo original são usuários interessados em descoberta científica e computação científica, e o repositório pretende manter esse propósito principalmente
- Como implementações com melhoria de eficiência, são mencionados efficientkan e FourierKAN
- Para usuários focados em machine learning, KAN ainda não é um simples plugin out-of-the-box
- É necessário ajuste de hiperparâmetros
- Técnicas especiais específicas da aplicação podem ser adicionadas
- GraphKAN sugere que é melhor usar KAN no latent space e menciona que são necessárias embedding/unembedding linear layers após a entrada e antes da saída
- KANRL sugere que, em aprendizado por reforço, é melhor fixar alguns parâmetros treináveis para aumentar a estabilidade do treinamento
- Sobre se KAN será o LLM da próxima geração, os autores dizem não ter uma boa intuição
- KAN foi projetado para aplicações que valorizam alta acurácia e interpretabilidade
- A interpretabilidade em LLMs e a interpretabilidade na ciência podem ser bastante diferentes
- Eles consideram difícil transferir diretamente as conclusões dos artigos para LLMs ou tarefas gerais de machine learning
- KAN e MLP não podem substituir uma à outra; cada uma tem vantagens e limitações em determinados contextos
1 comentários
Opiniões do Hacker News
Dei uma olhada rápida no artigo e, como queria tentar simplificar mais, criei uma camada em PyTorch: https://github.com/GistNoesis/FourierKAN/
O essencial são literalmente só algumas linhas. No artigo, o código parece ter sido pensado para uma escala menor: usa interpolação por splines para representar funções unidimensionais e soma os resultados
Em vez disso, escolhi outra representação, usando coeficientes de Fourier para interpolar a função de cada coordenada, e acho que isso pode ajudar a ter uma noção do poder expressivo das redes Kolmogorov-Arnold. Pode ser mais fácil de convergir do que a versão com splines, embora a de splines exija menos operações
Claro, o fato de o meu código não funcionar não significa que o do artigo não funcione. Se quiser, pode experimentar e publicar como artigo
Também testei coeficientes de Fourier porque paralelizam bem e são fáceis de escrever, mas o comportamento no treinamento foi melhor com funções de base radial
A efficientKAN primeiro calcula funções de base comuns para todas as ativações nas arestas, e a saída é calculada como uma combinação linear dessas bases
Se as funções de base forem de Fourier, uma camada KAN pode ser vista como uma camada linear de pesos fixos + ativação seno + camada linear com pesos treináveis, o que é uma forma especial de Siren
Pode ser um exemplo que mostra a conexão entre KANs e MLPs
Você diz que “o fato de o meu código não funcionar não significa que o do artigo não funcione”, mas eu queria saber se ele realmente funciona
Mexi um pouco nos notebooks Jupyter dos autores e, pessoalmente, achei o Example_3_classfication.ipynb (https://github.com/KindXiaoming/pykan/blob/master/tutorials/Example_3_classfication.ipynb) o mais útil
Com os parâmetros escolhidos pelos autores, funciona como descrito, mas, na configuração de classificação da parte final do tutorial, se você mudar a forma da rede de (2, 2) para (2, 2, 2), ela falha em generalizar
A perda de treinamento cai até 1e-9, mas a perda de teste fica perto de 3e-1, e redes maiores também não ajudaram
É preciso um exemplo com parâmetros e complexidade de dados bem maiores, e eu gostaria de ver se isso é realmente treinável. MNIST parece um bom ponto de partida
Atualização: ao aumentar o tamanho do conjunto de treinamento em 100 vezes, o overfitting diminuiu, mas agora não consigo fazer a perda de treinamento cair abaixo de 1e-2. Continuo testando, e aceleração por GPU faz muita falta. No momento, a velocidade da CPU está limitando o progresso
Mudei três coisas. Aumentei o conjunto de treinamento de 1.000 para 100 mil amostras para resolver o overfitting, e reduzi um pouco o ruído na geração dos dados, de 0,1 para 0,07, para evitar sobreposição entre as classes
A parte mais importante e específica de KAN foi treinar 30 passos com grid=5 e depois, inicializando a partir do modelo anterior, treinar 30 passos com grid=10 e novamente 30 passos com grid=20. Esse é um procedimento comum em KANs e aparece em Example_1_function_fitting.ipynb (https://github.com/KindXiaoming/pykan/blob/master/tutorials/Example_1_function_fitting.ipynb)
Minha impressão geral é que funciona, que a implementação de referência é muito lenta e precisa mesmo de uma implementação para GPU, e que ela parece ter não linearidade mais forte do que MLP + ReLU, mas menor estabilidade de treinamento
Ainda não há garantia de que escale bem, e é essencial ver se essa abordagem consegue resolver MNIST. Vou continuar acompanhando
Se grandes ideias como Transformer, LSTM e ADAM tivessem sido testadas apenas em uma curva y=sin(x) com 50 números de dados de treinamento, é bem possível que essas ideias tivessem sido descartadas por engano
Rodar na GPU nem sempre é mais rápido, especialmente quando há muitos desvios de controle, então isso não é surpreendente
Infelizmente, precisei modificar KAN.py e KANLayer.py porque nem todos os tensores relacionados eram colocados no dispositivo correto. Pelo formato de algumas partes, também parece haver vestígios de que antes existia um argumento device
Na estatística clássica, há um modelo inspirado em Kolmogorov-Arnold chamado GAM (https://en.wikipedia.org/wiki/Generalized_additive_model), desenvolvido por Hastie e Tibshirani como uma extensão de GLM (https://en.wikipedia.org/wiki/Generalized_linear_model)
GLM generaliza regressão logística, regressão linear e vários modelos de regressão populares
Redes neurais GAM que usam funções de base aprendidas também já foram propostas, então achei um pouco surpreendente que o novo artigo não mencione trabalhos anteriores. As aplicações anteriores tinham foco maior em interpretabilidade
O sucesso das redes neurais está intimamente ligado à escalabilidade. O algoritmo em si não só precisa escalar para mais camadas, como também precisa se encaixar bem com o hardware
Redes neurais são compostas em grande parte por multiplicações de matrizes, e GPUs têm aceleração dedicada para multiplicação de matrizes. O motivo de o AlexNet ter tido tanto impacto também foi mostrar que era possível colocar redes neurais em GPUs para escalá-las e acelerá-las
Só pelo artigo, não fica claro quão bem esse algoritmo vai escalar. Tanto do ponto de vista algorítmico — se ele continua aprendendo bem com mais camadas — quanto se consegue aproveitar bem a aceleração de hardware, tudo isso é incerto
Em especial, não sei se uma estrutura em que cada peso tem uma função de ativação associada consegue tirar proveito da aceleração rápida de multiplicação de matrizes
É uma ideia interessante que funciona bem em pequena escala e tem boas propriedades, mas ainda não dá para saber se é uma arquitetura adequada para coisas como ImageNet ou LLMs
A aceleração rápida de multiplicação de matrizes, no começo, foi implementada em hardware porque era útil para problemas específicos, como gráficos
Se funções de ativação por peso realmente funcionarem bem, as pessoas rapidamente vão descobrir como executá-las em hardware
É revigorante ver uma nova pesquisa de IA que não seja o típico “modificamos o Transformer desta ou daquela forma e melhoramos um pouco neste ou naquele benchmark”
Esses artigos de melhorias incrementais também são importantes, mas todo mundo está ficando um pouco cansado deles, e evidências anedóticas e pesquisas recentes sugerem que talvez estejamos nos aproximando de limites fundamentais próprios dos Transformers, então pode ser que novas alternativas sejam necessárias(https://news.ycombinator.com/item?id=40179232)
A melhor parte deste trabalho é que não é uma escolha excludente. A função de ativação de interpolação por spline aprendível proposta pode ser inserida também em redes neurais profundas existentes para aumentar sua expressividade
Agora é só testar se ela de fato funciona melhor
PR se tornou uma força poderosa demais; ele já existia antes, mas agora parece ter ainda mais influência
Podemos combater isso votando positivamente em textos assim e, se estivermos avaliando trabalhos, não focando apenas em novo estado da arte. Esse critério já foi gamificado e claramente está nos levando na direção errada
Visto pelos padrões atuais, o conteúdo do livro era risivelmente básico, mas a motivação apresentada era o teorema de representação de Kolmogorov. A ideia era que uma rede adequada de 3 camadas, com funções de ativação apropriadas, poderia representar qualquer função contínua de m para n
Talvez por esse motivo, a maior parte da pesquisa da época se concentrava em redes de 3 camadas, ativações sigmoid eram o padrão, e o desaparecimento do gradiente era um grande problema
Levou 20 anos até que o AlexNet reavivasse a pesquisa em redes neurais depois do inverno da IA dos anos 1990
Olhando o preprint, eles tratam uma dimensão de entrada de 100 como “alta”, e a maioria dos problemas abordados tem dimensão de entrada de 5 ou menos
É o padrão que tenho visto em configurações de aprendizado de máquina inspiradas em física
O próximo passo é demonstrar no MNIST, e mesmo as 784 dimensões do MNIST são muito pequenas pelos padrões modernos
Mas, na maioria desses problemas, árvores de decisão ainda são competitivas com redes neurais, ou até se saem melhor
Interessante. Redes neurais de Kolmogorov conseguem representar funções descontínuas(https://arxiv.org/abs/2311.00049), mas eu estava curioso sobre até que ponto isso teria aplicabilidade prática
Este repositório parece mostrar que há ao menos alguma utilidade
O artigo também diz que “para funções descontínuas limitadas e ilimitadas, ainda não se conhece uma maneira prática de construir g”
Olhando o link do arXiv do OP(https://arxiv.org/abs/2404.19756), eles estão usando splines
Continua sendo interessante e potencialmente útil, mas, sem descobertas adicionais, não é útil para funções descontínuas. Se eu estiver errado, gostaria que enviassem um link; é um tema que me interessa muito
Talvez seja uma reação precipitada, mas uma combinação linear de B-splines não é apenas outra B-spline de ordem mais alta?
Fico me perguntando se, no fim, não é só ajustar B-splines de ordem alta a uma função
Curiosamente, esta abordagem e as bases do MLP foram inventadas ou descobertas quase na mesma época, há cerca de 66 anos
1957: https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Arnold_representation_theorem
1958: https://en.wikipedia.org/wiki/Multilayer_perceptron
Outra vantagem é que esta abordagem tem apenas um tipo de parâmetro, os coeficientes das funções de ativação locais, enquanto o MLP tem três tipos de parâmetros: pesos, vieses e uma função de ativação globalmente idêntica
Todo mundo fala de Transformer, mas eu gostaria de ver um modelo de difusão usando esta abordagem
Também não parece haver grande diferença entre os pesos de uma soma linear e os coeficientes de uma spline
Há U-Net com autoatenção e atenção cruzada, Vision Transformer, Diffusion Transformer etc.
Dá para argumentar do ponto de vista da concisão, isto é, a navalha de Occam, mas queria saber se é essa a ideia ou se há outro motivo
Parece que alguém enfiou splines em árvores de decisão
Na página 2 do PDF está escrito: “os nós de uma KAN não aplicam não linearidade e simplesmente somam os sinais de entrada”