Тема 09

Тема 9. NLP и современные модели ИИ

Тема 9. NLP и современные модели ИИ

В теме 8 мы дошли до рекуррентных сетей и их ограничений: последовательная обработка плохо распараллеливается, а градиенты, проходящие через десятки шагов, затухают или взрываются. Естественный язык — самая капризная из подобных областей: одно предложение может зависеть от слова, упомянутого тремя абзацами выше, а согласование подлежащего и сказуемого требует одновременно учитывать локальный контекст и удалённые синтаксические связи. Обработка естественного языка (англ. Natural Language Processing, NLP) — целая инженерная и научная традиция, в которой сменилось несколько поколений методов. От частотных моделей и ручных правил мы прошли путь до больших языковых моделей, способных писать связный технический текст и решать школьные задачи по математике. В этой завершающей теме разберём логику этого пути: что давало каждое поколение методов, что вынуждало двигаться дальше и где у современных моделей проходит граница применимости.

Обработка естественного языка

Задачи NLP

Под обработкой естественного языка традиционно понимают всё, что связано с компьютерным анализом и генерацией текста на человеческих языках. Каноничный обзор задач — учебник Юрафски и Мартина, переиздаваемый с 2000-х годов и фиксирующий выработанный сообществом понятийный аппарат @jurafsky2024slp. Внутри этой большой области сложилось несколько устойчивых классов задач, каждый со своим способом постановки и метрикой качества.

Классификация текстов — задача присвоить документу одну или несколько меток из конечного списка. Сюда попадают распознавание спама, определение тематики новостной заметки, разметка обращений клиентов в службе поддержки по категориям. Частный, очень практичный случай — анализ тональности (англ. sentiment analysis): требуется определить, выражает ли отзыв положительное, отрицательное или нейтральное отношение. Метрики стандартные — accuracy, F1, точность по классам, — то есть концептуально это та же классификация, что и в теме 4, просто над текстовыми объектами.

Извлечение информации — выделение из неструктурированного текста структурированных сущностей: имён людей, организаций, дат, географических объектов, отношений между ними. Близкая задача — ответы на вопросы (англ. question answering), в которой система получает текст и вопрос и должна указать в тексте релевантный фрагмент. Машинный перевод — задача перевода текста с одного языка на другой; здесь метрика BLEU и её преемники сравнивают порождённый перевод с эталонными референсами. Генерация текста — широкий класс задач, включающий резюмирование, написание реплик в диалоге, продолжение начатого фрагмента; именно генерация дала самый громкий всплеск интереса к NLP в 2020-х.

Сложность всех этих задач упирается в один корень — устройство самого языка. Слова многозначны: «ключ» в технической документации, в музыкальном тексте и в туристическом блоге — три разных понятия. Смысл зависит от контекста: «банк закрыт» в финансовой и в географической новости значит совсем разное. Синтаксис не сводится к фиксированному порядку слов: предложения с одинаковыми словами могут передавать противоположный смысл. Морфологически богатые языки вроде русского добавляют свою сложность — одна лексема порождает десятки словоформ, между которыми частотные модели плохо различают связи. На фоне этих сложностей долгое время казалось, что NLP принципиально требует богатой лингвистической инженерии. Современные большие модели показали, что значительная часть структуры извлекается из больших объёмов сырых текстов автоматически. Но извлекается она не вместо лингвистики, а скорее как её эмпирическое продолжение — и почему это сработало, до конца понимают не все.

Предобработка текста

Прежде чем подавать текст в любую модель, его обычно приводят к удобоваримому виду. Базовая операция — токенизация (англ. tokenization): разбиение строки на минимальные единицы, с которыми будет работать модель. В простейшем случае токенами служат слова, отделённые пробелами и пунктуацией, в более тонком — морфемы или буквенные подстроки. Современные модели чаще всего работают с подсловными токенизаторами вроде Byte-Pair Encoding или SentencePiece: словарь формируется по статистике корпуса и содержит как целые частые слова, так и фрагменты редких. Это компромисс между размером словаря и способностью разбирать незнакомые слова — фамилии, термины, опечатки.

