NEUROFLIGHTFIELD MANUAL / 01

ТЕХНИЧЕСКОЕ ПОСОБИЕ · БЕЗ МИСТИФИКАЦИИ

Как маленькая сеть
научилась летать

NF‑Икарус не видит картинку и не понимает игру словами. Шесть чисел описывают текущий полёт, 65 обученных параметров превращают их в одно решение: дать импульс или продолжить падение.

АРХИТЕКТУРА
6 → 8 → 1
ПАРАМЕТРЫ
65
ТАКТ РЕШЕНИЯ
60 Гц
ML-ФРЕЙМВОРК В БРАУЗЕРЕ
не нужен

ПЕРЕД НАЧАЛОМ

Шесть слов, которые встретятся дальше

Модель

Архитектура сети вместе с уже найденными весами.

Параметр

Число, которое обучение может изменить: вес или смещение.

Датасет

Набор примеров, на которых модель учится или проверяется.

Обучение

Процесс поиска параметров, уменьшающих ошибки или повышающих награду.

Инференс

Обычное применение уже обученной модели для нового решения.

Эпоха

Один полный проход алгоритма обучения по тренировочному датасету.

01

КАРТА СИСТЕМЫ

Один полный цикл

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

  1. 1МИРПоложение дрона и ближайших ворот
  2. 26 СЕНСОРОВФизика переводится в компактные числа
  3. 38 НЕЙРОНОВСмешивают сигналы с обученными весами
  4. 41 ВЫХОДВероятность импульса от 0 до 1
  5. 5ФИЗИКАПорог 0,50 меняет вертикальную скорость
02

САМАЯ МАЛЕНЬКАЯ ДЕТАЛЬ

Что такое один искусственный нейрон

Название позаимствовано у биологии, но искусственный нейрон не является маленьким мозгом. Это калькулятор из четырёх операций: получить числа, умножить каждое на свой коэффициент, сложить и пропустить сумму через ограничивающую функцию.

Вход x

Факт о текущем мире. Например, нормализованная высота дрона. Вход меняется каждый кадр и не обучается.

Вес w

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

Смещение b

Собственная исходная склонность нейрона. Благодаря смещению он может активироваться не только тогда, когда все входы ненулевые.

Активация tanh

Сжимает любую сумму в диапазон от −1 до +1. Без неё несколько слоёв свелись бы к одному линейному вычислению и плохо описывали бы сложные реакции.

03

ПЕРЕВОДЧИК МЕЖДУ ИГРОЙ И СЕТЬЮ

Нормализация — буквально

В игре высота измеряется сотнями пикселей, скорость — пикселями в секунду, а размер просвета — примерно двумя сотнями пикселей. Если подать эти величины как есть, масштаб единицы измерения начнёт влиять сильнее смысла. Нормализация переводит разные физические величины на общий числовой язык.

БЫЛО высота = 450 px

Число зависит от размера игрового поля.

ФОРМУЛА (450 / 600 − 0,5) × 2

Делим на высоту мира и переносим середину в ноль.

СТАЛО +0,50

Дрон на три четверти пути от потолка к полу.

СигналФормула ПримерКак читать знак
Высота(y / 600 − 0,5) × 2 300 px → 0,00− выше середины, + ниже
Вертикальная скоростьvᵧ / 500 +80 px/с → +0,16− летит вверх, + падает
До воротdx / 500 300 px → +0,600 — ворота уже рядом
Центр просвета(gapY / 600 − 0,5) × 2 320 px → +0,067положение относительно центра мира
Ошибка по высоте(gapY − y) / 300 32 px → +0,107+ просвет ниже дрона
Размер просветаgapSize / 600 198 px → +0,330доля высоты игрового поля
Зачем середину превращать в ноль?

Ноль становится нейтральной точкой. Положительный и отрицательный знаки сразу кодируют две противоположные стороны ситуации.

Зачем ограничивать значения?

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

Теряется ли информация?

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

04

ИНТЕРАКТИВНЫЙ РАЗБОР

Поставьте сеть в любую ситуацию

