Not All Memories are Created Equal: Learning to Forget by ExpiringSainbayar Sukhbaatar, Da Ju, Spencer Poff, Stephen Roller, Arthur Szlam, Jason Weston, Angela FanСтатья:
https://arxiv.org/abs/2105.06548 Code:
https://github.com/facebookresearch/transformer-sequential (плюс там же код для недавно обсуждавшегося Feedback Transformer)
Прикольная работа от хороших авторов в тему трансформеров с памятью.
Много свежей движухи в стане трансформеров направлено на увеличение attention span (все эти Big Bird, Longformer, Reformer и т.п.) и/или добавление памяти (Compressive Transformer и другая экзотика). Но, как известно, не все йогурты одинаково полезны. Мало увеличивать span и добавлять больше памяти, надо уметь и забывать ненужное и освобождать память.
Данная работа посвящена именно этому и идейно во многом является продолжением линий Adaptive Attention Span (тех же авторов,
https://t.me/gonzo_ML/99) и Compressive Transformer (DeepMind,
https://t.me/gonzo_ML/165).
Adaptive Attention Span позволял адаптивно определять этот самый span для каждой головы внимания независимо и не считать внимание по большим окнам, где это не надо. Compressive transformer перегонял в долгую память репрезентации, уходящие из обычного поля зрения, но делал это довольно топорно.
Суть текущей работы,
Expire-Span, в том, что давайте считать внимание не по всем элементам какого-то окна (attention span), а только по тем, которые “не забылись”. Тогда и окно можно сделать сильно больше, если в нём не так много ключевой информации, которую надо помнить. В данной работе attention span доходит до 128К токенов, что, кажется, рекорд. Фокусируются на декодерах.
Технически это работает так. Для каждой репрезентации токена (hidden state) мы имеем предиктор (по сути однослойная сетка с сигмоидой), дающий значение expiration value — как долго (сколько шагов по времени) эту репрезентацию нужно помнить. Как только элемент выходит из этого окошка, он “забывается” и не участвует далее в вычислении весов внимания. Количество элементов, участвующих в этом вычислении, называется размером памяти (C).
Окошко памяти сделано по аналогии с работой про adaptive attention span без резкого перепада, а как soft mask, в нём есть участок длины R (гиперпараметр), где вес элемента линейно спадает от единицы до нуля. Это чтобы был нормальный участок, откуда бы поступали градиенты на обучение этого механизма.
Лосс функция содержит дополнительный терм, уменьшающий средний размер используемой памяти C.
Механизм работает независимо для каждого слоя, что потенциально даёт возможность каждому слою специализироваться на своём временном масштабе (а можно, кстати, и заэнфорсить явный bias в этом месте, интересно, что получилось бы).
В работе указано много тонкостей имплементации. Среди них, например, есть абзац про регуляризацию памяти, когда при обучении для каждого батча случайным образом определяется число l<L (максимальный span) и память дальше этого l зануляется. Это чтобы модель не рассчитывала, что память всегда будет содержать специфическую информацию. Есть чувство, что это можно было бы назвать memory dropout и посвятить ему отдельную статью. А тут скромно абзац внутри текста.
Для сравнения бейзлайнами взяты Transformer-XL, Adaptive-Span и Compressive Transformer. Expire-Span демонстрирует очень хорошие результаты.
На задачке с коридором (когда в начале коридора есть цветное пятно, говорящее, в каком из поворотов в конце коридора будет награда, а коридор может быть длинным, так что помнить надо долго) ощутимо бьёт XL даже при малом объёме памяти (что логично, для такой задачи её как раз нужно мало). Есть задача навигации по нескольким комнатам с порталами (надо помнить, какой портал где правильный) и задача про длинные текстовые инструкции для игры, которые надо запоминать и в нужном месте использовать. Тут тоже лучше, чём XL.
Есть задача копирования последовательности, когда идёт сколько-то символов A, потом много B, и потом надо скопировать то самое количество A. Чем больше span, тем лучше работает (до 128К).