ТЕХНИЧЕСКОЕ ПОСОБИЕ · БЕЗ МИСТИФИКАЦИИ
Как маленькая сеть
научилась летать
NF‑Икарус не видит картинку и не понимает игру словами. Шесть чисел описывают текущий полёт, 65 обученных параметров превращают их в одно решение: дать импульс или продолжить падение.
- АРХИТЕКТУРА
- 6 → 8 → 1
- ПАРАМЕТРЫ
- 65
- ТАКТ РЕШЕНИЯ
- 60 Гц
- ML-ФРЕЙМВОРК В БРАУЗЕРЕ
- не нужен
ПЕРЕД НАЧАЛОМ
Шесть слов, которые встретятся дальше
Архитектура сети вместе с уже найденными весами.
Число, которое обучение может изменить: вес или смещение.
Набор примеров, на которых модель учится или проверяется.
Процесс поиска параметров, уменьшающих ошибки или повышающих награду.
Обычное применение уже обученной модели для нового решения.
Один полный проход алгоритма обучения по тренировочному датасету.
КАРТА СИСТЕМЫ
Один полный цикл
Игра повторяет этот маршрут до шестидесяти раз в секунду. В самой сети нет специальных правил про ворота или гравитацию — только числа, умножения и нелинейные функции.
- 1МИРПоложение дрона и ближайших ворот
- 26 СЕНСОРОВФизика переводится в компактные числа
- 38 НЕЙРОНОВСмешивают сигналы с обученными весами
- 41 ВЫХОДВероятность импульса от 0 до 1
- 5ФИЗИКАПорог 0,50 меняет вертикальную скорость
САМАЯ МАЛЕНЬКАЯ ДЕТАЛЬ
Что такое один искусственный нейрон
Название позаимствовано у биологии, но искусственный нейрон не является маленьким мозгом. Это калькулятор из четырёх операций: получить числа, умножить каждое на свой коэффициент, сложить и пропустить сумму через ограничивающую функцию.
+0,30+0,16+0,60+2,0−1,5+0,4z = Σ(xᵢ × wᵢ) + b
0,30×2 − 0,16×1,5 + 0,60×0,4 − 0,10
z = +0,50
h = tanh(z)
+0,46
сигнал нейрона следующему слою
x
Факт о текущем мире. Например, нормализованная высота дрона. Вход меняется каждый кадр и не обучается.
w
Ручка громкости для одного входа. Большой положительный вес усиливает сигнал, отрицательный меняет его направление, близкий к нулю почти игнорирует.
b
Собственная исходная склонность нейрона. Благодаря смещению он может активироваться не только тогда, когда все входы ненулевые.
tanh
Сжимает любую сумму в диапазон от −1 до +1. Без неё несколько слоёв свелись бы к одному линейному вычислению и плохо описывали бы сложные реакции.
ПЕРЕВОДЧИК МЕЖДУ ИГРОЙ И СЕТЬЮ
Нормализация — буквально
В игре высота измеряется сотнями пикселей, скорость — пикселями в секунду, а размер просвета — примерно двумя сотнями пикселей. Если подать эти величины как есть, масштаб единицы измерения начнёт влиять сильнее смысла. Нормализация переводит разные физические величины на общий числовой язык.
Число зависит от размера игрового поля.
Делим на высоту мира и переносим середину в ноль.
Дрон на три четверти пути от потолка к полу.
(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: редкий выброс не может стать
огромным числом и полностью заглушить остальные входы.
В обычном игровом диапазоне — практически нет. Меняются масштаб и начало отсчёта, но взаимное положение состояний сохраняется.
ИНТЕРАКТИВНЫЙ РАЗБОР
Поставьте сеть в любую ситуацию
Ниже загружаются те же веса model.json, которыми управляется настоящая
игра. Слева задаются физические величины в понятных единицах, затем они
нормализуются, проходят через восемь скрытых нейронов и дают итог справа.
Загрузка параметров модели…
МАТЕМАТИКА
Что именно считается
Теперь соберём отдельные нейроны в сеть. Слово «слой» означает только группу вычислений, результаты которой передаются следующей группе. Скрытый слой из восьми нейронов получает все шесть входов одновременно.
x = [x₁ … x₆]
Пять физических величин превращаются в шесть сопоставимых входов.
hⱼ = tanh(bⱼ + Σ xᵢwᵢⱼ)
Восемь разных наборов весов создают восемь разных взглядов на ситуацию.
p = sigmoid(b + Σ hⱼwⱼ)
Ещё одна взвешенная сумма превращается в удобное число от 0 до 1.
p > 0,50 → импульс
Порог превращает плавный сигнал сети в бинарную команду игре.
Не потому, что он секретный. Мы видим входы и конечное действие напрямую, а промежуточные восемь значений существуют только внутри вычисления.
У них нет заранее назначенных ролей вроде «нейрон высоты». Обучение распределяет полезные закономерности между ними, и смысл обычно возникает из совместной работы нескольких нейронов.
Формально он похож на вероятность и при обучении трактуется как она. Но в игре безопаснее называть его силой решения: значение 0,90 не гарантирует правильность в девяти случаях из десяти.
ВОСПРИЯТИЕ
Что сеть видит — и чего не видит
Программист сам решает, какие факты предоставить модели. Это называется проектированием признаков. Хороший набор не сообщает готовый ответ, но делает нужную закономерность доступной маленькой сети.
Где дрон находится между потолком и полом.
Летит ли он вверх или уже ускоряется вниз.
Сколько времени остаётся до встречи с препятствием.
Где по вертикали расположен безопасный коридор.
Насколько дрон выше или ниже нужной точки.
Сколько запаса доступно для ошибки управления.
Canvas рисуется только для человека. Координаты поступают прямо из игровой физики.
Это не рекуррентная сеть. История влияет лишь через текущую вертикальную скорость.
Дальние препятствия намеренно не нужны для короткого реактивного управления.
Ручное управление не меняет веса. Браузер хранит только лучший счёт.
ОБУЧЕНИЕ
С учителем — и самостоятельно
Ваша интуиция верна: это отличная среда, чтобы агент учился собственными попытками. Именно так и происходит на втором этапе. Но сначала ему дают дешёвый стартовый навык от математического учителя — не вместо самостоятельных полётов, а чтобы не тратить большую часть вычислений на заведомо беспомощные падения.
Модель получает состояние и метку: здесь надо дать импульс, здесь — нет. Ошибка между меткой и ответом показывает, в какую сторону менять веса.
Никто не сообщает правильный ответ на каждом кадре. Агент действует, получает награду за результат и постепенно ищет более успешную стратегию.
Например, группировка похожих объектов. В Neuroflight этот класс методов не используется. Нейроэволюция тоже не относится к нему в строгом смысле.
Генерируются не видеозаписи, а 40 000 случайных наборов координат и скоростей.
Для каждого набора короткая физическая формула прогнозирует, куда дрон
продолжит падать, и создаёт метку 1 — импульс или
0 — парить.
- Данные
- 40 000 состояний
- Обучение / проверка
- 36 000 / 4 000
- Эпохи
- 42
- Проверочная точность
- 98,025%
- Проверочная ошибка
- 0,0555
Создаются 72 версии уже обученного пилота с немного различающимися весами. Они действительно играют в ту же физику, что и браузерная игра. Успешные версии сохраняются, копируются и случайно мутируют; неуспешные исчезают.
- Популяция
- 72 пилота
- Поколения
- 36
- Элита поколения
- 14 пилотов
- Финальная проверка
- 8 сценариев × 120 с
- Худший итоговый fitness
- 126,08
t = clamp(дистанция / 185, 0,06, 0,30)
ŷ = y + vᵧt + ½ · 840 · t²
Если прогнозируемая высота окажется ниже целевой точки просвета и дрон уже не взлетает слишком быстро, учитель ставит метку «импульс». Цель берётся на 12 пикселей выше центра: импульс мгновенно придаёт скорость вверх, а гравитация продолжает действовать после него.
Сеть выдаёт число для пачки из 1024 размеченных состояний.
Бинарная кросс‑энтропия измеряет расхождение ответа с меткой 0 или 1.
Производные показывают вклад каждого веса в ошибку.
Adam‑подобное обновление немного сдвигает все 65 параметров в полезную сторону.
Одна эпоха — это один полный проход по 36 000 обучающим примерам. Таких проходов 42. Данные каждый раз перемешиваются, а скорость обновления весов дважды уменьшается, чтобы в конце делать более осторожные поправки. Оставшиеся 4 000 состояний сеть не использует для изменения весов: они нужны, чтобы проверить, выучила ли она правило, а не запомнила тренировочную выборку.
Здесь нет обратного распространения ошибки: симулятор не обязан быть
дифференцируемым. Он просто оценивает целого пилота. 70% итоговой оценки приходит
от среднего результата на сценариях, а 30% — от худшего. Поэтому выгоден не
один удачный полёт, а устойчивость. Каждые пять поколений кандидаты дополнительно
проверяются на четырёх постоянных сценариях; величина мутаций постепенно
уменьшается с 0,11 до нижней границы 0,025.
Можно получить высокую точность на отдельных состояниях и всё равно погибать из‑за редкой ошибки, которая уводит полёт в незнакомую область.
Случайные сети сначала почти сразу разбиваются. Награда за выживание есть, однако хорошую реакцию приходится находить с нуля огромным числом полётов.
Формула дешёво приводит поиск в разумную область, а самостоятельные полёты оптимизируют именно то, что важно пользователю: долгую устойчивую игру.
ВЫПОЛНЕНИЕ
Где физически живёт модель
Обучение и использование модели — разные процессы. Тяжёлый поиск весов однажды выполнялся локально в Python. Посетитель получает готовые 65 чисел и выполняет только короткий прямой расчёт — инференс.
Браузер получает model.json как обычный статический файл.
Функция на JavaScript выполняет примерно 65 умножений и сложений за такт.
localStorage хранит только рекорд под ключом neuroflight-best.
Сенсоры игры и решения агента не отправляются обратно на сервер.
Python генерирует примеры, считает ошибки, симулирует популяции и экспортирует победителя.
JavaScript получает шесть входов, считает восемь активаций и один выход. Результат сразу управляет физикой.
ЧЕСТНЫЕ ГРАНИЦЫ
Насколько это «интеллект»
Это настоящая обученная нейронная сеть, но очень специализированная. Она не рассуждает словами, не переносит навык в другую игру и не понимает, что является дроном. Её интеллект — выученная функция управления внутри одной физики.
Обобщать на новые последовательности ворот в знакомом диапазоне физики.
Сочетать высоту, скорость и время до препятствия нелинейным образом.
Объяснить решение человеческим языком — подписи виджета создаёт интерфейс.
Надёжно работать после радикальной смены гравитации или силы импульса без новой проверки.
ВОСПРОИЗВОДИМОСТЬ
Как повторить обучение
Обучение использует 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 — физика и выполнение сети.