Ниже загружаются те же веса model.json, которыми управляется настоящая игра. Слева задаются физические величины в понятных единицах, затем они нормализуются, проходят через восемь скрытых нейронов и дают итог справа.

ВЫХОД СЕТИ ЗАГРУЗКА 0,00 порог 0,50 1,00
Что получает сетьвсе входы приведены к небольшому диапазону
Живой граф 6 → 8 → 1толщина линии — модуль веса, цвет — знак
усиливает подавляет
Разобрать скрытый нейронвыберите один из восьми

Загрузка параметров модели…

05

МАТЕМАТИКА

Что именно считается

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

НОРМАЛИЗАЦИЯ x = [x₁ … x₆]

Пять физических величин превращаются в шесть сопоставимых входов.

СКРЫТЫЙ СЛОЙ hⱼ = tanh(bⱼ + Σ xᵢwᵢⱼ)

Восемь разных наборов весов создают восемь разных взглядов на ситуацию.

ВЫХОД p = sigmoid(b + Σ hⱼwⱼ)

Ещё одна взвешенная сумма превращается в удобное число от 0 до 1.

ДЕЙСТВИЕ p > 0,50 → импульс

Порог превращает плавный сигнал сети в бинарную команду игре.

ПОЧЕМУ СЛОЙ «СКРЫТЫЙ»?

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

ЧТО ОЗНАЧАЕТ КАЖДЫЙ ИЗ 8 НЕЙРОНОВ?

У них нет заранее назначенных ролей вроде «нейрон высоты». Обучение распределяет полезные закономерности между ними, и смысл обычно возникает из совместной работы нескольких нейронов.

ВЫХОД — ЭТО ВЕРОЯТНОСТЬ?

Формально он похож на вероятность и при обучении трактуется как она. Но в игре безопаснее называть его силой решения: значение 0,90 не гарантирует правильность в девяти случаях из десяти.

06

ВОСПРИЯТИЕ

Что сеть видит — и чего не видит

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

Высота

Где дрон находится между потолком и полом.

Вертикальная скорость

Летит ли он вверх или уже ускоряется вниз.

Дистанция до ворот

Сколько времени остаётся до встречи с препятствием.

Центр просвета

Где по вертикали расположен безопасный коридор.

Ошибка по высоте

Насколько дрон выше или ниже нужной точки.

Размер просвета

Сколько запаса доступно для ошибки управления.

Сеть не видит пиксели

Canvas рисуется только для человека. Координаты поступают прямо из игровой физики.

У сети нет памяти

Это не рекуррентная сеть. История влияет лишь через текущую вертикальную скорость.

Она знает только ближайшие ворота

Дальние препятствия намеренно не нужны для короткого реактивного управления.

Она не учится у посетителя

Ручное управление не меняет веса. Браузер хранит только лучший счёт.

07

ОБУЧЕНИЕ

С учителем — и самостоятельно

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

ОБУЧЕНИЕ С УЧИТЕЛЕМ Есть правильный ответ для каждого примера

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

ОБУЧЕНИЕ С ПОДКРЕПЛЕНИЕМ Есть последствия действий и награда

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

ОБУЧЕНИЕ БЕЗ УЧИТЕЛЯ Ищутся закономерности без меток и награды

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

ЭТАП AИмитация учителя

Генерируются не видеозаписи, а 40 000 случайных наборов координат и скоростей. Для каждого набора короткая физическая формула прогнозирует, куда дрон продолжит падать, и создаёт метку 1 — импульс или 0 — парить.

Данные
40 000 состояний
Обучение / проверка
36 000 / 4 000
Эпохи
42
Проверочная точность
98,025%
Проверочная ошибка
0,0555
ЭТАП BНейроэволюция

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

Популяция
72 пилота
Поколения
36
Элита поколения
14 пилотов
Финальная проверка
8 сценариев × 120 с
Худший итоговый fitness
126,08
УЧИТЕЛЬ СМОТРИТ В БЛИЖАЙШЕЕ БУДУЩЕЕ t = clamp(дистанция / 185, 0,06, 0,30) ŷ = y + vᵧt + ½ · 840 · t²

