Series: Machine Learning Fundamentals – Bài 34
Ở các bài viết trước thuộc chuỗi Học sâu (Deep Learning), chúng ta đã tìm hiểu Mạng nơ-ron truyền thẳng (Multilayer Perceptron – MLP) và Mạng nơ-ron tích chập (Convolutional Neural Network – CNN) chuyên dụng cho dữ liệu hình ảnh.
Tuy nhiên, hai kiến trúc trên xử lý các đầu vào hoàn toàn độc lập với nhau và không có khả năng “ghi nhớ” ngữ cảnh của các dữ liệu trước đó. Khi đối mặt với dữ liệu dạng chuỗi (Sequential Data) như chuỗi thời gian (Time-Series) hoặc ngôn ngữ tự nhiên (NLP), Recurrent Neural Network (RNN) ra đời như một giải pháp chuẩn mực.
Recurrent Neural Network là gì?
Recurrent Neural Network (RNN) – hay Mạng nơ-ron hồi quy – là một lớp kiến trúc Deep Learning chuyên biệt được thiết kế để xử lý dữ liệu dạng chuỗi, nơi thứ tự của các điểm dữ liệu đóng vai trò quyết định đến ý nghĩa của toàn bộ thông tin.
Điểm khác biệt cốt lõi của RNN là sự xuất hiện của vòng lặp phản hồi (Recurrent Loop), cho phép thông tin truyền từ bước thời gian (Time Step) này sang bước thời gian tiếp theo dưới dạng một Trạng thái ẩn (Hidden State).
┌───┐
│ │ (Hidden State h_t)
▼ │
[x_t] ──> [RNN Cell] ──> [y_t]
Tài liệu chính thức mô tả RNN lưu giữ thông tin quá khứ bằng cách truyền Hidden State qua từng bước thời gian. Xem thêm tại TensorFlow Recurrent Neural Networks Guide.
Cấu trúc và Cơ chế hoạt động của Recurrent Neural Network
Khi trải phẳng một mạng RNN theo trục thời gian (Unrolling in Time), ta thu được một chuỗi các nơ-ron nối tiếp nhau:
[x_0] ──> [RNN Cell] ──> [y_0]
│
▼ (h_0)
[x_1] ──> [RNN Cell] ──> [y_1]
│
▼ (h_1)
[x_2] ──> [RNN Cell] ──> [y_2]
Tại mỗi bước thời gian $t$:
-
RNN tiếp nhận đầu vào hiện tại $x_t$ và Trạng thái ẩn từ bước trước $h_{t-1}$.
-
Cập nhật Trạng thái ẩn mới $h_t$ thông qua hàm kích hoạt (thường là
tanhhoặcReLU):$$h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t + b_h)$$ -
Tính toán đầu ra $y_t$:
$$\hat{y}_t = \text{softmax}(W_{hy} h_t + b_y)$$
Nhờ cơ chế Chia sẻ trọng số (Weight Sharing), các ma trận trọng số $W_{hh}, W_{xh}, W_{hy}$ được dùng chung cho tất cả các bước thời gian, giúp mô hình xử lý được các chuỗi có độ dài linh hoạt và giảm thiểu rủi ro bùng nổ tham số.
Thuật toán học: Lan truyền ngược theo thời gian (BPTT)
Khác với mạng MLP thông thường sử dụng Backpropagation tiêu chuẩn, RNN sử dụng thuật toán Backpropagation Through Time (BPTT) để huấn luyện:
-
Forward Pass: Dữ liệu chuỗi đi qua từng bước thời gian $t = 1, 2, …, T$, tính toán Hidden State $h_t$ và dự đoán $\hat{y}_t$.
-
Loss Calculation: Tổng sai số $L$ là tổng Loss tại từng bước thời gian:
$$L = \sum_{t=1}^{T} L_t$$ -
Backward Pass: Gradient của $L$ được tính ngược từ bước thời gian cuối cùng $T$ trở về bước đầu tiên $t=1$. Do ma trận trọng số $W_{hh}$ được nhân liên tục qua từng bước, việc tính đạo hàm chuỗi (Chain Rule) dẫn đến các chuỗi tích ma trận kéo dài.
Các dạng bài toán phổ biến với RNN
-
One-to-Sequence (Một – Nhiều): Đầu vào là 1 giá trị/hình ảnh, đầu ra là 1 chuỗi văn bản (ví dụ: Tạo mô tả tự động cho ảnh – Image Captioning).
-
Sequence-to-One (Nhiều – Một): Đầu vào là 1 chuỗi văn bản, đầu ra là 1 nhãn phân loại (ví dụ: Phân tích cảm xúc đánh giá khách hàng – Sentiment Analysis).
-
Sequence-to-Sequence (Nhiều – Nhiều):
-
Độ dài bằng nhau: Gán nhãn từng từ trong câu (Named Entity Recognition – NER).
-
Độ dài khác nhau: Mô hình Encoder-Decoder cho Dịch tự động (Machine Translation) hoặc Dự báo chuỗi thời gian dài hạn.
-
Vấn đề Triệt tiêu Gradient (Vanishing Gradient) & Bùng nổ Gradient (Exploding Gradient)
Mặc dù mang lý thuyết “ghi nhớ quá khứ”, mạng RNN truyền thống (Vanilla RNN) lại gặp hạn chế nghiêm trọng khi huấn luyện trên các chuỗi dài (Long Sequences):
-
Vanishing Gradient (Triệt tiêu Gradient): Khi tính BPTT qua chuỗi thời gian dài, Gradient bị nhân liên tục với các trọng số nhỏ hơn 1. Kết quả là Gradient giảm về 0, làm cho mô hình không thể cập nhật trọng số ở các bước xa trong quá khứ $\rightarrow$ RNN bị “mất trí nhớ ngắn hạn” (Long-term Dependency Problem).
-
Exploding Gradient (Bùng nổ Gradient): Ngược lại, nếu các trọng số lớn hơn 1, Gradient tăng tiến theo cấp số nhân dẫn đến tràn bộ nhớ hoặc mô hình không thể hội tụ.
-
Giải pháp khắc phục Bùng nổ Gradient: Kỹ thuật Gradient Clipping (Cắt ngưỡng Gradient nếu vượt quá giá trị max quy định).
-
Các biến thể cải tiến: LSTM và GRU
Để giải quyết triệt me vấn đề Triệt tiêu Gradient của Vanilla RNN, hai kiến trúc cải tiến tiên tiến đã ra đời:
1. Long Short-Term Memory (LSTM)
Bổ sung một kênh lưu trữ riêng gọi là Cell State ($c_t$) chạy xuyên suốt các bước thời gian như một “băng truyền” và được điều khiển bởi 3 cổng (Gates) sử dụng hàm Sigmoid:
-
Forget Gate ($f_t$): Quyết định bao nhiêu % thông tin cũ từ Cell State nên bị xóa bỏ.
-
Input Gate ($i_t$): Quyết định ghi thêm bao nhiêu thông tin mới vào Cell State.
-
Output Gate ($o_t$): Quyết định trích xuất thông tin gì từ Cell State ra Hidden State ($h_t$).
2. Gated Recurrent Unit (GRU)
Phiên bản đơn giản hóa của LSTM, kết hợp Cell State và Hidden State làm một, giúp giảm số lượng thông số cần tính toán:
-
Reset Gate ($r_t$): Quyết định kết hợp thông tin mới với thông tin quá khứ như thế nào.
-
Update Gate ($z_t$): Đóng vai trò đồng thời của cả Forget Gate và Input Gate trong LSTM.
-
So sánh: GRU huấn luyện nhanh hơn, tốn ít RAM hơn và ít bị Overfitting hơn LSTM trên các tập dữ liệu vừa và nhỏ.
Dữ liệu có cần Preprocessing / Scaling không?
CỰC KỲ BẮT BUỘC.
-
Feature Scaling: Bài toán chuỗi thời gian (Stock, Thời tiết, Traffic) có biên độ chênh lệch rất lớn. Bắt buộc phải đưa dữ liệu về khoảng $[0, 1]$ hoặc $[-1, 1]$ bằng MinMaxScaler để tránh làm bão hòa các hàm kích hoạt
tanhvàsigmoid. -
Data Reshaping (Xử lý ma trận 3D): Mạng RNN trong TensorFlow/PyTorch yêu cầu đầu vào dạng Tensor 3D với kích thước
[Batch_Size, Time_Steps, Features]. -
Padding Sequence: Đối với bài toán xử lý văn bản có độ dài câu không đều, bắt buộc dùng
pad_sequencesđể đưa các chuỗi về cùng một độ dài chuẩn.
So sánh CNN và RNN
| Tiêu chí | Convolutional Neural Network (CNN) | Recurrent Neural Network (RNN) |
| Loại dữ liệu phù hợp | Dữ liệu không gian (Hình ảnh, Grid 2D/3D) | Dữ liệu chuỗi theo thời gian (Văn bản, Âm thanh, Time-Series) |
| Mối liên hệ dữ liệu | Phụ thuộc vị trí điểm ảnh lân cận | Phụ thuộc thứ tự trước – sau theo thời gian |
| Tính toán song song (Parallelization) | Rất cao (xử lý toàn bộ ảnh cùng lúc trên GPU) | Thấp (phải tính tuần tự từng bước $t$) |
| Cơ chế chính | Bộ lọc Tích chập (Convolution Kernel) | Trạng thái ẩn (Hidden State) & Các Cổng (Gates) |
Ưu điểm và Nhược điểm của Recurrent Neural Network
Ưu điểm
-
Xử lý linh hoạt các dữ liệu có độ dài chuỗi biến đổi.
-
Lưu trữ ngữ cảnh thông tin quá khứ để đưa ra dự đoán cho hiện tại.
-
Dùng chung trọng số giúp tiết kiệm tham số khi chuỗi dữ liệu dài.
Nhược điểm
-
Tính toán tuần tự (Sequential Computation): Không thể thực hiện song song hóa (Parallelization) hiệu quả trên GPU, dẫn đến tốc độ huấn luyện chậm hơn nhiều so với CNN.
-
Dễ gặp hiện tượng Vanishing Gradient nếu không chuyển sang dùng LSTM/GRU.
-
Vẫn gặp khó khăn với các chuỗi siêu dài (khi đó nên cân nhắc kiến trúc Transformer).
Khi nào nên dùng Recurrent Neural Network?
-
Xử lý ngôn ngữ tự nhiên (NLP): Phân loại văn bản, dịch tự động, Chatbot, gán nhãn thực thể.
-
Dự báo chuỗi thời gian (Time-Series Forecasting): Dự đoán giá cổ phiếu, doanh thu bán hàng, nhu cầu phụ tải điện, thời tiết.
-
Xử lý tín hiệu âm thanh, nhận diện giọng nói (Speech-to-Text) và phân tích nhịp tim y tế (ECG).
Tóm tắt
-
Recurrent Neural Network truyền Hidden State qua các bước thời gian để ghi nhớ ngữ cảnh chuỗi.
-
Thuật toán huấn luyện là Backpropagation Through Time (BPTT).
-
Vanilla RNN dễ bị hiện tượng Vanishing Gradient khi chuỗi dữ liệu dài.
-
LSTM và GRU là giải pháp tối ưu nhờ cơ chế Cổng (Gates) giữ thông tin dài hạn.
-
Bắt buộc chuẩn hóa dữ liệu bằng MinMaxScaler và biến đổi dữ liệu về dạng Tensor 3D trước khi huấn luyện.
Tài liệu tham khảo
-
TensorFlow Documentation: Working with RNNs in Keras
-
PyTorch Tutorials: Sequence Models and Long Short-Term Memory Networks
-
Hochreiter & Schmidhuber (1997): Long Short-Term Memory – Bài báo gốc đặt nền móng cho LSTM.
-
Cho et al. (2014): Learning Phrase Representations using RNN Encoder-Decoder – Bài báo gốc đặt nền móng cho GRU.
Khóa học tại MCNA Technology School
Nếu bạn muốn thực hành Machine Learning, Python và xây dựng các mô hình trên dữ liệu thực tế, có thể tham khảo:
Tác giả: Bùi Đình Tuyển – Data Analyst tại MCNA Technology School
📞 Hotline: 0939.866.825 (Mr. Khang)
🌐 Website: MCNA Technology School
📍 Hà Nội: 30 Trung Liệt, Đống Đa | Liền kề 44B TT2 Văn Quán, Hà Đông
📍 TP.HCM: 50B Phan Tây Hồ, Cầu Kiệu

