Về mặt toán, một mạng nơ-ron nhân tạo là một hàm số lớn được ghép từ những phép tính rất nhỏ: nhân đầu vào với các trọng số, cộng lại, cộng thêm một độ lệch, rồi cho kết quả đi qua một hàm phi tuyến đơn giản. Một lớp mạng làm việc đó cho nhiều nơ-ron cùng lúc, và có thể viết gọn thành một phép nhân ma trận cộng một vector. Nhiều lớp xếp chồng lên nhau tạo thành mạng sâu.
Không có gì bí ẩn trong từng bước tính, cái đáng chú ý nằm ở chỗ các trọng số không do người viết ra mà do thuật toán huấn luyện tự tìm. Bài này tính tay một mạng hai đầu vào, hai nơ-ron ẩn, một đầu ra; chỉ ra vì sao bắt buộc phải có hàm phi tuyến; và đếm số tham số của một mạng nhận dạng chữ số viết tay cỡ nhỏ.
Một nơ-ron nhân tạo làm đúng hai việc
Một nơ-ron nhận vào vài con số x1, x2, …, xn. Nó có một trọng số riêng cho mỗi đầu vào, ký hiệu w1, w2, …, wn, và một độ lệch b. Việc thứ nhất là tính tổng có trọng số: z = w1·x1 + w2·x2 + … + wn·xn + b. Đây chính là tích vô hướng của vector trọng số với vector đầu vào, cộng thêm b. Việc thứ hai là đưa z qua một hàm kích hoạt, ví dụ hàm ReLU giữ nguyên z nếu z dương và trả về 0 nếu z âm.
Ý nghĩa của trọng số khá trực quan. Trọng số dương lớn nghĩa là đầu vào đó đẩy nơ-ron về phía “bật”, trọng số âm nghĩa là kìm lại, trọng số gần 0 nghĩa là gần như bỏ qua. Độ lệch b quyết định ngưỡng: b âm lớn thì cần tổng đầu vào lớn mới vượt qua 0.
Ý tưởng này có lịch sử dài. McCulloch và Pitts mô tả một mô hình nơ-ron logic năm 1943; Rosenblatt đề xuất perceptron, một nơ-ron có trọng số học được, vào năm 1958. Perceptron dùng hàm bậc thang thay vì ReLU, nhưng phần tổng có trọng số thì giống hệt cách làm hiện nay.
Tính tay một mạng nhỏ, từng con số một
Mạng ví dụ có đầu vào x = (1; 2), một lớp ẩn gồm hai nơ-ron dùng ReLU, và một nơ-ron đầu ra không có hàm kích hoạt. Các trọng số dưới đây là ví dụ giả định, chọn cho dễ tính:
- Nơ-ron ẩn thứ nhất có trọng số (0,5; −1) và độ lệch 1. Tổng: z1 = 0,5·1 + (−1)·2 + 1 = 0,5 − 2 + 1 = −0,5. Qua ReLU, vì z1 âm nên h1 = 0.
- Nơ-ron ẩn thứ hai có trọng số (1; 1) và độ lệch −1. Tổng: z2 = 1·1 + 1·2 − 1 = 2. Qua ReLU, vì z2 dương nên h2 = 2.
- Lớp ẩn cho ra vector h = (0; 2). Nơ-ron thứ nhất “tắt”, nơ-ron thứ hai “bật”.
- Nơ-ron đầu ra có trọng số (3; 0,5) và độ lệch 0,5. Kết quả: y = 3·0 + 0,5·2 + 0,5 = 1,5.
- Nếu đổi đầu vào thành x = (4; 1), bạn tự tính lại sẽ được z1 = 2, z2 = 4, h = (2; 4), và y = 3·2 + 0,5·4 + 0,5 = 8,5. Lần này cả hai nơ-ron ẩn đều bật.
Toàn bộ quá trình đi từ đầu vào tới đầu ra như trên gọi là lan truyền thuận. Mạng thật chỉ khác ở quy mô: thay vì hai đầu vào là hàng trăm hay hàng nghìn, thay vì hai nơ-ron ẩn là hàng nghìn, thay vì một lớp ẩn là hàng chục lớp. Phép tính ở mỗi nơ-ron vẫn đúng là tổng có trọng số rồi qua hàm kích hoạt.
Viết gọn cả lớp thành phép nhân ma trận
Gom trọng số của hai nơ-ron ẩn thành ma trận W có hai hàng: hàng một là (0,5; −1), hàng hai là (1; 1). Gom độ lệch thành vector b = (1; −1). Khi đó toàn bộ lớp ẩn là h = ReLU(W·x + b), với ReLU áp lên từng thành phần. Kiểm lại: W·x = (0,5 − 2; 1 + 2) = (−1,5; 3), cộng b được (−0,5; 2), qua ReLU được (0; 2), khớp với cách tính từng nơ-ron.
Quy ước kích thước rất quan trọng khi đọc mã nguồn hay bài báo. Lớp nhận n đầu vào và có m nơ-ron thì W có m hàng và n cột, b có m thành phần, đầu ra có m thành phần. Nhìn kích thước là biết một lớp nối bao nhiêu với bao nhiêu.
Khi xử lý nhiều mẫu cùng lúc, người ta xếp các mẫu thành một ma trận đầu vào, mỗi hàng một mẫu, và cả lô được tính bằng một phép nhân ma trận duy nhất. Đây là lý do phần cứng đồ hoạ, vốn được thiết kế để nhân ma trận song song, trở thành phần cứng chủ lực của học sâu. Nhân một ma trận lớn một lần nhanh hơn rất nhiều so với nhân từng vector trong một vòng lặp.
Vì sao bắt buộc phải có hàm phi tuyến
Thử bỏ ReLU đi, chỉ giữ các phép nhân ma trận và cộng vector. Hai lớp liên tiếp cho y = W2·(W1·x + b1) + b2 = (W2·W1)·x + (W2·b1 + b2). Vế phải chỉ là một ma trận nhân x cộng một vector, tức là một lớp tuyến tính duy nhất. Xếp bao nhiêu lớp tuyến tính cũng chỉ tương đương một lớp, và một hàm tuyến tính không thể vẽ được ranh giới cong, không thể biểu diễn quan hệ kiểu “cả hai cùng bật thì tắt”.
Ví dụ kinh điển là phép XOR: đầu ra bằng 1 khi đúng một trong hai đầu vào bằng 1. Bốn điểm (0; 0), (1; 1) cho 0 và (0; 1), (1; 0) cho 1 không thể tách bằng một đường thẳng, nên một perceptron đơn lẻ không học được XOR. Minsky và Papert phân tích giới hạn này trong cuốn sách năm 1969 về perceptron. Thêm một lớp ẩn có hàm phi tuyến là giải quyết được.
Ở chiều ngược lại, có kết quả lý thuyết gọi là định lý xấp xỉ phổ quát: mạng có một lớp ẩn đủ rộng với hàm kích hoạt phù hợp có thể xấp xỉ bất kỳ hàm liên tục nào trên một miền bị chặn với sai số tuỳ ý; Cybenko chứng minh một phiên bản cho hàm sigmoid năm 1989. Cần đọc đúng định lý: nó nói mạng như vậy tồn tại, không nói thuật toán huấn luyện sẽ tìm ra nó, cũng không nói cần bao nhiêu nơ-ron.
Các hàm kích hoạt hay gặp
Hàm kích hoạt được chọn theo tính chất toán của nó: miền giá trị, đạo hàm có dễ tính không, có làm gradient teo lại không. Bảng dưới liệt kê những hàm phổ biến nhất:
| Hàm | Công thức bằng chữ | Miền giá trị | Ghi chú |
|---|---|---|---|
| Sigmoid | 1 chia cho (1 cộng e mũ âm z) | Từ 0 đến 1 | Dùng ở đầu ra phân loại hai lớp; ở lớp ẩn sâu dễ làm gradient teo |
| Tanh | (e mũ z trừ e mũ âm z) chia (e mũ z cộng e mũ âm z) | Từ −1 đến 1 | Đối xứng quanh 0, từng phổ biến trong mạng hồi quy |
| ReLU | z nếu z dương, 0 nếu ngược lại | Từ 0 trở lên | Rất rẻ để tính, đạo hàm bằng 1 ở phía dương; mặc định của nhiều mạng |
| Leaky ReLU | z nếu z dương, một hệ số nhỏ nhân z nếu âm | Mọi số thực | Tránh tình trạng nơ-ron tắt hẳn không học được nữa |
| GELU | z nhân với xác suất phân phối chuẩn nhỏ hơn z | Từ khoảng −0,17 trở lên | Mượt hơn ReLU, hay gặp trong các mô hình Transformer |
Ở đầu ra, hàm được chọn theo bài toán chứ không theo sở thích: hồi quy giá trị số thì để tuyến tính, phân loại hai lớp dùng sigmoid, phân loại nhiều lớp dùng softmax. Chọn sai hàm đầu ra là lỗi rất hay gặp của người mới, và thường không báo lỗi gì, chỉ cho kết quả kém.
Đếm số tham số: con số “mô hình bao nhiêu tỷ tham số” nghĩa là gì
Mỗi lớp nối đầy đủ có số tham số bằng số đầu vào nhân số nơ-ron, cộng số nơ-ron (cho độ lệch). Lấy ví dụ một mạng nhỏ nhận ảnh chữ số viết tay 28 × 28 điểm ảnh, tức 784 đầu vào, có một lớp ẩn 128 nơ-ron và lớp đầu ra 10 nơ-ron cho mười chữ số.
Lớp ẩn có 784 × 128 = 100.352 trọng số cộng 128 độ lệch, tổng 100.480 tham số. Lớp đầu ra có 128 × 10 = 1.280 trọng số cộng 10 độ lệch, tổng 1.290. Cả mạng có 101.770 tham số. Mỗi tham số là một con số mà thuật toán huấn luyện phải tìm.
Khi nghe một mô hình ngôn ngữ có vài tỷ hay vài trăm tỷ tham số, đó là cùng một kiểu đếm, chỉ là kiến trúc phức tạp hơn và các ma trận lớn hơn rất nhiều. Số tham số cho biết kích thước bộ nhớ cần để chứa mô hình và khối lượng tính toán mỗi lần chạy, nhưng không trực tiếp cho biết mô hình thông minh tới đâu; chất lượng còn phụ thuộc dữ liệu, cách huấn luyện và kiến trúc.
Nơ-ron nhân tạo giống và khác nơ-ron sinh học tới đâu
Giống ở ý tưởng ban đầu. Nơ-ron sinh học nhận tín hiệu qua nhiều khớp nối, mạnh yếu khác nhau, và phát xung khi tổng kích thích vượt ngưỡng. Mô hình tổng có trọng số cộng ngưỡng được lấy cảm hứng từ hình ảnh đó.
Khác ở gần như mọi chi tiết. Nơ-ron thật phát xung theo thời gian, có hoá học phức tạp, cấu trúc nhánh tự tính toán, và não không học bằng lan truyền ngược theo cách mạng nhân tạo làm. Nơ-ron nhân tạo là một hàm số tĩnh, đơn giản hơn nhiều.
Đừng suy từ tên gọi. Vì tên “mạng nơ-ron”, nhiều bài viết phổ thông suy ra rằng AI “suy nghĩ như não”. Đó là phép so sánh lỏng. Chính xác hơn là gọi mạng nơ-ron là một họ hàm có nhiều tham số, được chỉnh bằng tối ưu hoá.
Hiểu đúng giúp đánh giá đúng. Khi biết mô hình chỉ là phép nhân ma trận và hàm phi tuyến xếp chồng, bạn sẽ không ngạc nhiên khi nó tự tin trả lời sai: hàm số nào cũng cho ra một con số, kể cả khi đầu vào nằm ngoài vùng nó đã thấy lúc huấn luyện.
Câu hỏi thường gặp
Một lớp mạng nơ-ron có phải chỉ là một phép nhân ma trận không?
Gần đúng. Một lớp nối đầy đủ gồm phép nhân ma trận trọng số với vector đầu vào, cộng vector độ lệch, rồi áp hàm kích hoạt lên từng thành phần. Phần nhân ma trận chiếm gần hết khối lượng tính toán, nên người ta hay nói gọn như vậy, nhưng thiếu hàm kích hoạt thì cả mạng chỉ còn là một phép biến đổi tuyến tính.
Trọng số ban đầu lấy từ đâu?
Trọng số được khởi tạo ngẫu nhiên theo một phân phối có độ lớn được tính cẩn thận dựa trên số đầu vào và đầu ra của lớp. Nếu khởi tạo tất cả bằng 0, mọi nơ-ron trong lớp sẽ tính ra cùng một kết quả và nhận cùng một gradient, nên không bao giờ học ra các đặc trưng khác nhau.
Mạng càng nhiều lớp thì càng tốt?
Không tự động. Mạng sâu hơn biểu diễn được hàm phức tạp hơn nhưng khó huấn luyện hơn, dễ gặp gradient teo hoặc phình, và dễ học thuộc dữ liệu nếu dữ liệu ít. Các kỹ thuật như kết nối tắt và chuẩn hoá lớp ra đời để mạng sâu huấn luyện được, và độ sâu phù hợp vẫn phải thử theo bài toán.
Độ lệch có vai trò gì nếu đã có trọng số?
Độ lệch cho phép dịch ngưỡng của nơ-ron mà không phụ thuộc đầu vào. Không có độ lệch, tổng có trọng số luôn bằng 0 khi mọi đầu vào bằng 0, nên ranh giới quyết định buộc phải đi qua gốc toạ độ. Thêm độ lệch giống như thêm số hạng tự do trong phương trình đường thẳng.
Mạng tích chập và Transformer có dùng cùng loại phép toán không?
Có, ở mức nền tảng. Mạng tích chập dùng trọng số chung trượt trên ảnh, về bản chất vẫn là tổng có trọng số. Transformer dùng các phép nhân ma trận để tạo truy vấn, khoá, giá trị và lớp nối đầy đủ, cộng thêm softmax. Khác biệt nằm ở cách nối các phép tính, không ở loại phép tính.
Tự viết một mạng nơ-ron nhỏ cần biết lập trình đến đâu?
Chỉ cần biết vòng lặp, mảng và hàm. Một mạng hai lớp viết bằng thư viện tính toán ma trận cơ bản thường chưa tới một trăm dòng, kể cả phần huấn luyện. Tự viết một lần trước khi dùng thư viện học sâu giúp bạn hiểu rõ từng kích thước và từng bước tính.