Ứng Dụng Logic Mờ Trong Trí Tuệ Nhân Tạo
Hôm nay nhận được một gói sách do bạn Dương Hải Linh từ Nhà xuất bản Bưu điện Nhân dân gửi đến, xin chân thành cảm ơn trước. Vì thời gian gần đây không có nhiều thời gian nghiên cứu kỹ lưỡng nên tôi chỉ lướt qua những chương gây hứng thú.
Trong hai cuốn “Bí quyết lập trình trí tuệ nhân tạo trò chơi” và “Kỹ xảo lập trình trò chơi Windows” đều có chương đề cập đến logic mờ. Nhớ lại vài năm trước, đồng nghiệp của tôi là bạn Soloist từng nghiên cứu chủ đề này một thời gian ngắn và chia sẻ với tôi những kiến thức cơ bản. Vì vậy tôi đã dành thời gian đọc kỹ hai chương sách này, tuy nhiên cảm giác chúng chỉ dừng ở mức giới thiệu khái quát. Sau đó tôi tiếp tục tra cứu thêm trên Wikipedia và trao đổi với đồng nghiệp làm về AI trong giờ ăn trưa, từ đó quyết định ghi chép lại những hiểu biết của bản thân.
Trong cuốn sách về lập trình AI trò chơi có đưa ra ví dụ thực tế: Trong trò chơi bắn súng góc nhìn thứ nhất (FPS), nhân vật điều khiển bởi máy (NPC) có nhiều loại vũ khí với sức mạnh và tầm bắn khác nhau. Nhà thiết kế trò chơi muốn NPC lựa chọn vũ khí dựa trên hai yếu tố: khoảng cách đến người chơi và lượng đạn còn lại. Tuy nhiên tôi có một ví dụ riêng: Trong trò chơi nhập vai trực tuyến (MMO), khi NPC truy đuổi người chơi cần cân nhắc nhiều yếu tố như khoảng cách từ vị trí ban đầu, chỉ số sức mạnh của người chơi và lượng máu (HP) của bản thân.
Hãy tạm gác khái niệm logic mờ sang một bên, khi thiết kế AI chúng ta thường gặp phải những bài toán ra quyết định phức tạp như thế nào?
Thông thường nhà thiết kế sẽ định nghĩa quy tắc: Khi NPC di chuyển quá xa vị trí ban đầu thì dừng tấn công và quay về điểm xuất phát. Tuy nhiên ngay cả những nhà thiết kế mới vào nghề cũng nhận ra quy tắc này quá mơ hồ. “Quá xa” cụ thể là bao nhiêu? Vì vậy cần bổ sung thêm định nghĩa như bán kính truy đuổi - “Khi khoảng cách từ NPC đến điểm xuất phát vượt quá bán kính truy đuổi 40 mét thì dừng tấn công và quay về”. Trong bảng thiết kế trò chơi, thông số này sẽ được ghi rõ là “Bán kính truy đuổi: 40 mét”.
Nhận xét cá nhân: Việc tách biệt giữa việc thiết kế quy tắc (điều kiện truy đuổi) và xác định giá trị số (bán kính 40 mét) thành hai công việc riêng biệt do hai nhóm thiết kế hệ thống và thiết kế số liệu đảm nhiệm, theo tôi thấy là không thực tế.
Việc lập trình quy tắc này không khó, nhưng khi có nhiều hơn một quy tắc thì mọi chuyện trở nên phức tạp. Giả sử thêm quy tắc: Khi HP của NPC dưới 20% thì ngừng truy đuổi. Lúc này NPC phải cân nhắc hai yếu tố đối lập - khoảng cách và HP. Ví dụ khi HP đầy nhưng đã di chuyển quá xa điểm xuất phát, hoặc ngược lại HP thấp nhưng vẫn gần điểm xuất phát, phải xử lý thế nào?
Nếu áp dụng logic nhị phân (đen-trắng), ta có thể thiết lập quy tắc giao hai điều kiện: Chỉ tiếp tục truy đuổi khi cả hai điều kiện đều thỏa mãn. Tuy nhiên cách này có điểm bất hợp lý: Một thay đổi nhỏ như HP từ 20% xuống 19%, hoặc khoảng cách từ 39m lên 40m có thể làm thay đổi hoàn toàn quyết định, trong khi những thay đổi lớn hơn như từ 1% lên 19% hay 1m lên 39m lại không ảnh hưởng gì.
Một hành vi ra quyết định tự nhiên hơn nên như thế này: Khi một yếu tố ở gần ngưỡng giới hạn, cần xem xét yếu tố còn lại nhiều hơn. Ví dụ khi HP của NPC ở quanh mức 20%, dù là 19% hay 21% cũng không quan trọng bằng khoảng cách. Ngược lại, nếu khoảng cách là 39m hay 41m thì HP lại trở thành yếu tố quyết định.
Để đạt được điều này, không thể dùng đơn giản các câu lệnh if-else. Dù áp dụng phương pháp nào cũng làm tăng độ phức tạp tính toán của AI. Vấn đề khác là cần xác định trong môi trường nào và với NPC nào thì nên áp dụng AI nâng cao này. Chúng ta tạm gác chi phí tính toán sang một bên và tập trung vào cách thực hiện.
Phản ứng đầu tiên của tôi giống như nhiều đồng nghiệp trong buổi trưa thảo luận - thêm yếu tố xác suất vào mỗi quyết định. Thay vì dùng ngưỡng 40m để phân chia rõ ràng, hãy để xác suất truy đuổi là hàm số liên quan đến khoảng cách. Tính toán xác suất của tất cả yếu tố ảnh hưởng rồi dùng số ngẫu nhiên mô phỏng quá trình ra quyết định.
Tuy nhiên logic mờ không dựa trên mô phỏng ngẫu nhiên. Nói đơn giản, với logic mờ, khi tất cả đầu vào xác định thì kết quả cũng xác định. “Mờ” ở đây chỉ các điều kiện biên không rõ ràng.
Thông thường mỗi biến được chia thành ba mức độ. Ví dụ với khoảng cách, có thể định nghĩa: Dưới 10m là gần, 20m là trung bình, 40m là xa. Những khoảng cách dưới 10m được xem là rất gần, trên 40m là rất xa. Khoảng giữa 10-20m có thể thuộc cả hai mức gần và trung bình, 20-40m thuộc cả trung bình và xa. Trên đồ thị, đây là hai hình thang nửa bên và một hình tam giác ở giữa. Dĩ nhiên có thể dùng đường cong nhưng sẽ khó tính toán hơn.
Về mặt số liệu, dưới 10m là 100% gần, trên 40m là 100% xa. Ở mức 20m là 100% trung bình, các khoảng giữa sẽ chuyển tiếp mượt mà.
Tương tự, kết quả mong muốn cũng chia ba mức: Hoàn toàn không muốn truy đuổi, muốn truy đuổi, và rất muốn truy đuổi. Sau đó thiết lập các quy tắc như:
- Khi ở rất xa điểm xuất phát và HP rất thấp → Hoàn toàn không muốn truy đuổi
- Khi ở mức trung bình và HP cao → Rất muốn truy đuổi
- Khi ở mức trung bình và HP trung bình → Muốn truy đuổi
Với hai điều kiện mỗi điều kiện ba mức, sẽ có tổng cộng 9 quy tắc. Việc định nghĩa này đòi hỏi chuyên môn của nhà thiết kế. Tuy nhiên các quy tắc có sai lệch nhỏ cũng không làm kết quả thay đổi đột ngột, thiếu một vài quy tắc vẫn có thể tính toán được.
Khi thay các tham số vào quy tắc, ta sẽ có độ tin cậy cho ba mức kết quả. Ví dụ, nếu NPC