Пошаговое руководство по настройке BERT для NER

Со времени основополагающей статьи Васвани и др. Внимание - это все, что вам нужно, модели Transformer на сегодняшний день стали самым современным в технологии НЛП. С приложениями, от NER, классификации текста, ответов на вопросы или генерации текста, применения этой удивительной технологии безграничны.

В частности, BERT - что означает двунаправленные представления кодировщика от трансформаторов - использует архитектуру трансформатора новым способом. Например, BERT анализирует обе стороны предложения с помощью случайно замаскированного слова, чтобы сделать прогноз. Помимо прогнозирования замаскированного токена, BERT прогнозирует последовательность предложений, добавляя токен классификации [CLS] в начале первого предложения, и пытается предсказать, следует ли второе предложение за первым, добавляя токен разделения [SEP] между двумя предложениями.

В этом руководстве я покажу вам, как настроить модель BERT для прогнозирования таких сущностей, как навыки, диплом, основной диплом и опыт работы с описанием должностей в программном обеспечении. Если вы хотите пойти дальше и извлечь связи между сущностями, прочтите нашу статью о том, как выполнять объединенные сущности и извлечение отношений с помощью трансформаторов.

Для тонкой настройки трансформаторов требуется мощный графический процессор с параллельной обработкой. Для этого мы используем Google Colab, поскольку он предоставляет бесплатные серверы с графическими процессорами.

В этом уроке мы будем использовать недавно выпущенную библиотеку spaCy 3 для точной настройки нашего преобразователя. Ниже приведено пошаговое руководство по настройке модели BERT на spaCy 3 (видеоурок здесь). Код вместе с необходимыми файлами доступен в репозитории G ithub repo.

Маркировка данных:

Для точной настройки BERT с помощью spaCy 3 нам необходимо предоставить данные для обучения и разработки в формате JSON spaCy 3 (см. Здесь), которые затем будут преобразованы в двоичный файл .spacy. Мы предоставим данные в формате IOB, содержащиеся в файле TSV, а затем преобразуем их в формат spaCy JSON.

Я пометил только 120 должностных инструкций такими объектами, как навыки, диплом, диплом специалиста и опыт для обучающий набор данных и около 70 должностных инструкций для набора данных разработчика.

В этом руководстве я использовал инструмент аннотации UBIAI, потому что он обладает обширными функциями, такими как:

  • Автоматическая аннотация ML
  • Словарь, регулярное выражение и автоматическая аннотация на основе правил
  • Совместная работа в команде для совместного использования задач аннотации
  • Прямой экспорт аннотаций в формат IOB

Используя функцию регулярных выражений в UBIAI, я предварительно аннотировал все упоминания опыта, которые следует шаблону «\ d. * \ +. *», Например «5+ лет опыта в C ++». Затем я загрузил словарь csv, содержащий все языки программного обеспечения, и назначил навыки сущности. Предварительные аннотации экономят много времени и помогут свести к минимуму ручные аннотации.

Для получения дополнительной информации об инструменте аннотации UBIAI посетите страницу документации и мой предыдущий пост Введение в UBIAI: простая в использовании текстовая аннотация для приложений NLP ».

Экспортированная аннотация будет выглядеть так:

MS B-DIPLOMA
in O
electrical B-DIPLOMA_MAJOR
engineering I-DIPLOMA_MAJOR
or O
computer B-DIPLOMA_MAJOR
engineering I-DIPLOMA_MAJOR
. O
5+ B-EXPERIENCE
years I-EXPERIENCE
of I-EXPERIENCE
industry I-EXPERIENCE
experience I-EXPERIENCE
. I-EXPERIENCE
Familiar O
with O
storage B-SKILLS
server I-SKILLS
architectures I-SKILLS
with O
HDD B-SKILLS

Для конвертации из IOB в JSON (см. Документацию здесь) мы используем команду spaCy 3:

!python -m spacy convert drive/MyDrive/train_set_bert.tsv ./ -t json -n 1 -c iob
!python -m spacy convert drive/MyDrive/dev_set_bert.tsv ./ -t json -n 1 -c iob

После преобразования в JSON spaCy 3 нам нужно преобразовать файлы JSON для обучения и разработки в двоичный файл .spacy с помощью этой команды (обновите путь к файлу своим собственным):

!python -m spacy convert drive/MyDrive/train_set_bert.json ./ -t spacy
!python -m spacy convert drive/MyDrive/dev_set_bert.json ./ -t spacy

Модельное обучение:

  • Откройте новый проект Google Colab и обязательно выберите GPU в качестве аппаратного ускорителя в настройках ноутбука.
  • Чтобы ускорить процесс обучения, нам нужно запустить параллельную обработку на нашем графическом процессоре. Для этого устанавливаем библиотеку NVIDIA 9.2 cuda:
!wget https://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64 -O cuda-repo-ubuntu1604–9–2-local_9.2.88–1_amd64.deb
!dpkg -i cuda-repo-ubuntu1604–9–2-local_9.2.88–1_amd64.deb
!apt-key add /var/cuda-repo-9–2-local/7fa2af80.pub
!apt-get update
!apt-get install cuda-9.2

Чтобы проверить, установлен ли правильный компилятор cuda, запустите:! Nvcc --version

  • Установите просторную библиотеку и конвейер пространственного трансформатора:
pip install -U spacy
!python -m spacy download en_core_web_trf
  • Далее мы устанавливаем библиотеку машинного обучения pytorch, которая настроена для cuda 9.2:
