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

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

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

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

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

  • Свертка (Convolution): маленький фильтр (ядро) сканирует входные данные и выявляет локальные шаблоны, например ряд из трёх камней или диагонали.
  • Нелинейность (Activation): после свёртки применяется функция активации ReLU, которая оставляет положительные значения и обнуляет отрицательные, помогая сети учить сложные правила.
  • Batch Normalization (BN): слой BatchNorm2d нормализует выходные значения каждого слоя по батчу. Это ускоряет обучение и делает его более стабильным.
  • Полносвязный слой (Linear): после свёрточных слоёв карты признаков разворачиваются в длинный вектор и передаются на линейный слой. Linear слой оценивает стратегическую ценность каждого хода на доске.

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

Чтобы понять, как работает Conv2d, нужно разобраться с тремя ключевыми терминами:

  • Каналы: каждый канал — это отдельный слой данных. На входе доска представлена одним каналом (1×15×15), потому что каждая клетка имеет одно значение: пусто, крестик или нолик. После первого слоя появляется 64 канала — значит сеть создала 64 разных способа «смотреть» на доску одновременно.
  • Фильтры: это маленькие матрицы весов (например, 3×3), которые обучаются находить локальные шаблоны. На первом слое таких фильтров 64, каждый фильтр ищет свою особенность — один может реагировать на горизонтальные линии, другой на диагонали и т.д.
  • Карты признаков (feature maps): результат применения фильтра к данным называется картой признаков. Если у вас 64 фильтра, то на выходе Conv2d будет 64 карты признаков, каждая показывает, где на доске найден конкретный шаблон.

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

В нашем коде слои создаются так:

torch::nn::Conv2d(torch::nn::Conv2dOptions(in_channels, out_channels, kernel_size).padding(p))

Параметры:

ПараметрЗначение в нашем кодеНазначение
in_channels1 → 64 → 64 → 128Количество входных каналов (на первом слое — 1 канал доски; далее — количество карт признаков предыдущего слоя).
out_channels64 → 64 → 128Количество фильтров, которые слой обучит для выявления шаблонов. Каждый фильтр создаёт свою карту признаков.
kernel_size3Размер фильтра (ядра) — 3×3. Он смотрит на соседние клетки.
padding1Добавляет рамку из нулей вокруг входа, чтобы размер выхода совпадал с размером входа (15×15).

4. Как фильтр сканирует доску

Представьте фильтр 3×3 как маленькую рамку. Он накладывается на доску и перемещается по всем позициям, считая сумму произведений своих весов и значений на доске. Благодаря padding=1 карта признаков остаётся 15×15. На каждом слое используется несколько фильтров, каждый создаёт свою карту признаков.

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

  • Conv1: 1 канал → 64 фильтра (3×3), карты 15×15 → ReLU + BatchNorm
  • Conv2: 64 → 64 фильтра (3×3), карты 15×15 → ReLU + BatchNorm
  • Conv3: 64 → 128 фильтров (3×3), карты 15×15 → ReLU + BatchNorm
  • Linear: flatten 128×15×15 = 28800 → 225 выходов (по одной на каждую клетку)

6. Количество «нейронов»

  • Conv1: 64 карты × 15×15 = 14400 нейронов
  • Conv2: 64 карты × 15×15 = 14400 нейронов
  • Conv3: 128 карт × 15×15 = 28800 нейронов
  • Linear: 225 нейронов

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

  1. Вход: доска 15×15 (тензор 1×1×15×15)
  2. Conv1 → BatchNorm1 → ReLU: получаем 64 карты 15×15
  3. Conv2 → BatchNorm2 → ReLU: получаем 64 карты 15×15
  4. Conv3 → BatchNorm3 → ReLU: получаем 128 карт 15×15
  5. Flatten: разворачиваем карты в один длинный вектор 28800 элементов
  6. Linear: предсказываем рейтинг каждой из 225 клеток доски

8. Важность ReLU и BatchNorm

  • ReLU: обнуляет отрицательные значения и оставляет положительные, помогает обучению и предотвращает проблему «залипания» на одних значениях.
  • BatchNorm: нормализует данные после свёртки, делает обучение стабильным, ускоряет его и предотвращает резкие перепады градиентов.

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

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

10. Заключение

Мы подробно разобрали работу сети GomokuNet. Свёрточные слои выявляют локальные шаблоны на доске, создают карты признаков через фильтры и каналы, ReLU и BatchNorm делают обучение стабильным, а Linear слой предсказывает ценность каждого хода. Теперь понятно, как фильтры, каналы и карты признаков помогают сети обучаться игре в Гомоку.

М.О.