Прослеживая историю внимания LLM: стоя на плечах гигантов
Делиться

Знаменитое высказывание Исаака Ньютона о том, что он видел дальше, только стоя на плечах гигантов, отражает вечную истину о науке. Каждый прорыв опирается на бесчисленные слои предшествующего прогресса, пока однажды… всё просто не заработает. Нигде это не проявляется так очевидно, как в недавней и продолжающейся революции в обработке естественного языка (NLP), движимой архитектурой Transformers, лежащей в основе большинства современных систем генеративного ИИ.
«Если я и видел дальше, то потому, что стоял на плечах гигантов».
— Исаак Ньютон, письмо Роберту Гуку, 5 февраля 1675 г. (по старому стилю; 1676 г. по новому стилю)

В этой статье я выступаю в роли ученого Шерлока Холмса, прослеживающего эволюцию языкового моделирования.
Языковая модель — это система искусственного интеллекта, обученная предсказывать и генерировать последовательности слов на основе закономерностей, изученных в больших наборах текстовых данных. Она присваивает вероятности последовательностям слов, что позволяет применять её в самых разных областях — от распознавания речи и машинного перевода до современных систем генеративного искусственного интеллекта.
Как и все научные революции, языковое моделирование возникло не в одночасье, а опирается на богатое наследие. В этой статье я сосредоточусь на небольшой части обширной литературы в этой области. В частности, наше путешествие начнётся с ключевой более ранней технологии — релевантно-ориентированных языковых моделей Лавренко и Крофта, — которая ознаменовала собой значительный прорыв в производительности систем информационного поиска в начале 2000-х годов и продолжает оставлять свой след в соревнованиях TREC. Оттуда путь ведёт к 2017 году, когда Google опубликовала основополагающую статью «Внимание — всё, что вам нужно», в которой была представлена архитектура Transformers, совершившая революцию в задачах перевода последовательностей.
Ключевое звено между двумя подходами, по сути, довольно простое: мощная идея внимания. Подобно тому, как моделирование релевантности Лавренко и Крофт оценивает, какие термины с наибольшей вероятностью будут встречаться в запросе, механизм внимания Трансформера вычисляет сходство между запросом и всеми токенами в последовательности, взвешивая вклад каждого токена в контекстное значение запроса.
В обоих случаях механизм внимания действует как мягкий вероятностный механизм взвешивания, обеспечивая обоим методам их грубую репрезентативную силу.
Обе модели представляют собой генеративные фреймворки для работы с текстом, различающиеся главным образом по области применения: RM1 моделирует короткие запросы из документов, трансформаторы моделируют полные последовательности.
В следующих разделах мы рассмотрим предысторию моделей релевантности и архитектуры Transformer, подчеркнув их общие основы и прояснив параллели между ними.
Моделирование релевантности — знакомство с моделью смеси RM1 Лавренко
Давайте рассмотрим концептуальную параллель между моделью релевантности Лавренко и Крофта в информационном поиске и механизмом внимания Трансформера. Оба появились в разных областях и эпохах, но имеют общую интеллектуальную ДНК. Мы рассмотрим предысторию моделей релевантности, прежде чем обозначить ключевую связь с последующей архитектурой Трансформера.
Когда Виктор Лавренко и В. Брюс Крофт представили модель релевантности в начале 2000-х годов, они предложили элегантную вероятностную формулировку для преодоления разрыва между запросами и документами. В основе этих моделей лежит простая идея: предполагается существование скрытого «распределения релевантности» терминов словаря, характеризующего документы, которые пользователь считает релевантными своему запросу. Задача заключается в оценке этого распределения на основе наблюдаемых данных, а именно запроса пользователя и коллекции документов.
Первый вариант моделирования релевантности — RM1 (существовало еще две модели в том же семействе, которые здесь подробно не рассматриваются) — делает это напрямую, выводя распределение слов, которые, вероятно, встречаются в соответствующих документах по запросу, по сути моделируя релевантность как скрытую языковую модель, которая находится «за» как запросами, так и документами.

с апостериорной вероятностью документа d по запросу q, заданной как:

Это классическая модель языка униграмм со сглаживанием Дирихле, предложенная в оригинальной статье Лавренко и Крофта. Для оценки этой модели релевантности RM1 использует наиболее часто извлекаемые документы в качестве псевдорелевантной обратной связи (PRF) — предполагается, что документы с наивысшей оценкой, вероятно, релевантны. Это означает отсутствие необходимости в дорогостоящих оценках релевантности, что является ключевым преимуществом формулировки Лавренко.

