Последнее время часто замечаю некоторую мысль, вижу ее в статьях, в решениях моих товарищей и также активно применяю ее в нашем проекте @Audio2MIDIBot. Сталкивались ли вы с задачей, которая кажется неподъёмной для одной нейросети? Когда данные настолько сложны, что даже самая глубокая архитектура не справляется? Сегодня я хочу поговорить о мощном принципе, который помогает решать такие проблемы — о декомпозиции.
Идея особенно актуальна, когда мы пытаемся решить сложную генеративную или дискриминативную задачу в один этап: подали на вход сырые данные — на выходе получили финальный результат. Такой подход часто ведет к нестабильному обучению и посредственному качеству.
Ключевая мысль: сложную проблему нужно разбить на последовательность более простых.
Каждый следующий этап нашего решения (будь то слой в сети или отдельная модель) должен работать с уже упрощенным, более "чистым" представлением данных. Мы последовательно снижаем неопределенность, пока финальная задача не станет почти тривиальной. Как говорил методолог Георгий Щедровицкий: «Решение задачи состоит в том, что мы находим язык, в котором решение очевидно».
В мире DL этот поиск "языка" — это, по сути, архитектурный feature engineering. Мы не просто надеемся, что сеть сама всё выучит. Мы сознательно проектируем пайплайн так, чтобы помочь ей это сделать и определяем данные на вход.
А теперь вопрос: как максимально упростить задачу? Под упростить я понимаю уменьшить неопределнность модели в отношении желаемого результата. Получить такой преобразование распределния, чтобы модель быстро и точно научилась решать целевую задачу. Мы снова делаем feature engineering. Хотя почти все думают, что в нейросетях фичи выделяются автоматически - с одной стороны это верно. С другой - именно мы контролируем, как эти фичи будут выделяться и что подавать на вход.
Самое время увидеть примеры, где мы обощаем мысль за пределы преобразований между слоями нейросети.
Пример 1: Музыка в ноты (@Audio2MIDIBot)
Мы хотим создать нейросеть, которая переводит ЛЮБУЮ музыку в ноты для фортепиано. Пространство всех аудиозаписей в мире невероятно сложное и зашумленное. Обучить одну модель "аудио -> детализированное MIDI" — гигантская и нестабильная задача, в частности из за аудиокодеков.
Решение через декомпозицию: разбиываем процесс на два этапа:
▪️Модель 1 (Грубое извлечение): Аудиокодек и трансформер извлекают из сложного аудиосигнала простую последовательность нот (MIDI). Результат часто бывает с ошибками и без нюансов.
▪️Модель 2 (Улучшение/Refinement): Вторая, уже чисто "символьная" модель, берет на вход простые MIDI и обогащает их, исправляет ошибки и добавляет детали. Она работает в гораздо более простом и стабильном пространстве "MIDI -> улучшенные MIDI".
Этот двухэтапный подход стал прорывом в нашем проекте, кардинально улучшив качество (подробнее о недостатках я рассказывал на Data Fest).
Пример 2: Стилизация портретов (от Алексея Попова)
Команда Леши делала диффузионную модель для стилизации портрета (например, добавить мультяшные эффекты). Полностью генерировать стилизованный портрет с нуля, сохраняя черты лица конкретного человека, очень сложно. Модель легко может "забыть" исходные детали.
Решение через декомпозицию: Вместо генерации с нуля, процесс можно разбить:
▪️Этап 1 (Сохранение идентичности): Первые шаги диффузии генерируют основу портрета, максимально близкую к реальному человеку, без стилизации.
▪️Этап 2 (Стилизация): Последующие шаги добавляют стилизующие детали поверх уже "узнаваемой" основы.
Так модель лучше сохраняет индивидуальные черты лица, а стилизация получается более качественной и предсказуемой.
#research #papers