Мы используем файлы cookie, чтобы сайт работал и становился удобнее. Продолжая пользоваться «Думайте», вы соглашаетесь с Политикой конфиденциальности.

Показать все результаты

Ничего не найдено

Доступна новая версия приложения

Версия

Скачать

Нейросеть внутри Factorio: как завод научился отвечать на вопросы

5 дн. назад авторская
69 10 9 мин

Мне нравится компьютерная игра Factorio за то, что в ней постоянно приходится что-нибудь придумывать: строишь, замечаешь проблему, ищешь решение — и проверяешь его в деле. Для меня это хороший способ и отдохнуть, и поработать головой. А когда я узнал, что возможности игры позволяют собрать внутри неё собственную нейросеть, захотелось попробовать.

Что из этого получилось и как я делал видео о проекте, расскажу дальше. А для начала познакомлю вас с самой Factorio.

Игра про производство

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

Довольно быстро возникает желание поручить эту работу механизмам. Бур добывает руду, конвейер везёт её к печи, механическая рука перекладывает внутрь. Из печи выходит железо, которое отправляется дальше — в сборочный автомат. Там из него получаются, например, шестерёнки. Они нужны для новых машин, которые позволят добывать и производить ещё больше.

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

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

При этом завод существует в движении: по лентам едут детали, манипуляторы загружают станки, поезда привозят сырьё. Можно пройти вдоль производства и увидеть весь путь вещи — от залежи руды до готового изделия.

Почему здесь приходится думать

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

Допустим, сборочные автоматы слишком медленно выпускают детали. Первое желание — поставить ещё несколько. Но если причина в нехватке железа, новые автоматы просто встанут рядом со старыми. Нужно пройти назад по производству: хватает ли печей, доходит ли до них руда, успевает ли конвейер её перевозить?

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

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

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

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

От управления заводом к нейросети

Для управления производством в Factorio есть логические сети. По проводам передаются сигналы с числами: например, сколько предметов лежит в сундуке. Эти сигналы позволяют включать и выключать устройства при нужных условиях.

Можно настроить насос так, чтобы он работал только при недостатке жидкости в баке. Или остановить выпуск деталей, когда на складе накопился достаточный запас.

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

Здесь и появляется связь с нейросетями. Обработка текста в языковой модели тоже состоит из операций над числами. Буквы представлены числами, параметры модели — числа, промежуточные результаты — тоже. Значит, возникает задача: как выразить необходимые вычисления через устройства, которые есть в игре?

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

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

Корень удалось получить методом Ньютона. Его идея довольно понятна: берём приблизительный ответ, делим исходное число на это приближение, а затем находим среднее между приближением и результатом деления. Полученное число используем как новое приближение и повторяем. Для этого нужны только деление и сложение — операции, которые комбинаторы уже умеют выполнять. В схеме сначала выбирается начальное приближение по величине входного числа, затем идут четыре таких уточнения. Так из простых игровых устройств получается блок вычисления квадратного корня.

Для другой операции понадобился другой приём. В механизме внимания модель оценивает, каким частям текста уделить больше внимания. При расчёте этих весов используется экспонента — ещё одна функция, которой у комбинаторов нет. Её реализовали ступенчатым приближением: заранее рассчитанные значения заложили в схему, а комбинаторы с условиями выбирают нужную ступень в зависимости от входного числа. Получилась «лестница» из 134 комбинаторов. Здесь важно, что такое же приближение учитывалось при обучении модели.

Так вычисления модели постепенно переводились на язык игры: где-то хватало одного арифметического устройства, где-то требовалась последовательность уточнений, а где-то — набор условий с заранее подготовленными числами.

Итоговая модель содержит примерно 6,4 миллиона параметров. Это трансформер — тот же класс архитектур, к которому относятся многие современные языковые модели. Только возможности здесь значительно скромнее: модель работает с английским текстом, а её контекст ограничен 256 символами.

Обучалась она вне Factorio. Во время обучения подбираются параметры — числа, от которых зависит обработка запроса и продолжение текста. Затем готовые параметры были перенесены в игровую схему. Уже эта схема выполняет вычисления для получения ответа.

