2 pontos por GN⁺ 2024-05-02 | 1 comentários | Compartilhar no WhatsApp
  • 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:
  • Instalação pelo GitHub:
  • Instalação pelo PyPI:
    • pip install pykan
  • Os principais pacotes exigidos incluem matplotlib, numpy, scikit_learn, sympy, torch, tqdm, pandas, seaborn, pyyaml etc.
  • Usuários de Conda podem criar um ambiente com python=3.9.7 e 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 chamar model.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 lamb gradualmente
    • 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
  • 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 que width, sugere-se reduzir primeiro grid e depois width
  • 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

 
GN⁺ 2024-05-02
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

    • Quando mexi na implementação ontem à noite, usar funções de base radial em vez de coeficientes de Fourier foi mais estável para treinar redes com profundidade maior que 2
      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
    • Ao combinar a implementação de Noesis com a efficientKAN de Blealtan (https://github.com/Blealtan/efficient-kan), a estrutura fica muito parecida com Siren (uma MLP que usa função de ativação seno)
      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
    • O código realmente funciona? Você treinou? Há gráficos?
      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
    • Fico curioso para saber o quanto essa família de modelos é amigável a GPUs
  • 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

    • Atualização 2: na forma (2, 2, 2), cheguei a 100% de acurácia no treinamento e 99% de acurácia no teste
      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
    • Concordo que exemplos maiores são necessários. Acho que exemplos de brinquedo não são muito úteis para técnicas modernas de aprendizado de máquina
      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
    • É possível executar em CUDA, e um dos exemplos mostra como fazer. No entanto, nos meus testes foi mais lento que na CPU
      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

    • Sim. Cheguei aqui pesquisando por KAN e GAM, e esse foi exatamente o primeiro pensamento que me veio à cabeça
  • 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

    • Funções de ativação por peso soam como algo que poderia ser aproximado por uma transformada discreta do cosseno. A compressão JPEG também usa isso, e há aceleração em hardware
      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

    • Na prática, há bastante pesquisa desse tipo. Só que muitas vezes ela passa por revisão adicional ou simplesmente não é aceita, e, sem um histórico especial como MIT ou CIT, não chega ao HN
      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
    • Em 1989, em meio à febre das redes neurais da época, li o livro de redes neurais de Robert Hecht Nielsen. Provavelmente era a segunda onda de entusiasmo; a primeira deve ter começado com o perceptron em hardware de Rosenblatt e depois esfriado após o manuscrito “Perceptrons”, de Minsky e Papert
      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
    • A ciência tem esse lado mesmo. 95% dela consiste em produzir melhorias de razoáveis a boas sobre o que já existe, e, nesse processo, os pesquisadores amadurecem até fazer trabalhos realmente interessantes
  • 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

    • Em processos de negócios reais, há muitos problemas de aprendizado de máquina com menos de 100 dimensões de entrada
      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

    • Ainda não é prático para funções descontínuas. Como o artigo citado também explica, sabemos que existe uma g para funções descontínuas limitadas, mas não há um método para encontrá-la
      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

    • Para um único nó ou uma única camada, sim. Mas, quando a saída de uma camada entra como entrada da próxima, isso deixa de ser uma simples combinação linear de splines
  • 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

    • O viés é apenas um peso para uma entrada que está sempre ligada
      Também não parece haver grande diferença entre os pesos de uma soma linear e os coeficientes de uma spline
    • Sobre o terceiro ponto, a maioria dos modelos de difusão já usa arquiteturas baseadas em Transformer
      Há U-Net com autoatenção e atenção cruzada, Vision Transformer, Diffusion Transformer etc.
    • É verdade que o item 2 é uma diferença. Mas fico curioso por que isso seria uma vantagem
      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
    • Posso estar errado, mas pelo que sei, LLMs modernos quase não usam vieses
  • Parece que alguém enfiou splines em árvores de decisão

    • São splines mesmo, mas não sei quanto às árvores de decisão. Estou deixando passar algo?
      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”