Содержание курса 31 / 37

31 / 37 · Задачи NLP

Ответы на вопросы

Экстрактивный QA читает вопрос и отрывок вместе и предсказывает, где ответ начинается и где заканчивается: формат входа, скользящее окно для длинных отрывков, отображение символов в токены, модель с двумя выходами и её функция потерь, точное совпадение и F1, а также шаг от данного отрывка к найденному.

На этой странице 12

NER размечает токены, которые уже есть в тексте. Ответы на вопросы (QA) просят модель что-то найти: по вопросу и отрывку вернуть ту часть отрывка, которая на вопрос отвечает. В постановке эпохи трансформеров это предсказание двух позиций, и почти вся инженерия — в том, чтобы привести данные к этой форме и обратно.

Обозначения. Вопрос qq, отрывок-контекст cc; ответ — фрагмент c[as:ae]c[a_s : a_e], заданный смещением символа и текстом; после токенизации фрагмент — пара индексов токенов (s,e)(s, e); энкодер даёт вектор hjh_j на токен.

Постановка задачи#

Экстрактивный QA: ответ — непрерывный фрагмент данного отрывка. Бенчмарк SQuAD 1.1 (Rajpurkar et al., 2016) содержит 87 599 обучающих и 10 570 валидационных троек «вопрос — отрывок — ответ» из Википедии; ответ хранится как текст плюс номер его начального символа:

{"context": "Barack Obama was born in Honolulu and ...",
 "question": "Where was Barack Obama born?",
 "answers": {"text": ["Honolulu"], "answer_start": [25]}}

Конечное смещение следует из длины текста. Ответ гарантированно есть в отрывке; SQuAD 2.0 (Rajpurkar, Jia and Liang, 2018) добавляет вопросы без ответа, на которых модель должна воздержаться.

QA в открытой области (open-domain QA) убирает данный отрывок: система должна сначала найти в корпусе подходящие отрывки, а затем извлечь или породить ответ. Порождающий QA позволяет декодеру написать ответ своими словами. Экстрактивная постановка выделяет шаг чтения, и механика в ней видна яснее всего.

Отправная точка: сопоставить вопрос с отрывком#

Ранние нейросетевые «читатели» кодировали вопрос и отрывок раздельно и строили матрицу внимания между ними, чтобы каждый токен отрывка знал, на какие токены вопроса он похож; BiDAF (Seo et al., 2017) с такой схемой поверх LSTM достигал около 77 F1F_1 на SQuAD 1.1. Постановка на трансформере убирает раздельные энкодеры: оба текста подаются в один энкодер, и сопоставление делает self-attention.

Вход#

[CLS] вопрос [SEP] отрывок [SEP], где token_type_ids размечают два сегмента. Три сложности решаются на этапе предобработки:

Длинные отрывки. Энкодер здесь читает не больше 384 токенов (предел модели — 512). Вопрос никогда не обрезается (truncation="only_second"); длинный отрывок режется на перекрывающиеся окна оставшейся длины с шагом (stride) 128 токенов, и каждое окно идёт в паре с полным вопросом, так что ответ возле разреза целиком попадает хотя бы в одно окно. Один пример может стать несколькими; overflow_to_sample_mapping записывает, из какого исходного примера получено каждое окно. Окно в 128 токенов с шагом 32 превращает один пример SQuAD в три.

Символы в токены. Ответ — смещение в символах; модели нужны индексы токенов. return_offsets_mapping=True даёт каждому токену его (start_char, end_char) в исходном тексте:

токен[CLS]BarackObamawasborninHawaii.[SEP]
смещения(0, 0)(0, 6)(7, 12)(13, 16)(17, 21)(22, 24)(25, 31)(31, 32)(0, 0)

Токен начала — последний, чей начальный символ ≤\le answer_start, а токен конца — первый, чей конечный символ ≥\ge answer_start + len(text); ищутся они только внутри сегмента отрывка (sequence_ids говорит, какие токены относятся к вопросу, к отрывку или ни к чему).

Окна без ответа. Если ответ не помещается в окно целиком, обе цели ставятся в позицию 0, на токен [CLS]. Так модель выучивает выход «в этом окне ответа нет», и так же представляется воздержание в SQuAD 2.0.

Модель и её функция потерь#

Две линейные оценки поверх энкодера, реализованные одним nn.Linear(768, 2), два выхода которого разделяются:

sj=ws⋅hj,ej=we⋅hj,Pstart(j)=softmax⁡j(s),Pend(j)=softmax⁡j(e).s_j = w_s \cdot h_j, \qquad e_j = w_e \cdot h_j, \qquad P_{\text{start}}(j) = \operatorname{softmax}_j(s), \quad P_{\text{end}}(j) = \operatorname{softmax}_j(e).