Модель создаёт текст по одному символу. Получает запрос, вычисляет следующую букву, добавляет её к тексту и повторяет процесс. Так из отдельных шагов постепенно получается фраза.

Сто пять тысяч объектов ради ответа

Вся постройка занимает около 105 тысяч игровых объектов. В это число входят комбинаторы, электрические подстанции, лампы и другие элементы. Одних ламп — примерно 8800.

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

Другая трудность — задержки. Сигналам нужно время, чтобы пройти через устройства. Если следующий участок схемы начнёт работу слишком рано, он может получить результат предыдущего вычисления. Поэтому важно согласовать последовательность действий: когда данные готовы, когда их можно читать и когда переходить дальше.

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

Вся постройка в игре

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

Например, на приветствие «hi!» модель ответила:

> hello! i am busy with my factory, but i always have time to talk.

«Привет! Я занят своим заводом, но у меня всегда есть время поговорить».

А на просьбу «tell me a joke.» — «расскажи шутку» — модель ответила:

> why did the biter bring a map? because it got lost in my spaghetti belts!

«Почему кусака взял с собой карту? Потому что заблудился в моих конвейерах-спагетти!»

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

Быстрым такой разговор не назовёшь: на моём Ryzen 5 5600 вычисление одного символа занимает около семи секунд. Даже короткую фразу приходится ждать несколько минут. В видеодемонстрациях ожидание ускорено.

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

Табло с ответом

Проект опубликован на GitHub. Там можно посмотреть материалы и инструкцию по запуску, а также попробовать модель у себя.

О проекте рассказали и на других площадках: в «Нейроновостях» вышла статья «В Factorio собрали настоящую языковую модель на 6,4 млн параметров!», а в Клубе DNS — «Внутри Factorio собрали ИИ чат-бота без GPU и внешних сервисов».

Как из этого получилось видео

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

Весь проект я вёл с Claude Code — и модель, и инструменты для её переноса в игру, и подготовку видео. Ролик тоже собирался через код: игровые записи соединялись с поясняющей графикой, надписями и подсветкой нужных участков.

Для ролика Claude делал огромные кадры — 10 000 на 4000 пикселей. Это сорок миллионов точек в одном изображении. Такой размер был нужен для плавного движения камеры: из большого изображения вырезался участок для видео, а затем эта область постепенно перемещалась по исходному кадру. На экране получался плавный пролёт вдоль схемы, хотя его основой было одно большое изображение.

Постепенно исходных материалов набралось примерно на 200 гигабайт. И всё это ради ролика продолжительностью около восемнадцати минут. За коротким фрагментом, в котором на табло появляется ответ, остаются минуты настоящего ожидания: модель по-прежнему тратит около семи секунд на каждую букву. Длинные ответы приходилось записывать целиком, а затем ускорять для показа.

Объяснение начинается с маленькой модели, повторяющей «hello». На небольшом примере проще показать последовательность вычислений, а затем перейти к большой схеме и настоящим ответам.

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

Я просматривал сборки и отмечал, что нужно изменить. Где-то камера двигалась слишком быстро, где-то длинный ответ не помещался в кадр. Когда речь шла о конкретном устройстве, его нужно было подсветить именно в этот момент. Иначе диктор уже объясняет вычисление, а зритель ещё ищет нужное место на экране.

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

Для меня это стало продолжением самого проекта: сначала добиться, чтобы схема работала, а потом разобраться, как сделать её понятной другому человеку. В Factorio можно проследить путь железа от руды до ракеты. Здесь захотелось так же показать путь вопроса до букв на табло.

Роман Раевский

Все ссылки

96 %
100 %

Комментарии 4

Войдите, чтобы оставить комментарий.

А
уровень 2 в 4 дня
Спасибо за статью. При запуске видео - запускается реклама по несколько раз - так и должно быть? Вроде бы задумывалось, то рекламы не будет или это не так?
Полезно
—
Уместно
—
уровень 3 в 4 дня
Видео отличное получилось - хорошо на примере элементов игры объясняет логику работы нейросетей. И сама задумка необычная.
Полезно
—
Уместно
—
уровень 4 в 5 дней
Был знаком с игрой. Интересная. Но съедала слишком много времени)
Полезно
—
Уместно
—