Если прогнозируемая высота окажется ниже целевой точки просвета и дрон уже не взлетает слишком быстро, учитель ставит метку «импульс». Цель берётся на 12 пикселей выше центра: импульс мгновенно придаёт скорость вверх, а гравитация продолжает действовать после него.

1Прямой проход

Сеть выдаёт число для пачки из 1024 размеченных состояний.

2Функция ошибки

Бинарная кросс‑энтропия измеряет расхождение ответа с меткой 0 или 1.

3Обратное распространение

Производные показывают вклад каждого веса в ошибку.

4Шаг оптимизатора

Adam‑подобное обновление немного сдвигает все 65 параметров в полезную сторону.

Одна эпоха — это один полный проход по 36 000 обучающим примерам. Таких проходов 42. Данные каждый раз перемешиваются, а скорость обновления весов дважды уменьшается, чтобы в конце делать более осторожные поправки. Оставшиеся 4 000 состояний сеть не использует для изменения весов: они нужны, чтобы проверить, выучила ли она правило, а не запомнила тренировочную выборку.

172 набора весовОдин чемпион и варианты с шумом
2Полёт в средеДве новые последовательности ворот, до 42 секунд
3FitnessГлавное — время жизни, небольшой бонус — держаться у центра
4Отбор и мутация14 лучших становятся родителями следующего поколения

Здесь нет обратного распространения ошибки: симулятор не обязан быть дифференцируемым. Он просто оценивает целого пилота. 70% итоговой оценки приходит от среднего результата на сценариях, а 30% — от худшего. Поэтому выгоден не один удачный полёт, а устойчивость. Каждые пять поколений кандидаты дополнительно проверяются на четырёх постоянных сценариях; величина мутаций постепенно уменьшается с 0,11 до нижней границы 0,025.

ТОЛЬКО УЧИТЕЛЬ Быстро, но не проверяет длинную цепочку решений

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

ТОЛЬКО ЭВОЛЮЦИЯ Возможно, но дороже и медленнее стартует

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

ВЫБРАНО: ГИБРИД Учитель даёт рефлекс, среда проверяет реальность

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

08

ВЫПОЛНЕНИЕ

Где физически живёт модель

Обучение и использование модели — разные процессы. Тяжёлый поиск весов однажды выполнялся локально в Python. Посетитель получает готовые 65 чисел и выполняет только короткий прямой расчёт — инференс.

Загрузка

Браузер получает model.json как обычный статический файл.

Инференс

Функция на JavaScript выполняет примерно 65 умножений и сложений за такт.

Состояние

localStorage хранит только рекорд под ключом neuroflight-best.

Приватность

Сенсоры игры и решения агента не отправляются обратно на сервер.

ВО ВРЕМЯ ОБУЧЕНИЯ Веса меняются

Python генерирует примеры, считает ошибки, симулирует популяции и экспортирует победителя.

ВО ВРЕМЯ ИГРЫ Веса неизменны

JavaScript получает шесть входов, считает восемь активаций и один выход. Результат сразу управляет физикой.

09

ЧЕСТНЫЕ ГРАНИЦЫ

Насколько это «интеллект»

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

МОЖЕТ

Обобщать на новые последовательности ворот в знакомом диапазоне физики.

МОЖЕТ

Сочетать высоту, скорость и время до препятствия нелинейным образом.

НЕ МОЖЕТ

Объяснить решение человеческим языком — подписи виджета создаёт интерфейс.

НЕ МОЖЕТ

Надёжно работать после радикальной смены гравитации или силы импульса без новой проверки.

10

ВОСПРОИЗВОДИМОСТЬ

Как повторить обучение

Обучение использует NumPy и фиксированный seed 260718. Результат экспортируется в JSON и не требует TensorFlow или PyTorch на сайте.

python -m pip install -r training/requirements.txt
python training/train.py
python tests/test_model.py

Главные исходники: training/train.py — обучение, model.json — веса, app.js — физика и выполнение сети.