变压器能学会战略吗?

Can transformers learn strategies?

TicTacGPT玩简单棋盘游戏

Photo by Jon Tyson on Unsplash

尽管大多数棋盘游戏都倾向于使用卷积神经网络或其他几何灵感的架构,但实际上我们可以将棋盘状态表示为字符串的事实引发了一个问题,即变换器是否可以自然地应用于游戏中。在这里,我们将在井字棋的简单游戏背景下探讨这个问题。虽然这可能看起来并不太实际(几乎每个人都知道在这个游戏中有一个闭合形式的纳什均衡策略,非常容易学习),但对于我们的问题来说,这是一个有用的测试平台。原因是这个游戏足够简单,我们可以很容易地训练一个变换器来玩这个游戏,但足够复杂,不太明显什么是最佳策略。

实现游戏

我们将首先实现一个`TicTacToe`类。这相当简单。我们希望能够将棋盘表示为一个由9个字符组成的字符串,每个格子一个字符。我们将使用`X`表示第一个玩家,`O`表示第二个玩家,`-`表示一个空格。我们还将跟踪下一个轮到谁下棋,以及游戏是否结束。如果有赢家,我们还将跟踪赢家。最后,我们将包含一个漂亮的方法来打印棋盘,这样我们在调试时就不必盯着字符串了。

class TicTacToe:    def __init__(self):        # 初始化一个空棋盘        self.board = ['-' for _ in range(9)]        self.current_player = 'X'  # X先开始        def make_move(self, position):        """在棋盘上下一步棋。"""        if self.board[position] == '-':            self.board[position] = self.current_player            self.switch_player()            return True        else: return False  # 非法移动        def switch_player(self):        """切换当前玩家。"""        self.current_player = 'O' if self.current_player == 'X' else 'X'        def check_winner(self):        """检查是否有赢家。"""        # 行、列、对角线        winning_positions = [            [0, 1, 2], [3, 4, 5], [6, 7, 8],  # 行            [0, 3, 6], [1, 4, 7], [2, 5, 8],  # 列            [0, 4, 8], [2, 4, 6]  # 对角线        ]                for positions in winning_positions…