В последние годы разговоры об искусственном интеллекте не утихают ни на минуту. Гигантские модели, которые генерируют текст, картинки и даже целый код, требуют дата-центров с мощными процессорами и терабайтами памяти. Однако если копнуть глубже, основа всей этой магии проста и понятна. Один необычный проект наглядно это доказывает. Причем он реализован на компьютере почти полувековой давности. Автор запустил настоящий, хоть и крошечный трансформер.
Машина из прошлого века
Сначала о том, что это за девайс. Речь о PDP-11 — системе 1970-х, широко применявшейся в науке и инженерии. Это 16-битная архитектура с поддержкой разнообразной периферии.
Ее возможности были ограничены: дорогая память и низкая по современным меркам производительность требовали писать предельно компактный и точный код. При этом архитектура была продуманной — с гибкой системой адресации и единым подходом к работе с памятью и устройствами, что упрощало разработку. PDP-11 во многом задала стандарты: на этих машинах появились и развивались Unix и язык C, оказавшие влияние на все последующее программирование.
Код загружали напрямую через консоль: после сборки программы заносили в память вручную, посредством панели или с бумажной ленты. Ошибка означала повтор всей процедуры, поэтому отладка занимала много времени и требовала аккуратности.
Характеристики PDP-11/44 (экземпляр из проекта)
-
Процессор: 16-битная архитектура DEC PDP-11/44
-
Тактовая частота: ~6 МГц
-
Оперативная память: 64 КБ
-
Тип памяти: магнитная/полупроводниковая (в зависимости от конфигурации)
-
Кеш: дополнительная кеш-плата (ускорение доступа к памяти)
-
Накопители: отсутствуют в базовом сценарии (загрузка без дисков)
-
Загрузка программ:
-
через консольную панель
-
ручной ввод в память
-
возможна загрузка с бумажной ленты
-
-
Интерфейсы: модульная система шин для подключения периферии
-
Арифметика: целочисленная (без аппаратного сопроцессора)
-
Формфактор: стоечная мини-ЭВМ (rack-mounted)
Владелец PDP-11/44 из статьи держит эту систему у себя в гараже полностью в рабочем состоянии. Он давно собирает старое железо и получает настоящее удовольствие, когда удается запустить на нем что-то неожиданное. Машина стала для него не просто реликвией, а площадкой для экспериментов. И сейчас речь как раз об одном из них.
Создатели проекта
Идея реализовать трансформер на таком устаревшем оборудовании принадлежит французскому разработчику Дамьену Бурейлю. Ранее он уже создавал простые нейронные сети на системах с жесткими ограничениями ресурсов, и этот опыт стал отправной точкой для более сложной задачи. В новом проекте он решил проверить, можно ли перенести принципы механизма внимания на платформу уровня PDP-11.
Проект получил название ATTN-11, он полностью написан на ассемблере MACRO-11, без использования высокоуровневых языков и готовых библиотек. Такой подход выбран осознанно: все вычисления, структуры данных и работа с памятью реализованы вручную. Это позволило уложиться в крайне ограниченные ресурсы системы и одновременно продемонстрировать, что базовые принципы механизма внимания можно воспроизвести даже на оборудовании, где, на первый взгляд, не хватает места для современных программ.
Дамьен опирался на свои предыдущие наработки, в частности на систему Xortran, где он демонстрировал обучение с обратным распространением ошибки в крайне тесных рамках. Новый проект стал прямым развитием этой идеи. Теперь вместо простого перцептрона реализована полноценная, пусть и минимальная, архитектура с механизмом внимания. При этом код удалось уместить чуть более чем в 6 килобайт в бинарном виде, так что он полностью укладывался в доступные ресурсы машины.
Дейв Пламмер, увидев результат, решил запустить его на реальном PDP-11.
Устройство минимальной нейросети
Модель предельно упрощена: один слой, одна голова внимания, размер внутреннего представления — 16, максимальная длина последовательности — 8 токенов, словарь — 10 символов (цифры от 0 до 9). Всего 1216 параметров. Для вычислений использовали фиксированную точку: на прямом проходе — 8 бит дробной части (Q8), при обучении — 15 бит (Q15), веса накапливались в 32-битном формате (Q16). Умножение выполняли средствами целочисленной арифметики PDP-11 с последующими сдвигами для приведения масштаба, а softmax заменили на заранее рассчитанную таблицу значений. Это позволило полностью отказаться от плавающей запятой и снизить нагрузку на процессор.
Вся нейросеть построена вокруг небольшого стека операций под названием NN11, который включает в себя скалярную арифметику, векторные и матричные операции, функции активации и базовые слои. Архитектура сведена к минимуму: встраивание токенов, позиционное кодирование, механизм внимания с остаточным соединением и финальная проекция на выход. Этого хватило для задачи переворота последовательности, где ключевую роль играет порядок элементов.
Память распределена рационально: веса хранятся в трех вариантах точности: для накопления, прямого прохода и градиентов. Используются небольшие кеши для промежуточных результатов и таблицы для экспоненты и других функций. В итоге вся система занимает около 19,2 КБ и укладывается даже в 32 КБ, оставляя место для ОС и отладки.
Само внимание реализовано через классическое скалярное произведение запросов и ключей, без дополнительных усложнений. Входные векторы проецируются с помощью обучаемых матриц, после чего формируется матрица сходства. Чтобы избежать переполнения в ограниченной арифметике, из всех значений вычитают максимум — это простой и надежный способ сохранить численную стабильность.
Далее используется заранее подготовленная таблица экспоненты из 256 элементов. Она заменяет softmax: разницу делят на восемь, выбирают соответствующий элемент по индексу и нормируют. Результат умножается на векторы, формируя взвешенную сумму, которая проходит через остаточное соединение. Это позволяет учитывать позиции в последовательности без лишних вычислений.
В этой задаче внимание должно было игнорировать содержимое токенов и опираться только на их порядок. Каждый элемент нужно сопоставить с нужным из конца, поэтому ошибка в позиционном соответствии сразу давала неверный результат. При небольшой размерности модель быстро «чувствовала» такие промахи, и обучение требовало точной подстройки весов. В итоге даже одного слоя оказалось достаточно, чтобы выучить это правило и корректно работать с последовательностью.
Обучение проводилось с помощью стохастического градиентного спуска с разными скоростями для частей модели: 0,08 для весов внимания, 0,01 для встраиваний и 0,0025 для выходной проекции. Это позволило обойтись без сложного оптимизатора и сэкономить память. На каждом шаге сеть получала случайную последовательность из восьми цифр, предсказывала перевернутую цифру и корректировала веса по ошибке.
Все происходило в реальном времени на самой машине. Вначале точность оставалась на уровне случайного угадывания, но затем быстро росла: к ~350 итерациям модель достигала 100%, а потери почти обнулялись. Весь процесс занимал около 3,5 минуты, что для такой системы выглядело более чем достойно.
А что сегодня?
Эксперимент показывает, что за внешней сложностью современных моделей стоит набор базовых операций: матричные умножения, нормализация, вычисление сходства. В минимальной конфигурации все это укладывается в простую арифметику и работает даже при крайне ограниченной памяти.
Разницу создает масштаб. Увеличение числа параметров, объема данных и вычислений позволяет переходить от узких задач к универсальным моделям, способным обобщать разнообразные сценарии и работать с ними. Ограниченные ресурсы, наоборот, заставляют выделять только ключевые элементы и строить более компактные решения.
Такие проекты наглядно показывают, что развитие искусственного интеллекта сегодня во многом определяется инфраструктурой: архитектурные идеи известны, а их эффективность раскрывается при масштабировании. Возврат к простым реализациям помогает лучше понять эти принципы и увидеть, как они работают в чистом виде.
ссылка на оригинал статьи https://habr.com/ru/articles/1024564/