Каждый softmax берётся по позициям, а не по классам: «какой из mm токенов — начало» — одна классификация на mm вариантов, а «какой — конец» — другая. Это не разметка токенов на три класса (начало / конец / ни то ни другое), как может показаться: такая постановка допускала бы несколько начал в одном отрывке и не умела бы предпочесть одно; softmax по позициям даёт ровно одно начало и один конец и совместную оценку любой пары. Функция потерь — среднее двух кросс-энтропий,

L=12(−log⁡Pstart(s∗)−log⁡Pend(e∗)),\mathcal L = \tfrac12\big(-\log P_{\text{start}}(s^*) - \log P_{\text{end}}(e^*)\big),

а предсказание — пара (j,k)(j, k), максимизирующая sj+eks_j + e_k при j≤kj \le k и k−jk - j меньше максимальной длины ответа, с оценкой по всем окнам примера; простой argmax каждого выхода по отдельности может вернуть конец раньше начала.

Рисунок

Экстрактивный QA: два распределения по позициям

Оценки начала и конца по позициям[CLS]: 0.02/0.02, Where: —, was: —, Obama: —, born: —, ?: —, [SEP]: 0/0, Obama: 0.03/0.01, was: 0.01/0.01, born: 0.02/0.01, in: 0.12/0.02, Hawaii: 0.78/0.85, .: 0.01/0.07, [SEP]: 0.01/0.01. лучшая пара с началом ≤ конца: Hawaii.вопросотрывокначалоконец[CLS]Where··was··Obama··born··?··[SEP]ObamawasborninHawaii.[SEP]вопрос не участвует в поиске[CLS]: «ответа нет»лучшая пара с началом ≤ конца: HawaiiОценки начала и конца по позициям[CLS]: 0.02/0.02, Where: —, was: —, Obama: —, born: —, ?: —, [SEP]: 0/0, Obama: 0.03/0.01, was: 0.01/0.01, born: 0.02/0.01, in: 0.12/0.02, Hawaii: 0.78/0.85, .: 0.01/0.07, [SEP]: 0.01/0.01. лучшая пара с началом ≤ конца: Hawaii.началоконец[CLS]WhereвопросwasвопросObamaвопросbornвопрос?вопрос[SEP]ObamaотрывокwasотрывокbornотрывокinотрывокHawaiiотрывок.отрывок[SEP][CLS]: «ответа нет»лучшая пара с началом ≤ конца: Hawaii
Вопрос и отрывок идут в энкодер одной последовательностью, и два линейных выхода дают в каждой позиции оценку «здесь начало ответа» и «здесь конец ответа». Каждый softmax берётся по позициям, а не по классам: одна позиция начала и одна позиция конца. Токены вопроса (серые) из поиска исключаются по sequence_ids; позиция [CLS] означает «в этом окне ответа нет». Ответ — пара начало ≤ конец внутри отрывка с наибольшей суммой оценок, здесь начало и конец совпадают на Hawaii. Вероятности условные.

Что даёт замороженный энкодер#

Заморозим BERT-base-cased, обучим только выходной слой на 1538 параметров на 2000 обучающих окон три эпохи и спросим Where was Barack Obama born? по отрывку Barack Obama was born in Hawaii. He was elected president in 2008. Если декодировать каждый выход своим argmax, ответ получается Barack Obama born? [SEP] Barack Obama: независимые argmax попадают в сегмент вопроса, конец предшествует началу, и декодированный фрагмент проходит через разделитель. Декодирование по правилу выше (только токены отрывка, начало до конца, ограниченная длина) убирает уродливый фрагмент. Насколько хорош замороженный выходной слой за пределами этого примера, неизвестно: прогон маленький (2000 окон), и ни точное совпадение, ни F1F_1 не сохранены. Так что он показывает слабость этой постановки, а не то, что замороженный энкодер не может извлекать фрагменты. Замороженные признаки MLM не обучались отмечать, где начинается ответ, и дообучение под задачу обычно их улучшает; чтобы сказать насколько, замороженную отправную точку и дообученную модель нужно декодировать одним и тем же правилом с ограничениями и оценить на одном и том же наборе. Дообученный BERT-base достигает 88.5 F1F_1 и 80.8 точного совпадения на SQuAD 1.1 (Devlin et al., 2019, таблица 2); опубликованный рецепт — три эпохи по всей обучающей выборке с шагом обучения 3×10−53 \times 10^{-5} и обучением всех параметров.

Метрики#

Точное совпадение (exact match, EM): 1, если предсказанный текст после нормализации (нижний регистр, удаление пунктуации и артиклей) совпадает с одним из эталонных ответов, иначе 0. F1: пересечение предсказания и эталона по токенам, с максимумом по эталонным ответам, если их несколько, усреднённое по вопросам. EM наказывает in Honolulu против Honolulu; F1 даёт ему 2⋅1⋅0.5/1.5=0.672 \cdot 1 \cdot 0.5 / 1.5 = 0.67. Обе метрики считаются по тексту, поэтому переход «символы → токены» нужно точно обратить: декодировать предсказанный фрагмент токенов обратно в исходные символы через смещения, а не в заново токенизированную строку.

