NoProp: Реальный опыт обучения без Backprop – от провала к 99% на MNIST. backpropagation.. backpropagation. DDPM.. backpropagation. DDPM. deep learning.. backpropagation. DDPM. deep learning. no-prop.. backpropagation. DDPM. deep learning. no-prop. python.. backpropagation. DDPM. deep learning. no-prop. python. Research.. backpropagation. DDPM. deep learning. no-prop. python. Research. искусственный интеллект.. backpropagation. DDPM. deep learning. no-prop. python. Research. искусственный интеллект. Машинное обучение.. backpropagation. DDPM. deep learning. no-prop. python. Research. искусственный интеллект. Машинное обучение. нейронные сети.. backpropagation. DDPM. deep learning. no-prop. python. Research. искусственный интеллект. Машинное обучение. нейронные сети. нейронные сети и машинное обучение.. backpropagation. DDPM. deep learning. no-prop. python. Research. искусственный интеллект. Машинное обучение. нейронные сети. нейронные сети и машинное обучение. Ненормальное программирование.

Всем привет! Обучение нейронных сетей с помощью обратного распространения ошибки (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 блоков сети.

  1. Независимое Обучение: Вместо сквозного обучения вся сеть “разрезается” на блоки. Каждый блок t (от 1 до T) обучается независимо от других.

  2. Задача Блока (Оригинал): Его задача — предсказать “чистый” целевой эмбеддинг метки u_y, соответствующий входному изображению x, получив на вход само изображение x и зашумленную версию этого эмбеддинга zt−1​. Уровень шума в zt−1​ определяется шагом t и расписанием шума.

  3. Функция Потерь (Оригинал): Основана на ELBO и включает:

    • Потери шумоподавления: MSE между выходом блока u^θt​​ и чистым uy​. Статья выводила вес ∝(SNR(t)−SNR(t−1)), который оказался проблемным (отрицательным).

    • Потери классификации: Cross-Entropy для финального классификатора, работающего с зашумленным состоянием zT​∼q(zT​∣y).

  4. Инференс (Оригинал): Итеративное применение блоков по Уравнению 3 статьи:

    z_t=a_t hat{u}_{theta}(z_{t-1}, x) + b_t z_{t-1} + sqrt{c_t} epsilon_t

  5. “Без Backprop/Forward-prop”: Обучение локально, не требует сквозных проходов по всей сети.

Отладка: Путь боли и открытий

Реализовали на PyTorch, следуя описанию… и ничего не заработало. ClassifyLoss ~2.3, DenoiseLoss -> 0. Начался долгий процесс отладки:

  1. Исправление Очевидного: Проверили и исправили структуру цикла обучения (внешний цикл по t, как в Алгоритме 1) и архитектуру блока (добавили логиты -> softmax -> взвешенную сумму эмбеддингов, как в Приложении B.2). Это дало первый крошечный сдвиг в ClassifyLoss (< 2.3), но DenoiseLoss все равно коллапсировала.

  2. Борьба с Весом Потерь: Осознали, что вес ∝(SNR(t)−SNR(t−1)) из статьи непригоден для минимизации MSE из-за отрицательных значений. Попробовали разные эвристики: abs(), константный вес ETA_LOSS_WEIGHT. Это предотвращало нулевой вес, но не решало проблему коллапса DenoiseLoss и отсутствия обучения классификации.

  3. Стабилизация: Столкнулись с взрывным ростом нормы эмбеддингов (>1000!). Добавили клиппинг градиентов и клиппинг нормы эмбеддингов (сначала через WD, потом явно до 50), что стабилизировало норму, но не улучшило обучение.

  4. Анализ Связанных Работ: Решили изучить статьи по VDM, Sohl-Dickstein, CARD. Ключевые инсайты:

    • Успешные диффузионные модели (DDPM, VDM, CARD) чаще предсказывают шум ϵ, а не чистые данные/эмбеддинги.

    • VDM использует положительный вес потерь, зависящий от γ˙​(t) (производная лог-SNR).

    • CARD использует предсказатель среднего fϕ​(x) для направления диффузии и расстояние до прототипов для классификации.

    • VDM имеет явный член реконструкции L0​, работающий с очищенным z0​, в отличие от классификации NoProp по зашумленному zT​.

  5. Кардинальные Изменения (Отход от NoProp): Стало ясно, что нужно пробовать подход, ближе к мейнстриму диффузионных моделей:

    • Сменили цель блоков: Стали предсказывать шум ϵ. Потери — MSE(ϵ^,ϵ).

    • Сменили вход классификатора: Стали обучать классификатор на предсказанном чистом эмбеддинге u^T​ (восстановленном из zT−1​ и ϵ^T​ последним блоком).

    • Сменили инференс: Заменили на DDPM-подобный обратный шаг с использованием ϵ^.

    • Вес потерь: Использовали простой равномерный вес для MSE(ϵ^,ϵ), масштабируемый ETA_LOSS_WEIGHT.

  6. Подбор Гиперпараметров: Запустили Optuna с GridSampler на 10 эпох для LR, ETA_LOSS_WEIGHT, EMBED_WD. Лучшие: LR=0.01, ETA=0.5, EMBED_WD=1e-7.

  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.

Итоговые Мысли

  1. Воспроизводимость: Это классическая история о том, как сложно бывает воспроизвести результаты статьи, особенно для новых методов, без доступа к коду и полному списку “инженерных трюков”.

  2. Важность Деталей: Выбор цели обучения (шум vs данные), схема взвешивания потерь, техники стабилизации оказались критически важными.

  3. Сила Аналогий: Идеи из смежных успешных работ (DDPM, VDM, CARD) помогли найти рабочее решение там, где буквальное следование статье заводило в тупик.

  4. NoProp как Идея: Идея обучения без backprop жива! Наш модифицированный подход достиг 99% на MNIST. Возможно, оригинальный NoProp тоже можно заставить работать, но это требует дальнейших исследований или уточнений от авторов.

  5. Отладка с ИИ: Опыт показал, что современные LLM могут быть мощным инструментом в руках исследователя/разработчика для анализа, брейншторма и решения сложных технических задач.

Надеюсь, наш опыт был интересен и, возможно, кому-то окажется полезным. Не бойтесь пробовать новое и копать глубоко!

Ссылка на репозиторий с финальным кодом:

https://github.com/vpuhoff/noprop-dt-mnist-pytorch

Автор: vpuhoff

Источник

Рейтинг@Mail.ru
Rambler's Top100