Снова к вопросу о предельных размерах запроса - с одного Телеграм-канала:
Цитата:
Вы думали, что 260 000 токенов это что-то невозможное для этэншна? А вот и нет, оказывается, если приделать approximate KNN (
https://towardsdatascience.com/comprehe ... 94f057d6b6) внутрь механизма внимания и складировать Keys и Values в отдельном буфере, то можно засунуть в GPT целые книги!
Авторы показывают, что такое внимание помогает модели вспоминать сложные теоремы и леммы, которые были описаны десятки страниц назад! А самое крутое — это можно приделать к любому предобученному трансформеру, нужно лишь немного потюнить его на длинных текстах, что не очень сложно, так как градиенты через память не идут.
А вот непосредственно из публикации (
ссылка):
Цитата:
Language models typically need to be trained or finetuned in order to acquire new knowledge, which involves updating their weights. We instead envision language models that can simply read and memorize new data at inference time, thus acquiring new knowledge immediately. In this work, we extend language models with the ability to memorize the internal representations of past inputs. We demonstrate that an approximate kNN lookup into a non-differentiable memory of recent (key, value) pairs improves language modeling across various benchmarks and tasks, including generic webtext (C4), math papers (arXiv), books (PG-19), code (Github), as well as formal theorems (Isabelle). We show that the performance steadily improves when we increase the size of memory up to 262K tokens. On benchmarks including code and mathematics, we find that the model is capable of making use of newly defined functions and theorems during test time.
С другого Телеграм-канала, на ту же тему:
Цитата:
Memorizing Transformers: как приделать к языковой модели внешнюю память, чтобы расширить контекст до 260.000 токенов
Языковые модели сейчас получаются классненькие, но все равно не идеальные. Одна из главных проблем — длина контекста (количество токенов текста, на которое модель может опираться, выдавая очередную генерацию). В стандартной GPT-4, к примеру, длина контекста — 8.000 токенов. В расширенной версии — 32.000. То есть, лучшая GPT-4 "видит" только 32.000 токенов поданного на вход текста. Все, что дальше, для нее не существует.
Увеличивать контекст модели довольно дорого по времени, количеству параметров и памяти. Поэтому ищутся другие способы. Один из вариантов — вариации "внешней памяти". В эту внешнюю память в каком-то виде складируется информация из входного текста, а модель в процессе работы с помощью некого механизма вытаскивает оттуда релевантные части для текущего шага генерации.
Идея внешней памяти сама по себе даалекоо не нова, ее и в СV, и в NLP развивают много лет со всех сторон. Но ребята из Гугла придумали новую идею этого механизма, довольно простую и эффекивную.
Вот в чем идея:
Устройство показано на 1 картинке к посту. Берем обычную языковую модель (трансформер). Берем один слой attention внутри этого трансформера (авторы берут слой, близкий к концу сети). К этому слою приделываем хранилище key-value пар, механизм выделения из хранилица нужной инфы и механизм использования этой инфы — еще один attention.
Сейчас расскажу, как эти части устроены. На каждом шаге генерации языковой модели происходит следующее:
- В хранилище добавляются все значения key и value для всех поданых на вход токенов и всех голов attention этого слоя;
- Для значений query всех поданых на вход токенов с помощью KNN ищутся k ближайших key-value пар из хранилища;
- Считается attention между query всех поданых на вход токенов и этими k ближайшими key-value парами. Из k полученных значений attention для каждого токена берется взвешенное среднее — получается одно значение attention на каждый входной токен;
- Считается обычный attention между query, key и value всех поданых на вход токенов;
- Два полученных attention фьюзятся в один также с помощью взвешенного среднего.
Все. Эксперименты показывают, что такая идея позволяет модели выделять релевантную инфу из памяти, которая была записана туда много-много токенов назад. Авторы тестировали модель на разных датасетах, включая датасет статей из arxiv, кода на GitHub, а также PG-19 — это датасет книг на английском языке, который стал классическим бенчмарком для проверки long-range natural language text modeling.
В общем-то, на всех них perplexity модели с памятью вместимостью 65к токенов выигрывает у модели без памяти (2 картинка к посту). Более того, у авторов получилось, что небольшой трансформер с внешней памятью всего 8к может показывать те же результаты, что большой трансформер без памяти, у которого в 5 раз больше обучаемых параметров.
Ну и что еще круто: эту память можно приделать при дообучении предобученной модели. Дообучать придется не очень много — модель быстро учится использовать механизм памяти и улучшает результат (3 картинка к посту)
Ну вот, общая идея такая. В устройстве модели есть еще пара важных нюансов, о них читайте в разделах 3.2 и 3.3 статьи.