После токенизации идёт нормализация (англ. normalization) — приведение разных написаний одного и того же слова к единому виду. Сюда входит понижение регистра, приведение даты и числа к канонической форме, иногда удаление диакритики. Дальше — лемматизация (англ. lemmatization) или стемминг (англ. stemming): сведение словоформы к лемме (бежал, бежит, побежим → бежать) или к усечённой основе. Лемматизация лингвистически корректнее, но требует словарей и морфоанализатора; стемминг — алгоритмическая отрубка окончаний по правилам, грубее, но дешевле. На русском языке без морфологической обработки работать тяжело: один глагол может встречаться в корпусе в десятках форм, и без лемматизации частотные методы дробят сигнал по словоформам.

Удаление стоп-слов (англ. stop words) — высокочастотных служебных слов вроде «и», «в», «на» — оправдано тогда, когда модель работает по принципу мешка слов и информативность определяется частотой. Для нейросетевых моделей с обучаемыми эмбеддингами стоп-слова обычно не удаляют: служебные слова несут синтаксическую и прагматическую информацию, которую модель полезно учитывать. Пунктуацию убирают по тому же критерию — если модель её игнорирует, проще убрать; если использует, оставляют.

Общая логика такая: предобработка должна согласовываться с используемой моделью. Для классической логистической регрессии на TF-IDF лемматизация и удаление стоп-слов почти всегда улучшают качество. Для дообучения BERT — наоборот, лишняя предобработка ломает работу собственного токенизатора и ухудшает результат. Сводки экспериментов с этим эффектом фиксируются в практической литературе по NLP постоянно: одна и та же операция в одной модели полезна, в другой вредна, и слепо применять «стандартный пайплайн» нельзя.

Конвейер предобработки текста: от сырой строки до числового вектора
Конвейер предобработки текста: от сырой строки до числового вектора

Числовое представление текста

Любая модель машинного обучения работает с числами; текст должен быть переведён в числовое представление. Историческое начало — модель мешка слов (англ. bag of words, BoW): документ представляется вектором, длина которого равна размеру словаря, а ii-я координата — частота встречаемости ii-го слова в документе. Порядок слов теряется, остаётся только частотный профиль. Несмотря на эту грубость, BoW работает в задачах классификации текстов на уровне, который трудно превзойти простыми методами: разница «спам / не спам» вполне ловится по статистике слов, без понимания смысла.

Усиление BoW — TF-IDF (англ. Term Frequency–Inverse Document Frequency) @salton1988tfidf. Идея в том, что не все слова одинаково информативны: слово, встречающееся почти в каждом документе коллекции, малополезно для различения документов, а редкое слово несёт сильный сигнал. Вес терма tt в документе dd записывается как tfidf(t,d)=tf(t,d)logNdf(t),\mathrm{tfidf}(t, d) = \mathrm{tf}(t, d) \cdot \log \frac{N}{\mathrm{df}(t)}, где tf(t,d)\mathrm{tf}(t, d) — частота терма в документе, NN — общее число документов в коллекции, df(t)\mathrm{df}(t) — число документов, содержащих tt. Логарифмический множитель — это обратная документная частота, она тем выше, чем реже терм встречается в коллекции в целом. Полученные веса собирают в матрицу «документы × термы»; строки её — векторные представления документов, на которых работают классические алгоритмы информационного поиска и классификации. Подробное изложение TF-IDF и других схем взвешивания — в каноничном учебнике Маннинга по информационному поиску @manning2008ir.

Матрица документ-терм с весами TF-IDF
Матрица «документ–терм» с весами TF-IDF: каждая строка — числовой вектор документа