Нейросеть внутри Factorio: как завод научился отвечать на вопросы

Мне нравится компьютерная игра Factorio за то, что в ней постоянно приходится что-нибудь придумывать: строишь, замечаешь проблему, ищешь решение — и проверяешь его в деле. Для меня это хороший способ и отдохнуть, и поработать головой. А когда я узнал, что возможности игры позволяют собрать внутри неё собственную нейросеть, захотелось попробовать.

Что из этого получилось и как я делал видео о проекте, расскажу дальше. А для начала познакомлю вас с самой Factorio.

Видео: https://rutube.ru/video/3f5ed4a82dcea1d7010bf9edce6fe2dd/

Игра про производство

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

Довольно быстро возникает желание поручить эту работу механизмам. Бур добывает руду, конвейер везёт её к печи, механическая рука перекладывает внутрь. Из печи выходит железо, которое отправляется дальше — в сборочный автомат. Там из него получаются, например, шестерёнки. Они нужны для новых машин, которые позволят добывать и производить ещё больше.

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

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

При этом завод существует в движении: по лентам едут детали, манипуляторы загружают станки, поезда привозят сырьё. Можно пройти вдоль производства и увидеть весь путь вещи — от залежи руды до готового изделия.

Почему здесь приходится думать

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

Допустим, сборочные автоматы слишком медленно выпускают детали. Первое желание — поставить ещё несколько. Но если причина в нехватке железа, новые автоматы просто встанут рядом со старыми. Нужно пройти назад по производству: хватает ли печей, доходит ли до них руда, успевает ли конвейер её перевозить?

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

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

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

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

От управления заводом к нейросети

Для управления производством в Factorio есть логические сети. По проводам передаются сигналы с числами: например, сколько предметов лежит в сундуке. Эти сигналы позволяют включать и выключать устройства при нужных условиях.

Можно настроить насос так, чтобы он работал только при недостатке жидкости в баке. Или остановить выпуск деталей, когда на складе накопился достаточный запас.

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

Здесь и появляется связь с нейросетями. Обработка текста в языковой модели тоже состоит из операций над числами. Буквы представлены числами, параметры модели — числа, промежуточные результаты — тоже. Значит, возникает задача: как выразить необходимые вычисления через устройства, которые есть в игре?

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

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

Корень удалось получить методом Ньютона. Его идея довольно понятна: берём приблизительный ответ, делим исходное число на это приближение, а затем находим среднее между приближением и результатом деления. Полученное число используем как новое приближение и повторяем. Для этого нужны только деление и сложение — операции, которые комбинаторы уже умеют выполнять. В схеме сначала выбирается начальное приближение по величине входного числа, затем идут четыре таких уточнения. Так из простых игровых устройств получается блок вычисления квадратного корня.

Для другой операции понадобился другой приём. В механизме внимания модель оценивает, каким частям текста уделить больше внимания. При расчёте этих весов используется экспонента — ещё одна функция, которой у комбинаторов нет. Её реализовали ступенчатым приближением: заранее рассчитанные значения заложили в схему, а комбинаторы с условиями выбирают нужную ступень в зависимости от входного числа. Получилась «лестница» из 134 комбинаторов. Здесь важно, что такое же приближение учитывалось при обучении модели.

Так вычисления модели постепенно переводились на язык игры: где-то хватало одного арифметического устройства, где-то требовалась последовательность уточнений, а где-то — набор условий с заранее подготовленными числами.

Итоговая модель содержит примерно 6,4 миллиона параметров. Это трансформер — тот же класс архитектур, к которому относятся многие современные языковые модели. Только возможности здесь значительно скромнее: модель работает с английским текстом, а её контекст ограничен 256 символами.

Обучалась она вне Factorio. Во время обучения подбираются параметры — числа, от которых зависит обработка запроса и продолжение текста. Затем готовые параметры были перенесены в игровую схему. Уже эта схема выполняет вычисления для получения ответа.

Модель создаёт текст по одному символу. Получает запрос, вычисляет следующую букву, добавляет её к тексту и повторяет процесс. Так из отдельных шагов постепенно получается фраза.

Сто пять тысяч объектов ради ответа

