Это третья часть и продолжение серии. Пожалуйста, перейдите к Вступительной статье, в которой рассказывается о мотивации этой серии. Мы рассмотрим различные разделы тренинга по распознаванию именованных сущностей (NER) по общедоступным данным CoNLL в Блокноте Colab и сделаем соответствующие комментарии для каждого из разделов.

  • Загрузите и импортируйте библиотеки - установлена ​​библиотека под названием seqeva l - это необходимо для расчета показателей прогнозирования NER. Помимо этого, устанавливаются и импортируются обычные библиотеки Pytorch и Pytorch Lightning.
  • Загрузить данные. Набор данных CoNLL предварительно обработан и доступен для загрузки из библиотеки наборов данных Transformers. Но в демонстрационных целях записная книжка загружает данные из общедоступного репозитория и подготавливает данные в формате, который полезен для целей обучения. Имеется 14 039 обучающих данных, 3250 проверочных данных и 3453 тестовых данных. В каждой строке есть список токенов слов и связанные теги с каждым токеном слова, как показано ниже. Пожалуйста, смотрите страницу 2 этого документа для получения подробной информации о схеме тегов. Существует 9 различных возможных тегов NER.
sentences = ['Germany', "'s", 'representative', 'to', 'the', 'European', 'Union', "'s", 'veterinary', 'committee', 'Werner', 'Zwingmann', 'said', 'on', 'Wednesday', 'consumers', 'should', 'buy', 'sheepmeat', 'from', 'countries', 'other', 'than', 'Britain', 'until', 'the', 'scientific', 'advice', 'was', 'clearer', '.']
tags = ['B-LOC', 'O', 'O', 'O', 'O', 'B-ORG', 'I-ORG', 'O', 'O', 'O', 'B-PER', 'I-PER', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-LOC', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
  • Определите предварительно обученную модель. Используемая предварительно обученная модель - это модель DistilBert-Base. Это дистиллированная версия BERT, которая на 60% быстрее, на 40% легче в памяти и при этом сохраняет 97% производительности BERT. После успешного обучения с этим можно попробовать другие предварительно обученные модели, изменив переменную model_checkpoint.
  • Определите функцию предварительной обработки или класс набора данных - здесь мы определяем унаследованный от Pytorch Dataset класс NERDataset, который будет создавать данные train, val и test в формате набора данных, который необходим загрузчику данных. Pytorch использует класс DataLoader для объединения данных в мини-пакеты. Данные токенизируются в этом классе с помощью предварительно обученного токенизатора. Помеченные теги преобразуются в числа с помощью LabelEncoder. Здесь следует отметить, что преобразователь токенизатора может разбить одно слово на более чем один токен, поэтому необходимо позаботиться о том, чтобы правильно добавлять теги к словам, которые были разбиты. Также специальным токенам, таким как CLS, SEP, присваивается тег -100, чтобы их можно было игнорировать при вычислении функции потерь.
  • Определите класс DataModule - это класс, определенный Pytorch Lightning, который содержит весь код, необходимый для подготовки мини-пакетов данных с использованием DataLoaders. В начале обучения класс Trainer сначала вызовет функции prepare_data и setup. Здесь есть функция сопоставления, которая выполняет заполнение мини-пакетов. Модели типа Bert потребуют, чтобы все входные данные мини-партии были одинаковой длины. Вместо заполнения входных данных до самой длинной длины всего набора данных функция сопоставления помогает дополнить входные данные мини-пакета до самой длинной длины данных в этом мини-пакете. Это обеспечивает более быстрое обучение и меньшее использование памяти. Особое внимание следует уделить заполнению target_tags. Функция tokenizer.pad заполняет только столбцы input_ids, Внимание_mask. Target_tags, содержащие теги NER каждого токена слова, должны быть отдельно дополнены, как показано ниже.
  • Определите класс модели - здесь определяется прямая функция модели DL. Как можно видеть, вывод из последнего скрытого слоя (который имеет форму - размер пакета, количество токенов, 768) берется из модели Берта и отправляется через слой Dropout перед отправкой через линейный слой с 9 выводами. (равно 9 различным целевым тегам). Окончательный результат будет иметь форму - размер партии, количество токенов, 9.
  • Традиционно обучение NER проводилось с использованием Bi-LSTM в дообертскую эпоху. Вложения Glove использовались в качестве отправной точки для встраивания токенов слов, и эти вложения были отправлены через двунаправленный LSTM для предсказаний NER. Вот статья, в которой показана модель BiLSTM в Tensorflow. Вложения Гловера не имели контекста, поэтому LSTM был необходим для построения контекста, но вложения модели Берта распознают контекст слов в предложении. SparkNLP, Spacy и т. Д. Сегодня имеют модели, которые начинаются с Bert Embeddings и используют BiLSTM для прогнозирования NER - вероятно, это сделано потому, что было бы быстрее обучить BiLSTM по сравнению с точной настройкой большой модели Bert.
  • Определите класс модуля Pytorch Lightning - здесь определяются функции обучения, проверки и шага тестирования. Потери и точность модели вычисляются в ступенчатых функциях. Здесь также определены оптимизаторы и планировщики. Здесь следует обратить внимание на то, что CrossEntropyLoss не следует рассчитывать на добавленных токенах для каждых данных. Маска внимания будет равна нулю для всех заполненных токенов, поэтому ее можно использовать для идентификации заполненных токенов. Класс Pytorch CrossEntropyLoss имеет значение по умолчанию ignore_index, равное -100, поэтому технически нам не нужно было выполнять оператор np.where для замены заполненных токенов индексом игнорирования, поскольку заполненные токены уже были помечены как -100, чтобы начать с . Но все же стоит знать об этом для будущих целей, когда у заполненных токенов может быть другой номер.
  • Функция вычисления метрик используется для вычисления точности, отзыва, f1 и точности различных целевых тегов.
  • Определение параметров трейнера - здесь определяются все необходимые параметры трейнера и обратные вызовы трейнера. Мы определили 3 разных обратных вызова - EarlyStopping, LearningRate Monitor и Checkpointing. Вместо использования argparse для определения параметров последнее обновление Pytorch Lightning позволяет определять параметры с помощью файла .yaml - этот файл .yaml может быть предоставлен в качестве аргумента для файла .py python при запуске CLI. Таким образом, параметры тренера можно поддерживать отдельно от обучающего кода. Поскольку в демонстрационных целях мы используем Colab Notebook, мы придерживаемся метода argparse.
  • Обучение модели. Это делается с помощью метода Trainer.fit (). Профилировщик может быть определен в параметрах тренера, чтобы предоставить больше информации о времени выполнения тренинга.
  • Оцените производительность модели. После 3 эпох обучения мы получаем результаты тестовых данных:
Overall results:
{‘test_accuracy’: 0.9712, ‘test_f1’: 0.8669, ‘test_loss’: 0.1460, ‘test_precision’: 0.8618}
per tag result of :
{'LOC': {'f1': 0.95455,   'number': 2618,   'precision': 0.94264,   'recall': 0.9667},  
'MISC': {'f1': 0.83842,   'number': 1231,   'precision': 0.81987,   'recall': 0.8578},  
'ORG': {'f1': 0.89782,   'number': 2056,   'precision': 0.90024,   'recall': 0.89542},  
'PER': {'f1': 0.97329,   'number': 3034,   'precision': 0.97361,   'recall': 0.9729},
  • Как мы видим, теги неуравновешены (см. Значение числового ключа), и функции потерь можно помочь, добавив к ней веса. Результат теста F1 86,18 намного ниже, чем результат 94,6 балла SOTA. Этого следует ожидать от модели DistilBert. Очень немногие из моделей, перечисленных на сайте SOTA, использовали BERT. BiLSTM с CRF в 2018 году набрал около 91 балла. Базовый BERT имел оценку F 92,4, а большой BERT имел оценку F 92,8 в 2018 году. Теперь, когда у нас есть больший контроль над архитектурой модели DL с помощью Pytorch Lightning, эксперименты можно проводить с использованием других архитектур.
  • Выполнить вывод на обученной модели - отправьте образец текста пакета в модель, чтобы получить прогноз на основе обученной модели. Это можно использовать при построении конвейера вывода ML.
  • Данные журналов TensorBoard - это откроет TensorBoard в записной книжке Colab и позволит вам просматривать различные журналы TensorBoard. Pytorch Lightning по умолчанию ведет журналы TensorBoard, и это можно изменить с помощью обратного вызова Logger.

Далее мы рассмотрим тренинг по задаче с множественным выбором в Части 4 этой серии.