Код: https://github.com/fanat503/Induction-Heads-Tinystories

Введение

Исследования Induction Heads и SAE очень важны, чтобы разобраться в современных моделях и понять, что же в них происходит. Цель эксперимента — проверить формирование Induction Heads на датасете TinyStories. Почему был выбран именно такой датасет? Потому что он очень простой и понятный, что позволяет изолировать влияние сложности данных на формирование механизмов.

Архитектура и методология

Моделью была GPT-2 Small, реализованная с нуля на PyTorch, на 124М параметров. Сам датасет состоял из 473М токенов (~5.5 эпох, 20,000 шагов), что позволило прогнать модель несколько раз на каждом токене. Метрики проверялись на функциях compute_induction_score и compute_previous_token_score, которые были также написаны самостоятельно. Архитектура SAE состояла из Encoder, который принимал 768 измерений и переносил их в 8192 измерений, а также Decoder, который переносил всё обратно в 768 измерений. l1_coeff равнялся 3.9, количество эпох обучения SAE — 25.

Результаты

3.1 Previous Token Heads

Previous Token Heads чётко формировались в начальных слоях (0–4). Наибольший score показала голова L0H3: 0.20. Стабильная динамика начала вырисовываться уже с 14,000 шагов (из 20,000).

Динамика Previous Token Score для головы L0H3 (шаги 14K–19K). Видно стабильное плато на уровне ~0.20, что говорит об устойчивом формировании механизма.
Динамика Previous Token Score для головы L0H3 (шаги 14K–19K). Видно стабильное плато на уровне ~0.20, что говорит об устойчивом формировании механизма.
Previous Token Score по слоям и головам. Наибольший score у L0H3 (0.20) — Previous Token механизм концентрируется в ранних слоях (0–4).
Previous Token Score по слоям и головам. Наибольший score у L0H3 (0.20) — Previous Token механизм концентрируется в ранних слоях (0–4).

3.2 Induction Heads

Induction Heads показали совсем другие результаты. Максимальный score, который показала голова L6H4, был равен 0.05, что объясняется характеристиками датасета. Пик результатов пришёлся на 15,000–16,000 шагов, а дальше пошёл медленный плавный спад, который почти не отразился на итоговом результате.

Начальная гипотеза эксперимента была такова, что Induction Heads могут слабо сформироваться на таком простом датасете — что позже и подтвердилось с помощью метрик, описанных выше.

Динамика Induction Score для головы L6H4 (шаги 14K–19K). Пик 0.0537 на шаге 16K с последующим плавным спадом — признак слабого и нестабильного механизма.
Динамика Induction Score для головы L6H4 (шаги 14K–19K). Пик 0.0537 на шаге 16K с последующим плавным спадом — признак слабого и нестабильного механизма.
Induction Score по слоям и головам. Максимум у L6H4 (0.05) — значительно слабее Previous Token Heads. Ни одна голова не показала сильного Induction паттерна.
Induction Score по слоям и головам. Максимум у L6H4 (0.05) — значительно слабее Previous Token Heads. Ни одна голова не показала сильного Induction паттерна.

3.3 Sparse Autoencoder

SAE обучен на активациях 6-го слоя, так как именно ему принадлежит голова L6H4, показавшая наивысший Induction Score. Active features находились в диапазоне 20–35 фичей на каждый токен, что позволяет хорошо их интерпретировать. Dead features составили приблизительно 3% (~228/8192) — неплохой результат, достигнутый за счёт L1-регуляризации, которая минимизировала количество фичей с ненулевой активацией.

Были найдены 2 главные фичи, которые сначала казались Induction-фичами, но при более длительной проверке на синтетических и реальных данных выяснилось следующее: F#8107 отвечает за синтаксически предсказуемый контекст, а F#635 — за общий контекстный паттерн. В итоге чистых Induction-фичей найдено не было, что подтвердило низкий score на тестах.

Активации F#8107 и F#635 на примере текста. F#8107 активна уже при первом появлении токена, разница с повтором минимальна (0.04–0.12) — чистого Induction паттерна нет. F#635 активна на синтаксически предсказуемых позициях.
Активации F#8107 и F#635 на примере текста. F#8107 активна уже при первом появлении токена, разница с повтором минимальна (0.04–0.12) — чистого Induction паттерна нет. F#635 активна на синтаксически предсказуемых позициях.

Обсуждение

Induction Heads оказались такими слабыми на TinyStories, так как простой датасет не требует глубоких механизмов In-context Learning. Из-за этого модели было "выгодно" сформировать качественные Previous Token Heads и не развивать Induction-механизм. Гипотеза на следующий эксперимент: Induction Heads будут лучше себя проявлять на более сложных датасетах, например OpenWebText, так как там модели для достижения более низкого loss придётся освоить данный алгоритм.

Следующий эксперимент будет посвящён обучению моделей разных размеров на TPU на двух датасетах (TinyStories и OpenWebText), чтобы определить, верна ли эта гипотеза.

Заключение

Previous Token Heads формируются стабильно на любых данных, так как они необходимы языковым моделям для предсказания следующего токена и минимизации loss. Induction Heads зависят от статистики повторов в датасете: если их нет, модели не имеет смысла выделять ресурсы на этот механизм. SAE при этом отлично помогает в визуализации и верификации результатов.

Код: https://github.com/fanat503/Induction-Heads-Tinystories