Как количественно оценить F1-Score при тонкой настройке предварительно обученных преобразователей для задач НЛП?

Введение

Поскольку Васвани и др. (2017) опубликовал статью Внимание — это все, что вам нужно», Трансформеры доминируют в последних достижениях в области обработки естественного языка (НЛП), где точная настройка предварительно обученных языковых моделей для последующих задач НЛП стала довольно популярной. . Если вы не знакомы с трансформерами, эта статья и эта статья — хорошая отправная точка. Иллюстрированный пример Джея Аламмара также является отличным ресурсом.

Библиотека Transformers от Huggingface 🤗 предоставляет несколько предварительно обученных моделей для облегчения выполнения последующих задач, таких как классификация текста, генерация текста, обобщение, ответы на вопросы и т. д. Библиотека Transformers совместима с Jax, PyTorch и TensorFlow, которые являются наиболее популярными платформами глубокого обучения и предоставляют API для загрузки и точной настройки предварительно обученных моделей с доступными данными для различных НЛП. задания.

При точной настройке предварительно обученных моделей для задач классификации мы обычно работаем с такими метриками, как Потери (бинарная кросс-энтропия или категориальная кросс-энтропия среди другие) и Точность. Однако, когда данные несбалансированы, мы часто заинтересованы в мониторинге таких показателей, как Точность, Отзыв и Показатель F1 во время обучения модели и на данные проверки. API Keras TensorFlow не дает прямого доступа к этим показателям в конце каждой эпохи. Короче говоря, эти метрики удалены в TensorFlow 2.0, поскольку их оценка для каждой партии может ввести в заблуждение. Однако мы можем разработать и использовать пользовательскую функцию обратного вызова для количественной оценки этих показателей по всему набору проверочных данных в конце каждой эпохи, что будет обсуждаться далее в этой статье.

Что такое Precision, Recall и F1-score и как их измерить?

В любой задаче классификации или поиска информации, когда данные несбалансированы, Точность может быть ненадежной метрикой для оценки производительности. Именно здесь Precision, Recall и F1-score считаются хорошими альтернативными показателями для оценки производительности модели. В контексте классификации точность связана с ошибкой типа I или завышением целевого класса. Отзыв связан с ошибкой типа II и недооценкой целевого класса. Другими словами, высокая точность показывает, что ложных срабатываний не так уж много, а высокая полнота показывает, что ложноотрицательных результатов не слишком много. Таким образом, показатель F1, представляющий собой гармоническое среднее из двух, очень полезен, поскольку он прекрасно обеспечивает баланс между низкой переоценкой и низкой недооценкой. Эта статья TDS предоставляет дополнительную информацию, включая формулы.

В задачах NLP эти метрики становятся весьма полезными, когда, например, мы имеем дело с задачей классификации текста (среди прочего), где доля классов сильно несбалансирована, и мы хотели бы убедиться, что мы оцениваем модель таким образом, чтобы показатель производительности на всех классах, а не только на классах с более высокой частотой/пропорциями (в отличие от Точности!).

Библиотека Scikit-Learn Python предоставляет API для расчета этих показателей, включая варианты для сценариев с несколькими метками. Как показано ниже, при работе с F1_score параметр 'average' по умолчанию имеет значение 'binary', которое сообщает результаты только для класса, указанного параметром 'pos_label'. . В качестве альтернативы параметру 'average' можно задать значение 'micro', 'macro', 'weighted'. или 'образцы'.

Согласно официальной документации Scikit-Learn по F1-score, опция микро вычисляет метрику глобально, подсчитывая общее количество истинных положительных результатов, ложных отрицательных результатов и ложных положительных результатов. Параметр macro вычисляет метрику для каждого класса и находит их невзвешенное среднее значение, при этом все классы обрабатываются одинаково. Опция взвешенная вычисляет метрику для каждого класса и находит их среднее значение, взвешенное по количеству экземпляров для каждого класса. Это изменяет "макрос", чтобы учесть дисбаланс меток, и может привести к тому, что оценка F1 не находится между точностью и полнотой. Наконец, выборки вычисляют метрику для каждого экземпляра и находят их среднее значение. precision_score и recall_score от Scikit-Learn имеют аналогичные параметры усреднения.

В этой статье мы передаем sklearn.metrics.f1_score в настраиваемую функцию обратного вызова Keras, чтобы мы могли сохранять необязательные параметры для всех параметров усреднения.

Пользовательский обратный вызов для расчета F1-счета при тонкой настройке Трансформеров

Keras — это API глубокого обучения, написанный на Python и работающий поверх платформы машинного обучения TensorFlow. В Keras обратный вызов — это объект, который может выполнять действия на разных этапах обучения (например, писать логи TensorBoard после каждой партии обучения или периодически сохранять модель). Обратные вызовы передаются различным методам Keras (например, подходят, оценивают, прогнозируют), поскольку они подключаются к различным этапам обучения, тестирования и прогнозирования модели.

Как обсуждалось выше, для таких показателей, как точность, отзыв и оценка F1, нам необходимо оценивать их для всего набора данных, а не для какой-либо отдельной партии, что может ввести в заблуждение. Следовательно, мы можем использовать метод уровня эпохи 'on_epoch_end(self, epoch, logs=None)', где словарь logs содержит значение потерь и все остальные показатели. в конце эпохи. Кроме того, атрибут self.model используется для доступа к модели, связанной с текущим этапом обучения, которую можно использовать для оценки данных проверки. Вот пример кода для количественного определения и вывода F1-оценки в конце каждой эпохи с использованием всех данных проверки:

В приведенном выше примере метод ‘__init__’ создает экземпляр объекта при передаче данных проверки. Затем метод «on_epoch_end» подсчитывает значения F1-оценки в конце каждой эпохи и заполняет объект logs. Следует отметить, что метод .predict возвращает логиты для всех классов (а не вероятности класса или метки класса). Итак, нам нужно применить функцию Softmax, чтобы преобразовать их в вероятности. Впоследствии мы применяем argmax numpy, чтобы обозначить класс с наибольшей вероятностью в качестве прогнозируемой метки.

Рабочий пример тонкой настройки Transformer (в данном случае DistilBERT) при вычислении F1-показателя по всему набору проверочных данных в конце каждой эпохи доступен на GitHub. В этом рабочем примере используется общедоступный набор данных, где подмножество обучающего набора используется для тонкой настройки, а весь тестовый набор передается методу .fit в качестве проверочного набора. Затем функция обратного вызова количественно определяет и сообщает оценку F1 в наборе проверки вместе с потерями и точностью в конце каждой эпохи:

Спасибо за прочтение! Пожалуйста, следите за мной на GitHub, подключайтесь к LinkedIn или следите за мной в Twitter, где я публикую свою текущую работу и другие интересные статьи, связанные с наукой о данных!