Кружок Программирования

Нейросети для чайников. Объясняет ChatGPT.

Эта статья сгенерирована нейросетью. В ней мы разберём другую нейросеть, которая обучается играть в Гомоку на доске 15×15. Мы будем использовать код на C++ с LibTorch, и я объясню каждый слой, каждый параметр и логику работы сети для тех, кто не сталкивался с нейронными сетями раньше.

1. Что такое свёрточные нейронные сети (CNN)

Сверточные сети — это особый вид нейронных сетей, которые хорошо работают с изображениями и двумерными структурами, такими как доска в Гомоку. Главная идея:

  • Свертка (Convolution): маленький фильтр (ядро) сканирует входные данные и выявляет локальные шаблоны, например ряд из трёх камней или диагонали. В нашем случае Фильтр 3×3 перемещается по доске. В каждой позиции он умножает свои веса на значения клеток и суммирует результат. Так получается одно число — выход одного нейрона. Размер выходного слоя остаётся 15×15, потому что padding=1 добавляет по одному ряду пустых клеток с кажого края, компенсируя ужимание от свёртки ядром 3×3.
  • Нелинейность (Activation): после свёртки применяется функция активации tanh, которая сжимает значения в диапазон от -1 до +1. Это важно, потому что оценки ходов в сети тоже лежат примерно в этом диапазоне.
  • Batch Normalization (BN): слой BatchNorm2d нормализует выходные значения каждого канала. Это ускоряет обучение и делает его более стабильным.
  • Полносвязный слой (Linear): после свёрточных слоёв карты признаков разворачиваются в длинный вектор и передаются на линейный слой. Linear слой оценивает стратегическую ценность каждого хода на доске.

2. Понятия каналов, фильтров и карт признаков

  • Каналы: каждый канал — это карта 15×15. Важно: канал — это НЕ один нейрон, а целая сетка из 225 нейронов.
  • Фильтры: это маленькие матрицы весов (например, 3×3), которые обучаются находить локальные шаблоны.
  • Карты признаков: результат применения одного фильтра ко всей доске. Один фильтр = один канал.

3. Подробное объяснение Conv2dOptions

torch::nn::Conv2d(torch::nn::Conv2dOptions(in_channels, out_channels, kernel_size).padding(p))
Параметр Значение Назначение
in_channels 1 → 64 → 64 → 128 Сколько каналов приходит на вход
out_channels 64 → 64 → 128 Сколько фильтров (и каналов) создаётся
kernel_size 3 Размер фильтра 3×3
padding 1 Сохраняет размер 15×15

4. Архитектура GomokuNet

  • Conv1: 1 → 64 каналов
  • Conv2: 64 → 64
  • Conv3: 64 → 128
  • Linear: 28800 → 225

5. Сколько нейронов в каждом слое

  • Conv1: 64 × 15×15 = 14400
  • Conv2: 14400
  • Conv3: 28800
  • Linear: 225

6. Сколько входов у одного нейрона

  • Conv1: 3×3×1 = 9 входов
  • Conv2: 3×3×64 = 576 входов
  • Conv3: 3×3×64 = 576 входов
  • Linear: 28800 входов

7. Сколько параметров (весов) в сети

  • Conv1: 64 × (3×3×1 + 1) = 640
  • Conv2: 64 × (3×3×64 + 1) = 36928
  • Conv3: 128 × (3×3×64 + 1) = 73856
  • Linear: 28800 × 225 + 225 ≈ 6.48 млн

Вывод: почти все параметры сети находятся в Linear слое.

8. Почему Linear слой — узкое место

Linear слой имеет миллионы параметров. Это:

  • замедляет обучение
  • повышает риск переобучения
  • игнорирует пространственную структуру доски

9. Как данные текут через слои

  1. Вход: 1×1×15×15
  2. Conv1 → BN → tanh
  3. Conv2 → BN → tanh
  4. Conv3 → BN → tanh
  5. Flatten → 28800
  6. Linear → 225

10. Почему каналы — это не нейроны

1 канал = 15×15 = 225 нейронов. Поэтому 64 канала = 14400 нейронов.

11. Почему 1 входной канал — это ограничение

Сейчас используется кодировка:

  • 1 = свой камень
  • -1 = чужой

Лучше использовать:

  • канал 1: свои камни
  • канал 2: чужие

12. Роль функции активации (tanh)

tanh ограничивает значения в [-1, 1], что хорошо совпадает с рейтингами ходов.

13. BatchNorm — что он делает

Нормализует каждый канал отдельно, чтобы значения не "разъезжались".

14. Интерпретация выходов сети

225 чисел — это оценки ходов, а не вероятности.

15. Как считается ошибка (Loss)

Используется MSE, но только для известных ходов (через mask).

16. Два режима обучения

  • По всей позиции
  • По одному ходу

17. Как сеть выбирает ход

Запрещённые клетки получают штраф, затем берётся argmax.

18. Как можно улучшить эту сеть (уровень AlphaZero)

  • Несколько входных каналов
  • Residual-блоки (ResNet)
  • Убрать Linear слой
  • Сделать отдельные головы:
    • Policy (куда ходить)
    • Value (кто выигрывает)

19. Схема сети с визуальными пояснениями

Input 1×15×15 Conv1 64×15×15 tanh + BN Conv2 64×15×15 tanh + BN Conv3 128×15×15 tanh + BN Flatten 28800 Linear 225

 

20. Итог

 

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

М.О.