Всем привет! Обучение нейронных сетей с помощью обратного распространения ошибки (backpropagation) — это стандарт де‑факто. Но у него есть ограничения: память, последовательные вычисления, биологическая неправдоподобность. Недавно я наткнулся на интересную статью «NOPROP: TRAINING NEURAL NETWORKS WITHOUT BACK‑PROPAGATION OR FORWARD‑PROPAGATION» (Li, Teh, Pascanu, arXiv:2403.13 502), которая обещает обучение вообще без сквозного backprop и даже без полного прямого прохода во время обучения! Идея показалась захватывающей, и мы (я и ИИ‑ассистент Gemini) решили попробовать ее реализовать на PyTorch для MNIST.
В этой статье я хочу поделиться нашим путешествием: как мы пытались следовать описанию из статьи, с какими трудностями столкнулись, как анализ связанных работ помог найти решение (которое, правда, отличается от оригинала) и каких впечатляющих результатов удалось достичь в итоге. Спойлер: получилось интересно, совсем не так, как ожидалось, но результат превзошел ожидания от процесса отладки.
Дисклеймер 1: Это рассказ об учебном эксперименте. Результаты и выводы основаны на нашем опыте и могут не полностью отражать возможности оригинального метода при наличии всех деталей реализации.)
Дисклеймер 2: Эксперимент с “White Paper” и Роль ИИ-Ассистента
Прежде чем мы углубимся в технические дебри, стоит сделать пару оговорок, которые помогут правильно воспринять эту статью.
Во‑первых, это был своего рода R&D эксперимент. Мы стартовали, имея на руках только текст научной статьи (то, что называют «white paper») по NoProp. У нас не было доступа к официальному коду авторов или готовым реализациям. Весь код, который вы увидите (или на который будет ссылка), — это наша собственная интерпретация описания из статьи. Как показал наш опыт, путь от формул на бумаге до работающего кода для новых алгоритмов может быть тернистым и требовать существенных отступлений и адаптаций. Воспроизводимость — это не всегда просто!
Во‑вторых, это путешествие по отладке и разработке я проделал не в одиночку. Моим напарником, аналитиком и, в значительной степени, помощником программиста была большая языковая модель Gemini 2.5 Pro от Google. На протяжении всего процесса Gemini помогал:
-
Анализировать научные статьи: Мы вместе «читали» и разбирали не только саму статью NoProp, но и связанные работы (VDM, Sohl‑Dickstein, CARD), сравнивая подходы, формулы и возможные подводные камни.
-
Диагностировать проблемы: Gemini помогал находить расхождения между кодом и статьей, интерпретировать логи обучения и сообщения об ошибках, а также выдвигать гипотезы о причинах неудач — от проблем с весами потерь и архитектурой до фундаментального разрыва между обучением и инференсом.
-
Предлагать решения: На основе анализа генерировались конкретные шаги по отладке, предлагались модификации алгоритма и кода.
-
Генерировать и рефакторить код: Gemini писал фрагменты кода для реализации исправлений, добавления новых компонентов (вроде HPO на Optuna, графиков, планировщика LR) и улучшения структуры существующего кода.
-
Структурировать мысли: Помогал формулировать выводы на каждом этапе и составлять план этой статьи.
Наше взаимодействие было похоже на парное программирование и исследование: я ставил цели, описывал проблемы, предоставлял контекст (код, логи, статьи), а Gemini предлагал анализ, идеи и код. Это был крайне интересный опыт использования возможностей современных ИИ для решения практической задачи на стыке R&D и инженерии, особенно когда работаешь с чем‑то новым без готовых примеров.
Теперь, когда контекст ясен, вернемся к нашему пути…
В чем суть NoProp (как мы поняли из статьи)?
Идея NoProp (конкретно, варианта NoProp-DT) основана на диффузионных моделях. Представьте, что у вас есть T блоков сети.
-
Независимое Обучение: Вместо сквозного обучения вся сеть “разрезается” на блоки. Каждый блок
t
(от 1 до T) обучается независимо от других. -
Задача Блока (Оригинал): Его задача — предсказать “чистый” целевой эмбеддинг метки
u_y
, соответствующий входному изображениюx
, получив на вход само изображениеx
и зашумленную версию этого эмбеддинга zt−1. Уровень шума в zt−1 определяется шагомt
и расписанием шума. -
Функция Потерь (Оригинал): Основана на ELBO и включает:
-
Потери шумоподавления: MSE между выходом блока u^θt и чистым uy. Статья выводила вес ∝(SNR(t)−SNR(t−1)), который оказался проблемным (отрицательным).
-
Потери классификации: Cross-Entropy для финального классификатора, работающего с зашумленным состоянием zT∼q(zT∣y).
-
-
Инференс (Оригинал): Итеративное применение блоков по Уравнению 3 статьи:
-
“Без Backprop/Forward-prop”: Обучение локально, не требует сквозных проходов по всей сети.
Отладка: Путь боли и открытий
Реализовали на PyTorch, следуя описанию… и ничего не заработало. ClassifyLoss
~2.3, DenoiseLoss
-> 0. Начался долгий процесс отладки:
-
Исправление Очевидного: Проверили и исправили структуру цикла обучения (внешний цикл по
t
, как в Алгоритме 1) и архитектуру блока (добавили логиты -> softmax -> взвешенную сумму эмбеддингов, как в Приложении B.2). Это дало первый крошечный сдвиг вClassifyLoss
(< 2.3), ноDenoiseLoss
все равно коллапсировала. -
Борьба с Весом Потерь: Осознали, что вес ∝(SNR(t)−SNR(t−1)) из статьи непригоден для минимизации MSE из-за отрицательных значений. Попробовали разные эвристики:
abs()
, константный весETA_LOSS_WEIGHT
. Это предотвращало нулевой вес, но не решало проблему коллапсаDenoiseLoss
и отсутствия обучения классификации. -
Стабилизация: Столкнулись с взрывным ростом нормы эмбеддингов (>1000!). Добавили клиппинг градиентов и клиппинг нормы эмбеддингов (сначала через WD, потом явно до 50), что стабилизировало норму, но не улучшило обучение.
-
Анализ Связанных Работ: Решили изучить статьи по VDM, Sohl-Dickstein, CARD. Ключевые инсайты:
-
Успешные диффузионные модели (DDPM, VDM, CARD) чаще предсказывают шум ϵ, а не чистые данные/эмбеддинги.
-
VDM использует положительный вес потерь, зависящий от γ˙(t) (производная лог-SNR).
-
CARD использует предсказатель среднего fϕ(x) для направления диффузии и расстояние до прототипов для классификации.
-
VDM имеет явный член реконструкции L0, работающий с очищенным z0, в отличие от классификации NoProp по зашумленному zT.
-
-
Кардинальные Изменения (Отход от NoProp): Стало ясно, что нужно пробовать подход, ближе к мейнстриму диффузионных моделей:
-
Сменили цель блоков: Стали предсказывать шум ϵ. Потери — MSE(ϵ^,ϵ).
-
Сменили вход классификатора: Стали обучать классификатор на предсказанном чистом эмбеддинге u^T (восстановленном из zT−1 и ϵ^T последним блоком).
-
Сменили инференс: Заменили на DDPM-подобный обратный шаг с использованием ϵ^.
-
Вес потерь: Использовали простой равномерный вес для MSE(ϵ^,ϵ), масштабируемый
ETA_LOSS_WEIGHT
.
-
-
Подбор Гиперпараметров: Запустили Optuna с
GridSampler
на 10 эпох дляLR
,ETA_LOSS_WEIGHT
,EMBED_WD
. Лучшие:LR=0.01
,ETA=0.5
,EMBED_WD=1e-7
. -
Финальный Запуск и Успех! Запустили полное обучение на 100 эпох с лучшими параметрами, планировщиком
CosineAnnealingLR
(T_max=100) и ранней остановкой. Результат: 99.01% точности на тесте MNIST!Точность на тестовой выборке по эпохам
Это все еще NoProp?
Финальный алгоритм сильно отличается от описанного в статье. Но сохранил ли он ключевые свойства?
-
Без Backpropagation? Да. Обучение блоков осталось независимым, на локальной ошибке (MSE по шуму). Сквозного градиента через T блоков нет.
-
Без Forward Propagation (при обучении)? Да. Для обучения блока
t
и классификатора все еще не требуется полный проход z0→…→zT.
Вывод: Да, модифицированный метод сохраняет ключевые характеристики “NoProp” – отсутствие сквозного прямого и обратного распространения ошибки при обучении. Но для достижения работоспособности пришлось адаптировать внутреннюю механику (цель предсказания, шаг инференса, обучение классификатора), приблизив ее к стандартным и успешным практикам диффузионных моделей (DDPM/VDM/CARD).
Особенности Взаимодействия с ИИ: Объем и Формат Данных в Отладке NoProp
Как упоминалось ранее, значительная часть работы по анализу, отладке и написанию кода велась в диалоге с ИИ-ассистентом Gemini 2.5 Pro от Google. Возможно, читателям будет интересно узнать, как именно строилось это взаимодействие.
1. Объем Контекста:
Наше “путешествие” было долгим, и объем информации, который нужно было удерживать в контексте, оказался весьма значительным. Он включал исходную статью NoProp (.tex файлы), тексты 3+ связанных статей, множество версий кода Python, большое количество логов обучения и ошибок, всю нашу переписку. Способность языковой модели удерживать и связывать всю эту информацию (помнить, что пробовали, какие были результаты, какие статьи читали) была критична для успеха отладки. Речь идет о десятках тысяч токенов контекста.
2. Формат Информации:
Информация предоставлялась в разных форматах: файлы .tex, код Python (в блоках ), логи и ошибки (простым текстом), тексты статей (простым текстом), запросы (на русском языке). Основным методом была прямая вставка в чат, что требовало от ИИ способностей к парсингу и пониманию полуструктурированного текста.
3. Ключевые Особенности Взаимодействия:
Процесс был итеративным (проблема -> анализ -> решение -> новая проблема). Четкость моих запросов и предоставление релевантного контекста (кода, логов) сильно влияли на скорость и качество помощи от Gemini.
Вывод по взаимодействию:
Работа напрямую с текстом научной статьи без готового кода — интересный вызов. Использование ИИ-ассистента с большим контекстным окном и хорошими аналитическими/кодогенерирующими способностями может значительно ускорить и упростить такой процесс R&D.
Итоговые Мысли
-
Воспроизводимость: Это классическая история о том, как сложно бывает воспроизвести результаты статьи, особенно для новых методов, без доступа к коду и полному списку “инженерных трюков”.
-
Важность Деталей: Выбор цели обучения (шум vs данные), схема взвешивания потерь, техники стабилизации оказались критически важными.
-
Сила Аналогий: Идеи из смежных успешных работ (DDPM, VDM, CARD) помогли найти рабочее решение там, где буквальное следование статье заводило в тупик.
-
NoProp как Идея: Идея обучения без backprop жива! Наш модифицированный подход достиг 99% на MNIST. Возможно, оригинальный NoProp тоже можно заставить работать, но это требует дальнейших исследований или уточнений от авторов.
-
Отладка с ИИ: Опыт показал, что современные LLM могут быть мощным инструментом в руках исследователя/разработчика для анализа, брейншторма и решения сложных технических задач.
Надеюсь, наш опыт был интересен и, возможно, кому-то окажется полезным. Не бойтесь пробовать новое и копать глубоко!
Ссылка на репозиторий с финальным кодом:
Автор: vpuhoff