Mạng nơ-ron nhân tạo (neural networks) là nền tảng của hầu hết các đột phá AI mà chúng ta thấy ngày nay — từ nhận dạng giọng nói trên điện thoại, đến xe tự lái, đến các mô hình ngôn ngữ lớn như GPT. Nhưng đằng sau vẻ ngoài phức tạp, ý tưởng cốt lõi thực ra khá thanh lịch và có thể hiểu được ngay cả khi bạn mới bắt đầu.
Bài viết này sẽ đưa bạn từ trực giác sinh học đến code Python thực tế, từng bước một.
Cảm Hứng Từ Não Người
Não người chứa khoảng 86 tỷ tế bào thần kinh (neurons), mỗi tế bào kết nối với hàng nghìn tế bào khác qua các khớp thần kinh (synapses). Khi bạn học điều gì đó mới, các kết nối này được tăng cường hoặc suy yếu — đó là cơ chế học tập ở cấp độ sinh học.
Mạng nơ-ron nhân tạo mô phỏng ý tưởng này: thay vì tế bào thần kinh, chúng ta có các “nodes” (nút) toán học; thay vì khớp thần kinh, chúng ta có các trọng số (weights) có thể điều chỉnh. Khi mô hình “học,” nó thực chất đang điều chỉnh các trọng số này để đưa ra dự đoán chính xác hơn.
Perceptron — Đơn Vị Cơ Bản
Mọi thứ bắt đầu từ perceptron — một neuron nhân tạo đơn lẻ. Perceptron nhận một hoặc nhiều đầu vào, nhân mỗi đầu vào với một trọng số, cộng tất cả lại, thêm một giá trị bias, và đưa qua một hàm kích hoạt để ra đầu ra.
Công thức cơ bản:
đầu ra = hàm_kích_hoạt(w₁x₁ + w₂x₂ + ... + wₙxₙ + b)
Trong đó x là các đầu vào, w là các trọng số, và b là bias. Trọng số quyết định tầm quan trọng của mỗi đầu vào; bias cho phép mô hình linh hoạt hơn.
Hàm Kích Hoạt — Chìa Khóa Của Sự Phi Tuyến
Nếu không có hàm kích hoạt, mạng nơ-ron dù nhiều lớp đến đâu cũng chỉ là một phép biến đổi tuyến tính. Hàm kích hoạt đưa vào tính phi tuyến, cho phép mạng học những mẫu phức tạp hơn.
- Sigmoid: Chuyển đổi bất kỳ số nào thành giá trị từ 0 đến 1. Hữu ích cho bài toán phân loại nhị phân ở lớp đầu ra.
- Tanh: Tương tự sigmoid nhưng cho ra giá trị từ -1 đến 1. Thường hoạt động tốt hơn sigmoid cho các lớp ẩn.
- ReLU (Rectified Linear Unit): f(x) = max(0, x). Nếu đầu vào dương, giữ nguyên; nếu âm, đặt về 0. ReLU là lựa chọn mặc định cho hầu hết các lớp ẩn ngày nay.
Kiến Trúc Mạng: Lớp Vào, Lớp Ẩn, Lớp Ra
Một mạng nơ-ron tiêu biểu có ba loại lớp:
- Lớp đầu vào (Input layer): Nhận dữ liệu thô. Số lượng nodes bằng số lượng đặc trưng (features) trong dữ liệu của bạn.
- Lớp ẩn (Hidden layers): Nơi “học” xảy ra. Bạn có thể có một hoặc nhiều lớp ẩn. Mạng có nhiều lớp ẩn được gọi là mạng “sâu” — đó là nguồn gốc của thuật ngữ “deep learning.”
- Lớp đầu ra (Output layer): Đưa ra dự đoán cuối cùng. Số lượng nodes phụ thuộc vào bài toán: 1 node cho hồi quy hoặc phân loại nhị phân, N nodes cho phân loại N lớp.
Lan Truyền Xuôi Và Lan Truyền Ngược
Lan truyền xuôi (Forward propagation) là quá trình dữ liệu đi từ lớp đầu vào, qua các lớp ẩn, đến lớp đầu ra để tạo ra dự đoán.
Lan truyền ngược (Backpropagation) là quá trình học. Sau khi có dự đoán, mô hình tính toán “lỗi” (loss) — sự chênh lệch giữa dự đoán và giá trị thực. Sau đó, sử dụng giải tích (đạo hàm theo chuỗi), nó tính toán mỗi trọng số cần được điều chỉnh bao nhiêu và theo hướng nào để giảm lỗi.
Xây Dựng Mạng Nơ-ron Đầu Tiên Với Python và Keras
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers
# Tải bộ dữ liệu MNIST - 70,000 hình ảnh chữ số 0-9
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# Chuẩn hóa giá trị pixel từ [0, 255] về [0, 1]
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
# Làm phẳng hình ảnh 28x28 thành vector 784 chiều
x_train = x_train.reshape(-1, 784)
x_test = x_test.reshape(-1, 784)
# Xây dựng kiến trúc mạng nơ-ron
model = keras.Sequential([
layers.Dense(128, activation='relu', input_shape=(784,)),
layers.Dropout(0.2), # Ngăn ngừa overfitting
layers.Dense(64, activation='relu'),
layers.Dropout(0.2),
layers.Dense(10, activation='softmax') # 10 chữ số 0-9
])
# Biên dịch và huấn luyện
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
history = model.fit(
x_train, y_train,
epochs=10,
batch_size=32,
validation_split=0.1
)
# Đánh giá trên tập kiểm tra
test_loss, test_accuracy = model.evaluate(x_test, y_test, verbose=0)
print(f"Độ chính xác: {test_accuracy:.4f}") # Kỳ vọng ~97-98%
Hiểu Rõ Các Siêu Tham Số Quan Trọng
- Learning rate (tốc độ học): Kiểm soát mỗi bước cập nhật trọng số lớn đến đâu. Adam optimizer tự động điều chỉnh điều này.
- Số lớp và số neurons: Nhiều hơn không phải luôn là tốt hơn. Mạng quá lớn dễ bị overfitting; quá nhỏ thì underfitting.
- Epochs: Số lần duyệt qua dữ liệu. Dùng “early stopping” để tự động dừng khi validation loss không còn cải thiện.
- Batch size: Kích thước batch nhỏ cho gradient ồn hơn nhưng có thể giúp thoát khỏi local minima.
Những Cạm Bẫy Thường Gặp Và Cách Tránh
Overfitting (học thuộc lòng): Mô hình học quá tốt trên dữ liệu huấn luyện nhưng dự đoán kém trên dữ liệu mới. Giải pháp: Dropout, regularization, hoặc thu thập thêm dữ liệu.
Vanishing gradient: Trong mạng rất sâu với sigmoid/tanh, gradient trở nên cực nhỏ khi lan truyền ngược qua nhiều lớp. Giải pháp: dùng ReLU, batch normalization.
Dữ liệu không được chuẩn hóa: Luôn chuẩn hóa dữ liệu đầu vào về phạm vi [0,1] hoặc chuẩn hóa theo mean/std trước khi huấn luyện.
Bước Tiếp Theo Của Bạn
Bạn vừa học xong những khái niệm cốt lõi của mạng nơ-ron nhân tạo. Dưới đây là lộ trình học tiếp theo:
- Convolutional Neural Networks (CNN): Kiến trúc chuyên biệt cho xử lý hình ảnh.
- Recurrent Neural Networks (RNN) và LSTM: Cho dữ liệu tuần tự — văn bản, chuỗi thời gian, âm thanh.
- Transformers: Kiến trúc đằng sau GPT, BERT, và hầu hết các mô hình ngôn ngữ hiện đại.
- Transfer learning: Sử dụng mô hình đã được huấn luyện trên dữ liệu lớn và tinh chỉnh cho bài toán của riêng bạn.
Hành trình học deep learning có thể gập ghềnh lúc đầu — nhiều khái niệm, nhiều toán học, nhiều thứ cần thử nghiệm. Nhưng với từng mô hình bạn xây dựng và từng bài toán bạn giải quyết, mọi thứ sẽ dần trở nên rõ ràng hơn. Bắt đầu bằng cách chạy đoạn code trên, thay đổi kiến trúc, và quan sát kết quả thay đổi như thế nào.