Какая задача решается с помощью BERT и CRF
Что проверяют
Понимаете ли вы задачу разметки последовательностей и роль каждой части: BERT даёт признаки, CRF связывает решения по соседним токенам. Следом спрашивают, зачем CRF, если BERT и так видит контекст, и как быть с разбиением слов на подслова.
Как отвечать
Основная задача это распознавание именованных сущностей (NER), а шире любая разметка токенов: выделение слотов в запросах, POS-теггинг, извлечение полей из документов. Схема модели:
- BERT: выдаёт контекстный вектор для каждого токена;
- линейный слой: превращает вектор в оценки для каждой метки, например по схеме BIO:
B-PER,I-PER,O; - CRF: добавляет обучаемую матрицу переходов между метками. Обучается максимизацией правдоподобия всей последовательности меток (нормировку считает прямой алгоритм), а на инференсе ищет лучшую последовательность алгоритмом Витерби.
Выигрыш CRF в согласованности. Голый softmax решает по каждому токену отдельно и может выдать I-ORG сразу после O или B-PER, а CRF такие переходы штрафует. На больших размеченных корпусах прирост поверх BERT обычно небольшой, заметнее он на маленьких выборках и на длинных сущностях.
Практика: в стандартном AutoModelForTokenClassification из Hugging Face CRF нет, его подключают отдельно, например пакетом pytorch-crf. WordPiece режет слова на подслова, поэтому метку ставят на первый подтокен, а остальные маскируют: в обычной голове это -100 в метках, для CRF нужна маска или сбор векторов по первым подтокенам. Качество меряют F1 по сущностям через seqeval, а не по токенам. Для русского берут русскоязычные или мультиязычные версии BERT.
Где спотыкаются
Говорят, что CRF «предсказывает на основе предыдущих выходов», как рекуррентная сеть. CRF оценивает всю последовательность меток целиком и обучается глобально, это не авторегрессия.
Путают роли: считают, что BERT классифицирует текст целиком, а CRF потом режет его на сущности.
Меряют accuracy по токенам. Большинство токенов имеют метку O, и метрика выглядит отличной при слабом качестве на самих сущностях.