Итак, мы выяснили, что LLM присваивают схожие представления словам с близкими значениями, что помогает делать более точные предсказания. Однако остается вопрос: как модели эффективно используют контекст? Ведь у слов нет жестко закрепленных значений – многие из них обладают двумя и более совершенно различными смыслами. Вспомним слово ключ – это может быть и ключ от замка, и источник воды. Совершенно разные вещи, которые требуют принципиально разных предсказаний следующего слова. Как же использовать контекст предшествующих слов, чтобы определить нужное значение, а затем на основе этого сделать точное предсказание?
Приведем пример. Мы попросили ChatGPT предсказать следующее слово в предложении «Путник шел по лесу и увидел ключ, бьющий из земли. Он был очень ________». Модель ответила: холодным – именно так ответили бы и многие люди. Чтобы прийти к слову холодный, ChatGPT должен был понять, что в данном контексте ключ означает источник, а также определить, что в описанной ситуации он, скорее всего, будет холодным. Как построить систему, способную на такое? Модель Элмана и ее многочисленные последователи опробовали один подход: сохранять копию паттерна активации, возникающего при обработке предыдущих слов, и обучать модель использовать информацию из этого паттерна через настройку весов соединений. Подход принес определенные успехи, но натолкнулся на ограничение: один паттерн может вместить лишь ограниченный объем контекстной информации. Механизм внимания, о котором пойдет речь ниже, позволяет современным моделям преодолеть это препятствие.
Вернемся к слову ключ в нашей фразе. Было бы полезно сохранить информацию обо всех предшествующих словах, чтобы найти среди них любые релевантные подсказки, которые помогут правильно интерпретировать ключ и предсказать слово холодный. Непосредственно предшествующее слово увидел подсказывает, что ключ – это существительное, но не указывает на то, что он будет холодным. Слова по лесу дают потенциально важную подсказку: в лесу обычно прохладно, и источник, скорее всего, будет холодным. Из земли – еще одна значимая деталь. А вот некоторые другие слова предложения не несут полезной контекстной информации. Нам бы хотелось, чтобы система уделяла больше внимания словам по лесу и из земли, чем, скажем, слову шел. Но это далеко не тривиальная задача. Да, нам кажется, что мы без усилий понимаем: после слова очень в этом предложении естественно следует холодным. Вопрос в том: как наши машины достигают такого результата на механистическом уровне? Хотя наш мозг устроен иначе, чем эти машины, понимание их работы может пролить свет и на работу человеческого мозга.
Решение этой проблемы было предложено в 2014 г. Дмитрием Богдановым, Кёнхёном Чо и Йошуа Бенджио из Монреальского университета. Они представили новый механизм для нейронных сетей под названием внимание, призванный улучшить качество машинного перевода. Бенджио, удостоенный премии Тьюринга в области искусственного интеллекта в 2018 г. вместе с Джеффри Хинтоном и Яном Лекуном, много лет изучал модели типа элмановской, и его группа хорошо понимала их ограничения. В 2017 г. исследователи из Google Brain взяли механизм внимания на вооружение и создали мощную модель машинного перевода, описанную в статье с говорящим названием «Внимание – это все, что нужно» (Attention Is All You Need). По их мнению, модуль внимания дал языковым моделям возможность использовать информацию из любой точки длинного предшествующего контекста – и это было «все, что нужно» для улучшения машинного перевода. Последующие работы OpenAI показали, что внимание (в сочетании с обучением через исправление ошибок при предсказании следующего слова) может быть если не всем, что нужно, то по крайней мере важнейшим компонентом для появления новых возможностей, о которых раньше не догадывались.
Модели GPT от OpenAI, как и многие другие LLM, содержат многоуровневый стек модулей нейронной сети, называемых блоками трансформеров. В крупных моделях таких блоков может быть до 100, и каждый включает в себя копию механизма внимания и трехслойную сеть прямого распространения. Когда модель обрабатывает очередное слово последовательности, его контекстно независимое векторное представление поступает на вход первого блока трансформера в основании стека. Это тот самый паттерн активации, о котором шла речь выше, – он формируется в процессе обучения с исправлением ошибок и помогает модели предсказывать последующие слова в тексте. Возьмем слово ключ в нашем предложении о путнике у родника. Его начальный паттерн можно представить как компромисс между двумя вариантами: одним – для металлического предмета и другим – для водного источника. По мере прохождения через стек блоков трансформеров этот паттерн постепенно трансформируется, приобретая контекстуально уместное значение, а затем, ближе к вершине стека, преобразуется в паттерн, подходящий для предсказания слова холодный.
Рассмотрим работу механизма внимания в первом блоке трансформера, где модель начинает корректировать контекстно независимый паттерн слова ключ, приближая его к контекстуально обусловленному значению. Для этого создается набор специальных паттернов – запросов. Запросы можно представить как паттерны, которые задают вопросы, адресованные словам контекста. При обработке каждого слова модель также генерирует паттерны, называемые ключами и значениями. Ключи и значения от предыдущих слов используются для ответа на запросы текущего слова. Хотя запросы, ключи и значения – это выученные паттерны, которые невозможно полностью описать словами, мы можем представить, что в нашем предложении один из запросов от слова ключ ищет слова, обозначающие объекты, которые могут быть либо металлическими предметами, либо источниками воды. Соответствующий ключ от слова замок или вода может совпасть с этим запросом, а соответствующее значение может быть паттерном, передающим информацию вроде «я запираюсь металлическим предметом под названием ключ» или «я вытекаю из-под земли, и это называется ключ». Поскольку в контексте присутствует слово вода, а слова замок нет, ответ на запрос поможет определить, что в данном случае ключ означает источник, из которого можно набрать воды.
В основе механизма внимания – процесса, который мы назовем вниманием на основе запросов, – лежит идея о том, что сопоставление запроса и ключа носит градуированный характер. Благодаря этому несколько слов из контекста могут участвовать в формировании ответа на запрос. Эти ответы комбинируются, причем вклад каждого определяется степенью соответствия между запросом и ключом. Мы проиллюстрируем эти принципы на рисунке 8.2. Слева показаны запрос от одного слова (допустим, ключ) и ключи от нескольких слов, которые могут встречаться в контексте, – например, шел, лес и по. Запрос от слова ключ в разной степени соответствует ключам каждого из этих слов. Модуль внимания присваивает каждому слову оценку внимания в зависимости от степени соответствия запросу. Затем модуль формирует паттерн составной оценки, суммируя отдельные паттерны значений, где вклад каждого определяется его оценкой внимания. В нашем случае слово лес получило намного более высокую оценку внимания и внесло наибольший вклад; шел добавил совсем немного; а по не добавило практически ничего. Наконец, этот составной паттерн значений используется для корректировки паттерна, поступившего на вход модуля внимания, смещая его в сторону контекстуально уместного представления водного источника. После дополнительной обработки сетью прямого распространения в блоке трансформера контекстно скорректированный паттерн становится входом для следующего блока. Такая же процедура внимания на основе запросов и последующая обработка выполняются в следующем блоке трансформера, затем в следующем – и так по всему стеку, пока выход последнего блока не будет использован для предсказания следующего слова.

