Phát triển mạng Kolmogorov-Arnold
(github.com/KindXiaoming)- pykan là kho lưu trữ GitHub cho các bài báo “KAN: Kolmogorov-Arnold Networks” và “KAN 2.0: Kolmogorov-Arnold Networks Meet Science”, cung cấp huấn luyện, hướng dẫn, tài liệu và ví dụ về KAN
- KAN được giới thiệu như một phương án thay thế cho MLP; tương tự như MLP dựa trên định lý xấp xỉ phổ quát, KAN dựa trên định lý biểu diễn Kolmogorov-Arnold
- Về mặt cấu trúc, MLP có hàm kích hoạt ở các nút còn KAN có hàm kích hoạt trên các cạnh; thay đổi này được mô tả là có thể cải thiện độ chính xác và khả năng diễn giải của mô hình
- Người dùng machine learning không dùng nhánh tính toán ký hiệu phải gọi
model.speed()trước khi huấn luyện; nếu không, symbolic branch không được song song hóa có thể khiến việc chạy rất chậm - Cách triển khai này chủ yếu nhắm tới các bài toán khoa học quy mô nhỏ, không dễ xem như plugin cắm-và-chạy cho tác vụ machine learning, và cần tinh chỉnh siêu tham số cũng như kỹ thuật theo từng ứng dụng
Tổng quan về pykan và KAN
- pykan là kho lưu trữ cho “KAN: Kolmogorov-Arnold Networks” và “KAN 2.0: Kolmogorov-Arnold Networks Meet Science”
- Bắt đầu nhanh có tại hellokan, ví dụ bổ sung có trong tutorials, và tài liệu có tại tài liệu chính thức
- KANs được giới thiệu là một phương án thay thế đầy hứa hẹn cho Multi-Layer Perceptrons (MLPs)
- MLP dựa trên universal approximation theorem
- KAN dựa trên Kolmogorov-Arnold representation theorem
- KAN và MLP được mô tả là có cấu trúc đối ngẫu
- KAN có hàm kích hoạt trên các cạnh
- MLP có hàm kích hoạt trên các nút
- Thay đổi cấu trúc này được mô tả là có thể giúp độ chính xác và khả năng diễn giải của KAN tốt hơn MLP
Cài đặt và môi trường chạy
- pykan có thể được cài từ PyPI hoặc GitHub
- Yêu cầu trước là Python 3.9.7 trở lên và
pip - Cách cài cho nhà phát triển:
git clone https://github.com/KindXiaoming/pykan.gitcd pykanpip install -e .
- Cài từ GitHub:
pip install git+https://github.com/KindXiaoming/pykan.git
- Cài từ PyPI:
pip install pykan
- Các gói phụ thuộc chính gồm
matplotlib,numpy,scikit_learn,sympy,torch,tqdm,pandas,seaborn,pyyamlv.v. - Người dùng Conda có thể tạo môi trường
python=3.9.7rồi cài theo cách GitHub hoặc PyPI
Chế độ hiệu năng và yêu cầu tính toán
- Nếu người dùng machine learning tự viết vòng lặp huấn luyện, không dùng
model.fit()và không dùng symbolic branch, thì việc gọimodel.speed()trước khi huấn luyện là rất quan trọng - Nếu không gọi
model.speed(), symbolic branch sẽ vẫn bật, và do tính toán ký hiệu không được song song hóa nên có thể rất chậm - Các ví dụ trong tutorials thường có thể chạy trong dưới 10 phút trên một CPU đơn
- Tất cả ví dụ trong bài báo có thể chạy trong dưới một ngày trên một CPU đơn
- Huấn luyện KAN cho PDE là tốn kém nhất, có thể mất vài giờ đến vài ngày trên một CPU đơn
- Lý do dùng CPU để huấn luyện mô hình là vì đã thực hiện quét tham số trên hàng nghìn mô hình nhỏ để thu được Pareto Frontier của MLP và KAN
- Với các tác vụ có quy mô bài toán lớn, khuyến nghị dùng GPU
Tinh chỉnh siêu tham số cho KAN
- Trực giác có được từ MLP và các mạng khác có thể không áp dụng nguyên xi cho KAN
- Lời khuyên cơ bản là bắt đầu từ cấu hình đơn giản
- KAN shape nhỏ
- grid size nhỏ
- dữ liệu nhỏ
- không regularization,
lamb=0
- Ví dụ, với bài toán có 5 đầu vào và 1 đầu ra, có thể thử bắt đầu từ cấu hình rất đơn giản như
KAN(width=[5,1,1], grid=3, k=3) - Nếu không hoạt động, khuyến nghị trước tiên tăng width; nếu vẫn không được thì tăng depth
- Khi hiệu năng đạt mức chấp nhận được, có thể tinh chỉnh tiếp sang KAN chính xác hơn hoặc dễ diễn giải hơn
- Nếu ưu tiên độ chính xác, có thể thử kỹ thuật grid extension, nhưng cần chú ý hiện tượng overfitting
- Nếu ưu tiên khả năng diễn giải, có thể làm thưa mạng bằng cách như
model.train(lamb=0.01)- Khuyến nghị tăng dần
lamb - Nếu sau khi huấn luyện, biểu đồ cho thấy các neuron rõ ràng là vô dụng, có thể lấy mô hình đã được cắt tỉa bằng
pruned_model = model.prune() - Sau đó có thể huấn luyện thêm để tối ưu độ chính xác hoặc độ thưa, hoặc thực hiện symbolic regression
- Khuyến nghị tăng dần
- Độ chính xác, khả năng diễn giải và hiệu quả tham số không phải lúc nào cũng xung đột nhau; tùy trường hợp có thể tương quan dương hoặc có tradeoff
- Nếu có chênh lệch lớn giữa train/test loss, nên cân nhắc tăng dữ liệu hoặc giảm mô hình
- Vì
gridquan trọng hơnwidth, nên đề xuất trước tiên giảmgrid, sau đó mới giảmwidth
- Vì
- Khuyến nghị bắt đầu từ mô hình đơn giản, kiểm tra trạng thái underfitting trước, rồi mở rộng dần để đi tới vùng phù hợp
Phạm vi áp dụng và giới hạn
- Mã nguồn được thiết kế với mục tiêu là các bài toán khoa học quy mô nhỏ như ví dụ toán học và vật lý
- Do không đặc biệt chú trọng hiệu quả và khả năng tái sử dụng, tác giả cho biết chấp nhận những phê bình về các khía cạnh đó
- Đối tượng người dùng ban đầu là những người quan tâm đến khám phá khoa học và tính toán khoa học, và kho lưu trữ cũng dự kiến chủ yếu giữ mục tiêu này
- Các triển khai cải thiện hiệu quả được nhắc đến gồm efficientkan và FourierKAN
- Với người dùng thiên về machine learning, KAN hiện vẫn chưa phải một plugin out-of-the-box đơn giản
- cần tinh chỉnh siêu tham số
- có thể cần thêm các kỹ thuật chuyên biệt theo từng ứng dụng
- GraphKAN đề xuất rằng nên dùng KAN trong latent space, và đề cập việc cần có embedding/unembedding linear layer ở sau đầu vào và trước đầu ra
- KANRL đề xuất rằng trong reinforcement learning, có thể nên cố định một số tham số có thể học để tăng độ ổn định huấn luyện
- Về việc KAN có trở thành LLM thế hệ tiếp theo hay không, tác giả nói rằng chưa có trực giác tốt
- KAN được thiết kế cho các ứng dụng coi trọng độ chính xác cao và khả năng diễn giải
- Khả năng diễn giải trong LLM và trong khoa học có thể rất khác nhau
- Tác giả cho rằng khó có thể chuyển trực tiếp kết luận của bài báo sang LLM hay các tác vụ machine learning nói chung
- KAN và MLP không thể thay thế lẫn nhau, và mỗi bên đều có ưu điểm cũng như giới hạn trong những thiết lập nhất định
1 bình luận
Ý kiến trên Hacker News
Tôi lướt nhanh bài báo và muốn thử đơn giản hóa hơn nên đã tạo một layer PyTorch: https://github.com/GistNoesis/FourierKAN/
Phần cốt lõi thật sự chỉ vài dòng. Trong bài báo, mã có vẻ hướng đến quy mô nhỏ hơn: dùng nội suy spline để biểu diễn các hàm một chiều rồi cộng các kết quả lại
Thay vào đó, tôi chọn một cách biểu diễn khác là dùng hệ số Fourier để nội suy hàm của từng tọa độ; có lẽ nó giúp hình dung khả năng biểu diễn của mạng Kolmogorov-Arnold. Có thể hội tụ dễ hơn phiên bản spline, nhưng số phép tính thì spline ít hơn
Tất nhiên, việc mã của tôi không chạy không có nghĩa là phía bài báo không chạy. Nếu muốn thì cứ thử nghiệm rồi viết thành bài báo cũng được
Tôi cũng đã thử hệ số Fourier vì chúng song song hóa tốt và dễ viết, nhưng hành vi huấn luyện thì hàm cơ sở xuyên tâm tốt hơn
efficientKAN trước hết tính các hàm cơ sở chung cho mọi kích hoạt trên cạnh, rồi tính đầu ra dưới dạng tổ hợp tuyến tính của các cơ sở đó
Nếu hàm cơ sở là Fourier, một layer KAN có thể được xem như layer tuyến tính trọng số cố định + kích hoạt sin + layer tuyến tính trọng số học được, tức là một dạng đặc biệt của Siren
Đây có thể là một ví dụ cho thấy mối liên hệ giữa KAN và MLP
Dù nói “việc mã của tôi không chạy không có nghĩa là phía bài báo không chạy”, tôi vẫn tò mò liệu nó có chạy được thật không
Tôi đã thử chỉnh một chút notebook Jupyter của các tác giả, và cá nhân tôi thấy Example_3_classfication.ipynb(https://github.com/KindXiaoming/pykan/blob/master/tutorials/Example_3_classfication.ipynb) là hữu ích nhất
Với các tham số do tác giả chọn thì nó hoạt động như mô tả, nhưng trong phần thiết lập phân loại ở nửa sau tutorial, nếu đổi dạng mạng từ (2, 2) sang (2, 2, 2) thì nó không tổng quát hóa được
Loss huấn luyện giảm xuống đến 1e-9 nhưng loss kiểm thử vẫn quanh 3e-1, và chuyển sang mạng lớn hơn cũng không giúp ích
Cần những ví dụ có tham số và độ phức tạp dữ liệu lớn hơn nhiều, và tôi cũng muốn xem liệu nó có thật sự huấn luyện được không. MNIST có vẻ là điểm khởi đầu tốt
Cập nhật: tăng kích thước tập huấn luyện lên 100 lần thì overfitting giảm, nhưng giờ lại không thể kéo loss huấn luyện xuống dưới 1e-2. Tôi vẫn đang tiếp tục thử nghiệm và rất cần tăng tốc GPU. Hiện tại tốc độ CPU đang hạn chế tiến độ
Có ba thay đổi. Tôi tăng tập huấn luyện từ 1.000 lên 100k mẫu để xử lý overfitting, và giảm nhẹ nhiễu trong quá trình tạo dữ liệu từ 0.1 xuống 0.07 để các lớp không chồng lấn
Phần quan trọng nhất và đặc thù với KAN là huấn luyện 30 bước với grid=5, sau đó khởi tạo từ mô hình trước và huấn luyện 30 bước với grid=10, rồi lại 30 bước với grid=20. Đây là cách làm quen thuộc trong KAN và được nêu trong Example_1_function_fitting.ipynb(https://github.com/KindXiaoming/pykan/blob/master/tutorials/Example_1_function_fitting.ipynb)
Ấn tượng chung là nó có chạy, triển khai tham chiếu rất chậm nên rất cần bản triển khai GPU, và nó cho cảm giác phi tuyến mạnh hơn MLP + ReLU nhưng độ ổn định khi huấn luyện kém hơn
Chưa có gì đảm bảo rằng nó mở rộng tốt, và nhất định cần xem liệu có thể giải MNIST bằng cách tiếp cận này không. Tôi sẽ tiếp tục theo dõi
Nếu những ý tưởng lớn như Transformer, LSTM, ADAM chỉ được kiểm thử trên đường cong y=sin(x) với tập huấn luyện 50 con số, rất có thể chúng ta đã loại bỏ nhầm các ý tưởng đó
Chạy trên GPU không phải lúc nào cũng nhanh hơn, đặc biệt khi có nhiều rẽ nhánh thì điều này không có gì đáng ngạc nhiên
Đáng tiếc là các tensor liên quan không phải tất cả đều được đưa lên đúng device, nên tôi đã phải sửa KAN.py và KANLayer.py. Nhìn một số định dạng thì có vẻ từng có dấu vết của tham số device trước đây
Trong thống kê cổ điển có một mô hình lấy cảm hứng từ Kolmogorov-Arnold gọi là GAM(https://en.wikipedia.org/wiki/Generalized_additive_model), do Hastie và Tibshirani phát triển như một phần mở rộng của GLM(https://en.wikipedia.org/wiki/Generalized_linear_model)
GLM khái quát hóa hồi quy logistic, hồi quy tuyến tính và nhiều mô hình hồi quy phổ biến khác
Neural network GAM dùng các hàm cơ sở học được cũng đã từng được đề xuất, nên tôi hơi ngạc nhiên khi bài báo mới này không nhắc đến các nghiên cứu trước đó. Các ứng dụng trước đây tập trung nhiều hơn vào tính diễn giải được
Thành công của mạng nơ-ron gắn chặt với khả năng mở rộng. Bản thân thuật toán không chỉ phải mở rộng được lên nhiều lớp hơn, mà còn phải phù hợp với phần cứng
Mạng nơ-ron phần lớn được cấu thành từ phép nhân ma trận, và GPU có tăng tốc chuyên dụng cho nhân ma trận. Lý do AlexNet có tác động lớn cũng là vì nó cho thấy có thể đưa mạng nơ-ron lên GPU để mở rộng và tăng tốc
Chỉ dựa vào bài báo thì chưa rõ thuật toán này sẽ mở rộng tốt đến đâu. Cả việc liệu về mặt thuật toán nó có học tốt khi số lớp tăng lên hay không, lẫn việc liệu nó có tận dụng tốt tăng tốc phần cứng hay không đều còn bất định
Đặc biệt, tôi không rõ cấu trúc gắn hàm kích hoạt cho từng trọng số có thể tận dụng tăng tốc nhân ma trận nhanh hay không
Đây là một ý tưởng thú vị, hoạt động tốt ở quy mô nhỏ và có những đặc tính hay, nhưng vẫn chưa thể biết liệu nó có phải là kiến trúc phù hợp cho những thứ như ImageNet hay LLM hay không
Tăng tốc nhân ma trận nhanh ban đầu được triển khai bằng phần cứng vì nó hữu ích cho một số bài toán cụ thể như đồ họa
Nếu hàm kích hoạt theo từng trọng số thực sự hiệu quả, mọi người sẽ nhanh chóng tìm ra cách chạy nó trên phần cứng
Thật mới mẻ khi thấy một nghiên cứu AI mới không phải kiểu quen thuộc “thay đổi Transformer theo cách này cách kia rồi tốt hơn một chút trên vài benchmark nọ kia”
Những bài cải tiến từng bước như vậy cũng quan trọng, nhưng mọi người đang dần hơi mệt mỏi, và dựa trên bằng chứng giai thoại cùng các nghiên cứu gần đây, có vẻ như ta đang tiến gần tới các giới hạn căn bản vốn có của Transformer, nên có thể cần những phương án thay thế mới (https://news.ycombinator.com/item?id=40179232)
Điểm hay nhất của công trình này là nó không phải lựa chọn một trong hai. Hàm kích hoạt nội suy spline có thể học được được đề xuất cũng có thể đưa vào các mạng nơ-ron sâu hiện có để tăng năng lực biểu diễn
Giờ chỉ cần kiểm thử xem trên thực tế nó có hoạt động tốt hơn không
PR đã trở thành một thế lực quá mạnh; trước đây cũng đã có, nhưng giờ dường như ảnh hưởng còn lớn hơn
Ta có thể chống lại bằng cách upvote những bài như thế này, và nếu là người bình duyệt thì không chỉ tập trung vào thiết lập kỷ lục hiệu năng mới. Tiêu chí đó đã bị game hóa và rõ ràng đang dẫn chúng ta đi sai hướng
Nhìn theo tiêu chuẩn hiện nay, nội dung trong sách cơ bản đến mức buồn cười, nhưng động lực được nêu ra là định lý biểu diễn Kolmogorov. Nội dung là một mạng 3 lớp thích hợp với hàm kích hoạt phù hợp có thể biểu diễn một hàm liên tục m-sang-n bất kỳ
Có lẽ vì lý do đó mà phần lớn nghiên cứu khi ấy tập trung vào mạng 3 lớp, hàm kích hoạt sigmoid là xu hướng chủ đạo, và tiêu biến gradient là vấn đề chính
Phải mất 20 năm cho đến khi AlexNet hồi sinh nghiên cứu mạng nơ-ron sau mùa đông AI của thập niên 1990
Nhìn vào preprint, họ xem chiều đầu vào 100 là “cao”, còn phần lớn các bài toán được xử lý có chiều đầu vào từ 5 trở xuống
Đây là hình ảnh điển hình trong các thiết lập học máy lấy cảm hứng từ vật lý mà tôi từng thấy
Bước tiếp theo là trình diễn trên MNIST, và 784 chiều của MNIST cũng rất nhỏ theo chuẩn hiện đại
Nhưng trong phần lớn các bài toán như vậy, cây quyết định vẫn cạnh tranh được với mạng nơ-ron, hoặc thậm chí làm tốt hơn
Thú vị. Mạng nơ-ron Kolmogorov có thể biểu diễn hàm không liên tục (https://arxiv.org/abs/2311.00049), nhưng tôi vẫn thắc mắc khả năng áp dụng thực tế đến mức nào
Kho lưu trữ này có vẻ cho thấy nó vẫn hữu dụng ở một mức nào đó
Trong bài báo cũng viết rằng “đối với các hàm bị chặn và không bị chặn không liên tục, hiện vẫn chưa biết cách xây dựng g một cách thực dụng”
Nếu xem liên kết arXiv của OP (https://arxiv.org/abs/2404.19756) thì họ đang dùng spline
Vẫn thú vị và có tiềm năng hữu ích, nhưng nếu không có phát hiện bổ sung thì không hữu dụng cho hàm không liên tục. Nếu tôi sai thì mong bạn gửi liên kết; đây là chủ đề tôi rất quan tâm
Có thể là phản ứng vội vàng, nhưng tổ hợp tuyến tính của B-spline chẳng phải lại là một B-spline bậc cao hơn khác sao?
Tôi tự hỏi rốt cuộc có phải chỉ là khớp B-spline bậc cao vào hàm hay không
Điều thú vị là nền tảng của cách tiếp cận này và MLP đã được phát minh hoặc khám phá gần như cùng thời điểm cách đây khoảng 66 năm
1957: https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Arnold_representation_theorem
1958: https://en.wikipedia.org/wiki/Multilayer_perceptron
Một ưu điểm nữa là cách tiếp cận này chỉ có một loại tham số, là các hệ số của hàm kích hoạt cục bộ, trong khi MLP có ba loại tham số: trọng số, bias và một hàm kích hoạt giống nhau trên toàn cục
Mọi người đều nói về Transformer, nhưng tôi muốn thấy một mô hình khuếch tán dùng cách tiếp cận này
Cũng không thấy có khác biệt lớn giữa trọng số của tổng tuyến tính và hệ số của spline
Có U-Net đưa self-attention và cross-attention vào, Vision Transformer, Diffusion Transformer, v.v.
Có thể lập luận từ góc nhìn sự ngắn gọn, tức dao cạo Occam, nhưng tôi không biết có phải ý đó không hay là có lý do khác
Cảm giác như ai đó nhồi spline vào cây quyết định vậy
Ở trang 2 của PDF có viết: “các nút của KAN không áp dụng phi tuyến tính mà chỉ đơn giản cộng các tín hiệu đầu vào lại”