Kolmogorov-Arnold 네트워크 개발
(github.com/KindXiaoming)- pykan은 논문 “KAN: Kolmogorov-Arnold Networks”와 “KAN 2.0: Kolmogorov-Arnold Networks Meet Science”를 위한 GitHub 저장소로, KAN 학습·튜토리얼·문서·예제를 제공함
- KAN은 MLP의 대안으로 제시되며, MLP가 보편 근사 정리에 기반하는 것처럼 KAN은 Kolmogorov-Arnold 표현 정리에 기반함
- 구조적으로 MLP는 노드에 활성화 함수가 있고 KAN은 엣지에 활성화 함수가 있으며, 이 변화가 모델 정확도와 해석 가능성을 개선할 수 있다고 설명함
- 기호 계산 브랜치를 쓰지 않는 머신러닝 사용자는 학습 전에
model.speed()를 호출해야 하며, 그렇지 않으면 병렬화되지 않은 symbolic branch 때문에 매우 느려질 수 있음 - 이 구현은 과학 관련 소규모 문제를 주 대상으로 하며, 머신러닝 작업에 바로 꽂아 쓰는 플러그인으로 보기 어렵고 하이퍼파라미터 튜닝과 적용별 기법이 필요함
pykan과 KAN 개요
- pykan은 “KAN: Kolmogorov-Arnold Networks”와 “KAN 2.0: Kolmogorov-Arnold Networks Meet Science”를 위한 저장소임
- 빠른 시작은 hellokan, 추가 예제는 tutorials, 문서는 공식 문서에서 제공됨
- KANs는 Multi-Layer Perceptrons(MLPs)의 유망한 대안으로 소개됨
- MLP는 universal approximation theorem에 기반함
- KAN은 Kolmogorov-Arnold representation theorem에 기반함
- KAN과 MLP는 쌍대적인 구조로 설명됨
- KAN은 엣지에 활성화 함수가 있음
- MLP는 노드에 활성화 함수가 있음
- 이 구조 변화가 KAN의 정확도와 해석 가능성을 MLP보다 좋게 만들 수 있다고 설명함
설치와 실행 환경
- pykan은 PyPI 또는 GitHub에서 설치할 수 있음
- 사전 요구사항은 Python 3.9.7 이상과
pip임 - 개발자 설치 방식:
git clone https://github.com/KindXiaoming/pykan.gitcd pykanpip install -e .
- GitHub 설치:
pip install git+https://github.com/KindXiaoming/pykan.git
- PyPI 설치:
pip install pykan
- 주요 요구 패키지는
matplotlib,numpy,scikit_learn,sympy,torch,tqdm,pandas,seaborn,pyyaml등을 포함함 - Conda 사용자는
python=3.9.7환경을 만든 뒤 GitHub 또는 PyPI 방식으로 설치할 수 있음
성능 모드와 계산 요구사항
- 머신러닝 사용자가 직접 학습 루프를 작성하고
model.fit()을 쓰지 않으며 symbolic branch를 쓰지 않는다면, 학습 전에model.speed()호출이 중요함 model.speed()를 호출하지 않으면 symbolic branch가 켜져 있고, 기호 계산이 병렬화되지 않아 매우 느릴 수 있음- tutorials의 예제는 보통 단일 CPU에서 10분 이내 실행 가능함
- 논문에 포함된 모든 예제는 단일 CPU에서 하루 이내 실행 가능함
- PDE용 KAN 학습은 가장 비싸며, 단일 CPU에서 몇 시간에서 며칠이 걸릴 수 있음
- 모델 학습에 CPU를 사용한 이유는 MLP와 KAN의 Pareto Frontier를 얻기 위해 수천 개의 작은 모델에 대해 파라미터 스윕을 수행했기 때문임
- 문제 규모가 큰 작업에서는 GPU 사용이 권장됨
KAN 하이퍼파라미터 튜닝
- MLP와 다른 네트워크에서 얻은 직관이 KAN에 그대로 적용되지 않을 수 있음
- 기본 조언은 단순한 설정에서 시작하는 것임
- 작은 KAN shape
- 작은 grid size
- 작은 데이터
- 정규화 없음,
lamb=0
- 예를 들어 입력 5개와 출력 1개인 작업에서는
KAN(width=[5,1,1], grid=3, k=3)처럼 매우 단순한 설정부터 시도할 수 있음 - 동작하지 않으면 먼저 width를 늘리고, 그래도 안 되면 depth를 늘리는 흐름을 권장함
- 성능이 받아들일 만한 수준에 도달하면 더 정확하거나 더 해석 가능한 KAN으로 정제할 수 있음
- 정확도를 중시한다면 grid extension 기법을 시도할 수 있지만, 과적합에 주의해야 함
- 해석 가능성을 중시한다면
model.train(lamb=0.01)같은 방식으로 네트워크를 희소화할 수 있음lamb는 점진적으로 늘려보는 방식이 권장됨- 학습 후 plot에서 명백히 쓸모없는 뉴런이 보이면
pruned_model = model.prune()으로 가지치기한 모델을 얻을 수 있음 - 이후 정확도 또는 희소성을 위해 추가 학습하거나 symbolic regression을 수행할 수 있음
- 정확도, 해석 가능성, 파라미터 효율성은 항상 서로 충돌하는 관계가 아니며, 경우에 따라 양의 상관관계가 있을 수도 있고 tradeoff가 있을 수도 있음
- train/test loss 사이에 큰 차이가 있으면 데이터를 늘리거나 모델을 줄이는 방향을 고려해야 함
grid가width보다 더 중요하므로 먼저grid를 줄이고 그다음width를 줄이는 순서가 제안됨
- 단순한 모델에서 시작해 먼저 underfitting 상태를 확인하고 점진적으로 확장해 적절한 영역으로 이동하는 방식이 권장됨
적용 범위와 한계
- 코드는 수학·물리 예제처럼 소규모 과학 문제를 염두에 두고 설계됨
- 효율성과 재사용성을 크게 고려하지 않았기 때문에, 해당 측면에 대한 비판을 수용한다고 밝힘
- 과학적 발견과 과학 컴퓨팅에 관심 있는 사용자를 원래 대상으로 하며, 저장소도 주로 이 목적을 유지할 예정임
- 효율 개선 구현으로 efficientkan과 FourierKAN이 언급됨
- 머신러닝 중심 사용자의 경우 KAN은 아직 단순한 out-of-the-box 플러그인이 아님
- 하이퍼파라미터 튜닝이 필요함
- 적용별 특수 기법이 추가될 수 있음
- GraphKAN은 KAN을 latent space에서 사용하는 편이 좋다고 제안하며, 입력 뒤와 출력 앞에 embedding/unembedding linear layer가 필요하다고 언급됨
- KANRL은 강화학습에서 학습 안정성을 높이기 위해 일부 학습 가능 파라미터를 고정하는 편이 좋다고 제안함
- KAN이 차세대 LLM이 될지에 대해서는 좋은 직관이 없다고 밝힘
- KAN은 높은 정확도와 해석 가능성을 중시하는 응용을 위해 설계됨
- LLM에서의 해석 가능성과 과학에서의 해석 가능성은 크게 다를 수 있음
- 논문의 결론을 LLM이나 일반 머신러닝 작업으로 직접 옮기기 어렵다고 봄
- KAN과 MLP는 서로를 대체할 수 없으며, 각각 어떤 설정에서는 장점과 한계를 가짐
댓글과 토론
Hacker News 의견들
-
논문을 빠르게 훑어보고 더 단순화해보고 싶어서 PyTorch 레이어를 만들어 봄: https://github.com/GistNoesis/FourierKAN/
핵심은 정말 몇 줄뿐임. 논문에서는 더 작은 규모를 염두에 둔 듯한 코드로, 1차원 함수를 표현하기 위해 스플라인 보간을 사용하고 그 결과를 합산함
대신 각 좌표의 함수를 보간하는 데 푸리에 계수를 쓰는 다른 표현을 골랐고, Kolmogorov-Arnold 네트워크의 표현력을 감잡는 데 도움이 될 듯함. 스플라인 버전보다 수렴은 쉬울 수 있지만 연산 수는 스플라인 쪽이 더 적음
물론 내 코드가 동작하지 않는다고 해서 논문 쪽이 동작하지 않는다는 뜻은 아님. 원하면 실험해보고 논문으로 내도 됨- 어젯밤 구현을 만져봤을 때는 푸리에 계수 대신 방사 기저 함수를 쓰는 편이 깊이 2를 넘는 네트워크 학습에서 더 안정적이었음
푸리에 계수도 병렬화가 잘 되고 작성하기 쉬워서 시도해봤지만, 학습 동작은 방사 기저 함수가 더 나았음 - Noesis 구현을 Blealtan의 efficientKAN(https://github.com/Blealtan/efficient-kan)과 합치면 Siren(Sin 활성화 함수를 쓰는 MLP)과 매우 비슷한 구조가 됨
efficientKAN은 모든 엣지 활성화에 공통 기저 함수를 먼저 계산하고, 출력은 그 기저의 선형 결합으로 계산함
기저 함수가 푸리에라면 KAN 레이어는 고정 가중치 선형 레이어 + Sin 활성화 + 학습 가능한 가중치 선형 레이어로 볼 수 있고, 이는 Siren의 특수한 형태임
KAN과 MLP 사이의 연결을 보여주는 사례일 수 있음 - 코드가 실제로 동작하나? 학습해봤나? 그래프가 있나?
“내 코드가 동작하지 않는다고 해서 논문 쪽이 동작하지 않는다는 뜻은 아님”이라지만, 실제로 동작하는지가 궁금함 - 이 계열 모델은 GPU 친화성이 어느 정도인지 궁금함
- 어젯밤 구현을 만져봤을 때는 푸리에 계수 대신 방사 기저 함수를 쓰는 편이 깊이 2를 넘는 네트워크 학습에서 더 안정적이었음
-
저자들의 Jupyter 노트북을 좀 만져봤고, 개인적으로는 Example_3_classfication.ipynb(https://github.com/KindXiaoming/pykan/blob/master/tutorials/Example_3_classfication.ipynb)가 가장 유용했음
저자들이 고른 파라미터에서는 설명대로 동작하지만, 튜토리얼 후반부의 분류 설정에서 네트워크 형태를 (2, 2)에서 (2, 2, 2)로 바꾸면 일반화에 실패함
학습 손실은 1e-9까지 내려가지만 테스트 손실은 3e-1 근처에 머물고, 더 큰 네트워크로 가도 도움이 되지 않았음
파라미터와 데이터 복잡도가 훨씬 큰 예제가 필요하고, 실제로 학습 가능한지도 보고 싶음. MNIST가 좋은 출발점일 듯함
업데이트: 학습 데이터셋 크기를 100배 늘리니 과적합은 줄었지만, 이제 학습 손실을 1e-2 아래로 내리지 못하고 있음. 계속 실험 중이고 GPU 가속이 절실함. 지금은 CPU 속도가 진행을 제한함- 업데이트 2: (2, 2, 2) 형태에서 학습 정확도 100%, 테스트 정확도 99% 까지 도달함
바꾼 점은 세 가지임. 학습 셋을 1,000개에서 100k 샘플로 늘려 과적합을 해결했고, 데이터 생성에서 잡음을 0.1에서 0.07로 조금 낮춰 클래스가 겹치지 않게 했음
가장 중요하고 KAN에 특화된 부분은 grid=5로 30스텝 학습한 뒤, 이전 모델에서 초기화해 grid=10으로 30스텝, 다시 grid=20으로 30스텝 학습한 것임. 이는 KAN에서 관용적인 방식이고 Example_1_function_fitting.ipynb(https://github.com/KindXiaoming/pykan/blob/master/tutorials/Example_1_function_fitting.ipynb)에 나와 있음
전체 인상은 동작은 한다는 것, 참조 구현은 매우 느려서 GPU 구현이 꼭 필요하다는 것, MLP + ReLU보다 비선형성이 강한 느낌이고 학습 안정성이 떨어진다는 것임
확장이 잘 된다는 보장은 아직 없고, 이 접근으로 MNIST를 풀 수 있는지 꼭 봐야 함. 계속 지켜볼 생각임 - 더 큰 예제가 필요하다는 데 동의함. 현대 기계학습 기법에는 장난감 예제가 별로 유용하지 않다고 봄
Transformer, LSTM, ADAM 같은 큰 아이디어를 y=sin(x) 곡선에 숫자 50개짜리 학습 데이터로만 테스트했다면, 그런 아이디어들을 잘못 버렸을 가능성이 큼 - CUDA에서 실행하는 것은 가능하고, 예제 중 하나가 방법을 보여줌. 다만 내가 해봤을 때는 CPU보다 느렸음
GPU에서 돌린다고 항상 빠른 것은 아니며, 특히 분기가 많은 경우에는 놀랍지 않음
아쉽게도 관련 텐서가 모두 올바른 장치에 올라가지 않아서 KAN.py와 KANLayer.py를 수정해야 했음. 일부 포맷을 보면 예전에는 device 인자가 있었던 듯한 흔적도 보임
- 업데이트 2: (2, 2, 2) 형태에서 학습 정확도 100%, 테스트 정확도 99% 까지 도달함
-
고전 통계에는 Kolmogorov-Arnold에서 영감을 받은 GAM(https://en.wikipedia.org/wiki/Generalized_additive_model)이라는 모델이 있고, Hastie와 Tibshirani가 GLM(https://en.wikipedia.org/wiki/Generalized_linear_model)의 확장으로 개발했음
GLM은 로지스틱 회귀, 선형 회귀 및 여러 인기 회귀 모델을 일반화함
학습된 기저 함수를 쓰는 신경망 GAM도 이미 제안된 바 있어서, 이번 새 논문에서 선행 연구가 언급되지 않은 점이 조금 의외임. 이전 응용은 해석 가능성에 더 초점을 맞췄음- 맞음. KAN과 GAM을 검색하다가 여기까지 왔고, 나도 처음 떠올린 생각이 바로 이거였음
-
신경망의 성공은 확장성과 긴밀히 연결되어 있음. 알고리즘 자체가 더 많은 레이어로 확장될 뿐 아니라 하드웨어와도 잘 맞아야 함
신경망은 대부분 행렬 곱셈으로 구성되고, GPU에는 행렬 곱셈 전용 가속이 있음. AlexNet이 큰 영향을 준 이유도 신경망을 GPU에 올려 확장하고 가속할 수 있음을 보여줬기 때문임
이 알고리즘이 얼마나 잘 확장될지는 논문만으로는 분명하지 않음. 알고리즘 측면에서 레이어가 많아져도 잘 학습되는지, 하드웨어 가속을 잘 활용할 수 있는지 모두 불확실함
특히 가중치마다 활성화 함수가 붙는 구조가 빠른 행렬 곱셈 가속을 활용할 수 있는지는 잘 모르겠음
작은 규모에서는 잘 동작하고 좋은 특성을 가진 흥미로운 아이디어지만, ImageNet이나 LLM 같은 곳에 적합한 아키텍처인지는 아직 알 수 없음- 가중치별 활성화 함수는 이산 코사인 변환으로 근사할 수 있을 것처럼 들림. JPEG 압축도 이걸 쓰고, 하드웨어 가속도 있음
빠른 행렬 곱셈 가속은 처음에는 그래픽스처럼 특정 문제에 유용해서 하드웨어로 구현된 것임
가중치별 활성화 함수가 정말 잘 먹힌다면, 사람들은 금방 이를 하드웨어에서 실행하는 방법을 찾아낼 것임
- 가중치별 활성화 함수는 이산 코사인 변환으로 근사할 수 있을 것처럼 들림. JPEG 압축도 이걸 쓰고, 하드웨어 가속도 있음
-
흔한 “Transformer를 이런저런 방식으로 바꿔서 이런저런 벤치마크에서 조금 나아졌다”는 식이 아닌 새 AI 연구를 보니 신선함
그런 점진적 개선 논문들도 중요하지만 다들 조금 지쳐가는 중이고, 일화적 증거와 최근 연구를 보면 Transformer 고유의 근본적 한계에 가까워지는 것 같아서 새로운 대안이 필요할 수도 있음(https://news.ycombinator.com/item?id=40179232)
이번 작업의 가장 좋은 점은 양자택일이 아니라는 것임. 제안된 학습 가능한 스플라인 보간 활성화 함수는 기존 심층 신경망에도 넣어서 표현력을 높일 수 있음
이제 실제로 더 잘 동작하는지 테스트하면 됨- 실제로는 이런 연구가 꽤 많음. 다만 추가 심사를 거치거나 아예 통과하지 못하는 경우가 많고, MIT나 CIT 같은 특별한 배경이 없으면 HN까지 올라오지 못함
PR이 너무 강한 힘이 되었고, 예전에도 있었지만 지금은 더 영향력이 커진 듯함
이런 글에 추천을 누르고, 심사 대상이라면 최고 성능 갱신에만 집중하지 않는 방식으로 맞설 수 있음. 그 기준은 이미 게임화됐고 우리를 잘못된 방향으로 이끄는 게 분명함 - 1989년 당시 신경망 열풍 속에서 Robert Hecht Nielsen의 신경망 책을 읽었음. 아마 두 번째 열풍이었고, 첫 번째는 Rosenblatt의 하드웨어 퍼셉트론에서 시작해 Minsky와 Papert의 “Perceptrons” 원고 이후 식었던 흐름이었을 것임
지금 기준으로 보면 책에 나온 내용은 우스울 정도로 기본적이었지만, 동기로 제시된 것은 Kolmogorov 표현 정리였음. 적절한 활성화 함수를 가진 적당한 3층 네트워크는 임의의 연속 m-to-n 함수를 표현할 수 있다는 내용임
그 이유 때문인지 당시 연구 대부분은 3층 네트워크에 집중했고, Sigmoid 활성화가 대세였으며, 기울기 소실이 주요 문제였음
AlexNet이 1990년대 AI 겨울 이후 신경망 연구를 되살리기까지 20년이 걸렸음 - 과학은 원래 이런 면이 있음. 95%는 이미 있는 것에 대한 보통에서 괜찮은 수준의 개선을 만들고, 그 과정에서 연구자들이 성장해 정말 흥미로운 일을 하게 됨
- 실제로는 이런 연구가 꽤 많음. 다만 추가 심사를 거치거나 아예 통과하지 못하는 경우가 많고, MIT나 CIT 같은 특별한 배경이 없으면 HN까지 올라오지 못함
-
프리프린트를 보면 입력 차원 100개를 “높다”고 보고, 다룬 문제 대부분은 입력 차원이 5개 이하임
내가 봐온 물리학 영감 기반 기계학습 설정에서는 전형적인 모습임
다음 단계는 MNIST에서 보여주는 것이고, MNIST의 784차원도 현대 기준으로는 아주 작음- 실제 비즈니스 프로세스에는 입력 차원이 100개 미만인 기계학습 문제가 많음
하지만 그런 문제 대부분에서는 결정 트리가 여전히 신경망과 경쟁력이 있거나 오히려 더 잘함
- 실제 비즈니스 프로세스에는 입력 차원이 100개 미만인 기계학습 문제가 많음
-
흥미로움. Kolmogorov 신경망은 불연속 함수를 표현할 수 있지만(https://arxiv.org/abs/2311.00049), 실제 적용 가능성이 어느 정도인지 궁금했음
이 저장소는 그래도 어느 정도 쓸모가 있음을 보여주는 듯함- 불연속 함수에는 아직 실용적이지 않음. 인용한 논문도 설명하듯이, 불연속 유계 함수에 대해 g가 존재한다는 것은 알지만 그것을 찾는 방법은 없음
논문에도 “불연속 유계 및 비유계 함수의 경우 g를 실용적으로 구성하는 방법은 아직 알려져 있지 않다”고 되어 있음
OP의 arXiv 링크(https://arxiv.org/abs/2404.19756)를 보면 이들은 스플라인을 사용하고 있음
여전히 흥미롭고 잠재적으로 유용하지만, 추가 발견 없이는 불연속 함수에는 유용하지 않음. 내가 틀렸다면 링크를 주면 좋겠고, 매우 관심 있는 주제임
- 불연속 함수에는 아직 실용적이지 않음. 인용한 논문도 설명하듯이, 불연속 유계 함수에 대해 g가 존재한다는 것은 알지만 그것을 찾는 방법은 없음
-
성급한 반응일 수 있지만, B-스플라인의 선형 결합은 또 다른 더 높은 차수의 B-스플라인 아닌가?
결국 함수에 고차 B-스플라인을 맞추는 것뿐 아닌지 궁금함- 단일 노드나 단일 레이어라면 맞음. 하지만 한 레이어의 출력이 다음 레이어의 입력으로 들어가면 더 이상 단순한 스플라인의 선형 결합이 아님
-
흥미롭게도 이 접근과 MLP의 토대는 약 66년 전 거의 같은 시기에 발명되거나 발견됐음
1957년: https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Arnold_representation_theorem
1958년: https://en.wikipedia.org/wiki/Multilayer_perceptron
또 하나의 장점은 이 접근에는 지역 활성화 함수의 계수라는 한 종류의 파라미터만 있는 반면, MLP에는 가중치, 편향, 전역적으로 동일한 활성화 함수라는 세 종류의 파라미터가 있다는 점임
모두가 Transformer를 이야기하지만, 나는 이 접근을 쓴 확산 모델을 보고 싶음- 편향은 항상 켜져 있는 입력에 대한 가중치일 뿐임
선형 합의 가중치와 스플라인의 계수 사이에도 큰 차이는 없어 보임 - 세 번째에 대해 말하면, 대부분의 확산 모델은 이미 Transformer 기반 아키텍처를 사용함
자기 어텐션과 교차 어텐션을 넣은 U-Net, Vision Transformer, Diffusion Transformer 등이 있음 - 2번이 차이인 것은 맞음. 그런데 왜 그게 장점이 되는지 궁금함
간결성, 즉 오컴의 면도날 관점에서 주장할 수는 있을 듯한데, 그런 생각인지 아니면 다른 이유가 있는지 궁금함 - 내가 틀릴 수도 있지만, 현대 LLM에서는 편향을 거의 쓰지 않는 것으로 알고 있음
- 편향은 항상 켜져 있는 입력에 대한 가중치일 뿐임
-
누군가 스플라인을 결정 트리에 쑤셔 넣은 느낌임
- 스플라인은 맞는데, 결정 트리는 잘 모르겠음. 내가 놓친 게 있나?
PDF 2쪽에는 “KAN의 노드는 비선형성을 적용하지 않고 들어오는 신호를 단순히 합산한다”고 되어 있음
- 스플라인은 맞는데, 결정 트리는 잘 모르겠음. 내가 놓친 게 있나?