2 điểm bởi GN⁺ 2024-05-02 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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”“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áckhả 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ênpip
  • Cách cài cho nhà phát triển:
  • Cài từ GitHub:
  • 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, pyyaml v.v.
  • Người dùng Conda có thể tạo môi trường python=3.9.7 rồ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ọi model.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
  • Độ 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
    • grid quan trọng hơn width, nên đề xuất trước tiên giảm grid, sau đó mới giảm width
  • 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 efficientkanFourierKAN
  • 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

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

    • Khi tôi thử chỉnh phần triển khai tối qua, dùng hàm cơ sở xuyên tâm thay cho hệ số Fourier ổn định hơn trong việc huấn luyện các mạng sâu hơn 2 tầng
      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
    • Nếu ghép triển khai của Noesis với efficientKAN của Blealtan(https://github.com/Blealtan/efficient-kan), ta sẽ có một cấu trúc rất giống Siren (MLP dùng hàm kích hoạt sin)
      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
    • Mã có thật sự chạy không? Đã huấn luyện thử chưa? Có đồ thị không?
      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 tò mò dòng mô hình này thân thiện với GPU đến mức nào
  • 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ập nhật 2: Với dạng (2, 2, 2), tôi đã đạt độ chính xác huấn luyện 100%, độ chính xác kiểm thử 99%
      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
    • Tôi đồng ý rằng cần ví dụ lớn hơn. Tôi cho rằng ví dụ đồ chơi không mấy hữu ích với các kỹ thuật học máy hiện đạ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 CUDA là khả thi, và một trong các ví dụ có chỉ cách làm. Tuy nhiên khi tôi thử thì nó chậm hơn CPU
      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

    • Đúng vậy. Tôi tìm kiếm KAN và GAM rồi đến được đây, và đây cũng chính là suy nghĩ đầu tiên nảy ra với tôi
  • 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

    • Hàm kích hoạt theo từng trọng số nghe có vẻ có thể xấp xỉ bằng biến đổi cosin rời rạc. Nén JPEG cũng dùng cái này, và cũng có tăng tốc phần cứ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

    • Thực ra có khá nhiều nghiên cứu kiểu này. Chỉ là chúng thường phải qua thêm vòng bình duyệt, hoặc thậm chí không được thông qua, và nếu không có nền tảng đặc biệt như MIT hay CIT thì khó lên tới HN
      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
    • Vào năm 1989, giữa cơn sốt mạng nơ-ron khi đó, tôi đã đọc cuốn sách về mạng nơ-ron của Robert Hecht Nielsen. Có lẽ đó là làn sóng thứ hai; làn sóng đầu tiên bắt đầu từ perceptron phần cứng của Rosenblatt và lắng xuống sau bản thảo “Perceptrons” của Minsky và Papert
      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
    • Khoa học vốn có khía cạnh như vậy. 95% là tạo ra những cải tiến từ bình thường đến khá tốt trên những thứ đã có, và trong quá trình đó các nhà nghiên cứu trưởng thành để làm những việc thực sự thú vị
  • 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

    • Trong các quy trình kinh doanh thực tế có nhiều bài toán học máy với chiều đầu vào dưới 100
      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 đó

    • Với hàm không liên tục thì vẫn chưa thực dụng. Như bài báo bạn trích cũng giải thích, ta biết rằng với hàm bị chặn không liên tục thì tồn tại g, nhưng không có cách tìm nó
      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

    • Nếu là một nút đơn lẻ hoặc một lớp đơn lẻ thì đúng. Nhưng khi đầu ra của một lớp được đưa vào làm đầu vào cho lớp tiếp theo, nó không còn là tổ hợp tuyến tính của spline đơn giản nữa
  • Đ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

    • Bias chỉ là trọng số cho một đầu vào luôn bật mà thôi
      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
    • Nói về điểm thứ ba, phần lớn các mô hình khuếch tán hiện đã dùng kiến trúc dựa trên Transformer
      Có U-Net đưa self-attention và cross-attention vào, Vision Transformer, Diffusion Transformer, v.v.
    • Đúng là số 2 là một khác biệt. Nhưng tôi tò mò vì sao điều đó lại trở thành ưu điểm
      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ó thể tôi sai, nhưng theo tôi biết thì trong các LLM hiện đại hầu như không dùng bias
  • Cảm giác như ai đó nhồi spline vào cây quyết định vậy

    • Spline thì đúng, nhưng cây quyết định thì tôi không rõ. Có gì tôi đã bỏ sót không?
      Ở 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”