30 / 37 · Задачи NLP
Распознавание именованных сущностей
Пометить каждый токен сущностью, к которой он относится: схема BIO, превращающая фрагменты в классы токенов, выравнивание между размеченными словами и токенами-подсловами, линейный выходной слой на предобученном энкодере, точность, полнота и F1 на уровне сущностей, а также базовые уровни и ловушки разметки последовательностей.
Классификация текстов · BERT и маскированное языковое моделирование · Токенизация
На этой странице 11
Классификация даёт одну метку на документ. Многим вопросам нужна метка на каждый фрагмент документа: какие слова называют человека, организацию, место, дату. Распознавание именованных сущностей (NER) — стандартный пример разметки последовательностей (sequence labelling), и именно здесь разрыв между словами, которые размечает набор данных, и токенами-подсловами, которые читает трансформер, приходится преодолевать явно.
Обозначения. Предложение — последовательность слов с эталонными тегами ; токенизатор превращает её в токены-подслова с ; энкодер даёт вектор на токен; выходной слой даёт логиты по набору тегов в каждой позиции.
Постановка задачи#
Вход: предложение. Выход: множество фрагментов-сущностей в нём, у каждого — тип. Стандартные типы бенчмарка CoNLL-2003 (Tjong Kim Sang and De Meulder, 2003) — PER, ORG, LOC и MISC; в обучающей части 14 041 предложение, в валидационной — 3250, в тестовой — 3453. Фрагменты переводятся в теги слов схемой BIO: B-X начинает сущность типа X, I-X продолжает её, O — вне сущностей. С четырьмя типами это классов.
| Токен | Barack | Obama | was | born | in | Honolulu |
|---|---|---|---|---|---|---|
| Тег | B-PER | I-PER | O | O | O | B-LOC |
Различие B/I позволяет отличить две соседние сущности одного типа: B-PER I-PER B-PER — два человека, B-PER I-PER I-PER — один.
Отправная точка: признаки и модель последовательности#
До нейросетевых моделей NER решали условным случайным полем (CRF) над придуманными вручную признаками: регистр, форма слова, суффиксы, вхождение в справочники, предыдущее и следующее слово (Lafferty, McCallum and Pereira, 2001). CRF моделирует последовательность тегов совместно, поэтому выучивает оценки переходов: низкая оценка перехода от O к I-PER делает его маловероятным. Чтобы сделать его невозможным, нужно жёсткое ограничение — маска на переходах, которая в соглашении IOB2 разрешает I-X только после B-X или I-X. Первые нейросетевые системы сохранили CRF поверх двунаправленной LSTM над эмбеддингами слов и символов (Lample et al., 2016; Huang, Xu and Yu, 2015) и достигли примерно 90–91 на CoNLL-2003; регистр и форма символов оставались самыми полезными сигналами, только теперь выученными.
Классификация токенов на предобученном энкодере#
где — множество позиций токенов, у которых есть метка. Размерности: идентификаторы [B, m] → векторы [B, m, 768] → логиты [B, m, 9], развёрнутые в [B·m, 9] относительно целей [B·m] для функции потерь. Без CRF: контекст энкодера достаточно силён, чтобы независимые решения по токенам работали, а немногие недопустимые переходы можно исправить постобработкой.
Модель с учётом регистра (cased): заглавные буквы — самый сильный признак имени, а токенизатор без учёта регистра из прежних заметок их бы выбросил.
Выравнивание слов и токенов#
Набор данных размечает слова; модель читает токены WordPiece. Hendrix penned on a piece of London hotel stationery in late 1966 превращается в Hendrix penned on a piece of London hotel station ##ery in late 1966, а 10,925 — в четыре токена. Метод токенизатора word_ids() даёт для каждого токена номер слова, из которого он получен (None для [CLS] и [SEP]), и метки назначаются по правилу:
- специальные токены получают метку , которую кросс-энтропия игнорирует;
- первый токен слова получает тег слова;
- токены-продолжения (
##ery) получают либо , так что обучается только первая часть, либо копию тега слова. СкопированныйB-Xпревращает одну сущность в несколько (B-PER B-PER— два человека), поэтому при копировании на частях-продолженияхB-Xнужно заменять наI-X.
Обучение и подсчёт метрики — разные правила. Каким бы ни было соглашение при обучении, метрика использует один тег на слово: построить по word_ids() маску, которая оставляет первый токен каждого слова и отбрасывает специальные токены и части-продолжения, применить её одинаково к предсказаниям и к эталону и только потом передать последовательности тегов оценщику. Для London hotel station ##ery word_ids() даёт 6, 7, 8, 8, и маска оставляет первые три. Отбрасывание одних позиций с даёт один тег на слово, только если частям-продолжениям ставилось .
Метки слов и токены-подслова
Замороженного энкодера недостаточно#
Заморозим все 108.3 млн параметров BERT-base-cased и обучим только выходной слой на 6921 параметр (0.01% модели) на обучающей части CoNLL-2003 две эпохи с шагом обучения ; токены-продолжения получают тег своего слова. Функция потерь на обучении заканчивается на 0.26, а первое тестовое предложение показывает результат:
| SOCCER | - | JAPAN | GET | LUCKY | WIN | , | CHINA | IN | SURPRISE | DEFEAT | . | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| эталон | O | O | B-LOC | O | O | O | O | B-PER | O | O | O | O |
| заморожен + слой | O | O | B-PER | O | O | O | O | O | O | O | O | O |
Выходной слой находит JAPAN, но присваивает неверный тип, и пропускает CHINA, эталонный тег которого сам по себе — известная ошибка разметки этого корпуса (CHINA — страна, здесь футбольная команда, а не человек). В заголовке заглавными буквами, где признак регистра исчезает, линейное считывание замороженных признаков находит некоторые имена и не может надёжно определить их тип; это результат линейного зондирования из заметки о дообучении в другой задаче. Дообучение всего энкодера на CoNLL-2003 даёт 92.4 для BERT-base (Devlin et al., 2019, таблица 7); рецепт тот же, что в прежних заметках (шаг обучения от до , от двух до четырёх эпох), применённый к той же модели без заморозки энкодера.
Оценка: сущности, а не токены#
Доля верных токенов обманывает дважды: большинство токенов — O, а наполовину размеченная сущность бесполезна. Стандарт — точность, полнота и на уровне сущностей из заметки об оценке, как их реализует seqeval: предсказанный фрагмент засчитывается, только если его начало, конец и тип совпадают с эталонным фрагментом. Предсказание B-PER I-PER над Barack Obama — одно верное срабатывание; B-PER над одним Barack — одно ложное срабатывание и один пропуск. Маска первых токенов из предыдущего раздела применяется к предсказаниям и к эталону до подсчёта, а идентификаторы тегов переводятся обратно в строки, потому что оценщик читает префиксы B-/I-.
Разбивка по типам (PER, ORG, LOC, MISC) — стандарт, и она зависит от того, взято ли отображение идентификаторов в метки из набора данных. Написанное вручную отображение, которое упорядочивает теги не так, как набор данных, например меняет местами B-LOC и B-ORG, не влияет на общую , потому что перестановка согласованная, но меняет местами числа по типам и предсказанные теги этих двух типов. Отсюда правило: брать отображение из собственного списка меток набора данных и никогда не писать отображения меток вручную.
Зачем извлекать сущности#
Повторяются три применения. Мониторинг и аналитика: считать упоминания организаций, людей и мест в потоке новостей и связывать их с базой знаний. Заполнение слотов в ассистентах: в book a flight to Tokyo next Friday нужно найти Tokyo как пункт назначения и next Friday как дату, прежде чем заработает логика бронирования; NER — первый этап, за ним идут связывание и нормализация. Обезличивание (de-identification): заменить имена, адреса, телефоны и даты в тексте заглушками ([CLIENT_1]) до того, как текст покинет контролируемую среду, например чтобы отправить его во внешнюю модель. Последнее применение острее всего показывает слабые места задачи: пропущенная сущность — это утечка, неверная граница пропускает половину имени, один и тот же человек должен получать одну и ту же заглушку во всём документе (кореференция), а заглушки должны быть обратимыми для уполномоченного читателя и при этом не восстанавливаться из контекста кем-то ещё — чего один NER не гарантирует.
Что изменилось#
| CRF на признаках / BiLSTM-CRF | Энкодер + линейный слой, дообученный | |
|---|---|---|
| Признаки | придуманные или выученные по словам и символам | контекстные векторы подслов |
| Модель последовательности | CRF над тегами | нет; контекст внутри энкодера |
| Регистр, форма | явные признаки | выучены, нужна модель с учётом регистра |
| на тесте CoNLL-2003 | ≈ 90–91 | ≈ 92–93 |
| Токены | слова | подслова, выровненные через word_ids |
Ограничения#
- Фрагменты плоские. BIO не может выразить вложенные сущности (
[Bank of [America]]) или разрывные; вложенному NER нужны модели на фрагментах. - Типы задаются данными. Модель, обученная на четырёх грубых типах, не найдёт названия лекарств или коды продуктов без новых меток; zero-shot NER на языковых моделях с промптом обменивает точность на гибкость.
- Сдвиг предметной области силён: модели, обученные на новостях, деградируют на твитах, юридических текстах и медицинских записях, где регистр и форматирование другие.
- Границы хрупки на пунктуации, дефисах и разбиениях на подслова, а метрика не прощает ошибок в один токен.
- В бенчмарке есть ошибки (
CHINAкак человек), поэтому лучшие результаты отчасти измеряют согласие с разметчиками.
Что нужно запомнить#
- NER — классификация токенов с тегами BIO; четыре типа дают девять классов.
- Выравнивать метки слов по токенам-подсловам через
word_ids: специальные токены — , первая часть получает тег, части-продолжения — или тег с заменойB-наI-. Считать метрику по одному тегу на слово, с маской первых токенов для предсказаний и эталона. - Линейный слой на замороженном энкодере находит некоторые имена и ошибается в типах или пропускает другие; энкодер нужно дообучать (92.4 для BERT-base на CoNLL-2003).
- Оценивать на уровне сущностей (
seqeval), по типам, с отображением меток, взятым из набора данных. - Использовать модель с учётом регистра; регистр — самый сильный признак.
Ноутбук#
week07_nlp_tasks.ipynb. Номера ячеек считают все ячейки, включая текстовые, начиная с 1. Приведённые числа взяты из прогона, сохранённого в курсе; у ячеек, изменённых с тех пор под текущие версии библиотек, сохранённого выхода нет.
- Ячейки 3–9 загружают CoNLL-2003 и печатают его признаки, включая список меток
ner_tagsв собственном порядке набора данных. - Ячейки 11–15 токенизируют обучающее предложение
bert-base-casedи показывают разбиения на подслова иword_ids(). - Ячейка 17 определяет
tokenize_and_align_labelsс соглашением иlabel_all_tokens=True(токены-продолжения получают копию тега слова, в том числе тегаB-); ячейка 18 применяет её к набору данных. - Ячейки 23–27 строят
BERTforNER(замороженныйAutoModel, дропаут,nn.Linear(768, 9), кросс-энтропия на развёрнутых логитах) и печатают 6921 обучаемый параметр из 108 317 193; если убрать строки, выставляющиеrequires_grad = False, постановка превращается в полное дообучение. - Ячейка 29 берёт
id2labelиз названий меток набора данных (егоfeatures). Ноутбук в том виде, в каком курс читали впервые, вместо этого задавал своё отображение сB-LOCпод индексом 3 иB-ORGпод 5, тогда как в списке признаков набора данныхB-ORGстоит под 3, аB-LOC— под 5, поэтому числа по типам и печатаемые теги этих двух типов менялись местами. Ячейка 30 определяет функцию метрикиseqeval, которая отбрасывает только позиции с и поэтому при скопированных тегах оценивает каждую часть-подслово, а не один тег на слово; ячейка 31 обучает две эпохи черезTrainer(шаг обучения , батч 32,DataCollatorForTokenClassification) и приводит итоговую функцию потерь на обучении 0.262; метрики оценки, посчитанные на каждой эпохе, в сохранённом выходе отсутствуют. - Ячейки 33–34 печатают эталонные теги и предсказания модели для первого тестового предложения, приведённые выше. Сохранённые эталонные теги получены с отображением меток, написанным вручную в первой версии, поэтому
JAPANзначится там какB-ORG; его идентификатор в наборе данных —B-LOC. Предсказания напечатаны по токенам-подсловам, 33 позиции с[CLS]и[SEP]; таблица переносит их обратно на слова по первому токену каждого слова (JAPAN— этоJ ##AP ##AN, и все три предсказаны какB-PER). - Ячейки 35–36 перечисляют применения NER и ставят вопрос об обезличивании.
Дальше#
Разметка находит сущности, которые уже есть в тексте. Следующая заметка просит фрагмент, отвечающий на вопрос, — это тот же энкодер, читающий вопрос и отрывок вместе и предсказывающий две позиции, начало и конец, вместо тега на каждый токен.
Литература#
- E. F. Tjong Kim Sang, F. De Meulder. Introduction to the CoNLL-2003 Shared Task: Language-Independent Named Entity Recognition. CoNLL, 2003.
- J. Lafferty, A. McCallum, F. Pereira. Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data. ICML, 2001, pp. 282–289.
- Z. Huang, W. Xu, K. Yu. Bidirectional LSTM-CRF Models for Sequence Tagging. arXiv, 2015.
- G. Lample, M. Ballesteros, S. Subramanian, K. Kawakami, C. Dyer. Neural Architectures for Named Entity Recognition. NAACL, 2016.
- J. Devlin, M.-W. Chang, K. Lee, K. Toutanova. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. NAACL, 2019. §5.3 и таблица 7 (результаты на CoNLL-2003).
- N. Nakayama. seqeval. Оценка разметки последовательностей на уровне сущностей.
- Hugging Face. Token classification. Рецепт выравнивания, использованный в ноутбуке.