Мини исследование-отчет по статье - https://arxiv.org/abs/2311.12424
- Введение
- Сравнение эффективности Looped TFs с обычными TFs
- N токенов
- Looped n-layers
- Заменим Attention на SSM
- Немного изменим модель (Bonus)
- Дополнительные наблюдения
- Дискуссия и заключение
Все использованные версии библиотек содержатся в environment.yml
. Для установки среды можно воспользоваться следующими командами:
conda env create -f environment.yml
conda activate looped_tf
В случае трудностей с тренировкой модели все веса находятся по пути /scripts/scripts/models
.
За основу исследования взята статья Looped Transformers are Better at Learning Learning Algorithms. В данной работе мы посмотрим на возможности по улучшению модели, скорости ее сходимости, проверим несколько гипотез и попробуем обосновать полученный результат. Выведем метрики для сравнения архитектур при различных параметрах и посмотрим, что влияет на тот или иной результат. Большая часть экспериментов проводилась с параметрами
Одна часть экспериментов проводилась в ноутбуках формата experiment_*.ipynb
. Другая часть экспериментов проводилась в удаленной среде (kaggle), их конфигурации находятся в папке configs
.
Задача работы: сравнить возможность зацикленных и обычных моделей для In-Context Learning в контексте линейной регрессии (с шумом и без).
Все эксперементы проводились с выключенным Mixed Precision, поскольку он не влиял на скорость обучения - из-за того, что gpt2_nano не может использовать GPU эффективно, и по этой же причине, тренировка оставалась относительно медленной. Одна часть эксперементов проводилась на локальной машине с Nvidia 3060ti mobile, а вторая на удаленной машине.
Для сравнения двух типов моделей, посмотрим на скорость сходимости трансформера (TF) с параметром Heads=4, dims=10, points=31
. На графике квадратичная ошибка масштабирована на размерность регрессии
Как можно видеть из графиков, Looped TFs при увеличении $ b $ дает улучшение метрик. При количестве параметров в 12 раз меньшим, чем у обычного трансформера, он показывает сопоставимые с обычным трансформером показатели.
Сравним точность моделей и посмотрим на их поведение на разных итерациях (в дальнейшем данный метод будет использован ни один раз). Для этого обучим Looped TFs со значениями
Из графика можем видеть, что при большем
Эксперименты проводились в блокноте experiment_schedule.ipynb
.
Появилась следующая гипотеза:
Гипотеза
Тренировка с использованием шедулинга (по параметру
$b$ ) может дать лучшую сходимость при увеличении параметрa$b$ на этапе валидации.
Однако в процессе эксперимента со слабыми моделями (n_embs=128
), это подтвердилось только частично.
При тренировке с разным
Опыты проводились в блокноте experiment_shedule.ipynb
и в блокноте experiment_shedule_2.ipynb
.
Из графиков выше можно видеть, что, в отличии от моделей с параметрами n_embs=256
- мы увеличили размерность моделей в два раза относительно предыдущих, однако это не изменинило положения. Возможно, данные результаты связаны с тем, что модель пытается подстроиться под разное количество итераций во время обучения.
Проверим гипотезу:
Гипотеза
Модель имеет возможность использовать часть токенов как хранилище информации с предыдущего шага.
Постановка экспериментов. Будем убирать как
Чтобы понять, насколько мы можем обрезать количество токенов, которые подаются в модель, замаскируем часть из них, и посмотрим на метрики.
Модели обучались с параметрами
На графиках ниже мы можем видеть вполне ожидаемый результат - для моделей обученных с параметрами
Также интересно, что при увеличении количества итераций при инференсе мы получаем такую же ошибку на каждом этапе отбрасывания
Попробуем замаскировать все токены кроме
Как можем видеть, ощутимой разницы это не дало, видимо для зацикленных трансформеров первые и последние токены имеют схожую важность.
Меньшее количество токенов негативно влияет на итоговые показатели модели. Можно сделать вывод что исходная гипотеза верна, дополнительные
токены на входе действительно позволяют модели обучаться для хранения информации о токенах с предыдущей итерации.
Эксперименты проводились в блокнотах experiment_last_n_tokens.ipynb
и experiment_first_n_tokens.ipynb
.
В результате проведения экспериментов проявилось интересное поведение которое потенциально может вести к переобучению модели, и иногда отсутствию возможности адаптироваться на новые данные. При использовании 20-30 токенов мы на обоих графиках можем наблюдать уменьшение точности, и на последней точке перед скачком резкое увеличение точности. Данное поведние стоит исследовать на разной размерности, количестве токенов и других задачах классификации (дерево, MLP, ... ).
Также при маскировании
Проверим возможности зацикленных трансформеров
при обучении с количеством слоев
Будем обучать зацикленные трансформеры с варьированием
Данный паттерн повторяется с разным параметром
Из интересного стоит отметить, что, чем больше слоев у модели, тем больше шагов итерации ей необходимо чтобы сойтись. К примеру, для моделей с параметрами
Получается, что сходимость зависит не только от числа итераций
Эксперимент проводился в блокноте
experiment_looped_n_layers.ipynb
.
В данной серии эксперементов попробуем исследовать как ведет себя Mamba (архитектура из статьи Transformers are SSMs: Generalized Models and Efficient Algorithms Through Structured State Space Duality ). Реализация взята из библиотеки zetascale
и репозитория mamba-minimal. Стоит заметить, что время обучения модели сильно больше в отличие стандартного блока трансформера, поскольку там не реализованы многие методы оптимизации. Вместо стандартного диапазона тренировки
Проверим следующую гипотезу:
Гипотеза
Поведение моделей будет похоже как при тренировке, так и при валидации.
Для построения модели заменим основную модель GPT-nano на архитектуру Mamba. Сама реализация находится в mamba_nano.py
. Была обучена базовая модель с разным количеством итераций. Разное количество шагов вызвано большим временем обучения модели, однако мы все равно можем проследить основные моменты, такие как выход на плато и начало падения целевой метрики. Результаты обучения приведены на графике ниже. Для более наглядного сравнения использовалось скользящее среднее.
Как мы можем увидеть модель, проявляет себя достаточно интересно - на первых итерациях квадратичная ошибка падает сильно быстрее, чем у Looped TF, и далее идет выход на плато, но несмотря на эти показатели, итоговая ошибка у моделей на базе архитектуры Mamba больше, чем у моделей на базе трансформеров. Посмотрев на график ниже, можно предположить, что Mamba накапливает больше ошибок в процессе выполнения (по сравнению с трансформером, который становится более стабильным).
Интересно, что зацикленная Mamba показывает себя стабильнее на большем количестве итераций при валидации. Основная гипотеза состоит в том, что сама архитектура модели более натурально работает в цикле. Поскольку Mamba это sequence-based network, в теории она может более натурально работать с циклами, однако этот тезис стоит проверить основательнее, на других эксперименетах.
Для конечных выводов по использованию данной архитектуры и ее возможностей с зацикливанием стоит провести больше эксперементов. Но ввиду сильного увеличения времени работы, сделать это тяжело, не прибегая к тем улучшениям (одна из самых важных частей статьи), которые делают модели Mamba быстрее при увеличении контекста. Однако, изначальная гипотеза не подтвердилась - модель показала себя слабее относительно трансформеров, однако возможный тюнинг параметров может помочь модели достигнуть похожих показателей точности. И хотя модель достигает меньшей точности по сравнению с трансформерами, можно увидеть, что ее зацикленная версия ведет себя значительно лучше, а это значит, что и с другими архитектурами их зацикленные версии могут дать значительный прирост в точности.
Одним из основых элементов архитектуры модели является цикл с находящимся внутри трансформером. Так как мы стараемся имитировать итеративные алгоритмы, попробуем позаимствовать идею из градиентного спуска. Дадим модели новый параметр lr
.
Обучим для более справедливого оценивания несколько моделей с параметрами
В результате мы получили более точную модель. При больших итерациях, за исключением шедулинга, где результат идентичен, мы можем видеть, что дополнительная информация о цикле помогает уменьшить ошибку после обучения. Разница в квадратичной ошибке составляет ~0.005, ~0.005, ~0.0024 для
b=5 | b=10 | b=15 | |
---|---|---|---|
Classic model | 0.0067 | 0.0070 | 0.00328 |
LR model | 0.0014 | 0.0019 | 0.00086 |
Посмотрим на график обучения модели и на скользящее среднее во время тренировки. Можем увидеть что наше дополнение к архитектуре позволяет ускорить сходимость алгоритма.
Эксперимент проводился в блокноте experiment_bonus.ipynb
.
Поскольку Looped TFs имеют преимущество во многих ситуациях над обычными TF с таким же или большим количеством параметров, исследование этого поведения может помочь в понимании природы такого поведения. Как один из вариантов, можно посмотреть на ландшафт потерь моделей и посмотреть на их различия. Метод взят из статьи Visualizing the Loss Landscape of Neural Nets.
Было обучено 5 моделей - один зацикленный трансформер со значениями
Можно увидеть, что у Looped TF ландшафт потерь более равномерный, чем у обычного трансформера. Также в ряде случаев ландшафт имеет более крутые спуски в окрестности точки минимума, что может свидетельствовать о более скорой сходимости. Это же мы можем видеть на графиках обучения модели. Хотя по графикам нельзя однозначно говорить, что влияет на такое хорошее поведение у Looped TF, но позволяет дать некоторые идеи относительно того, что может происходить при обучении модели.
Все эксперименты проводились в ноутбуке loss_surface.ipynb
, 3д графики можно увидеть там же или в папке images
.
Мы провели ряд эксперементов с Looped TF и TF, варьировали их параметры и попытались интерпертировать вывод модели. Можно сказать, что зацикленные трансформеры показали свою эффективность в задачах линейной регрессии. Многие выводы, сделанные в оригинальной статье, подтвердились.
Было выяснено, что при увеличении числа слоев модели вели себя ожидаемо, улучшая итоговое качество метрик, однако если слоев становилось слишком много, модель сходилась сильно дольше (особенно при увеличении
Чтобы улучшить обобщающие способности модели, можно провести больше экспериментов с варьированием
Архитектура Mamba и ее "Looped" версия показала себя многообещающе, и хотя не получилось провести все необходимые эксперименты, ввиду долгого времени тренировки, она показала себя достаточно хорошо, чтобы исследовать на ней задачу In-Context learning в контексте моделей Universal Transformer.
Сама же интерпретация моделей вызывает большой интерес. Стоит более внимательно изучить поведение моделей как итеративного алгоритма в задаче In-Context learning для более сложных задач, таких как языковое моделирование (LM) или же компьютерное зрение (CV).