Ограничения частотных методов очевидны. Порядок слов теряется: «собака укусила человека» и «человек укусил собаку» получают одинаковый вектор. Семантические связи не отражаются: слова «врач» и «доктор» — разные координаты, и модель не знает, что они почти синонимы. Размерность вектора равна размеру словаря и при больших корпусах достигает сотен тысяч, что делает векторы разреженными и неудобными для нейронных моделей. И всё же частотные методы остаются полезным инструментом: они быстры, интерпретируемы, дают сильный baseline на классификации, а в задачах поиска вариант BM25, родственный TF-IDF, до сих пор конкурентоспособен против нейронных моделей. От частотного представления мы движемся не потому, что оно «устарело», а потому, что в задачах, требующих понимания смысла, его выразительной силы не хватает.

Векторные представления и эмбеддинги

Word Embeddings

Преодолеть разреженность и отсутствие семантики удалось переходом к плотным векторным представлениям слов (англ. word embeddings) — отображениям словаря в евклидово пространство фиксированной невысокой размерности (обычно 50–300). Базовая идея уходит корнями к дистрибутивной гипотезе Зеллига Харриса: слова, встречающиеся в похожих контекстах, имеют похожий смысл. На лозунге Дж. Р. Фёрса это звучит как «You shall know a word by the company it keeps». Если научиться сжимать контексты в векторы и располагать в них слова так, чтобы близкие по употреблению оказывались рядом, мы получим геометрию, в которой «близость» соответствует семантическому родству.

Технически прорыв связан с моделью Word2Vec Миколова и соавторов @mikolov2013w2v. Они предложили простую и эффективно обучаемую нейросетевую архитектуру: одно скрытое слое-проекция и предсказательная цель. В варианте CBOW (англ. Continuous Bag-of-Words) сеть по контексту — нескольким соседним словам — предсказывает центральное слово. В варианте Skip-gram наоборот: по центральному слову предсказываются окружающие. После обучения веса проекционного слоя и оказываются искомыми эмбеддингами. Чуть позже появилась модель GloVe 1, строящая эмбеддинги напрямую из глобальной матрицы совместной встречаемости слов; вычислительно она другая, идеологически — близкая.

Полученные пространства обладают любопытным свойством, которое прямо отмечали авторы Word2Vec: семантические отношения проявляются как направления в пространстве. Векторная разность v(king)v(man)+v(woman)\mathbf{v}(\text{king}) - \mathbf{v}(\text{man}) + \mathbf{v}(\text{woman}) оказывается ближайшим соседом к вектору v(queen)\mathbf{v}(\text{queen}). Аналогично «Москва» относится к «Россия» примерно так же, как «Париж» к «Франция»: соответствующие направления почти параллельны. Эта семантическая арифметика долгое время служила витриной демонстраций — наглядной, но и переоценённой. На внимательной проверке оказалось, что часть аналогий работает за счёт особенностей датасета и метрики, а не за счёт «понимания» отношения. Тем не менее сам факт, что в обучённой без размеченных меток модели возникают согласованные с человеческой интуицией структуры — нетривиален и стал важным сигналом, что в больших корпусах текста закодировано много полезной информации.

Пространство эмбеддингов слов: семантические отношения как направления
Пространство эмбеддингов: семантически близкие слова расположены рядом, а отношения «страна–столица» и «мужской–женский род» проявляются как направления

Принципиальное практическое следствие — возможность передачи знаний (англ. transfer learning). Эмбеддинги, обученные на большом универсальном корпусе (Wikipedia, новости, веб-тексты), переиспользуются как готовые признаки в прикладной задаче на маленьком датасете. Раньше каждая команда строила модель «с нуля» на своём небольшом размеченном корпусе; с приходом предобученных эмбеддингов первый слой бесплатно достался от индустриального уровня моделей, и качество прикладных систем заметно подросло. Это была первая волна того, что позже назовут базовыми моделями (англ. foundation models) @bommasani2021foundation — обучаемых единожды на огромных корпусах и переиспользуемых дальше.

У эмбеддингов Word2Vec и GloVe осталось одно фундаментальное ограничение, которое и подтолкнуло следующий шаг. Каждое слово получает один и тот же вектор вне зависимости от контекста, в котором оно встретилось. Слово «коса» в «острая коса» и «длинная коса» — это один и тот же вектор, и модель не различает значения. Преодолеть это смогли только модели, в которых представление слова зависит от его окружения в конкретном предложении — то есть контекстные эмбеддинги. Архитектурно их обеспечили трансформеры.

