Вопрос на собес #5 . Катастрофическое забывание
Довольно популярная практика дообучения какой-то модели на новых данных или задаче. Например, мы скачали обученную open source модель и хотим дообучить на своих специфических данных. Но проблема в том, что в ходе обучения на новых данных она может деградировать в качестве на том домене, на котором она была изначально обучена. Это и есть катастрофическое забывание.
Почему так происходит?
В стандартных нейронных сетях нет разделения, при котором часть весов используется для одной задачи, часть для другой. В ходе дообучения все веса оптимизируются под конкретную функцию потерь (loss) на данной задаче / на текущих данных, постепенно «затирая знания» о прошлом обучении.
Да, есть fine-tune, при котором часть модели замораживается, а остальное обучается. Но это другая история.
У человека так же?
В некоторых источниках пишут, что такая особенность не свойственна человеческому мозгу. Но я с этим не согласен. Представьте, что вы переехали за границу и в течение 5-10 лет не разговариваете на русском и не слушаете речь на нем. Вообще. Конечно, со временем язык будет забываться.
Как с этим бороться?
Самый популярный подход — Elastic Weight Consolidation (EWC), который ограничивает изменение важных весов. О как. И каким образом?
Как определить, какие веса важные?
Ядром алгоритма EWC является матрица Фишера. Ой, фу, матан... А можно попроще? Нам нужен некоторый тестовый датасет (100-1000 примеров), на котором мы будем проверять важность весов обученной модели. Необходимо на одном примере датасета посчитать градиент функции потерь (помним градиентный спуск). Затем усреднить квадраты градиентов по всем примерам. И так повторить для каждого веса. Эти квадраты градиентов — значения важности весов — диагональные элементы матрицы Фишера. Чем больше влияние веса, тем больше значение градиента, тем больше важность. Кажется, логично.
Как это применить при дообучении?
Чтобы предотвратить катастрофическое забывание, мы должны меньше менять важные веса. То есть разность между старым весом и новым должна быть минимальна. Таким образом, чем больше важность веса и чем больше его изменение в ходе обучения, тем больше получится штраф — дополнительная сумма к функции потерь. За счет этого такой подход можно отнести к регуляризации.
Недостатки:
🔺 нужно предварительно посчитать матрицу Фишера перед запуском дообучения;
🔺 нужно подбирать параметр лямбда, который определяет долю штрафа в функции потерь;
🔺 зависимость от тестового датасета.
Как еще бороться с катастрофическим забыванием?
🔹 Повторение — мать учения. При дообучении на новых данных можно подмешивать и старые;
🔹 Fine-tuning (пост про него);
🔹 Иногда пробуют ансамбли, которые позволяют проводить голосование нескольких моделей, например, старой и новой.
Подробнее
Post #104
100