# Аналоговый Redstone: как Янник Кильчер реализовал алгоритм обратного распространения ошибки в Minecraft

Источник: https://www.youtube.com/watch?v=7OdhtAiPfWY
Канал: Yannic Kilcher
Опубликовано: 14.04.2021

---

Янник Кильчер (Yannic Kilcher), известный исследователь в области машинного обучения, продемонстрировал уникальный проект: полностью функциональную и обучаемую аналоговую нейронную сеть, построенную в Minecraft. В отличие от большинства внутриигровых компьютеров, работающих на бинарной логике, эта система использует уровни сигнала Redstone для выполнения вычислений, имитируя работу биологического мозга и современных ML-моделей.

## 🧱 Основы аналоговых вычислений в Minecraft
[[JUMP:01:45]]

Традиционно игроки используют Redstone для создания двоичных систем (включено/выключено), однако Янник Кильчер решил использовать его аналоговую природу [01:45]. Сигнал Redstone в Minecraft имеет 16 уровней интенсивности — от 0 до 15 [01:58]. При передаче по обычному проводу сигнал затухает на единицу за каждый блок пути, что исследователь использовал как основу для передачи данных [02:11].

Ключевыми компонентами системы стали:

*   **Компоратор (Comparator):** позволяет считывать сигнал и передавать его без затухания, а также выполнять операцию вычитания [03:04].
*   **Кафедра (Lectern):** служит источником входных данных; номер открытой страницы книги преобразуется в силу сигнала [02:37].
*   **Повторитель (Repeater):** в отличие от компаратора, всегда усиливает сигнал до максимума (15), если на входе есть хотя бы единица [03:17].
*   **Делитель:** Янник Кильчер спроектировал схему, которая делит силу сигнала на 4, что необходимо для удержания промежуточных вычислений в диапазоне 0–15 [03:56].

## 🧠 Память и умножение: архитектурные блоки
[[JUMP:04:22]]

Для создания нейросети потребовались более сложные логические узлы. Первым из них стала ячейка памяти, состоящая из двух компараторов, образующих замкнутый цикл [04:22]. Она способна бесконечно удерживать поданный на неё сигнал. Вариация этой схемы — затухающая ячейка памяти — постепенно снижает уровень сигнала при каждом цикле, что Кильчер использовал для реализации таймеров [04:49].

Самым сложным элементом стал аналоговый множитель [05:02]. Янник Кильчер признаёт, что позаимствовал базовую конструкцию у автора канала rkf vaulter, но адаптировал её для своих нужд [05:14]. Принцип работы множителя:

1.  Один входной сигнал определяет длительность работы поршня.
2.  Пока поршень активен, из второго сигнала (хранящегося в памяти) вычитается определенное значение.
3.  Количество вычитаний пропорционально первому сигналу, что в итоге дает результат умножения в аналоговом виде [06:19].

## 📉 Градиентный спуск и извлечение корня
[[JUMP:07:11]]

Прежде чем строить полную сеть, исследователь создал прототип: устройство для поиска квадратного корня методом градиентного спуска [07:11]. По утверждению Кильчера, это первое в истории Minecraft аналоговое устройство такого типа [07:23].

Система работает следующим образом:

1.  В ячейке памяти хранится текущая «догадка».
2.  Число умножается само на себя.
3.  Результат сравнивается с целевым значением (например, 9) [07:49].
4.  Схема вычисляет сигнал ошибки и активирует поршни, которые прибавляют или отнимают единицу от «догадки» в памяти [08:02].
5.  Цикл повторяется, пока система не сойдется к результату (например, к 3) [08:44]. Если точного целого корня не существует, механизм начинает осциллировать между двумя ближайшими числами [08:57].

## 🕸 Структура глубокой нейронной сети
[[JUMP:10:41]]

Итоговая нейросеть имеет архитектуру 2-2-1: два входных нейрона, скрытый слой из двух нейронов и один выходной нейрон [10:53]. Все слои являются полносвязными (fully connected) [11:08].

Компоненты сети:

*   **Веса (Weights):** хранятся в четырех ячейках памяти для первого слоя и двух — для второго [11:46].
*   **Нелинейность (ReLU):** Янник Кильчер реализовал функцию активации ReLU, которая обрезает сигналы ниже значения 4 (поскольку отрицательных чисел в Redstone нет) [14:48]. К выходу ReLU всегда добавляется единица, чтобы избежать «нулевого градиента» [15:01].
*   **Обратное распространение (Backpropagation):** после прямого прохода система вычисляет разницу между выходом и целью, а затем пускает сигнал ошибки назад через сеть [16:06].
*   **Оптимизатор:** специальные механизмы маршрутизации позволяют использовать те же множители для вычисления обновлений весов [17:10].

## ⚙️ Процесс обучения и настройки
[[JUMP:12:39]]

Обучение происходит в автоматическом режиме и управляется сложной системой таймеров на базе затухающих ячеек памяти [16:31]. Янник Кильчер предусмотрел возможность настройки скорости обучения (learning rate) с помощью отдельных книг на кафедрах, которые ограничивают максимальный шаг изменения веса поршнями [13:32].

Цикл работы сети:

1.  **Прямой проход (Forward Prop):** сигнал идет от входов через множители весов и функции активации к выходу [18:56].
2.  **Вычисление ошибки:** сравнение результата с целевым значением и определение направления коррекции (выше/ниже) [16:06].
3.  **Обратный проход (Backprop):** вычисление необходимых градиентов для каждого веса [19:08].
4.  **Обновление весов:** поршни наносят короткие импульсы (1-tick), физически меняя уровень сигнала в ячейках памяти весов [20:03].

Исследователь продемонстрировал, как сеть успешно «переобучается» (overfit) под конкретную задачу, постепенно меняя выходной сигнал с 6 до целевых 12 после нескольких итераций обновления весов [20:16]. Янник Кильчер отмечает, что проект начинался как первоапрельская шутка, но превратился в сложнейшую инженерную задачу [20:28]. Исходный мир Minecraft со всеми схемами автор выложил в открытый доступ на GitHub для дальнейшего изучения сообществом [20:54].