3 điểm bởi GN⁺ 2023-08-27 | 1 bình luận | Chia sẻ qua WhatsApp
  • Bài viết giải thích một khái niệm quan trọng là tự động vi phân bằng Python, đây là thành phần cốt lõi trong quá trình huấn luyện mạng nơ-ron.
  • Tác giả là một kỹ sư machine learning, sử dụng các thư viện như Tensorflow và Pytorch, và đặt mục tiêu viết đoạn mã đơn giản nhất để thực hiện tự động vi phân.
  • Tác giả bắt đầu bằng cách viết mã Python thực hiện phép cộng giữa hai biến xy, rồi gán kết quả cho biến z. Tuy nhiên, z không theo dõi các biến đã được sử dụng, nên không thể tự động cập nhật giá trị của z khi giá trị của x hoặc y thay đổi.
  • Để giải quyết điều này, tác giả giới thiệu lớp Tensor, cho phép tính toán ký hiệu trên các biến. Trong lớp này, phép cộng được định nghĩa lại.
  • Lớp Tensor tiếp tục được cải tiến bằng cách sử dụng cây nhị phân. Mỗi tensor có thể chứa hai tensor khác và phép toán đã tạo ra nó. Điều này được thực hiện bằng cách đưa vào tuple Children.
  • Tác giả thêm phương thức forward vào lớp Tensor để chạy đồ thị tính toán và tính giá trị thực của tensor.
  • Tác giả đưa tự động vi phân vào đồ thị tính toán bằng cách bổ sung đạo hàm cho các phép toán cơ bản mà lớp Tensor hỗ trợ. Các lời gọi đệ quy tới hàm grad sẽ duyệt qua đồ thị tính toán và phân rã các hàm phức tạp thành tổ hợp của các hàm đơn giản.
  • Lớp Tensor được mở rộng để xử lý các công thức phức tạp hơn bằng cách thêm các phép toán như trừ, chia, lũy thừa và phủ định.
  • Tác giả minh họa cách sử dụng lớp Tensor bằng cách tạo ra các công thức phức tạp và tính đạo hàm của chúng.
  • Tác giả kết luận bằng cách đề xuất các cải tiến và tối ưu hóa khả dĩ cho lớp Tensor, như bổ sung phép toán cho mảng có kích thước bất kỳ, dừng duyệt tại các nút không phụ thuộc vào tensor x, và thiết lập bộ nhớ đệm để tránh lặp lại phép tính.
  • Bài viết nhằm giúp độc giả hiểu cách tự động vi phân được thực hiện để tối ưu hóa và huấn luyện mạng nơ-ron.

1 bình luận

 
GN⁺ 2023-08-27
Ý kiến trên Hacker News
  • Độc giả đánh giá cao những phần trình diễn mã ngắn gọn và thanh nhã giúp hiểu các khái niệm phức tạp.
  • Phần giải thích về automatic differentiation trong bài có vẻ bị đơn giản hóa quá mức vì chỉ đề cập đến trường hợp đồ thị là cây, không xử lý các đồ thị có hướng không chu trình phức tạp hơn.
  • Một số độc giả thấy automatic differentiation rất thú vị và đã tự viết phần giới thiệu riêng về khái niệm này.
  • Một độc giả đã chia sẻ bản autodiff do chính mình triển khai chỉ với 26 dòng Python.
  • Các kỹ thuật được thảo luận tương tự với những gì được dùng trong "theo dõi phụ thuộc" và trong các hệ thống Knowledge Based Engineering nhằm giảm khối lượng tính toán trong các mô hình 3D tham số quy mô lớn.
  • Video của Andrej Karpathy về cách xây dựng autograd engine được khuyến nghị vì rất giàu tính gợi mở.
  • Một số độc giả cho rằng autodiff không nhất thiết phải xây dựng đồ thị phép toán mà có thể tính các giá trị tương ứng ngay tại chỗ.
  • Có ý kiến cho rằng giải thích autodiff như quy tắc dây chuyền ở dạng số sẽ rõ ràng hơn.
  • Một câu hỏi được đặt ra về cơ sở để gọi lớp này là tensor.
  • Tính đơn giản của phần triển khai đã khiến một số độc giả ngạc nhiên, và nhờ đó khái niệm này trở nên dễ tiếp cận hơn họ từng nghĩ.
  • Phần triển khai được so sánh với free monad của Haskell, cho thấy sự liên hệ giữa các ngôn ngữ trong bài viết.