Трансформеры и большие языковые модели

Архитектура трансформера

В теме 8 мы видели, как рекуррентные сети LSTM и GRU справлялись с обработкой последовательностей и обходили проблему затухающих градиентов за счёт обучаемых механизмов памяти. Но один принципиальный недостаток у них оставался: вычисления в RNN последовательны по природе — следующее скрытое состояние зависит от предыдущего, — и это делает обучение медленным даже на GPU, ради которых перешли на нейронные модели. В 2017 году группа Васвани предложила радикальное решение: вообще отказаться от рекуррентности и оставить только механизм внимания 2. Получившаяся архитектура — трансформер — допускает массивное распараллеливание и оказалась так удачно устроена, что за несколько лет вытеснила RNN практически из всех задач NLP.

Центральная идея — самовнимание (англ. self-attention). Положим, на входе у нас последовательность токенов x1,,xnx_1, \ldots, x_n, каждому из которых сопоставлен вектор представления. Для каждого токена мы хотим получить новое представление, обогащённое информацией о других токенах последовательности — причём так, чтобы модель сама решила, на какие именно обратить внимание. Технически это делается через три обучаемые линейные проекции: для токена ii вычисляются запрос qi\mathbf{q}_i (англ. query), ключ ki\mathbf{k}_i (англ. key) и значение vi\mathbf{v}_i (англ. value). Релевантность токена jj для токена ii оценивается скалярным произведением qikj\mathbf{q}_i \cdot \mathbf{k}_j; релевантности по всем jj нормируются softmax-ом, давая распределение весов внимания:

αij=exp(qikj/d)jexp(qikj/d).\alpha_{ij} = \frac{\exp(\mathbf{q}_i \cdot \mathbf{k}_j / \sqrt{d})}{\sum_{j'} \exp(\mathbf{q}_i \cdot \mathbf{k}_{j'} / \sqrt{d})}.

Делитель d\sqrt{d}, где dd — размерность ключей, нужен для численной устойчивости при больших dd. Новое представление токена ii — взвешенная сумма значений: oi=jαijvj\mathbf{o}_i = \sum_j \alpha_{ij} \mathbf{v}_j. Каждый токен таким образом «смотрит» на все остальные, причём степень внимания решается данными, а не правилами. Все скалярные произведения и взвешенные суммы вычисляются одной матричной операцией для всей последовательности — отсюда параллелизм.

Механизм самовнимания: запросы, ключи, значения и матрица весов внимания
Самовнимание: для каждой пары токенов вычисляется вес, и новое представление каждого токена есть взвешенная сумма значений остальных

Поскольку механизм внимания сам по себе симметричен относительно перестановок токенов (если перетасовать вход, перетасуется и выход в том же порядке), необходима явная подача информации о позиции. Решение — позиционное кодирование (англ. positional encoding): к векторному представлению каждого токена добавляется фиксированный или обучаемый вектор, зависящий от позиции. В оригинальной работе использовались синусоиды разной частоты; современные варианты — обучаемые или относительные (RoPE). Без позиционной информации трансформер «знал бы» только из каких слов состоит фраза, но не в каком порядке.

Полная архитектура трансформера состоит из стопок одинаковых блоков, каждый — слой самовнимания плюс позиционно-зависимый полносвязный слой, обвитые остаточными связями и нормализациями. В исходной работе блоки делились на два класса. Энкодер обрабатывает входную последовательность целиком, формируя её представление; внимание в нём двунаправленное — каждый токен видит и левый, и правый контекст. Декодер генерирует последовательность токен за токеном, причём внимание в нём маскированное: при генерации очередного токена модель видит только уже сгенерированные, что обеспечивает корректность авторегрессии. Энкодер и декодер связаны кросс-вниманием: декодер на каждом шаге обращается к выходу энкодера. Эта пара отлично подходит для машинного перевода, который и был исходной задачей.

Большие языковые модели (LLM)

