Нейросети для чайников. Объясняет 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_channels | 1 → 64 → 64 → 128 | Количество входных каналов (на первом слое — 1 канал доски; далее — количество карт признаков предыдущего слоя). |
| out_channels | 64 → 64 → 128 | Количество фильтров, которые слой обучит для выявления шаблонов. Каждый фильтр создаёт свою карту признаков. |
| kernel_size | 3 | Размер фильтра (ядра) — 3×3. Он смотрит на соседние клетки. |
| padding | 1 | Добавляет рамку из нулей вокруг входа, чтобы размер выхода совпадал с размером входа (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. Как данные текут через слои
- Вход: доска 15×15 (тензор 1×1×15×15)
- Conv1 → BatchNorm1 → ReLU: получаем 64 карты 15×15
- Conv2 → BatchNorm2 → ReLU: получаем 64 карты 15×15
- Conv3 → BatchNorm3 → ReLU: получаем 128 карт 15×15
- Flatten: разворачиваем карты в один длинный вектор 28800 элементов
- Linear: предсказываем рейтинг каждой из 225 клеток доски
8. Важность ReLU и BatchNorm
- ReLU: обнуляет отрицательные значения и оставляет положительные, помогает обучению и предотвращает проблему «залипания» на одних значениях.
- BatchNorm: нормализует данные после свёртки, делает обучение стабильным, ускоряет его и предотвращает резкие перепады градиентов.
9. Схема сети с визуальными пояснениями
10. Заключение
Мы подробно разобрали работу сети GomokuNet. Свёрточные слои выявляют локальные шаблоны на доске, создают карты признаков через фильтры и каналы, ReLU и BatchNorm делают обучение стабильным, а Linear слой предсказывает ценность каждого хода. Теперь понятно, как фильтры, каналы и карты признаков помогают сети обучаться игре в Гомоку.
