By: VyyKa
Github: https://github.com/VyyKa/Game-Snake-Use-ML-RL-and-DQN-
Note: Mọi người mà chưa biết về cái RL với DQN này thì đọc cái bài post trước đó nha(hẹ hẹ hẹ): https://hotailienvykha.space/posts/khainiem-ml-dqn/
1. KIẾN TRÚC TỔNG THỂ
Project này sử dụng Reinforcement Learning (RL) với Deep Q-Network (DQN) để dạy AI chơi game Snake. Cấu trúc chính:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Environment │ │ DQN Agent │ │ Neural Net │
│ (SnakeEnv) │◄──►│ (DQNAgent) │◄──►│ (DQN Model) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
2. MÔI TRƯỜNG (ENVIRONMENT) - src/env.py
2.1 Play State Space (khu vực không gian để chơi game này)
# Observation vector 12 chiều:
observation = [
norm_head_x, norm_head_y, # Vị trí đầu rắn (2)
*direction_one_hot, # Hướng hiện tại (4) - one-hot encoding
dx, dy, # Vị trí mồi tương đối (2)
danger_left, danger_front, danger_right, # Nguy hiểm (3)
norm_length # Độ dài rắn (1)
]
Giải thích chi tiết:
- Vị trí đầu rắn: Chuẩn hóa về [0,1] để neural network dễ học
- Hướng: One-hot encoding [UP, RIGHT, DOWN, LEFT] = [1,0,0,0]
- Vị trí mồi tương đối: Khoảng cách từ đầu rắn đến mồi
- Nguy hiểm: 1.0 = nguy hiểm, 0.0 = an toàn
- Độ dài: Chuẩn hóa theo kích thước lưới
2.2 Action Space (Không gian dỉ chuyên)
action_space = 3 # 0=turn_left, 1=straight, 2=turn_right
Tại sao 3 actions thay vì 4?
- Rắn luôn di chuyển về phía trước
- Chỉ cần quyết định: rẽ trái, đi thẳng, rẽ phải
- Tránh được action “đi lùi” không hợp lý
2.3 Reward System (cấu trúc phần thưởng)
# Từ config.yaml:
rewards:
eat_food: 10.0 # Ăn mồi: +10 điểm
die: -10.0 # Chết: -10 điểm
step: -0.01 # Mỗi bước: -0.01 điểm
move_towards_food: 0.1 # Di chuyển về phía mồi: +0.1
move_away_food: -0.1 # Di chuyển xa mồi: -0.1
Triết lý thiết kế reward:
- Sparse reward: Chỉ thưởng khi ăn mồi
- Dense reward: Penalty nhỏ cho mỗi bước để khuyến khích hiệu quả
- Shaping reward: Hướng dẫn AI di chuyển về phía mồi
3. DEEP Q-NETWORK (DQN) - src/models/dqn.py
3.1 Kiến trúc Neural Network
# Từ config.yaml:
network:
hidden_layers: [128, 128, 64] # 3 layer ẩn
activation: "relu"
Cấu trúc mạng:
Input (12) → Linear(128) → ReLU → Dropout(0.1)
→ Linear(128) → ReLU → Dropout(0.1)
→ Linear(64) → ReLU → Dropout(0.1)
→ Linear(3) → Q-values
Giải thích:
- Input layer: 12 neurons (observation space)
- Hidden layers: 128 → 128 → 64 neurons
- Output layer: 3 neurons (Q-values cho 3 actions)
- Activation: ReLU (Rectified Linear Unit)
- Dropout: 0.1 để tránh overfitting
3.2 Q-Learning Theory
Q-Function: Q(s,a)
= giá trị kỳ vọng của tổng reward khi thực hiện action a
ở state s
Bellman Equation:
Q(s,a) = r + γ * max Q(s',a')
Trong đó:
r
: immediate rewardγ
: discount factor (0.99)s'
: next statea'
: next action
Note: Ghi vậy thôi chứ cũng chằng hiểu lắm :)))))))))))))
4. DQN AGENT - src/agent.py
4.1 Experience Replay Buffer
Experience Replay Buffer lưu trữ các trải nghiệm của agent để training sau này, giúp:
- Phá vỡ correlation giữa các sample liên tiếp
- Tái sử dụng dữ liệu hiệu quả
- Ổn định quá trình training
4.2 Training Process
Agent học thông qua việc:
- Thu thập experience từ environment
- Lưu vào replay buffer
- Sample random batch để training
- Cập nhật Q-network weights
5. TRAINING LOOP - src/train.py
5.1 Training Process Flow
# Training loop chính:
for episode in range(episodes):
state = env.reset()
for step in range(max_steps):
# 1. Chọn action
action = agent.act(state, training=True)
# 2. Thực hiện action
next_state, reward, done, info = env.step(action)
# 3. Lưu experience và train
loss = agent.step(state, action, reward, next_state, done)
# 4. Cập nhật state
state = next_state
if done:
break
# 5. Cập nhật epsilon
agent.update_epsilon(episode)
5.2 Key Components
Experience Replay Buffer:
- Lưu trữ
(state, action, reward, next_state, done)
- Sample ngẫu nhiên để train (tránh correlation)
- Capacity: 50,000 experiences
Target Network:
- Copy của Q-network
- Cập nhật mỗi 1000 steps
- Giúp ổn định training
Epsilon-Greedy Policy:
epsilon = 1.0 → 0.05 # Exploration → Exploitation
6. CONFIGURATION - config.yaml
# Hyperparameters DQN
gamma: 0.99 # Discount factor
lr: 0.0005 # Learning rate
batch_size: 128 # Batch size
buffer_size: 50000 # Replay buffer size
# Epsilon-greedy
epsilon_start: 1.0 # Bắt đầu với 100% exploration
epsilon_end: 0.05 # Kết thúc với 5% exploration
epsilon_decay_episodes: 800 # Decay trong 800 episodes
# Network updates
target_update_every: 1000 # Cập nhật target network mỗi 1000 steps
# Training
episodes: 1500 # Tổng số episodes
max_steps_per_episode: 500 # Max steps per episode
7. EVALUATION & MONITORING
7.1 Metrics Tracking
Các metrics quan trọng để theo dõi:
- Episode Reward: Tổng reward mỗi episode
- Episode Length: Số steps mỗi episode
- Loss: Training loss của neural network
- Epsilon: Mức độ exploration hiện tại
- Average Score: Điểm trung bình trong window gần đây
8. THỰC HÀNH VÀ HIỂU SÂU
8.1 Chạy Training và Quan sát
# Training với render (chậm nhưng có thể quan sát)
python continue_training.py --latest --episodes 50
# Training không render (nhanh)
python continue_training.py --latest --episodes 100 --no-render
8.2 Quan sát AI chơi
Khi training, các anh zai đồng môn có thể quan sát:
- AI ban đầu di chuyển ngẫu nhiên (high epsilon)
- Nó sẽ dần dần học được cách tránh tường và thân mình
- Cuối cùng học được strategy tối ưu để ăn mồi
9. TỔNG KẾT KIẾN THỨC
9.1 Reinforcement Learning Flow
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Environment │ │ Agent │ │ Neural Net │
│ │ │ │ │ │
│ State: 12 dim │◄──►│ Action: 3 dim │◄──►│ Q-values: 3 dim │
│ Reward: float │ │ Policy: ε-greedy│ │ Loss: MSE │
│ Done: bool │ │ Buffer: 50k │ │ Optimizer: Adam │
└─────────────────┘ └─────────────────┘ └─────────────────┘
9.2 Key Learning Points
- State Representation: 12-dimensional vector encoding game state
- Action Space: 3 discrete actions (left, straight, right)
- Reward Design: Sparse + dense rewards for effective learning
- Experience Replay: Breaks temporal correlations
- Target Network: Stabilizes training
- Epsilon-Greedy: Balances exploration vs exploitation
9.3 Hyperparameters Impact
- Learning Rate (0.0005): Too high → unstable, too low → slow learning
- Batch Size (128): Larger → more stable gradients, smaller → more updates
- Buffer Size (50k): Larger → more diverse experiences, smaller → faster updates
- Epsilon Decay (800 episodes): Faster → less exploration, slower → more exploration
Tài liệu tham khảo:
Chúc các đồng môn thành cmn công với Reinforcement Learning! 🚀🤖