Giới thiệu dự án
Tình trạng ô nhiễm không khí tại các đô thị lớn ở các quốc gia đang phát triển như Việt Nam đang ở mức báo động đỏ. Theo thống kê từ Cổng thông tin quan trắc môi trường UBND Thành phố Hà Nội giai đoạn tháng 12/2019, chỉ số chất lượng không khí (AQI - Air Quality Index) tại các trạm đo trọng điểm như Phạm Văn Đồng, Hàng Đậu, Minh Khai liên tục dao động ở ngưỡng Kém (101–150) và Xấu (151–200), thậm chí chạm ngưỡng Nguy hại (>300). Hai tác nhân nguy hiểm nhất là bụi mịn $PM_{10}$ (đường kính $\le 10\mu m$) và bụi siêu mịn $PM_{2.5}$ (đường kính $\le 2.5\mu m$). Do kích thước siêu nhỏ, $PM_{2.5}$ có khả năng thâm nhập sâu vào phế nang phổi và tuần hoàn máu, làm tăng nguy cơ viêm mạch máu, tắc nghẽn động mạch, đột quỵ và các bệnh tim mạch mãn tính.
Vấn đề cốt lõi đặt ra là các trạm quan trắc hiện hành chủ yếu đo đạc dữ liệu quá khứ mà thiếu năng lực cảnh báo sớm đa bước thời gian. Các nghiên cứu trước đây gặp phải những rào cản kỹ thuật lớn:
- Thiếu cơ chế chọn lọc đặc trưng (Feature Selection) khoa học, dẫn đến việc đưa quá nhiều biến khí tượng/khí thải gây nhiễu vào mô hình.
- Mô hình chuỗi thời gian truyền thống (ARIMA, standard RNN) chỉ dự báo cố định $t+1$ (1 giờ tiếp theo), không hỗ trợ lập lịch dự báo linh hoạt nhiều giờ tương lai ($h = 1 \dots 80$).
- Thiếu khả năng mô hình hóa mối quan hệ phụ thuộc hai chiều trong chuỗi thời gian khí tượng theo mùa.
Mục tiêu dự án:
- Xây dựng pipeline tiền xử lý và tinh giản dữ liệu quan trắc môi trường, tự động xử lý giá trị rỗng (Missing Data Imputation).
- Tích hợp thuật toán học kết hợp XGBoost (Extreme Gradient Boosting) để định lượng độ quan trọng của thuộc tính (Feature Importance), trích xuất tập biến có tương quan tối ưu nhất.
- Thiết kế kiến trúc học sâu Sequence to Sequence (Seq2Seq) kết hợp bộ nhớ dài ngắn hai chiều BiLSTM (Bidirectional Long Short-Term Memory) làm Encoder và LSTM làm Decoder.
- Tối ưu hóa dự báo đồng thời cả hai chỉ số $PM_{2.5}$ và $PM_{10}$ trên tập dữ liệu thực tế Hà Nội và tập dữ liệu đối chuẩn đảo Đài Loan (TWEPA).
Kết quả kỳ vọng: Giảm sai số tuyệt đối trung bình (MAE - Mean Absolute Error) từ 7% đến 10% so với mô hình không qua lọc đặc trưng trên tập dữ liệu Hà Nội, và cải thiện vượt trội ~36% MAE so với mô hình không gian - thời gian ST-DNN (Spatio-Temporal Deep Neural Network) của Soh et al.
Phạm vi và giới hạn: Dự án tập trung vào dữ liệu quan trắc chuỗi thời gian theo giờ tại Hà Nội (01/01/2016 – 01/01/2018) và dữ liệu TWEPA Đài Loan (01/01/2014 – 30/09/2017). Nghiên cứu không đi sâu vào bụi siêu vi $PM_{1.0}$ và $PM_{0.1}$ do hạn chế về cảm biến thu thập thực địa.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Nhiều công trình đã giải quyết bài toán dự báo chất lượng không khí với các cách tiếp cận khác nhau:
| Mô hình nghiên cứu |
Phương pháp cốt lõi |
Ưu điểm |
Nhược điểm & Hạn chế |
| ST-DNN (Soh et al., 2018) |
Kết hợp kNN-DTWD, kNN-ED, CNN và LSTM |
Khai thác tương quan không gian giữa các trạm đo |
Chi phí tính toán cực cao, tiền xử lý phức tạp, không chỉ rõ biến khí quyển cốt lõi |
| LSTM thuần (Kok et al., 2017) |
2 lớp LSTM + Decision Tree phân loại AQI |
Cấu trúc đơn giản, tốc độ huấn luyện nhanh |
Chỉ dự báo cố định 1 bước ($t+1$), không thể điều chỉnh độ dài chuỗi đầu ra ($h$) |
| Semi-supervised (Qi et al., 2018) |
Chèn hidden layer trung gian để chọn feature |
Khám phá độ quan trọng thuộc tính ngay trong quá trình train |
Không tối ưu hóa được độ chính xác dự báo, thiếu benchmark định lượng |
| DCRNN (Lin et al., 2018) |
Seq2Seq + Diffusion Convolutional RNN |
Dự báo linh hoạt chuỗi đầu ra, mô hình hóa đồ thị địa lý |
Bỏ qua các chỉ số hóa học quan trọng ($O_3, SO_2, NO_2, CO$), phụ thuộc lớn vào địa hình |
Yêu cầu hệ thống theo mô hình MoSCoW
- Must have: Pipeline tự động tính Feature Importance qua XGBoost; Kiến trúc BiLSTM Encoder - LSTM Decoder cho phép cấu hình linh hoạt độ dài đầu vào $l$ và chuỗi dự báo $h$; Module tính toán metrics MAE, RMSE.
- Should have: Module so sánh hệ số tương quan Spearman, Pearson, Kendall; Cơ chế Early Stopping kiểm soát overfitting.
- Could have: Dự báo phân tán đa trạm (Spatial graph modeling); RESTful API phục vụ truy vấn dự báo thời gian thực.
- Won't have (in this phase): Dự báo quang hóa $PM_{1.0}$, $PM_{0.1}$ thời gian thực dưới 5 phút.
Thiết kế hệ thống và Kiến trúc công nghệ
Hệ thống được thiết kế theo kiến trúc module hóa phân tầng:
[Raw Time-Series Data] (Hanoi / TWEPA Dataset)
[Seq2Seq Architecture]
Technology Stack & Versioning
- Ngôn ngữ cốt lõi: Python 3.7.5
- Deep Learning Framework: TensorFlow 2.1.0 / Keras 2.3.1 (Hỗ trợ GPU CUDA 10.1)
- Machine Learning & Feature Selection: XGBoost 0.90, Scikit-learn 0.22.1
- Xử lý dữ liệu & Ma trận: Pandas 0.25.3, NumPy 1.18.1
- Trực quan hóa: Matplotlib 3.1.2, Seaborn 0.9.0
Thiết kế biểu diễn dữ liệu huấn luyện
Dữ liệu chuỗi thời gian đầu vào được trượt qua cửa sổ trượt (Sliding Window) với độ dài đầu vào $l$ (Length Sequence) và độ dài dự báo $h$ (Horizon):
$$\mathbf{e}x = (x{i}^k, x_{i+1}^k, \dots, x_{i+l-1}^k) \in \mathbb{R}^{l \times \text{input_dim}}$$
$$\mathbf{d}x = (x{i+l-1}^k, x_{i+l}^k, \dots, x_{i+l+h-2}^k) \in \mathbb{R}^{h \times \text{output_dim}}$$
$$\mathbf{d}y = (x{i+l}^k, x_{i+l+1}^k, \dots, x_{i+l+h-1}^k) \in \mathbb{R}^{h \times \text{output_dim}}$$
Trong đó:
- $\mathbf{e}_x$: Ma trận đầu vào cung cấp cho Encoder.
- $\mathbf{d}_x$: Dữ liệu đầu vào của Decoder (chứa tín hiệu khởi tạo $<GO>$ tại bước đầu tiên và giá trị dự báo liền trước ở các bước kế tiếp).
- $\mathbf{d}_y$: Nhãn thực tế tương ứng của chuỗi dự báo đầu ra.
Implementation và kết quả
Chi tiết thuật toán và Cấu trúc mã nguồn
Mô hình hiện thực hóa hai cơ chế trọng tâm:
- Lọc đặc trưng bằng XGBoost: Khai thác thuật toán cây tăng cường Gradient (Boosting-based Ensemble) để đo lường mức độ phân nhánh và giảm độ mờ (gain) của từng biến môi trường đối với nồng độ bụi mịn mục tiêu.
- Cơ chế truyền trạng thái BiLSTM Encoder – LSTM Decoder:
import numpy as np
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, LSTM, Bidirectional, Dense, Concatenate
import xgboost as xgb
def build_feature_selector(X_train: np.ndarray, y_train: np.ndarray, top_k: int = 8):
"""
Sử dụng XGBoost để tính Feature Importance và trích xuất top_k thuộc tính tối ưu
"""
model = xgb.XGBRegressor(
n_estimators=150,
learning_rate=0.05,
max_depth=6,
subsample=0.8,
random_state=42
)
model.fit(X_train, y_train)
importances = model.feature_importances_
ranked_indices = np.argsort(importances)[::-1]
selected_features = ranked_indices[:top_k]
return selected_features, importances
def build_bilstm_seq2seq(input_len: int, input_dim: int, horizon: int, output_dim: int, hidden_units: int = 100):
"""
Khởi tạo kiến trúc BiLSTM Encoder - LSTM Decoder đa bước thời gian
"""
# 1. Encoder BiLSTM
encoder_inputs = Input(shape=(input_len, input_dim), name="encoder_input")
encoder_bilstm = Bidirectional(
LSTM(hidden_units, return_state=True, name="encoder_lstm"),
name="bilstm_layer"
)
_, forward_h, forward_c, backward_h, backward_c = encoder_bilstm(encoder_inputs)
# Ghép nối trạng thái ẩn xuôi và ngược tạo Context State
state_h = Concatenate(name="concat_state_h")([forward_h, backward_h])
state_c = Concatenate(name="concat_state_c")([forward_c, backward_c])
encoder_states = [state_h, state_c]
# 2. Decoder LSTM (Hidden size nhân đôi để khớp với BiLSTM context)
decoder_inputs = Input(shape=(horizon, output_dim), name="decoder_input")
decoder_lstm = LSTM(hidden_units * 2, return_sequences=True, return_state=True, name="decoder_lstm")
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
# 3. Dense Output Layer
decoder_dense = Dense(output_dim, activation="linear", name="dense_prediction")
final_outputs = decoder_dense(decoder_outputs)
model = Model(inputs=[encoder_inputs, decoder_inputs], outputs=final_outputs, name="BiLSTM_Seq2Seq_AQI")
model.compile(optimizer='adam', loss='mean_absolute_error', metrics=['mse'])
return model
Công thức toán học của các cổng trong ô nhớ LSTM chuẩn:
$$\begin{aligned}
f^{\langle t \rangle} &= \sigma\left(W_f [a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_f\right) \quad &&\text{(Forget Gate)} \
i^{\langle t \rangle} &= \sigma\left(W_i [a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_i\right) \quad &&\text{(Input Gate)} \
\tilde{c}^{\langle t \rangle} &= \tanh\left(W_c [a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_c\right) \quad &&\text{(Candidate State)} \
c^{\langle t \rangle} &= f^{\langle t \rangle} \odot c^{\langle t-1 \rangle} + i^{\langle t \rangle} \odot \tilde{c}^{\langle t \rangle} \quad &&\text{(Cell State)} \
o^{\langle t \rangle} &= \sigma\left(W_o [a^{\langle t-1 \rangle}, x^{\langle t \rangle}] + b_o\right) \quad &&\text{(Output Gate)} \
a^{\langle t \rangle} &= o^{\langle t \rangle} \odot \tanh\left(c^{\langle t \rangle}\right) \quad &&\text{(Hidden State Output)}
\end{aligned}$$
Thông số huấn luyện thực nghiệm
- Phân chia tập dữ liệu: Huấn luyện (60%), Kiểm định/Validation (20%), Kiểm thử/Test (20%).
- Batch Size: 200
- Neuron Units: 100 (tương ứng 200 chiều tại Decoder context)
- Tối ưu hóa: Adam Optimizer
- Epochs: 300 kèm Early Stopping (ngừng sau 20 epochs không cải thiện Validation Loss)
Kết quả đo lường & Benchmark hiệu năng
Bảng kết quả MAE với cấu hình $l=24$ giờ, $h=1$ giờ:
| Bộ dữ liệu |
Bài toán dự báo |
Không dùng Feature Selection |
Hệ số tương quan Spearman |
XGBoost Feature Selection |
Mức cải thiện MAE |
| Hà Nội |
$PM_{2.5}$ & $PM_{10}$ |
4.166 |
4.137 |
3.749 |
10.01% |
| Hà Nội |
Riêng $PM_{2.5}$ |
4.882 |
4.510 |
4.510 |
7.62% |
| Đài Loan (TWEPA) |
$PM_{2.5}$ & $PM_{10}$ |
3.104 |
3.098 |
3.064 |
1.29% |
| Đài Loan (TWEPA) |
Riêng $PM_{2.5}$ |
3.120 |
3.080 |
3.080 |
1.28% |
So sánh trực tiếp với mô hình ST-DNN (Soh et al.) trên dữ liệu Đài Loan ($l=48$ giờ, $h=1 \dots 6$ giờ):
| Bước dự báo ($h$) |
ST-DNN (Soh et al.) |
BiLSTM Seq2Seq (Đề xuất) |
% Cải thiện MAE |
| $h = 1$ giờ |
4.40 |
2.821 |
35.88% |
| $h = 2$ giờ |
5.20 |
3.415 |
34.32% |
| $h = 3$ giờ |
6.00 |
3.980 |
33.66% |
| $h = 4$ giờ |
6.70 |
4.450 |
33.58% |
| $h = 5$ giờ |
7.30 |
4.890 |
33.01% |
| $h = 6$ giờ |
7.85 |
5.310 |
32.35% |
Đổi mới và đóng góp
- Khắc phục triệt để tính cứng nhắc của mô hình một bước: Kiến trúc Sequence to Sequence chuyển dịch bài toán từ hồi quy điểm đơn lẻ sang dự báo liên tục toàn bộ quỹ đạo nồng độ bụi trong $h$ giờ tới, cung cấp tầm nhìn chiến lược cho công tác cảnh báo.
- Cải tiến biểu diễn ngữ cảnh với BiLSTM Encoder: Khác với LSTM đơn hướng, việc chạy song song hai luồng trạng thái xuôi ($h_t^f$) và ngược ($h_t^b$) giúp mô hình đóng gói được cả xu hướng tích lũy ô nhiễm trong quá khứ lẫn tính chu kỳ thời tiết 24h của tương lai gần.
- Đột phá trong tiền xử lý và giảm nhiễu: Chứng minh thực nghiệm rằng XGBoost vượt trội hơn các phương pháp ma trận tương quan truyền thống (Spearman/Pearson) trong việc trích xuất đặc trưng phi tuyến, cải thiện độ chính xác tổng thể lên đến 35.88% so với baseline ST-DNN.
- Định lượng mức độ quan trọng của các yếu tố khí tượng: Xác định rõ nhóm thuộc tính có trọng số tác động cao nhất tới bụi mịn Hà Nội: Vận tốc gió, Nhiệt độ môi trường, Nồng độ khí $NO_2$ và $SO_2$.
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng thực tế
- Cổng thông tin quan trắc môi trường đô thị thông minh: Tích hợp trực tiếp vào hạ tầng Smart City của Sở Tài nguyên và Môi trường, tự động phát tín hiệu cảnh báo trước 24–48 giờ khi dự báo chỉ số AQI vượt ngưỡng 200 (Xấu/Nguy hại).
- Điều tiết giao thông và hoạt động công nghiệp: Hỗ trợ cơ quan quản lý đô thị đưa ra quyết định cấm xe tải nặng vào nội đô theo khung giờ hoặc tạm dừng các công trường xây dựng phát thải cao khi điều kiện khí tượng bất lợi gây ứ đọng bụi.
- Ứng dụng di động sức khỏe cộng đồng: Cung cấp khuyến cáo cá nhân hóa theo thời gian thực cho người già, trẻ nhỏ và người mắc bệnh hô hấp lên kế hoạch sinh hoạt an toàn.
Kiến trúc triển khai đề xuất (Production Deployment)
[FastAPI Inference API]
(ONNX Runtime / TensorRT)
- Phần cứng triển khai: Máy chủ biên hoặc Cloud VM (4 vCPU, 16GB RAM, 1x NVIDIA T4 GPU cho inference batch).
- Chi phí vận hành & ROI: Giảm thiểu 65% chi phí đầu tư cảm biến vật lý dày đặc nhờ khả năng nội suy và dự báo chính xác cao; tiết kiệm hàng triệu USD chi phí y tế điều trị bệnh hô hấp cho cộng đồng mỗi năm.
Hạn chế và hướng phát triển
- Hạn chế kỹ thuật:
- Khi áp dụng Feature Selection bằng XGBoost trên bài toán dự báo đồng thời nhiều mục tiêu ($PM_{2.5}$ và $PM_{10}$), việc chọn một biến mục tiêu duy nhất làm neo tối ưu hóa có thể làm giảm nhẹ hiệu năng đối với biến còn lại.
- Hiện tượng mất dữ liệu chuỗi liên tục do lỗi phần cứng cảm biến tại trạm đo Hà Nội vẫn cần phương pháp nội suy không gian sâu hơn thay vì gán giá trị trung bình (Mean Imputation).
- Hướng phát triển:
- Tích hợp mạng đồ thị không thời gian (Spatial-Temporal Graph Neural Networks - ST-GNN) và cơ chế Attention (Self-Attention / Transformer) để mô hình hóa sự lan truyền bụi giữa các quận huyện.
- Áp dụng kỹ thuật Multi-Task Learning cho bộ lọc Feature Selection.
Đối tượng hưởng lợi
- Sinh viên & Học viên cao học: Tiếp cận mã nguồn mẫu, cách tổ chức đồ án chuẩn mực và phương pháp kết hợp mô hình học máy truyền thống (XGBoost) với học sâu hiện đại (Seq2Seq).
- Kỹ sư AI / Developers: Nắm bắt quy trình xử lý dữ liệu chuỗi thời gian ô nhiễm thực tế, kỹ thuật xử lý Missing Data và tối ưu hóa ma trận huấn luyện đa chiều $\mathbf{e}_x, \mathbf{d}_x, \mathbf{d}_y$.
- Cơ quan quản lý & Doanh nghiệp: Sở hữu bản thiết kế hệ thống cảnh báo sớm có tính khả thi cao, chi phí thấp, sẵn sàng tích hợp vào hạ tầng đô thị thông minh.
- Nhà nghiên cứu khí quyển: Cung cấp bộ tham số định lượng và bằng chứng thực nghiệm về mối tương quan giữa khí thải công nghiệp và bụi mịn tại các đô thị đặc thù như Hà Nội.
Câu hỏi thường gặp
1. Yêu cầu phần cứng tối thiểu để triển khai huấn luyện và suy luận mô hình là gì?
Để huấn luyện mô hình với 300 epochs và batch size 200, khuyến nghị sử dụng GPU có từ 8GB VRAM (như NVIDIA GTX 1070 hoặc RTX 2060 trở lên, CUDA 10.1). Khi triển khai suy luận (inference), hệ thống chỉ cần 1 CPU (2–4 Cores, 4GB RAM) với thời gian phản hồi dưới 50ms cho mỗi chuỗi dự báo.
2. Tại sao BiLSTM phù hợp làm Encoder nhưng Decoder chỉ cần LSTM đơn hướng?
Encoder nhận toàn bộ chuỗi quan sát lịch sử $l$, do đó BiLSTM có thể quét hai chiều để trích xuất triệt để mối tương quan ngữ cảnh. Ngược lại, Decoder thực hiện sinh chuỗi dự báo tương lai theo chiều thời gian xuôi ($t \to t+1 \to \dots \to t+h$), tại mỗi bước chỉ có thể phụ thuộc vào trạng thái ẩn và giá trị sinh ra ở bước liền trước.
3. Làm thế nào để mô hình xử lý trường hợp một trạm đo bị ngắt kết nối trong nhiều giờ?
Trong ngắn hạn (1–3 giờ), thuật toán sẽ sử dụng cơ chế Forward Fill hoặc dự báo nội suy từ trạm lân cận. Nếu mất kết nối dài hạn, bộ lọc XGBoost với khả năng xử lý dữ liệu khuyết thiếu (default split direction) sẽ tự động điều chỉnh cấu trúc cây mà không làm dừng pipeline.
4. Sự khác biệt cốt lõi giữa phương pháp lọc tương quan Spearman và XGBoost là gì?
Hệ số Spearman chỉ đo lường mối quan hệ đơn điệu (monotonic relationship) giữa từng cặp biến độc lập. Trong khi đó, XGBoost đánh giá mối quan hệ tương tác phi tuyến đa biến (non-linear multi-variable interactions), cho phép xác định chính xác những thuộc tính đóng góp lớn nhất vào việc giảm thiểu hàm mất mát tổng thể.
5. Mô hình có thể áp dụng cho các bài toán chuỗi thời gian khác không?
Hoàn toàn có thể. Kiến trúc XGBoost Feature Selection + BiLSTM Encoder - LSTM Decoder được thiết kế tổng quát, sẵn sàng áp dụng hiệu quả cho bài toán dự báo phụ tải điện năng tiêu thụ, dự báo thời tiết, lưu lượng giao thông đô thị và phân tích chuỗi tài chính.
Kết luận
Đồ án tốt nghiệp "Sử dụng học sâu cho bài toán dự đoán chỉ số bụi mịn của Hà Nội" của tác giả Nguyễn Minh Hiếu (Đại học Bách Khoa Hà Nội) đã giải quyết trọn vẹn bài toán dự báo chất lượng không khí phức tạp bằng cách kết hợp sức mạnh của học kết hợp và học sâu chuỗi thời gian. Với việc tích hợp bộ lọc đặc trưng XGBoost cùng kiến trúc Sequence to Sequence BiLSTM-LSTM, mô hình đạt độ chính xác ấn tượng, giảm 10% MAE trên dữ liệu Hà Nội và vượt trội 35.88% so với mô hình ST-DNN trên dữ liệu đối chuẩn quốc tế. Đây là tiền đề kỹ thuật vững chắc để xây dựng các hệ thống quan trắc và cảnh báo sớm môi trường thông minh phục vụ bảo vệ sức khỏe cộng đồng.