Loss of plasticity in deep continual learning [2024]
Сегодня посмотрим на статейку от Саттона, которую мне недавно скинули в комментариях. В ней разбирается проблема потери пластичности - способности обучаться со временем - в нейросетях. Я уже кстати давно писал про статью на эту тему в контексте RL.
Рассмотрим эксперимент с так называемым Class-incremental CIFAR-100. На самом деле это облегчённый вариант Class-incremental, если сравнивать с моими недавними постами.
Вначале мы учим нейросеть на 5 классах, затем замеряем на 5 классах. Потом добавляем 5 новых классов, учим на 10 и тестируем на 10, и так далее. То есть в статье специально избегают проблему забывания, фокусируясь только на пластичности.
Обучаясь на задаче за задачей, нейросеть начинает работать всё хуже и хуже по сравнению с бейзлайном, который сразу учат на последней задаче, хотя у них перед глазами одни и те же данные. Случайная инициализация работает лучше претрейна, если данных достаточно.
В чём причина? Авторы объясняют это появлением так называемых Dormant Units - "нейронов", которые скатываются в константное предсказание - например, в 0, если используется ReLU. Градиенты перестают течь и нейрон становится бесполезным.
В статье протестировали метод под названием Shrink and Perturb - это добавление L2-регуляризации + зашумление весов, которые как бы помогают весам вернуться в точку "инициализации". С его помощью, пластичность теряется сильно медленнее.
Авторы предлагают и новый подход под названием Continual Backpropagation. Он предполагает более точечную работу с плохими юнитами.
Для каждого нейрона мы поддерживаем так называемую Utility Function, которая считается как его "вклад" в следующие слои - это буквально сумма выходных весов, умноженная на выход нейрона. Используем скользящее среднее для усреднения по времени.
На каждом шаге мы берём долю весов с наименьшим Utility и переинициализуем их - входные веса из шума, выходные нулями. Также выдаём иммунитет на переинициализацию этому юниту на следующие 100 шагов.
Доля пересоздаваемых юнитов не должна быть большой - всего 10^-5 от всех юнитов за шаг. Этого хватает, чтобы полностью решить проблему потери пластичности на задаче Class-incremental CIFAR-100 и удерживать долю Dormant Units достаточно близкой к нулю.
Может показаться, что этот метод является Free Lunch - мы получили плюс к пластичности, ничего не теряя. Но на самом деле мы скорее съедаем больший кусок ланча, за который уже заплатили до этого, выделив N памяти, который потом начинает простаивать.
Чем менее тривиальная перед нами задача, тем меньший кусок ланча мы умеем есть, и больший выбрасываем в мусорку. Съедать всё, что есть, мы научимся, когда люди осознают реальный смысл Bitter Lesson, степень своей ограниченности и начнут, наконец, гонять meta-meta-learning.
@knowledge_accumulator
Post #323
3.5K

- 👍 5
- ❤ 4
- 🔥 2