Вся постройка занимает около 105 тысяч игровых объектов. В это число входят комбинаторы, электрические подстанции, лампы и другие элементы. Одних ламп — примерно 8800.

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

Другая трудность — задержки. Сигналам нужно время, чтобы пройти через устройства. Если следующий участок схемы начнёт работу слишком рано, он может получить результат предыдущего вычисления. Поэтому важно согласовать последовательность действий: когда данные готовы, когда их можно читать и когда переходить дальше.

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

Вся постройка в игре

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

Без подсветки
Например, на приветствие «hi!» модель ответила:

> hello! i am busy with my factory, but i always have time to talk.

«Привет! Я занят своим заводом, но у меня всегда есть время поговорить».

А на просьбу «tell me a joke.» — «расскажи шутку» — модель ответила:

> why did the biter bring a map? because it got lost in my spaghetti belts!

«Почему кусака взял с собой карту? Потому что заблудился в моих конвейерах-спагетти!»

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

Быстрым такой разговор не назовёшь: на моём Ryzen 5 5600 вычисление одного символа занимает около семи секунд. Даже короткую фразу приходится ждать несколько минут. В видеодемонстрациях ожидание ускорено.

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

Табло с ответом

Проект опубликован на GitHub (https://github.com/RomOSTiny/factorio-transformer). Там можно посмотреть материалы и инструкцию по запуску, а также попробовать модель у себя.

О проекте рассказали и на других площадках: в «Нейроновостях» (https://nnets.ru/news/v-factorio-sobrali-nastojaschuju-jazykovuju-model-na-64-mln-parametrov) вышла статья «В Factorio собрали настоящую языковую модель на 6,4 млн параметров!», а в Клубе DNS (https://club.dns-shop.ru/digest/185582-vnutri-factorio-sobrali-ii-chat-bota-bez-gpu-i-vneshnih-servisov/) — «Внутри Factorio собрали ИИ чат-бота без GPU и внешних сервисов».

Как из этого получилось видео

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

Весь проект я вёл с Claude Code — и модель, и инструменты для её переноса в игру, и подготовку видео. Ролик тоже собирался через код: игровые записи соединялись с поясняющей графикой, надписями и подсветкой нужных участков.

Для ролика Claude делал огромные кадры — 10 000 на 4000 пикселей. Это сорок миллионов точек в одном изображении. Такой размер был нужен для плавного движения камеры: из большого изображения вырезался участок для видео, а затем эта область постепенно перемещалась по исходному кадру. На экране получался плавный пролёт вдоль схемы, хотя его основой было одно большое изображение.

Постепенно исходных материалов набралось примерно на 200 гигабайт. И всё это ради ролика продолжительностью около восемнадцати минут. За коротким фрагментом, в котором на табло появляется ответ, остаются минуты настоящего ожидания: модель по-прежнему тратит около семи секунд на каждую букву. Длинные ответы приходилось записывать целиком, а затем ускорять для показа.

Объяснение начинается с маленькой модели, повторяющей «hello». На небольшом примере проще показать последовательность вычислений, а затем перейти к большой схеме и настоящим ответам.

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

Я просматривал сборки и отмечал, что нужно изменить. Где-то камера двигалась слишком быстро, где-то длинный ответ не помещался в кадр. Когда речь шла о конкретном устройстве, его нужно было подсветить именно в этот момент. Иначе диктор уже объясняет вычисление, а зритель ещё ищет нужное место на экране.

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

Для меня это стало продолжением самого проекта: сначала добиться, чтобы схема работала, а потом разобраться, как сделать её понятной другому человеку. В Factorio можно проследить путь железа от руды до ракеты. Здесь захотелось так же показать путь вопроса до букв на табло.

  ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ  ПРОГРАММИРОВАНИЕ  НЕЙРОСЕТИ  ИИ  ЯЗЫКОВЫЕ МОДЕЛИ  МАШИННОЕ ОБУЧЕНИЕ  FACTORIO  ТРАНСФОРМЕРЫ  ЛОГИЧЕСКИЕ СХЕМЫ  КОМБИНАТОРЫ

Оценить запись

96 %
100 %

Содержание

Поделиться