Ngày 13.04.2019, OpenAI Five (từ giờ mình sẽ gọi tắt là Five), một trí tuệ nhân tạo được phát triển bởi đội ngũ của OpenAI, đánh bại nhà đương kim vô địch Dota2 thế giới, Team OG, 2 trắng trong một kèo đấu Bo3. Trong đó, ván đấu thứ 2 chứng kiến sự hủy diệt của Five đối với OG khi kết thúc ván đấu trong vòng 20 phút 51 giây với tỉ số mạng hạ gục là 46-6.
Trong bài viết này, mình sẽ đi sâu vào những câu hỏi, Five được thiết kế như thế nào? Cách Five xử lý thông tin đầu vào ra sao? Quá trình huấn luyện của Five diễn ra như thế nào? v.v.
P/s: Trong bài viết này mình có sử dụng nhiều thuật ngữ tiếng Anh đan xen tiếng Việt. Điều này không phải là mình muốn thể hiện gì, nhưng vì những thuật ngữ khi được dịch sang sẽ mất đi ý nghĩa vốn có của nó nên mình quyết định dùng như vậy nhé.
Học bò, học đứng, học đi và học cách chiến thắng
Five không được lập trình để chiến thắng, nó được lập trình để học cách chiến thắng. Nói cách khác là, Five không được lập trình theo hướng phải làm ABC nếu gặp trường hợp XYZ, vì nếu như vậy, đối với một game thời gian thực như Dota2, chúng ta sẽ không thể nào tính toán được hết các trường hợp có thể xảy ra. Thay vào đó, nhóm nghiên cứu OpenAI áp dụng Reinforcement Learning để trang bị cho Five khả năng tự học.
Ý tưởng chung nhất của (policy-based) Reinforcement Learning (từ giờ mình sẽ gọi là RL nhé) là huấn luyện cho máy tính giải quyết một vấn đề trong 1 môi trường cụ thể thông qua việc trao thưởng (rewards) cũng như phạt (penalties) của các chuỗi hành động (actions), những chuỗi hành động này được tổng hợp lại thành một hàm số gọi là Policy (có thể coi là xác suất của các chuỗi hành động tiếp theo dựa vào những hành động và trạng thái của môi trường trước đó). Mục tiêu của RL là tìm các hàm số Policy sao cho tổng các Rewards (discounted) là tối ưu.
Ví dụ, trong việc thiết kế xe tự động, giả sử xe chỉ thực hiện 3 động tác là rẽ trái, rẽ phải hoặc đi thẳng. Thêm vào đó, việc di chuyển xa ra đối với điểm đến nhận penalty là -1, còn gần hơn nhận reward là 1. Khi đó, hàm policy sẽ là hàm số nhận các thông tin về môi trường xung quanh tại thời điểm t (như là có biển báo cấm rẽ trái hay cấm rẽ phải hoặc đường 1 chiều), cùng các tham số Theta, và trả lại giá trị là xác suất cho các hành động tại thời điểm t+1 (ví dụ xác suất của việc rẽ trái là 0.1, rẽ phải là 0.7 và đi thẳng là 0.3). Giả sử như trên, xe sẽ rẽ phải. Nếu rẽ phải làm quãng đường gần hơn, xe sẽ nhận được 1 điểm, nếu xa hơn, xe nhận được -1 điểm. Mục tiêu của RF là tìm các tham số Theta để tổng reward nhận được từ t = 0, 1, 2, 3, 4,... là tối ưu.
Khi đã thiết kế được hệ thống Reinforcement Learnings, việc còn lại là để các bot "tự học" bằng phương pháp "trial and error", nôm na là thử và làm lại. Ở giai đoạn đầu của quá trình huấn luyện Five, các heros của Five chỉ đi xung quanh bản đồ một cách ngẫu nhiên. Tuy nhiên theo nhóm nghiên cứu, sau vài giờ, Five đã học được cách đi lane, farm lính. Sau vài ngày, Five đã học được cách tranh bounty runes, rotate heros để gia tăng lợi thế cũng như stick push, những hành vi mà người chơi Dota2 có kinh nghiệm mới có. Đặc biệt hơn, trong quá trình huấn luyện Five chơi ở chế độ 2vs2, đội ngũ thiết kế phát hiện Five đã học được cách block lính khi họ không hề cho Rewards với hành động này.
Học đi thì dễ, học chơi Dota2 mới khó
Với những lý thuyết như vậy, việc áp dụng RL vào rèn luyện máy chơi Dota2 là khả thi. Ví dụ, tại 1 điểm thời gian, những yếu tố môi trường trong RL chính là thông tin hiện có trên bản đồ (lượng tầm nhìn, máu, mana, quái rừng, ...), còn các hành động chính là việc di chuyển, đánh lính, deny lính, cast spells,... Từ đó, các hàm Policy chính là các mạng thần kinh với 1 layer ẩn (single-layer Neural Network) nhận các giá trị đầu vào là các thông tin ở trên, và đưa ra xác suất cho các hành động tiếp theo (ví dụ như cast skill Q là 0.12, deny con melee là 0.1,...), bộ tham số Theta mình đã nói ở trên chính là tham số Theta của mạng thần kinh này. Vì Dota2 là một game thời gian thực, khi đó các dòng thông tin thực chất là các chuỗi thời gian, nhóm nghiên cứu đã chọn mô hình Long Short-Term Memory (LSTM) Network. Kiểu mạng thần kinh này có đặc điểm là nó có thể xử lý thông tin theo dạng chuỗi thời gian. Nôm na là, thay vì phát triển một mạng thần kinh hay quên, nhóm đã phát triển một mạng thần kinh thù dai vậy. Cuối cùng, nhóm phát triển định nghĩa các Rewards dựa vào kinh nghiệm cá nhân của họ đối với trò chơi. Theo nhóm phát triển, tại mỗi bước thời gian có trung bình 8.000-80.000 hành động tùy theo cách chọn hero (so với tầm 1.000 của cờ vua và 6.000 của cờ vây). 
Tuy nhiên, việc áp dụng RL vào Dota2 là phức tạp hơn rất nhiều, vì Dota2 là game thời gian thực, một sự việc diễn ra là kết quả của rất nhiều. Việc này dẫn đến những vấn đề sau. Một là, trong Dota2 (cũng giống như những game MOBA khác), tín hiệu về việc chiến thắng không xuất hiện ngay từ đầu (không tính giai đoạn draft game), mà nó sẽ trở nên rõ hơn khi ta dành được lợi thế. Điều này gây cho các bot một vấn đề là, khi bắt đầu game, các bot sẽ không thể nhận biết đâu là hành động dẫn đến chiến thắng. Vấn đề này được gọi là Long Horizon. Vấn đề thứ hai là, giả sử bot chiến thắng, thì đâu là hành động dẫn đến chiến thắng? Hành động last hit vào nhà chính, hay là hành động mua fearie fire lúc đầu game? Rất khó để xác định. Do đó, Five sẽ không thể biết việc nào quan trọng để dành chiến thắng, việc nào không quan trọng để dành chiến thắng. Tưởng tượng nó giống như việc lần đầu bạn vào SG, xuống ga thành phố và bạn phải tự đi đến Dinh Độc Lập. Nếu không có hướng dẫn, và bạn không được phép hỏi, xem google maps, hay suy đoán, bạn sẽ mò thử đường một cách ngẫu nhiên, như vậy, xác suất bạn đạt đến nơi là rất thấp.
Để khắc phục điều này, nhóm nghiên cứu đã vẽ ra một lộ trình chiến thắng cho Five. Cụ thể, họ lên các tiêu chí làm tăng xác suất dẫn đến chiến thắng (tăng tiền, tăng XP, tăng số kills đạt được, giữ máu cao,...) và các tiêu chí làm giảm xác suất dẫn đến chiến thắng. Thêm vào đó, họ thêm vào trọng số cho những hành động đó. Ví dụ, đối với Five, nhóm nghiên cứu đã cho Reward của việc phá hủy nhà chính đối phương là 5 (cho cả team), tăng 1XP là 0.002, tăng 1 vàng là 0.006, hoặc cho Penalty đối với việc chết là -1. Đặc biệt, trọng số của việc last hit và giết được hero đối phương lần lượt là -0.16 và -0.6. Tại sao lại như vậy? Trong Dota2, việc last hit và giết hero đối phương sẽ đi kèm với việc tăng XP và Gold, vì trọng số của XP và Gold là tương đối lớn, khi đó lượng Reward tổng cộng khi last hit hoặc giết hero đối phương sẽ được bù trừ và thực tế là vẫn dương. Nếu chúng ta tăng Penalty của việc chết lên -2 chẳng hạn, các bot sẽ có xu hướng giữ mạng. Hoặc nếu reward cho việc last hit là 0.16 thay vì -0.16, thì Reward của việc last hit sẽ rất lớn, từ đó các bot sẽ có xu hướng farm lính nhiều, kể cả trong combat.
Để Five hoạt động phù hợp hơn với gameplay của Dota2, nhóm phát triển cũng thêm vào nhiều yếu tố, như sức mạnh tình bạn của Team OG (Team spirit), để 5 bộ não của Five (5 cái LSTM networks) có thể tương tác với nhau như 1 team, về phân chia tài nguyên, về phối hợp trong combat. Hay là cho Five thích ứng với các giai đoạn của 1 game, như là early game, mid và late game, bằng cách tăng giá trị của Reward theo thời gian (Time scale).
Tự học, tự chơi, tự giỏi
Cuối cùng, sau khi có đầy đủ thiết kế, cách học, phương pháp học, còn lại duy nhất một vấn đề đối với nhóm nghiên cứu, tài liệu học!!!
Và câu trả lời của nhóm phát triển là, self-play. Nôm na là, Five được thả cho tự chơi Dota2 với chính nó, và không hề có sự xuất hiện của con người. Thông thường, việc huấn luyện một bot để chơi một trò chơi phức tạp như Dota2 đòi hỏi người phát triển phải tạo ra một môi trường có độ phức tạp tương xứng. Tuy nhiên, nghiên cứu của Bansal et al (2018) đã chỉ ra rằng, bằng self-play, các bot có thể tự phát triển được những kĩ năng phức tạp với những môi trường đơn giản.
Với nghiên cứu này, nhóm phát triển đã cho Five chơi 80% các games với bộ Theta (mình đã nhắc đến ở trên) hiện tại, và 20% với các bộ Theta trong quá khứ. Điều này có nghĩa là, Five tự chơi 80% các games với chính nó hiện tại và 20% các games còn lại với những phiên bản cũ của nó. Việc chơi với phiên bản cũ của nó để tránh trường hợp mà nhóm phát triển gọi là strategy collapse, nôm na là Five quên đi những chiến thuật cũ.
Quá trình self-play được thực hiện như hình bên dưới,
Sơ đồ hệ thống của Five (Nguồn: báo cáo chính thức của nhóm phát triển về dự án Five)
Đầu tiên, Rollout Worker (mình sẽ gọi là rollout) bao gồm các CPUs sẽ chơi game và trích xuất thông tin từ game đang chơi. Rollout sẽ không tính toán các policy, thay vào đó, nó sẽ gửi thông tin đến Forward Pass GPU (là một hệ thống gồm các GPUs). Tại đây, Forward Pass GPU, với tập parameters (Theta mà mình nói ở trên) nhận từ kho chứa ở Controller (ở bước 1 khi bắt đầu tính toán, các parameters sẽ được ngẫu nhiên hóa (randomized)), sẽ tính toán policy và đưa ra các actions ngược lại Rollout để tiếp tục chơi game. Kiểu như Forward Pass GPU là huấn luyện viên còn Rollout sẽ là người chơi vậy. Rollout sẽ đưa ra thông tin cho Forward Pass GPU, Forward Pass GPU sẽ nhận thông tin kết hợp với kiến thức của mình về trò chơi (các Theta) để đưa ra actions và "chỉ" cho Rollout chơi.
Bên cạnh đó, Rollout sẽ gửi thông tin về các quan sát và môi trường (ví dụ vị trí của hero, lượng máu, mana, neutral creep,...) đến một tập hợp các GPUs khác để thực hiện việc tối ưu hóa, tập hợp các GPUs này gọi là Optimizer. Đơn giản thì, nó sẽ tính gradient và update gradient. Rollout chuyển thông tin đến Optimizer sau 256 bước (tầm 34s) chứ không đợi đến hết game (Dota2 chạy với tốc độ 30 khung hình 1 giây, Five sẽ thực hiện 1 actions và quan sát mỗi 4 khung hình, nghĩa là 1 giây nó sẽ có 7.5 bước). Sau khi tối ưu hóa và cập nhật các parameters Theta mới, Optimizer sẽ chuyển các Theta mới này đến Controller, và sau đó Controller sẽ chuyển các Theta mới này đến Forward Pass GPUs, kết hợp với thông tin nhận được từ Rollout để đưa ra các actions.
Five có thực sự là một tay chơi Dota2 hoàn hảo?
Thực sự thì Dota2 là một trò chơi rất phức tạp, trong đó có nhiều tướng với nhiều kĩ năng đa dạng, các items phức tạp. Do đó, Five thực tế không được thiết kế để chơi tất cả các hero, cũng như sử dụng tất cả các items.
Cụ thể, Five chỉ được thiết kế để chơi 17 vị tướng. Thực tế, nhóm đã thử với 80 heros, kết quả cho thấy rằng, việc huấn luyện 80 heros sẽ tốn nhiều tài nguyên và thời gian hơn tầm 20% để đạt được mức kĩ năng so với việc huấn luyện với 17 heros ở giai đoạn đầu của quá trình thử nghiệm (được nhóm định nghĩa qua khái niệm TrueSkill). Điều này cũng dễ hiểu vì việc học chơi nhiều vị tướng hơn sẽ tốn nhiều thời gian hơn.
Thêm vào đó, các heros mà Five chơi (như là Necrophos, Sniper, Crystal Maiden, Lich, Viper, ...) thường là những heros dễ chơi, dễ trúng thưởng (thực ra mình không tìm thấy tài liệu nêu lên danh sách các vị tướng mà Five có thể chơi, đây là những gì mình tìm được).
Việc bỏ qua kĩ năng micro nhiều units cùng 1 lúc cũng là một hạn chế của Five, khi Five không sử dụng được các vị tướng cũng như items có khả năng tạo bóng, tạo đệ. Ví dụ Five không chơi được Meepo, không sử dụng được Manta Style hoặc bản đồ Five chơi không xuất hiện Illusion Rune.
Những chiến thuật chơi của Five
Theo nhóm phát triển thì chiến thuật chơi của Five khó để phân tích. Tuy nhiên, Five có phong cách chơi riêng, khác với con người.
Trong giai đoạn đầu của quá trình huấn luyện, Five ưu tiên giao tranh hơn là tích lũy tài nguyên đợi late game. Cách chơi này khiến cho Five sẽ snowball rất nhanh nếu có lợi thế và kết thúc trận đấu chỉ trong vòng 20ph, nhưng nếu đối thủ chủ động né giao tranh và câu late, Five sẽ rất dễ thua.
Sau khi được huấn luyện một thời gian, Five bắt đầu thích nghi hơn với các chiến thuật khác, như chủ động giao tranh nếu có lợi thế, nhưng sẽ né giao tranh và tập trung vào việc lấy tài nguyên (farm lính, tranh rune, ...) khi bị thất thế. Bên cạnh đó, Five còn biết cách tập trung tài nguyên cho người chơi mạnh nhất của mình để carry (giống chiến thuật chơi nhường tài nguyên cho carry của con người).
Một điểm khác biệt của Five so với con người là Five sẵn sàng dùng tài nguyên của mình (skills, items), trong khi con người thường có xu hướng giữ tài nguyên cho những lúc quan trọng (ví dụ giữ BKB, Satanic,...).
Cách lên items của Five cũng khác so với con người. Ví dụ lên Shadow Amulet cho Crystal Maiden. Trong clip dưới đây, Five thể hiện khả năng bật tắt Amulet của mình và thả diều nhà vô địch thế giới OG. Topson cho đến chết https://clips.twitch.tv/PricklyHardOrcaBatChest
Một vài con số thú vị về Five
- Quá trình huấn luyện Five diễn ra trong 10 tháng, từ 30 tháng 06 năm 2018 đến 22 tháng 04 năm 2019;
- Phiên bản cuối cùng của Five có 158.502.815 tham số (Theta mà mình nói đến ở trên);
- Việc huấn luyện sử dụng thuật toán Stochastic Gradient Descent với batch size là 2.949.120;
- Có tổng cộng 57.600 workers trên 51.200 CPUs tạo thành Rollout Worker được dùng để chạy self-play và lấy thông tin từ game, cùng 480 cho đến 1536 GPUs tham gia vào việc tính gradient;
- Five được nhóm phát triển đưa lên Internet và chơi game với người chơi Dota2 trên Internet từ ngày 18 tháng 04 năm 2019 đến ngày 21 tháng 04 năm 2019, tổng cộng Five đã chơi 7.257 games, thắng 7.215 games, tỉ lệ thắng là 99.4%.
Lời kết
Trên đây là những hiểu biết của mình về OpenAI Five, một trí tuệ nhân tạo được tạo ra đã bánh bại con người trong trò chơi Dota2. Còn rất nhiều vấn đề mà mình chưa đề cập trong bài (như giai đoạn Ban/Pick, Surgery, Randomization,...), hi vọng sẽ nhận được đóng góp của các bạn.
Tài liệu tham khảo
https://cdn.openai.com/dota-2.pdf (báo cáo chính thức của đội ngũ phát triển)
https://arxiv.org/pdf/1710.03748.pdf  (Bansal et al (2018))