Kho mã nguồn này chứa triển khai thuật toán Deep Q-Learning (DQN) để giải bài toán LunarLander-v3 từ thư viện Gymnasium. Dự án thể hiện việc áp dụng học tăng cường (Reinforcement Learning) để huấn luyện một tác nhân (agent) hạ cánh an toàn một mô-đun mặt trăng, vượt qua các thách thức như không gian trạng thái liên tục và đảm bảo tính ổn định trong quá trình huấn luyện.
Mục tiêu của dự án là huấn luyện một tác nhân để giải bài toán LunarLander-v3, trong đó tác nhân cần điều khiển một mô-đun mặt trăng hạ cánh an toàn xuống một bãi đáp được chỉ định. Môi trường có không gian trạng thái liên tục (8 chiều) và không gian hành động rời rạc (4 hành động), phù hợp để áp dụng thuật toán Deep Q-Learning.
Triển khai sử dụng PyTorch cho mạng nơ-ron và Gymnasium cho môi trường, tích hợp các kỹ thuật như Experience Replay và Target Network để đảm bảo tính ổn định trong quá trình huấn luyện.
Môi trường LunarLander-v3 từ Gymnasium yêu cầu điều khiển một mô-đun mặt trăng để hạ cánh an toàn. Các đặc điểm chính:
- Không gian trạng thái: 8 biến liên tục (vị trí, vận tốc, góc, v.v.).
- Không gian hành động: 4 hành động rời rạc (không làm gì, kích hoạt động cơ trái, kích hoạt động cơ chính, kích hoạt động cơ phải).
- Phần thưởng: Tác nhân nhận phần thưởng dựa trên việc hạ cánh thành công, tiết kiệm nhiên liệu và bị phạt nếu va chạm hoặc di chuyển ra khỏi bãi đáp.
Dự án triển khai Deep Q-Learning (DQN), kết hợp Q-Learning với mạng nơ-ron sâu để xấp xỉ hàm giá trị Q cho không gian trạng thái liên tục. Các kỹ thuật chính bao gồm:
- Experience Replay: Lưu trữ các kinh nghiệm
(state, action, reward, next_state, done)vào bộ nhớ đệm và lấy mẫu ngẫu nhiên để phá vỡ tương quan giữa các kinh nghiệm liên tiếp. - Target Network: Sử dụng một mạng mục tiêu riêng để tính toán giá trị Q mục tiêu, giúp ổn định quá trình huấn luyện.
- Chính sách ε-greedy: Cân bằng giữa khám phá (chọn hành động ngẫu nhiên) và khai thác (chọn hành động tốt nhất) thông qua chiến lược giảm epsilon.
Hàm giá trị Q được xấp xỉ bởi:
trong đó:
-
$r$ : Phần thưởng tức thời -
$\gamma$ : Hệ số chiết khấu -
$\theta$ : Tham số của mạng chính (online network) -
$\theta^-$ : Tham số của mạng mục tiêu (target network)
Hàm mất mát được định nghĩa là:
trong đó
Lớp Network định nghĩa một mạng nơ-ron kết nối đầy đủ (fully-connected) với:
- Tầng đầu vào: Nhận vector trạng thái 8 chiều.
- Tầng ẩn: Hai tầng với 128 nơ-ron mỗi tầng, sử dụng hàm kích hoạt ReLU.
- Tầng đầu ra: Xuất ra giá trị Q cho 4 hành động có thể thực hiện.
class Network(nn.Module):
def __init__(self, state_size, action_size, seed=42):
super(Network, self).__init__()
self.seed = torch.manual_seed(seed)
self.fc1 = nn.Linear(state_size, 128)
self.fc2 = nn.Linear(128, 128)
self.fc3 = nn.Linear(128, action_size)
def forward(self, state):
x = F.relu(self.fc1(state))
x = F.relu(self.fc2(x))
return self.fc3(x)Lớp ReplayMemory triển khai bộ nhớ đệm để lưu trữ và lấy mẫu kinh nghiệm:
- Dung lượng: 200,000 kinh nghiệm.
- Hàm push: Thêm kinh nghiệm mới vào bộ nhớ, xóa kinh nghiệm cũ nhất nếu bộ nhớ đầy.
- Hàm sample: Lấy ngẫu nhiên một mini-batch (kích thước 128) để huấn luyện.
Lớp Agent quản lý quá trình học của DQN:
- act: Chọn hành động theo chính sách ε-greedy.
- step: Lưu kinh nghiệm vào bộ nhớ đệm và kích hoạt học sau mỗi 4 bước.
- learn: Cập nhật mạng chính bằng cách tối thiểu hóa hàm mất mát và thực hiện soft update cho mạng mục tiêu.
- soft_update: Cập nhật dần tham số mạng mục tiêu theo công thức:
| Tham số | Giá trị |
|---|---|
| Tốc độ học (Learning Rate) | 5e-4 |
| Kích thước Mini-batch | 128 |
| Hệ số chiết khấu ( |
0.99 |
| Dung lượng bộ nhớ đệm | 200,000 |
| Hệ số nội suy ( |
1e-3 |
Tác nhân đã huấn luyện đạt tỷ lệ hạ cánh thành công 100% trong quá trình đánh giá, với mức tiêu thụ nhiên liệu trung bình khoảng 53,88 đơn vị mỗi tập. Video thể hiện hiệu suất của tác nhân đã được lưu trong notebook (23020356_Bùi Hải Đăng.ipynb).
Để chạy mã nguồn, cần cài đặt các thư viện sau:
pip install gymnasium torch numpy matplotlib imageioĐảm bảo sử dụng Python phiên bản tương thích (ví dụ: Python 3.8 trở lên).
- Sao chép kho mã nguồn:
git clone https://github.com/DangShark/lunarlander-dqn.git cd lunarlander-dqn - Mở Jupyter Notebook:
jupyter notebook 23020356_Bùi Hải Đăng.ipynb
- Chạy toàn bộ các cell để huấn luyện tác nhân hoặc tải mô hình đã huấn luyện trước (
checkpoint_DDQN_newreward.pth) để đánh giá. - Để xem kết quả trực quan, đảm bảo cài đặt các thư viện cần thiết cho việc hiển thị video và xem video được tạo ra.
lunarlander-dqn/
│
├── 23020356_Bùi Hải Đăng.ipynb # Notebook chính chứa triển khai DQN
├── checkpoint_DDQN_newreward.pth # Trọng số mô hình đã huấn luyện
├── README.md # Tài liệu mô tả dự án
- Triển khai Double DQN để giảm sai lệch trong việc ước lượng giá trị Q.
- Thử nghiệm Prioritized Experience Replay để ưu tiên các kinh nghiệm quan trọng.
- Tinh chỉnh siêu tham số (ví dụ: tốc độ học, kiến trúc mạng) để cải thiện hiệu suất.
- Thêm reward shaping để tăng tốc độ hội tụ và tối ưu hóa tiêu thụ nhiên liệu.
- Mnih, V., et al. (2015). "Human-level control through deep reinforcement learning." Nature.
- Tài liệu Gymnasium: LunarLander-v3
- Tài liệu PyTorch: pytorch.org