Рисунок 8.2. Паттерны и оценки внимания в механизме внимания на основе запросов. Запрос от слова (здесь: ключ) сравнивается с ключами слов из контекста, порождая оценки внимания, которые зависят от степени соответствия запроса каждому ключу. Оценки внимания определяют вклад вектора значений каждого слова в составной паттерн внимания. Этот паттерн используется для корректировки контекстно независимого представления слова ключ, чтобы оно отражало значение, соответствующее предшествующему контексту
Важное преимущество внимания на основе запросов заключается в способности работать с очень длинными фрагментами предшествующего контекста. Модели сохраняют ключи и значения предыдущих слов в так называемом контекстном окне, которое может охватывать тысячи и даже миллионы слов. Это позволяет им использовать несравнимо больше контекстной информации, чем могли ранние модели, что дает им решающее преимущество перед предшественниками.
У вас может возникнуть вопрос: откуда берутся все эти паттерны? Мы говорили о запросах, ключах и значениях – неужели их спроектировали инженеры, создавшие трансформер? Вовсе нет – ни один паттерн в модели не был создан намеренно. Контекстно независимое векторное представление (эмбеддинг) каждого слова формируется через выученные веса связей, идущие от единственного входного элемента, назначенного для этого слова, к слою нейроноподобных элементов, который служит входом для первого блока трансформера. Эти веса связей настраиваются в процессе обучения для минимизации ошибок предсказания следующего слова. Веса связей, выученные путем коррекции ошибок предсказания следующего слова, также используются для генерации паттернов запросов, ключей и значений на каждом уровне стека трансформеров. Обработка в модулях прямого распространения также опирается на веса связей, выученные через исправление ошибок предсказания. Таким образом, модель использует выученные веса связей для представления контекстно независимых значений слов, их контекстуализации и формирования полезных предсказаний, опираясь на выученные паттерны запросов, ключей и значений.