От данного отрывка к найденному#

Экстрактивный QA предполагает, что модели кто-то вручил нужный отрывок. В системе для открытой области отрывок приходит от поисковой модели: построить эмбеддинг вопроса, найти ближайшие отрывки в индексе корпуса и запустить «читателя» на нескольких лучших (Chen et al., 2017; Karpukhin et al., 2020). Тогда точность читателя ограничена полнотой поиска, и оценивать их нужно раздельно — так устроены заметки о семантическом поиске и RAG. Порождающие читатели (декодер, которому дают вопрос и отрывки) заменяют извлечение фрагмента свободным текстом и наследуют его преимущества (перефразирование, синтез по нескольким отрывкам) и его риск (ответы, которых нет в отрывках).

Что изменилось#

Читатель в стиле BiDAFПредобученный энкодер, два выхода
Сопоставление вопроса и отрывкаявный слой вниманияself-attention по объединённой последовательности
Энкодерыраздельные, с нуляодин, предобученный
Выходначало/конец по позициямначало/конец по позициям
F1 на SQuAD 1.1≈ 7788.5 (base), 90.9 (large)
Длинные отрывкиобрезаютсяскользящие окна

Ограничения#

  • Только фрагменты. Ответы, требующие подсчёта, объединения или перефразирования, извлечь нельзя.
  • Воздержаться трудно. Без обучающих вопросов без ответа модель всегда находит фрагмент; с ними оценку [CLS] нужно калибровать относительно оценки лучшего фрагмента.
  • Окна могут разрезать доказательство. Ответ, обоснование которого лежит вне его окна, угадывается по локальным признакам.
  • EM и F1 измеряют пересечение, а не правильность; неверный фрагмент с правильными словами получает высокую оценку, а верный пересказ — ноль по EM.
  • Запоминание. Бенчмарки на Википедии пересекаются с корпусами предобучения; модель может отвечать по памяти, а не по отрывку, что обнаруживает постановка с найденными отрывками.

Что нужно запомнить#

  • Экстрактивный QA: [CLS] q [SEP] c [SEP] → два softmax по позициям (начало, конец) → лучшая пара с j≤kj \le k.
  • Работу делает предобработка: скользящие окна с шагом для длинных отрывков, отображение смещений из символов в токены, позиция 0 для окон без ответа.
  • Небольшой прогон с замороженным энкодером дал уродливый ответ и не дал измеренного балла; стандартный путь — дообучение (BERT-base: 88.5 F1 на SQuAD 1.1), а честное сравнение использует для обеих моделей одно и то же декодирование с ограничениями.
  • EM и F1 по токенам на нормализованном тексте; фрагменты декодируются через смещения.
  • QA в открытой области = поисковая модель + читатель; читатель ограничен полнотой поиска.

Ноутбук#

week07_nlp_tasks.ipynb. Номера ячеек считают все ячейки, включая текстовые, начиная с 1. Приведённые числа взяты из прогона, сохранённого в курсе; у ячеек, изменённых с тех пор под текущие версии библиотек, сохранённого выхода нет.

  • Ячейки 39–43 описывают формат и загружают SQuAD 1.1 (87 599 / 10 570).
  • Ячейки 48–52 токенизируют одну пару «вопрос — контекст» с max_length=128, stride=32, return_overflowing_tokens=True и показывают три получившихся окна и overflow_to_sample_mapping.
  • Ячейки 53–55 показывают return_offsets_mapping на коротком предложении (таблица выше).
  • Ячейка 56 — полная preprocess_function (384 токена, шаг 128, sequence_ids, поиск начала и конца, позиция 0 для окон без ответа); ячейка 57 применяет её к набору данных.
  • Ячейка 61 определяет BERTforQA с замороженным энкодером и nn.Linear(768, 2), разделяет выходы на логиты начала и конца и усредняет две кросс-энтропии.
  • Ячейки 64–67 загружают метрику SQuAD, определяют compute_metrics, который декодирует предсказанный фрагмент из идентификаторов входа оценочных окон и сравнивает его с эталонным, сообщают Trainer, что метки — это start_positions и end_positions, и обучают на 2000 окнах три эпохи. Прогон, сохранённый в курсе, использовал первую версию, которая декодировала label_ids так, будто это токены, поэтому F1 и EM у него нет.
  • Ячейка 69 запускает замороженную модель на примере с Обамой. Первая версия ноутбука декодировала каждый выход своим argmax, и приведённый выше неверный ответ — из сохранённого прогона этой первой версии; текущий ноутбук декодирует по ограниченному правилу (только токены отрывка, начало до конца, ограниченная длина).

Дальше#

Извлечь фрагмент — один способ дать ответ; сжать документ — другой. Следующая заметка сравнивает две постановки суммаризации — выбор частей входа и написание нового текста, — дообучает энкодер–декодер для второй и показывает, почему метрика, которой её оценивают, вознаграждает копирование.

Литература#