Contextual Bandit (LinUCB)
Gợi ý câu hỏi tối ưu hóa trong Vùng Phát triển Gần nhất (ZPD) sử dụng thuật toán LinUCB và cập nhật Sherman-Morrison.
Trong hệ thống học tập thích ứng của EduGap, thuật toán Contextual Bandit (LinUCB) (dựa trên nghiên cứu của Li et al. (2010) và các chuyển đổi sư phạm của Clement et al. (2015)) được sử dụng làm bộ điều phối gợi ý câu hỏi luyện tập. Mục tiêu là chọn ra câu hỏi nằm trong Vùng Phát triển Gần nhất (Zone of Proximal Development - ZPD) của học sinh — nơi câu hỏi không quá dễ (gây chán nản) và không quá khó (gây nản lòng).
1. Vector Ngữ cảnh 3 Chiều (Student Context)
Mỗi khi gợi ý câu hỏi, hệ thống xây dựng một vector ngữ cảnh đặc trưng cho trình độ hiện tại của học viên:
Trong đó:
- (Bias): Hệ số chặn (intercept) của mô hình tuyến tính.
- : Xác suất làm chủ kiến thức hiện tại lấy từ mô hình BKT của Concept mục tiêu.
- : Điểm Elo tổng quát của học sinh được chuẩn hóa mềm bằng hàm Sigmoid quanh giá trị trung vị :
2. Tính Điểm UCB (Upper Confidence Bound)
Mỗi câu hỏi ứng viên (arm) lưu trữ một ma trận hiệp biến nghịch đảo và một vector hồi quy . Điểm UCB của câu hỏi được tính toán trong thời gian thực:
- Ước lượng tham số :
- Dự báo phần thưởng kỳ vọng (Expected Reward):
- Tính phương sai dự báo (Variance):
- Tính điểm UCB:
Với là tham số kiểm soát mức độ thử nghiệm (Exploration, mặc định = ).
3. Cập nhật In-place qua Công thức Sherman-Morrison
De loại bỏ hoàn toàn việc đảo ma trận trực tiếp lúc runtime (gây trễ giao diện), hệ thống lưu trữ trực tiếp ma trận nghịch đảo và cập nhật nó sau mỗi tương tác bằng công thức Sherman-Morrison rank-1 với độ phức tạp chỉ .
Note: Công thức sử dụng phép trừ (subtraction) vì — đây là chuẩn Sherman-Morrison cho trường hợp thêm (rank-1 update), dẫn đến nghịch đảo giảm. Khác với trường hợp xóa (rank-1 downdate) sử dụng cộng (+).
Đảm bảo Tính Ổn định Số học (Numerical Stability)
Trong tính toán số thực dấu phẩy động (floating-point), ma trận có thể bị trôi giá trị và mất tính đối xứng sau nhiều lượt cập nhật. Hệ thống ép ma trận về dạng đối xứng sau mỗi lượt tính toán:
4. Hàm Phần thưởng Định hướng ZPD (ZPD Reward Function)
Hàm thưởng được thiết kế nhằm tối ưu hóa việc phân phối câu hỏi quanh đích xác suất làm đúng (điểm ngọt ngào sư phạm):
Trong đó:
- là điểm số thực tế học viên đạt được (actual score).
- là xác suất làm đúng kỳ vọng tính từ Elo trước lượt làm bài.
Nếu câu hỏi được gợi ý có xác suất làm đúng đúng bằng , reward nhận được sẽ là tối đa (). Nếu câu hỏi quá dễ ( đúng) hoặc quá khó ( đúng), phần thưởng nhận được sẽ bị phạt nặng.
5. Cài đặt Python tham chiếu
Cài đặt chi tiết LinUCB nằm tại bandit.py:
# Cập nhật Sherman-Morrison trong bandit.py
def update_arm(
self,
arm_id: str,
context_vector: list[float],
reward: float,
arms_states: dict[str, dict[str, Any]],
) -> dict[str, Any]:
x = np.array(context_vector).reshape(-1, 1)
arm_state = arms_states.get(arm_id)
A_inv = np.array(arm_state["A_inv"])
b = np.array(arm_state["b"]).reshape(-1, 1)
# 1. Tính mẫu số
denominator = 1.0 + float(x.T.dot(A_inv).dot(x)[0][0])
# 2. Áp dụng Sherman-Morrison
A_inv_new = A_inv - (A_inv.dot(x).dot(x.T).dot(A_inv)) / denominator
# Đảm bảo tính đối xứng
A_inv_new = (A_inv_new + A_inv_new.T) / 2.0
# 3. Cập nhật b
b_new = b + reward * x