Должен ли я нормализовать входные данные в моей нейронной сети?

сначала немного контекста.

Я берусь за очень амбициозный проект — создание нейронной сети, способной играть в шахматы на приличном уровне. Возможно, у меня ничего не получится, но я делаю это в основном для того, чтобы научиться подходить к такого рода машинному обучению.

Я решил обучить сеть с помощью генетического алгоритма для точной настройки весов после того, как разные нейронные сети сражались друг с другом в нескольких партиях в шахматы.

Каждый нейрон использует гиперболический тангенс (-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 о том, что я имею в виду:

Представление нейронной сети

Вопрос в том, должен ли я нормализовать входные данные, прежде чем они будут прочитаны нейронной сетью?

Я чувствую, что раздавливание данных может быть не такой уж хорошей идеей, но у меня действительно нет компетенции, чтобы сделать окончательный выбор.

Я надеюсь, что кто-то здесь может просветить меня по этому вопросу, и если вы считаете, что я должен нормализовать данные, я хотел бы, чтобы вы могли предложить некоторые способы сделать это.

Спасибо!


person Daniel    schedule 16.02.2017    source источник
comment
Пожалуйста, определите, что вы хотите нормализовать?   -  person SmallChess    schedule 17.02.2017
comment
Привет. Я хочу нормализовать входные данные, так что я перечислил в вопросе. Например, количество пешек, остающихся на доске, которое будет варьироваться от 0 до 8, должен ли я нормализовать его вместе со всеми другими входными данными, которые я перечислил?   -  person Daniel    schedule 17.02.2017
comment
Мой ответ на ваш [от 0 до 8] - ДА. Пожалуйста, просмотрите мой ответ.   -  person SmallChess    schedule 17.02.2017
comment
Я сделал аналогичный проект обучения с подкреплением на othello. Однако я не использовал ввод количества штук, поскольку сеть может сделать такой вывод. Я не использовал нормализацию. Успех довольно ограничен против поиска по дереву, поскольку у Отелло небольшое пространство поиска.   -  person Kh40tiK    schedule 17.02.2017


Ответы (1)


Вам не нужно ничего нормализовать внутри сети. Суть машинного обучения состоит в том, чтобы тренировать веса и смещения, чтобы изучить нелинейную функцию, в вашем примере это будет статическая шахматная оценка. Таким образом, ваша вторая нормализованная синяя вертикальная полоса (рядом с конечным результатом) не нужна.

Примечание. Hidden layers лучше использовать терминологию, чем abstraction layer, поэтому я буду использовать ее.

Другая нормализация, которую вы имеете перед скрытыми слоями, не является обязательной, но рекомендуется. Это также зависит от того, о каком входе мы говорим.

Газета Giraffe пишет на странице 18:

"Каждый слот имеет нормализованную координату x, нормализованную координату y..."

В шахматах 64 клетки, без нормализации диапазон будет [0,1,....63]. Это очень дискретно, и диапазон намного выше, чем у других входов (подробнее об этом позже). Имеет смысл нормализовать их до чего-то более управляемого и сопоставимого с другими входными данными. В документе не сказано, как именно он нормализуется, но я не понимаю, почему диапазон [0...1] не будет работать. Имеет смысл нормализовать шахматные клетки (или координаты).

Другие входные данные, например, есть ли на доске ферзь, являются истинными или ложными и, следовательно, не требуют нормализации. Например, в газете Giraffe на странице 18 написано:

...есть ли деталь или нет...

Ясно, что вы бы не нормализовали его.

Ответ на ваш вопрос

  • Если вы представляете Слой количества деталей как в Giraffe, вам не нужно нормализовать. Но если вы предпочитаете дискретное представление в [0..8] (потому что в шахматах может быть 9 ферзей), вы можете нормализовать.
  • Если вы представляете слой Piece Position Layer шахматными клетками, вы должны нормализовать его точно так же, как жираф.
  • Giraffe не нормализует Piece Attack Defense Layer, возможно, он представляет информацию как the lowest-valued attacker and defender of each square. К сожалению, в документе прямо не указано, как это делается. Ваша реализация может потребовать нормализации, поэтому руководствуйтесь здравым смыслом.

Без каких-либо предварительных предположений, какие функции будут более актуальными для модели, вы должны нормализовать их до сопоставимого масштаба.

ОТРЕДАКТИРОВАНО

Позвольте мне ответить на ваш комментарий. Нормализация — неправильный термин, вы говорите о функции активации (https://en.wikipedia.org/wiki/Activation_function). Функция нормализации и активации — не одно и то же.

person SmallChess    schedule 17.02.2017
comment
По-видимому, ввод отправляет комментарий вместо перехода на новую строку. Я хотел добавить еще кое-что. У меня сложилось впечатление, что каждый нейрон в нейронной сети (кроме выходных в самом конце) должен иметь какую-то функцию активации, например, tanh, вы говорите, что мне это не нужно в нейронах последнего слоя перед выход? - person Daniel; 17.02.2017
comment
@Daniel Я отредактировал свой ответ на ваш вопрос о нейронах последнего слоя перед выходом. - person SmallChess; 17.02.2017
comment
You shouldn't need to normalize anything inside the network. Не совсем верно, так как в литературе по глубокому обучению хорошо известен метод под названием пакетная нормализация. - person Kh40tiK; 17.02.2017
comment
@ Kh40tiK Возможно, вы правы (я мало что знаю о пакетной нормализации), но намерение OP, вероятно, не такое. - person SmallChess; 17.02.2017
comment
Привет, еще раз спасибо за ваш ответ. Вы правы, я извиняюсь, я использовал функцию активации и нормализацию как синонимы. Я не имею в виду, что я нормализую выходные данные слоев, то, что на рисунке было показано синими полосами, было функциями активации. - person Daniel; 18.02.2017