Piszę prostą grę z zabawkami z zamiarem trenowania głębokiej sieci neuronowej. Zasady gry są z grubsza następujące:
- Gra ma planszę złożoną z sześciokątnych komórek.
- Obaj gracze mają tę samą kolekcję elementów, którą mogą dowolnie umieszczać na planszy.
- Umieszczanie różnych rodzajów elementów nagradza (lub zmniejsza punkty przeciwnika) w zależności od ich pozycji i konfiguracji.
- Kto ma więcej punktów, wygrywa.
Istnieją dodatkowe zasady (dotyczące zwrotów, liczby i rodzajów elementów itp.), Ale nie są one ważne w kontekście tego pytania. Chcę stworzyć głęboką sieć neuronową, która może się iteracyjnie uczyć, grając przeciwko sobie. Moje pytania dotyczą reprezentacji danych wejściowych i wyjściowych. W szczególności:
- Ponieważ wzór elementów ma znaczenie, myślałem, że będę miał przynajmniej kilka warstw splotowych. Płytka może być różnej wielkości, ale w zasadzie bardzo mała (6x10 w moich testach, do rozszerzenia o kilka komórek). Czy ma sens? Z jakiego rodzaju puli mogę korzystać?
- Jak reprezentować obie strony? W tym artykule o go autorzy używają dwóch matryc wejściowych, jednej dla białych kamieni i jednej dla czarnych kamieni. Czy to też może działać w tym przypadku? Ale pamiętaj, że mam różne rodzaje elementów, powiedzmy A, B, C i D. Czy powinienem używać matryc wejściowych 2x4? Wydaje mi się to bardzo rzadkie i mało skuteczne. Obawiam się, że będzie to zbyt rzadkie, aby działały warstwy splotowe.
- Pomyślałem, że wyjściem może być rozkład prawdopodobieństw na macierzy reprezentujący pozycje na planszy, plus osobna tablica prawdopodobieństw wskazująca, który element zagrać. Jednak muszę również przedstawić zdolność do przekazania tury, co jest bardzo ważne. Jak mogę to zrobić, nie zmniejszając jego znaczenia wśród innych prawdopodobieństw?
- A co najważniejsze , czy egzekwuję tylko wygrywające ruchy czy też przegrane ruchy? Egzekwowanie zwycięskich ruchów jest łatwe, ponieważ właśnie ustawiłem pożądane prawdopodobieństwa na 1. Jednak, kiedy przegrywam, co mogę zrobić? Ustawić prawdopodobieństwo przesunięcia na 0, a wszystkich pozostałych na tę samą wartość? Czy sensowne jest również wymuszanie ruchów przez różnicę wyniku końcowego, nawet jeśli byłoby to sprzeczne ze znaczeniem wyników, które są z grubsza prawdopodobieństwem?
Ponadto opracowałem silnik gry w node.js, myśląc o użyciu Synaptic jako frameworku, ale nie jestem pewien, czy może on działać z sieciami splotowymi (wątpię, że istnieje sposób na ustalenie wag związanych z lokalnymi polami percepcyjnymi). Wszelkie porady na temat innych bibliotek kompatybilnych z węzłem?