Дальнейшая история — упрощение и масштабирование. Архитектурно оформились две ветви, использующие половинки исходного трансформера. BERT (англ. Bidirectional Encoder Representations from Transformers) Девлина и соавторов 3 — стопка энкодеров, обучаемая на двух задачах самообучения. Первая — маскированная языковая модель (англ. masked language modeling, MLM): из входного предложения случайно «занавешиваются» 15% токенов, и сеть учится их восстанавливать по двунаправленному контексту. Вторая — предсказание следующего предложения, помогающее модели понимать связь между фрагментами текста (последующие работы показали, что от неё можно отказаться без потерь). После предобучения на огромном корпусе BERT дообучается под конкретную задачу — классификацию, разметку, ответы на вопросы. Полученные представления оказались универсальнее предыдущих: один и тот же предобученный BERT через дообучение покрывает массу задач NLP, оставаясь сравнимо качественным.

GPT (англ. Generative Pre-trained Transformer) Радфорда и Брауна — стопка декодеров, обучаемая на классической задаче языкового моделирования: предсказание следующего токена по предыдущим. Внимание маскированное, направление одно — слева направо. На первый взгляд это шаг назад: BERT учитывает контекст с двух сторон, GPT — с одной. Но авторегрессивная постановка имеет одно ключевое преимущество — она напрямую порождает текст. С масштабированием это превратилось в основной актив: GPT-2 4 и GPT-3 5 показали, что при достаточном размере модели и корпуса языковая модель начинает работать как универсальный решатель задач. Не «обучи модель на классификации тональности», а «дай в подсказке несколько примеров — и она будет классифицировать». Этот режим — обучение в контексте (англ. in-context learning) и few-shot prompting — стал визитной карточкой больших языковых моделей.

BERT и GPT: энкодер с маскированной языковой моделью против декодера с авторегрессией
Две архитектурные ветви: BERT обучается восстанавливать замаскированные токены по двустороннему контексту, GPT — предсказывать следующий токен авторегрессивно

Масштабирование принесло качественно новые эффекты. Авторы работы об эмерджентных способностях (англ. emergent abilities) @wei2022emergent показали, что ряд задач — арифметика в несколько шагов, программирование, выполнение инструкций — у моделей малого размера решается на уровне случайного угадывания, а после прохождения некоторого порога параметров и токенов обучения качество резко возрастает. Поведение разрывное, а не плавно растущее, что само по себе нетривиально. Стоит оговориться, что и сама эмерджентность позже была частично переинтерпретирована: на ряде задач разрыв исчезает при смене метрики на непрерывную, и тогда оказывается, что качество росло всё время, просто бинарная метрика не показывала прогресса до пересечения порога. То есть эмерджентность отчасти артефакт измерения, отчасти — реальный фазовый эффект; единого мнения пока нет.

В практическом плане работать с LLM можно тремя способами. Первый — дообучение (англ. fine-tuning) на собственных данных: модель получает несколько эпох обучения на размеченной выборке вашей задачи и адаптируется под неё. Второй — промпт-инжиниринг (англ. prompt engineering): без изменения весов модели тщательно подбирается формулировка запроса. Третий, промежуточный, — обучение в контексте с несколькими примерами в промпте. У всех трёх подходов своя экономика: дообучение требует данных и вычислительных ресурсов, но даёт более стабильное качество; промптинг ничего не требует, но качество чувствительно к мелочам формулировки. С появлением методов параметрически-эффективного дообучения вроде LoRA граница между подходами размылась.

Базовая модель, fine-tuning и промптинг
Базовая модель и три способа её применения: дообучение под задачу, промптинг без изменения весов, обучение в контексте на нескольких примерах

Границы и ответственность

