Bỏ qua tới nội dung chính
Quay lại tin tức

Mạng lưới thần kinh sâu: 33 năm trước và 33 năm sau

Andrej Karpathy Blog· 14/3/2022models

Yann LeCun và cộng sự. (1989) bài báo Lan truyền ngược áp dụng cho nhận dạng mã Zip viết tay Tôi tin rằng nó có ý nghĩa lịch sử nào đó bởi vì, theo hiểu biết của tôi, đây là ứng dụng sớm nhất trong thế giới thực của mạng lưới thần kinh được đào tạo từ đầu đến cuối với lan truyền ngược. Ngoại trừ tập dữ liệu nhỏ (7291 hình ảnh chữ số thang độ xám 16x16) và mạng thần kinh nhỏ được sử dụng (chỉ 1.000 nơ-ron), bài báo này ngày nay trở nên hiện đại đáng kể, 33 năm sau - nó đưa ra một tập dữ liệu, mô tả kiến ​​trúc mạng thần kinh, hàm mất mát, tối ưu hóa và báo cáo tỷ lệ lỗi phân loại thử nghiệm trên t

Yann LeCun và cộng sự. (1989) bài báo Lan truyền ngược áp dụng cho nhận dạng mã Zip viết tay Tôi tin rằng nó có ý nghĩa lịch sử nào đó bởi vì, theo hiểu biết của tôi, đây là ứng dụng sớm nhất trong thế giới thực của mạng lưới thần kinh được đào tạo từ đầu đến cuối với lan truyền ngược. Ngoại trừ tập dữ liệu nhỏ (7291 hình ảnh chữ số thang độ xám 16x16) và mạng thần kinh nhỏ được sử dụng (chỉ 1.000 nơ-ron), bài báo này ngày nay trở nên hiện đại đáng kể, 33 năm sau - nó đưa ra một tập dữ liệu, mô tả kiến ​​trúc mạng thần kinh, hàm mất mát, tối ưu hóa và báo cáo tỷ lệ lỗi phân loại thử nghiệm trên các tập huấn luyện và kiểm tra. Tất cả đều rất dễ nhận biết và kiểm tra kiểu như một bài viết học sâu hiện đại, ngoại trừ việc nó đã có từ 33 năm trước. Vì vậy, tôi bắt đầu viết lại bài báo 1) cho vui nhưng 2) sử dụng bài tập này như một nghiên cứu điển hình về bản chất của sự tiến bộ trong học sâu. Thực hiện. Tôi đã cố gắng theo sát bài báo nhất có thể và triển khai lại mọi thứ trong PyTorch trong kho lưu trữ karpathy/lecun1989-repro github này. Mạng ban đầu được triển khai trong Lisp bằng cách sử dụng SN mô phỏng lan truyền ngược Bottou và LeCun 1988 (sau này được đặt tên là Lush). Bài viết bằng tiếng Pháp nên tôi không thể đọc được nó, nhưng từ cú pháp, có vẻ như bạn có thể chỉ định mạng lưới thần kinh bằng API cấp cao hơn tương tự như những gì bạn làm trong PyTorch ngày nay. Như một lưu ý nhanh về thiết kế phần mềm, các thư viện hiện đại đã áp dụng một thiết kế chia thành 3 thành phần: 1) thư viện Tensor chung nhanh (C/CUDA) thực hiện các phép toán cơ bản trên các tenxơ đa chiều và 2) một công cụ tự động chuyển đổi theo dõi biểu đồ tính toán chuyển tiếp và có thể tạo ra các hoạt động cho quá trình truyền ngược và 3) API cấp cao, nhận biết sâu (Python) có thể viết được của các hoạt động học sâu, lớp, kiến trúc, trình tối ưu hóa, hàm mất mát phổ biến, v.v. Đào tạo. Trong quá trình đào tạo, chúng ta phải thực hiện 23 lượt qua tập huấn luyện gồm 7291 ví dụ, với tổng số 167.693 bản trình bày (ví dụ, nhãn) cho mạng nơ-ron. Mạng ban đầu được đào tạo trong 3 ngày trên máy trạm SUN-4/260. Tôi đã chạy triển khai trên CPU MacBook Air (M1) của mình và CPU này xử lý nó trong khoảng 90 giây (tăng tốc ~ 3000 lần so với mức ban đầu). Conda của tôi được thiết lập để sử dụng bản dựng arm64 gốc, thay vì mô phỏng Rosetta. Tốc độ tăng tốc có thể ấn tượng hơn nếu PyTorch hỗ trợ toàn bộ khả năng của M1 (bao gồm GPU và NPU), nhưng điều này dường như vẫn đang được phát triển. Tôi cũng đã thử chạy mã trên GPU A100 một cách ngây thơ, nhưng quá trình đào tạo thực sự chậm hơn, rất có thể là do mạng quá nhỏ (convnet 4 lớp với tối đa 12 kênh, tổng cộng 9760 thông số, 64K MAC, kích hoạt 1K) và SGD chỉ sử dụng một ví dụ duy nhất tại một thời điểm. Điều đó có nghĩa là, nếu một người thực sự muốn giải quyết vấn đề này bằng cơ sở hạ tầng phần cứng (A100) và phần mềm hiện đại (CUDA, PyTorch), thì chúng ta cần đổi SGD trên mỗi mẫu để đào tạo toàn bộ nhằm tối đa hóa việc sử dụng GPU và rất có thể đạt được tốc độ trễ đào tạo khác ~ 100 lần. Tái tạo hiệu suất năm 1989. Bài báo gốc báo cáo các kết quả sau: eval: chia tàu. thua 2,5e-3. lỗi 0,14%. bỏ lỡ: 10 đánh giá: kiểm tra phân tách. thua 1,8e-2. lỗi 5,00%. bỏ lỡ: 102 Trong khi tập lệnh đào tạo của tôi repro.py ở dạng hiện tại được in ở cuối lượt thứ 23: eval: chia tàu. mất 4.073383e-03. sai số 0,62%. bỏ lỡ: 45 đánh giá: kiểm tra phân tách. mất 2.838382e-02. lỗi 4,09%. nhớ: 82 Vì vậy, tôi đang sao chép các con số một cách đại khái, nhưng không chính xác. Đáng buồn thay, rất có thể không thể sao chép chính xác vì tôi tin rằng tập dữ liệu gốc đã bị thất lạc theo thời gian. Thay vào đó, tôi phải mô phỏng nó bằng cách sử dụng tập dữ liệu MNIST lớn hơn (hah chưa bao giờ nghĩ rằng tôi sẽ nói như vậy) bằng cách lấy các chữ số 28x28 của nó, thu nhỏ chúng xuống 16x16 pixel bằng phép nội suy song tuyến tính và ngẫu nhiên không thay thế, vẽ đúng số lượng tập huấn luyện và ví dụ tập kiểm tra từ nó. Nhưng tôi chắc chắn còn có những thủ phạm khác. Ví dụ: bài viết hơi quá trừu tượng khi mô tả sơ đồ khởi tạo trọng số và tôi nghi ngờ rằng có một số lỗi định dạng trong tệp pdf, chẳng hạn như xóa dấu chấm “.”, làm cho “2.5” trông giống như “2 5”, và có khả năng (tôi nghĩ vậy?) xóa căn bậc hai. Ví dụ. Chúng tôi được biết rằng trọng số init được rút ra từ đồng nhất “2 4 / F” trong đó F là fan-in, nhưng tôi đoán điều này chắc chắn (?) có nghĩa là “2,4 / sqrt(F)”, trong đó sqrt giúp duy trì độ lệch chuẩn của đầu ra. Cấu trúc kết nối thưa thớt cụ thể giữa các lớp H1 và H2 của mạng cũng được lướt qua, bài báo chỉ nói rằng nó “được chọn theo sơ đồ sẽ không được thảo luận ở đây”, vì vậy tôi đã phải đưa ra một số phỏng đoán hợp lý ở đây với một cấu trúc thưa thớt khối chồng chéo. Bài báo cũng tuyên bố sử dụng tính phi tuyến tính của tanh, nhưng tôi lo lắng rằng đây thực sự có thể là “tanh chuẩn hóa” ánh xạ ntanh(1) = 1 và có khả năng có thêm kết nối bỏ qua tỷ lệ thu nhỏ, vốn là xu hướng vào thời điểm đó để đảm bảo có ít nhất một chút độ dốc ở phần đuôi phẳng của tanh. Cuối cùng, bài viết sử dụng “phiên bản đặc biệt của thuật toán Newton sử dụng phép tính gần đúng theo đường chéo của Hessian”, nhưng tôi chỉ sử dụng SGD vì nó đơn giản hơn đáng kể và theo bài báo, “thuật toán này không được cho là mang lại sự gia tăng đáng kể về tốc độ học tập”. Gian lận với việc du hành thời gian. Khoảng thời gian này đã đến phần yêu thích của tôi. Chúng ta sẽ sống ở đây trong tương lai 33 năm nữa và học sâu là một lĩnh vực nghiên cứu rất tích cực. Chúng ta có thể cải thiện kết quả ban đầu đến mức nào bằng cách sử dụng hiểu biết hiện đại và 33 năm R&D? Kết quả ban đầu của tôi là: eval: chia tàu. mất 4.073383e-03. sai số 0,62%. bỏ lỡ: 45 đánh giá: kiểm tra phân tách. mất 2.838382e-02. lỗi 4,09%. nhớ: 82 Điều đầu tiên tôi phác thảo một chút là chúng tôi đang thực hiện phân loại đơn giản thành 10 loại, nhưng tại thời điểm đó, việc này được mô hình hóa dưới dạng hồi quy lỗi bình phương trung bình (MSE) thành các mục tiêu -1 (đối với lớp phủ định) hoặc +1 (đối với lớp tích cực), w

Nguồn tin: Andrej Karpathy Blog. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.