LSTM và GRU: cổng và trí nhớ dài hạn

Cổng quên cổng cập nhật, trạng thái cell, so sánh LSTM GRU RNN cơ bản và thí nghiệm chuỗi trong bài này.
KhóThuật toán ~60 phút

Ôn lại trước khi học

Giới thiệu

Bài này học cổng nhớ dài của LSTM và GRU gọn. Dùng để nhớ ý đầu câu khi đọc tới cuối đoạn.

Kiến thức cần nhớ

LSTM

  • Định nghĩa: thêm đường cell chạy suốt chuỗi ít bị ghi đè.
  • Cổng quên quyết giữ bao nhiêu trí nhớ cũ.
  • Cổng nạp quyết thêm bao nhiêu điều mới.
  • Ví dụ đời thường: như sổ tay chỉ xóa dòng hết hạn.
  • Cổng ra quyết lộ bao nhiêu thành đáp án hiện tại.

GRU

  • Định nghĩa: bản gọn với 2 cổng, không tách cell riêng.
  • Cổng cập nhật pha trộn giữa nhớ cũ và đề xuất mới.
  • Cổng đặt lại quyết bỏ bao nhiêu quá khứ khi đề xuất.
  • Ví dụ đời thường: như gộp sổ nháp và sổ chính làm một.
  • Ẩn vừa là trí nhớ vừa là đầu ra luôn.
Mô hìnhTham sốTrí nhớ
RNN cơ bảnÍt nhất, nhanh nhấtChỉ nhớ ngắn
GRUVừa, huấn luyện nhanhNhớ trung và dài
LSTMNhiều nhất, chậm nhấtNhớ dài tốt nhất

Khi nào chọn

  • Chuỗi ngắn thì RNN cơ bản đã đủ và nhanh.
  • Dữ liệu vừa thì GRU là điểm cân bằng tốt.
  • Chuỗi rất dài thì LSTM giữ xa tốt hơn.
  • Luôn kẹp gradient và chuẩn hóa để ổn định.

Ví dụ

  • Input: câu dài 30 từ, ý ở từ số 2 -> Output: LSTM nhớ, RNN quên.
  • Giải thích: đường cell bảo toàn trí nhớ xa tốt hơn.
# Cổng quên quyết giữ bao nhiêu cũ
f = sigmoid(x @ Wf + h_cu @ Uf)  # gần 1 là giữ
cell = f * cell_cu + i * ung_vien  # cập nhật nhẹ

💻 Bài tập

Ngôn ngữ: Python 3 với NumPy cho Bài 1, PyTorch cho Bài 2-3. Nộp vào day-101/.

Bài 1: LSTM và GRU cell tự cài (forward)

CellCông thức cần cài
LSTMf,i,o=σ(⋅)f, i, o = \sigma(\cdot), c~=tanh⁡(⋅)\tilde c = \tanh(\cdot), ct=f⊙ct−1+i⊙c~c_t = f \odot c_{t-1} + i \odot \tilde c, ht=o⊙tanh⁡(ct)h_t = o \odot \tanh(c_t)
GRUz,r=σ(⋅)z, r = \sigma(\cdot), h~=tanh⁡(Wx+U(r⊙ht−1))\tilde h = \tanh(W x + U (r \odot h_{t-1})), ht=(1−z)⊙ht−1+z⊙h~h_t = (1 - z) \odot h_{t-1} + z \odot \tilde h
  1. Copy trọng số từ torch.nn.LSTMCell và torch.nn.GRUCell (chú ý thứ tự cổng trong PyTorch) sang bản NumPy. Output phải khớp sai số 1e-6.
  2. Đếm tham số: LSTM gấp 4 lần RNN, GRU gấp 3 lần. Kiểm tra bằng số.

Bài 2: Bài toán nhớ xa

Chuỗi dài T gồm số ngẫu nhiên. Nhãn là phần tử thứ 2 của chuỗi. Mô hình chỉ đọc hết chuỗi rồi đoán (many-to-one).

T       RNN_acc    GRU_acc    LSTM_acc
10      ...
30      ...
100     ...

Cùng số epoch, cùng hidden size, có gradient clipping. Chỉ ra T mà RNN bắt đầu thua.

Bài 3: Dự báo chuỗi thời gian (nâng cao)

Dữ liệu: nhiệt độ hằng ngày (dữ liệu công khai) hoặc sóng sin cộng nhiễu.

  1. Cửa sổ 30 ngày, đoán ngày 31. Chuẩn hóa bằng mean/std của tập train.
  2. Chia theo thời gian 70/15/15, không xáo trộn.
  3. So LSTM, GRU và baseline "ngày mai bằng hôm nay". In MAE test.
  4. Vẽ dự báo chồng lên giá trị thật trên tập test.

✅ Tiêu chí hoàn thành

  • Cell NumPy khớp PyTorch.
  • Bảng nhớ xa có số thật, thấy rõ RNN thua ở T lớn.
  • Bài 3 có baseline và LSTM/GRU thắng baseline.
  • Giải thích được vai trò cổng quên bằng công thức ctc_t.

❓ Câu hỏi ôn tập

  • Đường cell khác trí nhớ RNN sao?
  • Cổng quên làm gì?
  • GRU gọn hơn LSTM ở đâu?
  • Chuỗi ngắn nên dùng gì?

🌕 Bạn đã hoàn thành ngày 101. Làm hết bài tập phía trên rồi sang ngày tiếp theo.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.