ABK-GOFAI: Một Trí Tuệ Nhân Tạo Kiểu Cổ Điển Tốt Đẹp để Chơi Abak Evolution Backgammon.
Không có sự trợ giúp của Neural Network, việc phát triển một Trí Tuệ Nhân Tạo (AI) cho Abak là một nhiệm vụ đầy thách thức và theo thời gian dường như chạm tới giới hạn. Tuy nhiên, đó là một quá trình vui vẻ để phát triển nó, và nó vẫn đang làm nhiệm vụ ở các mức "easy", "normal" và "advanced". Đây là một bài viết về cách nó hoạt động và cách nó được tạo ra.
Giai Đoạn 1, GOFAI PHP
Phiên bản AI đầu tiên của Abak được viết bằng PHP và được xem là có thể làm hệ thống sập với lỗi 'out of memory', nhưng nó đã mở đường cho phiên bản C++. Đó là sân chơi thử nghiệm để tôi tìm ra rốt cuộc phải làm AI kiểu quái nào. Lần đầu tôi chạy nó gắn với webserver (nghĩa là tôi thực sự đang chơi chống lại nó), nó cần 15 giây rất dài để chọn một nước đi, và khi tôi thấy server tự di chuyển, tôi phát điên vì sung sướng và có lẽ đã nhảy múa một chút. Không chắc nữa.
Giai Đoạn 2, GOFAI C
Và thế là phiên bản C/C++ của AI, phiên bản đầu tiên đi vào môi trường thực tế, động cơ GOFAI yêu quý của tôi, đã ra đời từ tro tàn của PHP. Nó chạy 29 thuật toán phân tích trên hàng nghìn vị trí trong vài nano giây, và hoạt động như sau:
- Cho một vị trí bàn cờ và một bộ xúc xắc.
- Tính toán trạng thái
- Lấy mọi nước đi có thể.
- Phân tích từng nước đi và chấm điểm nó.
- Chọn điểm 'tốt nhất'.
Đây là sơ đồ của quy trình.
Nó gồm bốn hàm chính:
- Get Actions (Tính Toán Các Nước Đi Hợp Lệ):
Với một vị trí bàn cờ và một lần tung xúc xắc, nó tính tất cả các nước đi hợp lệ.
Các nước đi hợp lệ có thể từ 0 đến hàng chục nghìn.
Trong mọi ngôn ngữ tôi từng viết phần này, tôi đều dùng một cách tiếp cận đệ quy không cần thiết khiến mã rất khó debug, nhưng lại quá đẹp. Nó có vài trăm dòng mã nhưng mất của tôi hàng tuần để viết, rồi lại thêm nhiều tuần để chuyển nó sang C.
- Get state (Tính trạng thái bàn cờ):
Với một vị trí bàn cờ, nó tính ra một trạng thái ngữ nghĩa, khá là dễ hiểu:
- Khởi đầu
- Giữa ván
- Đang chạy không hy vọng
- Đang chạy còn hy vọng
- Cuối ván
- Đang vào nhà
-
Analyse Movement (Tính điểm cho một vị trí bàn cờ):
Đây là thuật toán đồ sộ nhất trong tất cả. Nó phân tích các đặc điểm của bàn cờ, mỗi đặc điểm trả về một điểm số, rồi dựa trên trạng thái đã tính trước đó để áp hệ số lên chúng, nhờ vậy bạn có thể đặt tầm quan trọng khác nhau cho các khía cạnh phân tích tùy vào trạng thái ván đấu.
AI khởi đầu với 8 thuật toán và kết thúc ở con số 29, ví dụ một ít như sau:
- Chiều Cao Các Cột
- Rủi ro bị đánh
- Rủi ro bị bẫy
- Sức Mạnh Bàn Nhà
- Các điểm xoay để thoát
- Quân ở thanh giữa
- Quân an toàn
Nhiều thuật toán trong số này ban đầu rất cơ bản hoặc đơn giản là chưa tồn tại.
Theo thời gian tôi tiếp tục làm việc trên chúng, thêm tính năng và tinh chỉnh hệ số.
-
Select Action (Chọn Nước Đi "Tốt Nhất"):
Thuật toán này tương đối đơn giản nếu bạn chỉ muốn điểm cao nhất (giống như cấp Advanced).
Ở cấp Normal và Easy, nó chọn ngẫu nhiên một nước đi trong danh sách các hành động tốt nhất; kích thước danh sách đó (hay mức độ chấp nhận nước đi kém) được quyết định bởi cấp độ.
Nhờ C, động cơ này nhanh như chớp, nên tôi sẽ luôn dùng nó làm hàm get-actions chính.
Giai Đoạn 3, GOFAI C Tinh Chỉnh
Để debug, xử lý sự cố và tinh chỉnh động cơ này, tôi đã phải xây rất nhiều công cụ để theo dõi quá trình ra quyết định. Không giống Neural Network, mỗi quyết định ở đây đều có thể kiểm toán, nên ít nhất bạn còn có được điều đó.
Quá trình này rất vui nhưng đau đớn vì chậm. Tôi chơi rất nhiều với CPU, và mỗi khi thấy một nước đi tệ, tôi lại quay về các công cụ này để xem điều gì đã sai. Đôi khi điều đó dẫn tôi tới việc sửa một thuật toán, tinh chỉnh một hệ số, hoặc xây dựng một mô hình phân tích mới. Đôi khi, và điều này rất đẹp, nó khiến tôi phải xem lại các chiến thuật Abak Evolution của chính mình.
Theo thời gian, tôi có một AI khá vững, nhưng việc hoàn thiện nó thêm nữa ngày càng khó. Có quá nhiều dòng mã, quá nhiều kịch bản, quá nhiều phép toán khổng lồ, đến mức debug ở cấp mã nguồn là một nhiệm vụ nặng nề, còn việc tinh chỉnh hệ số thủ công thì không mang lại kết quả.
Giai Đoạn 4, Tuyệt Vọng
Nhưng tôi vẫn muốn nhiều hơn vì tôi thật sự chơi Abak, và tôi cần một đối thủ vững vàng để vui vẻ, trong khi khi đó không có nhiều người chơi nó (và ngay cả lúc tôi đang viết những dòng này cũng vậy).
Và cách tiếp cận này có rất nhiều mặt hạn chế:
- Nó tính trạng thái của bàn cờ dựa trên vị trí hiện tại, và trạng thái đó được dùng để thay đổi hệ số của các thuật toán phân tích cho mọi hành động hợp lệ. Tuy nhiên chính hành động đó có thể đã làm thay đổi trạng thái, nhưng động cơ lại không tính đến điều này.
- Việc tinh chỉnh thủ công các hệ số đòi hỏi một lượng thời gian khổng lồ. Dù là khoảng thời gian vui vẻ, nhưng vẫn là vô số.
- Trạng thái cực kỳ khó tính toán một cách gọn ghẽ do số lượng kịch bản có thể xảy ra. Nó luôn là một thuật toán có khuyết điểm.
- Game Equity là điều không thể tính chính xác, bởi vì động cơ này có hệ thống điểm số tùy ý cho từng thuật toán phân tích, và điểm cuối cùng không phản ánh xác suất chiến thắng; nó chỉ hoạt động như một thang điểm so sánh giữa các vị trí bàn cờ khác nhau. Có thể nói nó có giá trị tương đối thay vì tuyệt đối.
Giai Đoạn 5, Sự Thức Tỉnh
Rồi một ngày nọ, vào năm 2018, Google đánh bại nhà vô địch GO bằng Neural Network AlphaGo của mình, dư luận dậy sóng, và những thư viện Machine Learning mã nguồn mở tuyệt vời mới bắt đầu xuất hiện, tận dụng GPU gia đình để tăng tốc quá trình huấn luyện.
Tất nhiên, tôi đã biết sơ về Neural Network, nhưng chưa từng tự xây dựng một cái nào, và thành thật mà nói, tôi xem đó là một nhiệm vụ vượt quá khả năng của mình.
Vì vậy tôi không thể cưỡng lại, và cấp expert giờ không còn chạy trên động cơ GOFAI nữa, ngoại trừ phần get-actions.
Nhưng câu chuyện này kết thúc ở đây.
Nếu bạn đã đọc đến tận đây, tôi thật sự kinh ngạc.
Văn bản này được viết vì mục đích SEO bởi đội ngũ Abak Evolution chân thành,
Còn gọi là Samy Garib.