Громкие демонстрации возможностей LLM не отменяют их ограничений, и обсуждать их без перекоса в сторону хайпа — обязанность учебного курса. Самое известное явление — галлюцинации (англ. hallucinations): модель уверенно генерирует фактически ложный текст, который грамматически и стилистически безупречен. Происходит это потому, что языковая модель предсказывает правдоподобные продолжения, а не истинные факты — она оптимизирована под распределение текста, а не под истинность. Никакого внутреннего механизма «знать, что знаешь, и не знать, что не знаешь» в чистом виде в архитектуре нет. Частично проблему смягчают подходы вроде поисково-усиленной генерации (англ. retrieval-augmented generation): модель сначала ищет релевантные документы в внешней базе, затем генерирует ответ, опираясь на них. Полностью устранить галлюцинации этим не удаётся.

Бендер и соавторы в работе со звучным названием «о опасностях стохастических попугаев» 6 обобщили целый класс проблем больших языковых моделей. Корпус, на котором обучается модель, отражает структуру интернет-текстов: предвзятости, стереотипы, исторические перекосы попадают в обученные веса и воспроизводятся в выводе. Расовые и гендерные стереотипы в результатах — не баг отдельной модели, а свойство данных. Энергетическая стоимость обучения и углеродный след — отдельный вопрос. Авторские права на тренировочные данные — другой, и пока не разрешённый юридически. Возможность массового производства дезинформации, дипфейков (англ. deepfakes) и автоматизированной мошеннической переписки — практический вопрос национальной безопасности.

В индустрии сложился набор требований к ответственной разработке и применению ИИ, кратко обозначаемый аббревиатурой FAT — fairness, accountability, transparency — справедливость, подотчётность, прозрачность. Справедливость требует, чтобы модель не давала систематически худших результатов для конкретных групп людей; для этого нужно измерять качество по группам, а не только в среднем. Подотчётность означает, что у системы есть владелец, который отвечает за её решения; неконкретное «алгоритм решил» — плохой ответ перед регулятором или судом. Прозрачность подразумевает, что пользователь знает, с моделью какого класса он взаимодействует, на каких данных она обучена, какие у неё известные ограничения. С большими языковыми моделями полная прозрачность пока недостижима — внутренние представления слишком сложны для интерпретации, — но это нормативный ориентир, к которому стоит стремиться.

Отдельный сюжет — критическая оценка возможностей модели. На стандартных бенчмарках LLM проходят впечатляющий рост качества; на задачах, не похожих на тренировочный распределение, тот же рост может оказаться иллюзорным. Способность к рассуждению часто оказывается тонкой имитацией: при незаметных перестановках формулировок задачи качество может рассыпаться. Это не значит, что у моделей нет реальных возможностей — значит, что замерять их нужно осторожно, желательно на задачах, для которых модель явно не оптимизировалась.

Литература

  1. Pennington J., Socher R., Manning C. D. GloVe: Global Vectors for Word Representation. — Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP), 2014, С. 1532–1543, DOI: 10.3115/v1/D14-1162.
  2. Vaswani A., Shazeer N., Parmar N., Uszkoreit J., Jones L., Gomez A. N., Kaiser Ł., Polosukhin I. Attention Is All You Need. — Advances in Neural Information Processing Systems (NeurIPS), 2017, https://arxiv.org/abs/1706.03762.
  3. Devlin J., Chang M., Lee K., Toutanova K. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. — Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics (NAACL-HLT), 2019, С. 4171–4186, DOI: 10.18653/v1/N19-1423.
  4. Radford A., Wu J., Child R., Luan D., Amodei D., Sutskever I. Language Models Are Unsupervised Multitask Learners. — 2019, https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learners.pdf.
  5. Brown T. B., Mann B., Ryder N., Subbiah M., Kaplan J., Dhariwal P., Neelakantan A., Shyam P., Sastry G., Askell A., others. Language Models Are Few-Shot Learners. — Advances in Neural Information Processing Systems (NeurIPS), 2020, https://arxiv.org/abs/2005.14165.
  6. Bender E. M., Gebru T., McMillan-Major A., Shmitchell S. On the Dangers of Stochastic Parrots: Can Language Models Be Too Big?. — Proceedings of the 2021 ACM Conference on Fairness, Accountability, and Transparency (FAccT), 2021, С. 610–623, DOI: 10.1145/3442188.3445922.