pip install torch==1.7.1+cu92 torchvision==0.8.2+cu92 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
  • После установки pytorch нам нужно установить просторные трансформаторы, настроенные для cuda 9.2, и изменить CUDA_PATH и LD_LIBRARY_PATH, как показано ниже. Наконец, установите библиотеку cupy, которая является эквивалентом библиотеки numpy, но для графического процессора:
!pip install -U spacy[cuda92,transformers]
!export CUDA_PATH=”/usr/local/cuda-9.2"
!export LD_LIBRARY_PATH=$CUDA_PATH/lib64:$LD_LIBRARY_PATH
!pip install cupy
  • SpaCy 3 использует файл конфигурации config.cfg, который содержит все компоненты обучения модели для обучения модели. На странице обучения spaCy вы можете выбрать язык модели (английский в этом руководстве), компонент (NER) и оборудование (GPU) для использования и загрузить шаблон файла конфигурации.

Единственное, что нам нужно сделать, это указать путь к файлам train и dev .spacy. После этого мы загружаем файл в Google Colab.

  • Теперь нам нужно автоматически заполнить файл конфигурации остальными параметрами, которые потребуются модели BERT; все, что вам нужно сделать, это запустить эту команду:
!python -m spacy init fill-config drive/MyDrive/config.cfg drive/MyDrive/config_spacy.cfg

Предлагаю отладить ваш конфигурационный файл на случай ошибки:

!python -m spacy debug data drive/MyDrive/config.cfg
  • Наконец-то мы готовы обучать модель BERT! Просто запустите эту команду, и обучение должно начаться:
!python -m spacy train -g 0 drive/MyDrive/config.cfg — output ./

P.S: если вы получите ошибку cupy_backends.cuda.api.driver.CUDADriverError: CUDA_ERROR_INVALID_PTX: не удалось выполнить компиляцию PTX JIT, просто удалите cupy и установите его снова, и это должно решить проблему.

Если все прошло правильно, вы должны увидеть, как обновляются оценки модели и потери:

По окончании обучения модель будет сохранена в папке model-best. Оценки модели находятся в файле meta.json внутри папки model-best:

“performance”:{
“ents_per_type”:{
“DIPLOMA”:{
“p”:0.5584415584,
“r”:0.6417910448,
“f”:0.5972222222
},
“SKILLS”:{
“p”:0.6796805679,
“r”:0.6742957746,
“f”:0.6769774635
},
“DIPLOMA_MAJOR”:{
“p”:0.8666666667,
“r”:0.7844827586,
“f”:0.8235294118
},
“EXPERIENCE”:{
“p”:0.4831460674,
“r”:0.3233082707,
“f”:0.3873873874
}
},
“ents_f”:0.661754386,
“ents_p”:0.6745350501,
“ents_r”:0.6494490358,
“transformer_loss”:1408.9692438675,
“ner_loss”:1269.1254348834
}

Оценки, безусловно, намного ниже уровня производственной модели из-за ограниченного набора данных для обучения, но стоит проверить его эффективность на образце описания должности.

Извлечение сущностей с помощью трансформаторов

Чтобы протестировать модель на образце текста, нам нужно загрузить модель и запустить ее на нашем тексте:

nlp = spacy.load(“./model-best”)
text = [
'''Qualifications
- A thorough understanding of C# and .NET Core
- Knowledge of good database design and usage
- An understanding of NoSQL principles
- Excellent problem solving and critical thinking skills
- Curious about new technologies
- Experience building cloud hosted, scalable web services
- Azure experience is a plus
Requirements
- Bachelor's degree in Computer Science or related field
(Equivalent experience can substitute for earned educational qualifications)
- Minimum 4 years experience with C# and .NET
- Minimum 4 years overall experience in developing commercial software
'''
]
for doc in nlp.pipe(text, disable=["tagger", "parser"]):
    print([(ent.text, ent.label_) for ent in doc.ents])

Ниже приведены сущности, извлеченные из нашего примера описания должности:

[
("C", "SKILLS"),
("#", "SKILLS"),
(".NET Core", "SKILLS"),
("database design", "SKILLS"),
("usage", "SKILLS"),
("NoSQL", "SKILLS"),
("problem solving", "SKILLS"),
("critical thinking", "SKILLS"),
("Azure", "SKILLS"),
("Bachelor", "DIPLOMA"),
("'s", "DIPLOMA"),
("Computer Science", "DIPLOMA_MAJOR"),
("4 years experience with C# and .NET\n-", "EXPERIENCE"),
("4 years overall experience in developing commercial software\n\n", "EXPERIENCE")
]

Достаточно впечатляюще для использования всего 120 учебных документов! Мы смогли правильно извлечь большую часть навыков, дипломов, дипломов и опыта.

При большем количестве обучающих данных модель, безусловно, улучшится и принесет более высокие баллы.

Заключение:

Имея всего несколько строк кода, мы успешно обучили функциональную модель преобразователя NER благодаря удивительной библиотеке spaCy 3. Идите вперед и попробуйте его на своем примере использования и, пожалуйста, поделитесь своими результатами. Обратите внимание, что вы можете использовать инструмент аннотации UBIAI, чтобы пометить свои данные, мы предлагаем бесплатную 14-дневную пробную версию.

Как всегда, если у вас есть какие-либо комментарии, оставьте сообщение ниже или напишите по адресу [email protected]!

Следуйте за нами в Twitter @ UBIAI5

Ссылка