Чтобы получить интуитивное представление о том, как работает модель RM1, мы шаг за шагом напишем ее код на Python, используя простой корпус документов, состоящий из трех «документов», определенных ниже, с запросом «cat».
import math from collections import Counter, defaultdict # ———————— # Шаг 1: Пример корпуса # ———————— docs = { «d1»: «кот сидел на коврике», «d2»: «собака залаяла на кота», «d3»: «собаки и кошки — друзья» } # Запрос query = [«кот»]
Далее — для целей этого показательного примера IR-ситуации — мы проводим легкую предварительную обработку коллекции документов, разбивая документы на токены, определяя количество каждого токена в каждом документе и определяя словарь:
# ———————— # Шаг 2: Предварительная обработка # ———————— # Токенизация и подсчет doc_tokens = {d: doc.split() for d, doc in docs.items()} doc_lengths = {d: len(toks) for d, toks in doc_tokens.items()} doc_term_counts = {d: Counter(toks) for d, toks in doc_tokens.items()} # Словарь vocab = set(w for toks in doc_tokens.values() for w in toks)
Если мы запустим приведенный выше код, мы получим следующий вывод с четырьмя простыми структурами данных, содержащими информацию, необходимую для вычисления распределения релевантности RM1 для любого запроса.
doc_tokens = { 'd1': ['the', 'cat', 'sat', 'on', 'the', 'mat'], 'd2': ['the', 'dog', 'labked', 'at', 'the', 'cat'], 'd3': ['dogs', 'and', 'cats', 'are', 'friends'] } doc_lengths = { 'd1': 6, 'd2': 6, 'd3': 5 } doc_term_counts = { 'd1': Counter({'the': 2, 'cat': 1, 'sat': 1, 'on': 1, 'mat': 1}), 'd2': Counter({'the': 2, 'dog': 1, 'labked': 1, 'at': 1, 'cat': 1}), 'd3': Counter({'dogs': 1, 'and': 1, 'cats': 1, 'are': 1, 'friends': 1}) } vocab = { 'the', 'cat', 'sat', 'on', 'mat', 'dog', 'labked', 'at', 'dogs', 'and', 'cats', 'are', 'friends' }
Если мы рассмотрим уравнение RM1, определённое ранее, мы можем разбить его на ключевые вероятностные компоненты. P(w|d) определяет распределение вероятностей слов w в документе d. P(w|d) обычно вычисляется с использованием априорного сглаживания Дирихле (Zhai & Lafferty, 2001). Это априорное сглаживание позволяет избежать нулевых вероятностей для неизвестных слов и уравновешивает данные, специфичные для документа, со статистикой фоновой выборки. Это определяется как:

Приведённое выше уравнение даёт нам модель униграммы «мешок слов» для каждого документа в нашем корпусе. Кстати, можно представить, как в наши дни — благодаря мощным языковым моделям Hugging-face — мы могли бы заменить эту формулировку, например, на вариант на основе BERT, используя вложения для оценки распределения P(w|d).
При подходе к P(w|d) на основе BERT мы можем вывести вложение документа g(d) с помощью объединения средних значений и вложение слова e(w), а затем объединить их в следующем уравнении:

Здесь V обозначает сокращенный словарь (например, объединение терминов документа), а 𝜏 — параметр температуры. Это может стать первым шагом к созданию нейронной модели релевантности (NRM), нетронутого и потенциально нового направления в области информационных технологий.
Вернемся к исходной формулировке: эту предыдущую формулу можно записать на Python как нашу первую оценку P(w|d):
# ———————— # Шаг 3: P(w|d) # ———————— def p_w_given_d(w, d, mu=2000): «»»Модель языка, сглаженная Дирихле.»»» tf = doc_term_counts[d][w] doc_len = doc_lengths[d] # вероятность коллекции cf = sum(doc_term_counts[dd][w] для dd в документах) collection_len = sum(doc_lengths.values()) p_wc = cf / collection_len return (tf + mu * p_wc) / (doc_len + mu)
Далее мы вычисляем вероятность запроса в рамках модели документа — P(q|d):
# ———————— # Шаг 4: P(q|d) # ———————— def p_q_given_d(q, d): «»»Запрос вероятности в соответствии с документом d.»»» оценка = 0.0 для w в q: оценка += math.log(p_w_given_d(w, d)) return math.exp(оценка) # возвращает вероятность, а не логарифм
RM1 требует P(d|q), поэтому мы переворачиваем вероятность — P(q|d) — используя правило Байеса:
def p_d_given_q(q): «»»Апостериорное распределение по документам, заданным запросом q.»»» # Вычислить вероятности запроса для всех документов scores = {d: p_q_given_d(q, d) for d in docs} # Предположим, что априорное распределение P(d) является равномерным, поэтому пропорциональность — это просто scores Z = sum(scores.values()) # нормализация return {d: scores[d] / Z for d in docs}
Мы предполагаем, что априорная вероятность документа равномерна, поэтому она сокращается. Затем мы также нормализуем все документы, чтобы сумма апостериорных вероятностей равнялась 1:

Подобно P(w|d), стоит подумать о том, как можно нейтрализовать термины P(d|q) в RM1. Первый подход — использовать готовую модель кросс- или двойного кодировщика (например, кросс-кодировщик BERT с тонкой настройкой MS MARCO) для встраивания запроса и документа, получения оценки сходства и её нормализации с помощью softmax:

Преобразовав P(d|q) и P(w|d) в представления на основе нейронной сети, мы можем соединить их вместе, чтобы получить простую начальную версию нейронной модели RM1, которая вернет нам P(w|q).
Однако в рамках этой статьи мы вернёмся к классической формулировке RM1. Давайте запустим код (стандартный, не нейронный) RM1, чтобы увидеть вывод различных компонентов, которые мы только что обсудили. Напомним, что наш учебный корпус документов выглядит следующим образом:
d1: «кошка сидела на коврике» d2: «собака лаяла на кошку» d3: «собаки и кошки — друзья»
При использовании сглаживания Дирихле (с μ=2000) значения будут очень близки к вероятности обнаружения слова «cat», поскольку документы очень короткие. Например:
- d1 : «cat» встречается один раз в 6 словах → P(q|d1) приблизительно равно 0,16
- d2 : «cat» встречается один раз в 6 словах → P(q|d2) приблизительно равно 0,16
- d3 : «кот» никогда не появляется → P(q|d3) приблизительно равен 0 (при сглаживании небольшое значение >0)
Теперь нормализуем это распределение, чтобы получить апостериорное распределение:
{ 'P(d1|q)': 0,5002, 'P(d2|q)': 0,4997, 'P(d3|q)': 0,0001 }
В чем ключевое различие между P(d|q) и P(q|d)?
P(q|d) показывает, насколько хорошо документ «объясняет» запрос. Если представить, что каждый документ сам по себе представляет собой мини-модель языка: если бы он генерировал текст, насколько вероятно, что он произведёт слова, которые мы видим в запросе? Эта вероятность высока, если слова запроса выглядят естественно в рамках распределения слов документа. Например, для запроса «кошка» документ, в котором буквально упоминается «кошка», даст высокую вероятность; документ о «собаках и кошках» — немного меньшую; документ о «Чарльзе Диккенсе» — близкую к нулю.
Напротив, вероятность P(d|q) определяет, насколько мы можем доверять документу с учётом запроса. Это меняет подход, используя правило Байеса: теперь мы спрашиваем, учитывая запрос, какова вероятность того, что релевантный пользователю документ — d?
Таким образом, вместо того, чтобы оценивать, насколько хорошо документ объясняет запрос, мы рассматриваем документы как конкурирующие гипотезы релевантности и нормализуем их распределение по всем документам. Это даёт нам ранговый рейтинг, преобразованный в вероятностную массу: чем он выше, тем выше вероятность того, что данный документ релевантен по сравнению с остальной частью коллекции.
Теперь у нас есть все компоненты для завершения реализации модели RM1 Лавренко:
# ———————— # Шаг 6: RM1: P(w|R,q) # ———————— def rm1(q): pdq = p_d_given_q(q) pwRq = defaultdict(float) for w in vocab: for d in docs: pwRq[w] += p_w_given_d(w, d) * pdq[d] # нормализовать Z = sum(pwRq.values()) for w in pwRq: pwRq[w] /= Z return dict(sorted(pwRq.items(), key=lambda x: -x[1])) # ————————
Теперь мы видим, что RM1 определяет распределение вероятностей по словарному запасу, которое показывает, какие слова с наибольшей вероятностью встречаются в документах, релевантных запросу. Это распределение затем можно использовать для расширения запроса, добавляя слова с высокой вероятностью их появления, или для переранжирования документов, измеряя расхождение KL между языковой моделью каждого документа и моделью релевантности запроса.
Самые популярные термины из RM1 для запроса ['cat'] cat 0.1100 the 0.1050 dog 0.0800 sat 0.0750 mat 0.0750 barked 0.0700 on 0.0700 at 0.0680 dogs 0.0650 friends 0.0630
В нашем примере термин «кошка» естественным образом поднимается наверх, поскольку он напрямую соответствует запросу. Высокочастотные фоновые слова, такие как «the», также часто встречаются, хотя на практике они были бы отфильтрованы как стоп-слова. Что ещё интереснее, содержательные слова из документов, содержащих слово «кошка» (например, сел, коврик, собака, лаял), также поднимаются вверх. В этом и заключается сила RM1: он вводит связанные термины, отсутствующие в самом запросе, без необходимости явного анализа релевантности или контроля. Слова, уникальные для d3 (например, друзья, собаки, кошки), получают небольшие, но ненулевые вероятности благодаря сглаживанию.
RM1 определяет модель релевантности, специфичную для запроса, — языковую модель, выведенную из запроса, которая оценивается путем усреднения документов, которые, скорее всего, релевантны этому запросу.
Теперь, увидев, как RM1 создает языковую модель, специфичную для запроса, переоценивая термины документа в соответствии с их апостериорной релевантностью, трудно не заметить параллель с тем, что появилось гораздо позже в глубоком обучении: механизмом внимания в «Трансформерах».
В RM1 мы оцениваем новое распределение P(w|R, q) по словам, комбинируя модели языка документов, взвешенные по вероятности релевантности каждого документа данному запросу. Архитектура Transformer делает нечто похожее: по заданному токену («запросу») вычисляется степень сходства со всеми остальными токенами («ключами»), а затем эти оценки используются для взвешивания их «значений». Это создаёт новое, контекстно-зависимое представление токена запроса.
Модель Лавренко RM1 как «прототрансформатор»
Механизм внимания, представленный в архитектуре Transformer, был разработан для преодоления ключевого недостатка более ранних моделей последовательностей, таких как LSTM и RNN: их короткого горизонта памяти. В то время как рекуррентные модели испытывали трудности с фиксацией долгосрочных зависимостей, механизм внимания позволял напрямую связывать любой токен в последовательности с любым другим, независимо от расстояния в последовательности.
Интересно, что математика внимания очень похожа на ту, что использовалась в RM1 много лет назад. В RM1, как мы видели, мы строим распределение, специфичное для запроса, взвешивая документы; в Transformers мы строим представление, специфичное для токена, взвешивая другие токены в последовательности. Принцип тот же — присваиваем вероятностную массу наиболее релевантному контексту, — но применяется на уровне токена, а не документа.
Если разобрать Трансформеров до их сути, механизм внимания — это, по сути, всего лишь RM1, применяемый на уровне токенов.
Это может показаться смелым заявлением, поэтому мы обязаны предоставить некоторые доказательства!
Давайте сначала немного углубимся в механизм внимания, а для более полного и глубокого погружения я положусь на фантастическое изобилие высококачественных существующих вводных материалов.
В слое внимания Transformer, известном как масштабированное скалярное произведение внимания, для заданного вектора запроса q мы вычисляем его сходство с ключами k всех остальных токенов. Эти сходства нормализуются с помощью функции softmax и преобразуются в веса. Затем эти веса используются для смешивания соответствующих значений v, создавая новое, контекстно-зависимое представление токена запроса.
Масштабированное скалярное произведение внимания:

Здесь Q = вектор(ы) запроса, K = ключевые векторы (документы, в нашей аналогии), V = векторы значений (слова/признаки, которые нужно смешать). Softmax — это нормализованное распределение по ключам.
Теперь вспомним RM1 (Лавренко и Крофт 2001):

Веса внимания в масштабированном скалярном произведении соответствуют распределению P(d|q) между документами и запросами в RM1. Переформулировка внимания в форме, учитывающей запросы, делает эту связь явной:


Вектор значений v в модели внимания можно представить как соответствующий P(w|d) в модели RM1, но вместо явного распределения слов v представляет собой плотный семантический вектор — низкоранговый суррогат полного распределения. По сути, это контент, который мы смешиваем после получения оценок релевантности для каждого документа.
Если рассматривать более широкую архитектуру Transformer, то можно увидеть, что многоголовое внимание запускает несколько моделей релевантности в стиле RM1 параллельно с различными проекциями.
Мы можем дополнительно провести параллели с более широкой архитектурой Transformer.
- Робастная оценка вероятности: например, мы ранее обсуждали, что RM1 нуждается в сглаживании (например, Дирихле) для сглаживания нулевых значений и предотвращения переобучения редким членам. Аналогично, Transformers используют остаточные связи и нормализацию слоёв для стабилизации и предотвращения коллапсов распределения внимания. Обе модели обеспечивают робастность оценки вероятности при разреженном или зашумлённом сигнале данных.
- Обратная связь по псевдорелевантности: RM1 выполняет один раунд вероятностного расширения посредством обратной связи по псевдорелевантности (PRF), ограничивая внимание первыми K найденными документами. Набор PRF функционирует как окно контекста внимания: запрос распределяет вероятностную массу по ограниченному набору документов, и слова соответствующим образом переоцениваются. Аналогично, внимание преобразователя ограничено локальной входной последовательностью. Однако, в отличие от RM1, преобразователи накладывают множество слоёв внимания, каждый из которых переоценивает и уточняет распределение токенов. Таким образом, глубокий стек внимания можно рассматривать как итеративную обратную связь по псевдорелевантности — многократное объединение данных в связанном контексте для создания более содержательных репрезентаций.
Аналогия между RM1 и Трансформатором суммирована в таблице ниже, где мы связываем вместе все компоненты и рисуем связи между ними:

RM1 выразил мощную, но общую идею: релевантность можно понимать как взвешивание смеси контента на основе сходства с запросом.
Почти два десятилетия спустя тот же принцип вновь проявился в механизме внимания Трансформера — теперь уже на уровне токенов, а не документов. То, что начиналось как статистическая модель для расширения запросов в информационном поиске, превратилось в математическое ядро современных больших языковых моделей (LLM). Это напоминание о том, что прекрасные идеи в науке редко исчезают; они путешествуют сквозь время, переосмысляясь и переосмысливаясь в новых контекстах.
Посредством письменного слова ученые передают идеи из поколения в поколение, незаметно связывая воедино волны инноваций, пока внезапно не происходит прорыв.
Иногда самые простые идеи оказываются самыми мощными. Кто бы мог подумать, что «внимание» может стать ключом к пониманию языка? И всё же это так.
Выводы и заключительные мысли
В этой статье мы проследили одну ветвь обширного дерева — языковое моделирование, обнаружив убедительную связь между развитием моделей релевантности в раннем информационном поиске и появлением Трансформеров в современном NLP. RM1 — первый вариант в семействе моделей релевантности — во многих отношениях был прото-Трансформером для IR, предвосхищая механизм, который впоследствии изменил то, как машины понимают язык.
Мы даже закодировали нейронный вариант модели релевантности, используя современные модели, работающие только с кодировщиками, тем самым формально объединив прошлое (модель релевантности) и настоящее (архитектуру преобразователя) в одной и той же формальной вероятностной модели!
В начале мы вспомнили образ Ньютона, стоящего на плечах гигантов. Завершим ещё одним его размышлением:
«Не знаю, кем я могу казаться миру, но самому себе я представлялся всего лишь мальчиком, играющим на берегу моря и развлекающимся тем, что время от времени находит более гладкий камешек или красивую ракушку, в то время как великий океан истины лежал передо мной совершенно неизведанным». Ньютон, Исаак. Цитируется в книге Дэвида Брюстера «Мемуары о жизни, трудах и открытиях сэра Исаака Ньютона», т. 2 (1855), стр. 407.
Надеюсь, вы согласитесь, что путь от RM1 до «Трансформеров» — это именно такое открытие — отполированный камешек на берегу гораздо большего океана открытий в области искусственного интеллекта, которые еще только предстоит увидеть.
Отказ от ответственности: Мнения и взгляды, высказанные в этой статье, принадлежат мне и не отражают точку зрения моего работодателя или каких-либо аффилированных организаций. Содержание статьи основано на личном опыте и размышлениях и не должно рассматриваться как профессиональный или академический совет.
📚Дальнейшее обучение:
- Моделирование релевантности для информационных технологий : если вы заинтересованы в дальнейшем изучении фреймворка моделирования релевантности и его исторической важности для информационных технологий, хорошим началом станет оригинальный цикл видеоматериалов Виктора Лавренко. Лекции очень понятны и информативны и основаны на популярном курсе по текстовым технологиям Эдинбургского университета.
- Аннотированный Трансформер : четкое пошаговое руководство по основополагающей статье «Внимание — это все, что вам нужно».
- Андрей Карпати — Создайте свой собственный GPT : практическое руководство по программированию, которое подробно описывает создание модели GPT с нуля. Отлично подходит для более глубокого понимания того, как работает внимание.
- « Иллюстрированный Трансформер» Джея Аламмара : прекрасное визуальное объяснение архитектуры Трансформера, которое хорошо сочетается с аннотированным Трансформером.
- Себастьян Рудер — Момент ImageNet в НЛП и далее : большой исторический контекст того, почему «Трансформеры» (и предварительная подготовка) изменили ландшафт НЛП.
- Опрос по предварительно обученным языковым моделям: Тщательный академический обзор предварительно обученных трансформаторов и их применений.
Источник: towardsdatascience.com



























