сначала немного контекста.
Я берусь за очень амбициозный проект — создание нейронной сети, способной играть в шахматы на приличном уровне. Возможно, у меня ничего не получится, но я делаю это в основном для того, чтобы научиться подходить к такого рода машинному обучению.
Я решил обучить сеть с помощью генетического алгоритма для точной настройки весов после того, как разные нейронные сети сражались друг с другом в нескольких партиях в шахматы.
Каждый нейрон использует гиперболический тангенс (-1, 1) для нормализации данных после их обработки, но еще не нормализует входные данные до того, как они попадут в сеть.
Я черпал вдохновение в шахматном движке Giraffe, особенно в вводных данных.
Они будут выглядеть примерно так:
Первый слой:
количество оставшихся белых пешек (0-8)
количество оставшихся черных пешек (0-8)
количество оставшихся Белых Рыцарей (0-2)
количество оставшихся Черных рыцарей (0-2)
....
Второй слой все еще на том же уровне, что и первый:
- Позиция пешки 1 (вероятно, с двумя значениями: x[0-7] и y[0-7])
- Позиция пешки 2
...
- Позиция королевы 1
- Позиция королевы 2
...
Третий слой, снова на том же уровне, что и два предыдущих. Данные будут «пересекаться» только после следующего уровня абстракции.
- Стоимость фигур, атакованных Пешкой1 (будет находиться в диапазоне 0-12)
- Ценности фигур, атакованных пешкой 2
...
- Ценность фигур, атакованных Bishop1
Вы поняли идею.
Если вы не знали, вот ужасное представление Paint о том, что я имею в виду:
Вопрос в том, должен ли я нормализовать входные данные, прежде чем они будут прочитаны нейронной сетью?
Я чувствую, что раздавливание данных может быть не такой уж хорошей идеей, но у меня действительно нет компетенции, чтобы сделать окончательный выбор.
Я надеюсь, что кто-то здесь может просветить меня по этому вопросу, и если вы считаете, что я должен нормализовать данные, я хотел бы, чтобы вы могли предложить некоторые способы сделать это.
Спасибо!