31 / 37 · Задачи NLP
Ответы на вопросы
Экстрактивный QA читает вопрос и отрывок вместе и предсказывает, где ответ начинается и где заканчивается: формат входа, скользящее окно для длинных отрывков, отображение символов в токены, модель с двумя выходами и её функция потерь, точное совпадение и F1, а также шаг от данного отрывка к найденному.
На этой странице 12
NER размечает токены, которые уже есть в тексте. Ответы на вопросы (QA) просят модель что-то найти: по вопросу и отрывку вернуть ту часть отрывка, которая на вопрос отвечает. В постановке эпохи трансформеров это предсказание двух позиций, и почти вся инженерия — в том, чтобы привести данные к этой форме и обратно.
Обозначения. Вопрос , отрывок-контекст ; ответ — фрагмент , заданный смещением символа и текстом; после токенизации фрагмент — пара индексов токенов ; энкодер даёт вектор на токен.
Постановка задачи#
Экстрактивный 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 на 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] | Barack | Obama | was | born | in | Hawaii | . | [SEP] |
|---|---|---|---|---|---|---|---|---|---|
| смещения | (0, 0) | (0, 6) | (7, 12) | (13, 16) | (17, 21) | (22, 24) | (25, 31) | (31, 32) | (0, 0) |
Токен начала — последний, чей начальный символ answer_start, а токен конца — первый, чей конечный символ answer_start + len(text); ищутся они только внутри сегмента отрывка (sequence_ids говорит, какие токены относятся к вопросу, к отрывку или ни к чему).
Окна без ответа. Если ответ не помещается в окно целиком, обе цели ставятся в позицию 0, на токен [CLS]. Так модель выучивает выход «в этом окне ответа нет», и так же представляется воздержание в SQuAD 2.0.
Модель и её функция потерь#
Две линейные оценки поверх энкодера, реализованные одним nn.Linear(768, 2), два выхода которого разделяются:
Каждый softmax берётся по позициям, а не по классам: «какой из токенов — начало» — одна классификация на вариантов, а «какой — конец» — другая. Это не разметка токенов на три класса (начало / конец / ни то ни другое), как может показаться: такая постановка допускала бы несколько начал в одном отрывке и не умела бы предпочесть одно; softmax по позициям даёт ровно одно начало и один конец и совместную оценку любой пары. Функция потерь — среднее двух кросс-энтропий,
а предсказание — пара , максимизирующая при и меньше максимальной длины ответа, с оценкой по всем окнам примера; простой argmax каждого выхода по отдельности может вернуть конец раньше начала.
Экстрактивный QA: два распределения по позициям
Что даёт замороженный энкодер#
Заморозим 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 окон), и ни точное совпадение, ни не сохранены. Так что он показывает слабость этой постановки, а не то, что замороженный энкодер не может извлекать фрагменты. Замороженные признаки MLM не обучались отмечать, где начинается ответ, и дообучение под задачу обычно их улучшает; чтобы сказать насколько, замороженную отправную точку и дообученную модель нужно декодировать одним и тем же правилом с ограничениями и оценить на одном и том же наборе. Дообученный BERT-base достигает 88.5 и 80.8 точного совпадения на SQuAD 1.1 (Devlin et al., 2019, таблица 2); опубликованный рецепт — три эпохи по всей обучающей выборке с шагом обучения и обучением всех параметров.
Метрики#
Точное совпадение (exact match, EM): 1, если предсказанный текст после нормализации (нижний регистр, удаление пунктуации и артиклей) совпадает с одним из эталонных ответов, иначе 0. F1: пересечение предсказания и эталона по токенам, с максимумом по эталонным ответам, если их несколько, усреднённое по вопросам. EM наказывает in Honolulu против Honolulu; F1 даёт ему . Обе метрики считаются по тексту, поэтому переход «символы → токены» нужно точно обратить: декодировать предсказанный фрагмент токенов обратно в исходные символы через смещения, а не в заново токенизированную строку.
От данного отрывка к найденному#
Экстрактивный QA предполагает, что модели кто-то вручил нужный отрывок. В системе для открытой области отрывок приходит от поисковой модели: построить эмбеддинг вопроса, найти ближайшие отрывки в индексе корпуса и запустить «читателя» на нескольких лучших (Chen et al., 2017; Karpukhin et al., 2020). Тогда точность читателя ограничена полнотой поиска, и оценивать их нужно раздельно — так устроены заметки о семантическом поиске и RAG. Порождающие читатели (декодер, которому дают вопрос и отрывки) заменяют извлечение фрагмента свободным текстом и наследуют его преимущества (перефразирование, синтез по нескольким отрывкам) и его риск (ответы, которых нет в отрывках).
Что изменилось#
| Читатель в стиле BiDAF | Предобученный энкодер, два выхода | |
|---|---|---|
| Сопоставление вопроса и отрывка | явный слой внимания | self-attention по объединённой последовательности |
| Энкодеры | раздельные, с нуля | один, предобученный |
| Выход | начало/конец по позициям | начало/конец по позициям |
| F1 на SQuAD 1.1 | ≈ 77 | 88.5 (base), 90.9 (large) |
| Длинные отрывки | обрезаются | скользящие окна |
Ограничения#
- Только фрагменты. Ответы, требующие подсчёта, объединения или перефразирования, извлечь нельзя.
- Воздержаться трудно. Без обучающих вопросов без ответа модель всегда находит фрагмент; с ними оценку
[CLS]нужно калибровать относительно оценки лучшего фрагмента. - Окна могут разрезать доказательство. Ответ, обоснование которого лежит вне его окна, угадывается по локальным признакам.
- EM и F1 измеряют пересечение, а не правильность; неверный фрагмент с правильными словами получает высокую оценку, а верный пересказ — ноль по EM.
- Запоминание. Бенчмарки на Википедии пересекаются с корпусами предобучения; модель может отвечать по памяти, а не по отрывку, что обнаруживает постановка с найденными отрывками.
Что нужно запомнить#
- Экстрактивный QA:
[CLS] q [SEP] c [SEP]→ два softmax по позициям (начало, конец) → лучшая пара с . - Работу делает предобработка: скользящие окна с шагом для длинных отрывков, отображение смещений из символов в токены, позиция 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, и приведённый выше неверный ответ — из сохранённого прогона этой первой версии; текущий ноутбук декодирует по ограниченному правилу (только токены отрывка, начало до конца, ограниченная длина).
Дальше#
Извлечь фрагмент — один способ дать ответ; сжать документ — другой. Следующая заметка сравнивает две постановки суммаризации — выбор частей входа и написание нового текста, — дообучает энкодер–декодер для второй и показывает, почему метрика, которой её оценивают, вознаграждает копирование.
Литература#
- P. Rajpurkar, J. Zhang, K. Lopyrev, P. Liang. SQuAD: 100,000+ Questions for Machine Comprehension of Text. EMNLP, 2016.
- P. Rajpurkar, R. Jia, P. Liang. Know What You Don’t Know: Unanswerable Questions for SQuAD. ACL, 2018.
- M. Seo, A. Kembhavi, A. Farhadi, H. Hajishirzi. Bidirectional Attention Flow for Machine Comprehension. ICLR, 2017.
- J. Devlin, M.-W. Chang, K. Lee, K. Toutanova. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. NAACL, 2019. §4.2 и таблица 2 (SQuAD).
- D. Chen, A. Fisch, J. Weston, A. Bordes. Reading Wikipedia to Answer Open-Domain Questions. ACL, 2017.
- V. Karpukhin et al. Dense Passage Retrieval for Open-Domain Question Answering. EMNLP, 2020.
- Hugging Face. Question answering. Предобработка со скользящим окном, использованная в ноутбуке.