Tiếp Tục Hành Trình Khám Phá Mạng Nơ-Ron - nói dối e blog

Tiếp Tục Hành Trình Khám Phá Mạng Nơ-Ron

Trong khoảng thời gian vừa qua, bên cạnh việc tập trung vào dự án game, tôi đã dành vài ngày để đào sâu nghiên cứu về mạng nơ-ron. Sau khi bài blog trước được đăng tải, tôi bất ngờ nhận được email từ nhóm bạn của NXB Turing. Không lâu sau, tôi được gửi tặng một “bộ sưu tập” gồm 9 cuốn sách tiếng Việt về trí tuệ nhân tạo do họ xuất bản. Thường thì khi các nhà xuất bản gửi sách mới, họ đều mong muốn mình có thể chia sẻ một vài cảm nhận. Dù không thích việc quảng bá sách một cách máy móc, tôi rất sẵn lòng giới thiệu những cuốn đã đọc và thấy hữu ích.

Với số lượng sách nhiều như vậy, tôi chưa thể đọc hết được. Tuy nhiên, các cuốn này đều xoay quanh cùng một chủ đề, tạo điều kiện lý tưởng để áp dụng phương pháp đọc sách theo chủ đề mà tôi học được từ cuốn “Làm thế nào để đọc một cuốn sách” năm ngoái. Theo đó, việc đọc cùng lúc nhiều sách về cùng một chủ đề sẽ giúp mở rộng góc nhìn và hiểu biết. Lần này, tôi đã thu hoạch được nhiều kiến thức mới mẻ.

Trong số những cuốn sách nhận được, có hai cuốn đặc biệt giúp tôi tiếp cận với mạng nơ-ron: “Hiểu sâu về mạng nơ-ron và học sâu” (bản dịch tiếng Việt của cuốn sách miễn phí đã đề cập) và “Nhập môn Học sâu” của tác giả người Nhật Bản. Tôi nhận thấy sách khoa học phổ thông của Nhật Bản thường trình bày rất chi tiết, kèm theo nhiều sơ đồ minh họa trực quan. Quả thực, cuốn này đã bổ sung nhiều chi tiết quan trọng mà tôi đã bỏ sót khi đọc cuốn trước, đặc biệt là phần giải thích về thuật toán lan truyền ngược. Thú vị hơn, khi tôi đăng ảnh bìa cuốn sách này trên Twitter (không tiết lộ tên sách), tác giả Saito Kagami đã phản hồi lại. Thế giới thật nhỏ bé!

Trong phần thực hành, tôi đặt mục tiêu nhỏ là xây dựng một mạng tích chập (CNN). Tuy nhiên, các đoạn mã ví dụ trong sách không còn đơn giản như mô hình mạng kết nối đầy đủ trước đây. Tôi quyết định tự tay viết lại từ đầu, không dựa vào bất kỳ thư viện tính toán nào. Việc thiếu tài liệu tham khảo khiến quá trình này trở nên thách thức hơn nhiều - không phải vì độ phức tạp của mã nguồn, mà vì khi có lỗi xảy ra, việc tìm nguyên nhân sẽ rất khó khăn. Điều này đòi hỏi tôi phải hiểu rõ bản chất từng bước tính toán để vừa viết mã chính xác, vừa có thể nhanh chóng phát hiện và sửa lỗi.

Tôi nhận ra mình đã hiểu sai một số khái niệm cơ bản trước đây, dẫn đến việc xây dựng các mô hình cũ với nhiều sai lệch. Chẳng hạn, trong lớp kết nối đầy đủ, mỗi kết nối đều có trọng số và hệ số thiên lệch riêng. Nếu chỉ xét từ góc độ toán học, đây là phép biến đổi affine. Tuy nhiên, trọng số và thiên lệch thực chất là hai yếu tố độc lập: trọng số được phân bố ở các kết nối đầu vào, còn thiên lệch là một hằng số độc lập gắn với từng nơ-ron. Sự phân tách này giúp hiểu rõ hơn cách lan truyền sai số xảy ra riêng biệt cho từng thành phần.

Về hàm kích hoạt, mỗi loại đều có ưu điểm riêng: sigmoid phù hợp với bài toán nhị phân, ReLU hiệu quả cho mạng sâu, còn tanh thích hợp với dữ liệu chuẩn hóa. Chúng đều tham gia vào quá trình lan truyền ngược nhưng không chứa tham số cần điều chỉnh.

Trước khi xây dựng CNN, tôi đã dành thời gian tái cấu trúc lại mã nguồn cũ. Phiên bản mới không quá phức tạp, chỉ đủ để hoạt động. Tôi cho rằng việc tối ưu hóa sớm có thể gây lãng phí vì kiến trúc sẽ tiếp tục thay đổi khi học sâu hơn.

CNN thực chất không bắt nguồn từ sinh học mà là ứng dụng của kỹ thuật xử lý tín hiệu. Bằng cách áp dụng phép tích chập lên ảnh 2D, mạng có thể trích xuất đặc trưng hình ảnh hiệu quả hơn so với việc xử lý từng pixel riêng lẻ. Điều này tương tự như việc phân tích dữ liệu ở chiều không gian cao hơn trước khi phân loại.

Về mặt toán học, nguyên lý lan truyền sai số trong CNN tương tự như mạng nơ-ron truyền thống. Trong quá trình xây dựng, tôi đặc biệt chú trọng đến việc xác minh thuật toán lan truyền ngược. Sau khi tự tay suy diễn, tôi đã tham khảo thêm bài viết “Nguyên lý lan truyền ngược trong tích chập” của Microsoft Research và tài liệu về tầng pooling để đảm bảo độ chính xác.

Với bài toán nhận diện chữ số MNIST, CNN giúp phát hiện các đặc trưng như nét thẳng, cong, giao điểm… nhờ tính chất bất biến với phép dịch chuyển. Điều này cho phép mạng xác định vị trí xuất hiện của đặc trưng mà không phụ thuộc vào vị trí cụ thể trên ảnh.

Việc khởi tạo tham số bằng số ngẫu nhiên thay vì giá trị 0 là một quyết định quan trọng. Nếu tất cả tham số bắt đầu giống nhau, các nơ-ron trong cùng một lớp sẽ không thể phân hóa chức năng. Chính quá trình huấn luyện sẽ dần định hình vai trò riêng cho từng nơ-ron. Với mạng sâu, việc điều chỉnh phân bố giá trị khởi tạo ở các tầng khác nhau còn giúp cải thiện hiệu suất.

Trong quá trình xây dựng lớp tích chập, tôi đã thiết kế một đoạn mã kiểm thử riêng để xác minh thuật toán lan truyền ngược. Đoạn mã này giải bài toán nghịch: từ ảnh đầu vào và kết quả tích chập, tìm lại bộ lọc ban đầu. Nhờ đó, tôi phát hiện và sửa được vài lỗi nhỏ trong mã nguồn. Nếu không có bước kiểm thử này, việc tích hợp trực tiếp vào mạng nơ-ron sẽ khiến lỗi khó phát hiện hơn nhiều.

Kết quả cuối cùng rất khả quan: độ chính xác tăng từ 95% lên gần 99%. Theo tài liệu tham khảo, việc tối ưu chi tiết quá trình học (như điều chỉnh tốc độ học, sử dụng kỹ thuật regularization) có thể giúp đạt trên 99%. Tuy nhiên, chi phí tính toán cũng tăng đáng kể - từ 1-2 phút cho mạng feedforward lên khoảng 20 phút cho CNN. Việc chờ đợi lâu có thể

0%