Daniel Sauble Segue 23 de jul · 13 min ler
Tic-tac-toe (ou zeros e cruzes) é um jogo simples. Dado que dois jogadores ('X' e 'O') estão alternando turnos em uma grade de 3×3, qual jogador pode ser o primeiro a reivindicar três quadrados em uma única linha, coluna ou diagonal?
Quanto aos jogos, o tic-tac-toe não é muito interessante. Com jogo perfeito, sempre termina em empate. Além disso, existem apenas 26.830 jogos únicos, então o espaço de busca é pequeno o suficiente para que possa ser resolvido sem recorrer a técnicas de aprendizagem profunda.
Ao mesmo tempo, os jogos simples costumam ser a melhor maneira de aprender como a aprendizagem profunda funciona. Você não precisa de um modelo complexo para obter bons resultados, e você não ficará atolado na complexidade do jogo em si. Vamos ver como alguém pode ensinar uma rede neural profunda (DNN) a jogar tic-tac-toe.
O Notebook Jupyter está aqui se você quiser o código completo para os exemplos a seguir.
Redes Neurais Profundas
Há excelentes introduções para redes neurais profundas, então não vou entrar em muitos detalhes. Mas aqui está uma atualização.
Fundamentalmente, uma rede neural profunda é sobre correspondência de padrões. Ele consiste em várias camadas de nós empilhadas umas sobre as outras. Cada nó recebe entrada de um ou mais nós na camada anterior. Depois de aplicar uma função, ela envia sua saída para um ou mais nós na próxima camada. Seus dados de treinamento são passados como entrada para a camada superior e sua classificação é medida em relação à saída da camada inferior.
Usando uma técnica chamada de propagação reversa, as pilhas de nós atualizam seus pesos até que as saídas da camada inferior estejam muito próximas da classificação desejada para cada parte dos dados de treinamento. Para evitar o overfitting, é necessário treinar com muitos dados e também reservar um conjunto de dados de teste que o modelo não tenha visto durante o treinamento.
Em nosso modelo DNN para jogar tic-tac-toe, os dados de treinamento são estados de tabuleiro individuais, e a classificação é a probabilidade de ganhar 'X', 'O' ou um empate. Uma vez treinados, podemos passar ao nosso modelo uma série de movimentos possíveis, depois escolher o movimento que provavelmente resultará no resultado desejado.
Por exemplo, se "X" estiver em movimento, queremos escolher um lance que resulte em uma vitória "X". No entanto, também queremos ser sensíveis sobre se uma vitória para 'X' parece improvável, caso em que devemos jogar por um empate. Um empate é preferível a um adversário vencedor.
O ambiente do jogo
Uma maneira de adquirir dados de treinamento é simulá-lo. Antes de podermos criar um simulador de jogos, temos que construir um ambiente no qual o nosso simulador possa rodar. Felizmente, para o tic-tac-toe isso é relativamente simples.
Precisamos de uma função para inicializar uma nova placa:
def initBoard ():
board = [
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]
]
placa de retorno
E uma função para obter uma lista de movimentos válidos para uma determinada prancha:
def getMoves (quadro):
move = []
para eu na faixa (len (placa)):
para j na faixa (len (placa [i])):
se placa [i] [j] == 0:
move.append ((i, j))
movimentos de retorno read more