Демонстрация кода для классификации текста с двумя популярными предварительно обученными моделями обнимающихся лиц
Введение
Лично я считаю, что все причудливые исследования машинного обучения и передовые алгоритмы искусственного интеллекта имеют очень минимальную ценность, если не нулевую, до той даты, когда их можно будет применять к реальным проектам, не требуя от пользователей безумного количества ресурсов и чрезмерных знаний в предметной области. И Hugging Face строит мост. Hugging Face является домом для тысяч предварительно обученных моделей, которые внесли большой вклад в демократизацию искусственного интеллекта с помощью открытого исходного кода и открытой науки.
Сегодня я хочу показать вам сквозную демонстрацию кода для сравнения двух самых популярных предварительно обученных моделей путем проведения анализа классификации текста с несколькими метками.
Первая модель — SentenceTransformers (SBERT). На самом деле это набор предварительно обученных моделей для различных задач, созданных командой из Лаборатории обработки вездесущих знаний в Техническом университете Дармштадта. Я использовал SBERT несколько раз в своих предыдущих проектах. У них даже есть библиотека Python, которая дает вам возможность не использовать Hugging Face API и платформу Pytorch. Загляните здесь.
Вторая модель — Data2vec, мощная предварительно обученная модель, предлагаемая командой ИИ из Meta (Facebook). Это самоконтролируемая структура (модель учителя → модель ученика), предназначенная для кодирования текста, аудио и изображений. Если вам интересно, как он развивается, вы можете найти оригинальную статью здесь.
Данные
Для данных я использую известный набор текстовых данных с открытым исходным кодом: BBC News Group (Его лицензия находится здесь: https://opendatacommons.org/licenses/dbcl/1-0/). Вы можете либо загрузить данные, выполнив следующие действия:
Или вы можете найти предварительно обработанную версию CSV в моем репозитории GitHub: https://github.com/jinhangjiang/Medium_Demo/blob/main/Data2vec_vs_SBERT/bbc-text.csv
Демонстрация кода
Шаг 1: Установите и импортируйте нужный нам пакет
Шаг 2: Разделите данные для проверки
Обратите внимание на одну деталь: я использую файл CSV вместо импорта данных из sklearn. Поэтому я задал входные данные в виде списка (X.tolist()). Без этого модель позже будет выдавать ошибки.
Шаг 3. Разметьте текст
Вот некоторые уточнения:
имя_модели: этот параметр должен быть строкой имени предварительно обученной модели, которую вы хотите использовать. Вы можете найти доступные модели: https://huggingface.co/models
max_length: этот параметр напрямую влияет на время обучения и скорость обучения. Вы хотели бы указать длину текста, который вы хотите, чтобы модель обрабатывала для каждого документа, если каждый документ очень длинный.
padding: установите для этого параметра значение True, если вы указали max_length. Заполнение самой длинной последовательностью в пакете (или без заполнения, если предоставлена только одна последовательность)
Шаг 4. Преобразование вложений в набор данных torch
Шаг 5: вызовите модель
AutoModelForSequenceClassification: «AutoModel…» поможет вам автоматически определить правильную модель для использования. До сих пор это работает нормально для меня. «…ForSequenceClassification» специально используется для задач классификации.
to("cuda"): если на вашем компьютере доступен графический процессор, вы можете добавить эту функцию в конец, чтобы использовать мощность графического процессора. Без этой функции время обучения обычно значительно увеличивается.
Шаг 6. Определите показатели оценки
metrics_name: это должна быть строка. Для нашей демонстрации я выбрал f1 в качестве метрики оценки. Вы можете найти доступные параметры здесь: https://github.com/huggingface/datasets/tree/master/metrics
среднее: я передал этот параметр, поскольку использую показатель f1 для оценки проблемы классификации с несколькими метками. Это НЕ универсальный параметр.
Шаг 7: Точная настройка предварительно обученной модели
Шаг 8. Сохраните доработанную модель, чтобы ее можно было использовать повторно.
Если вы хотите использовать свою точно настроенную модель, все, что вам нужно сделать, это заменить строку имени модели на шаге 3 и шаге 5 на путь к вашей собственной модели.
У вас есть доступ к полному коду скрипта здесь: https://github.com/jinhangjiang/Medium_Demo/blob/main/Data2vec_vs_SBERT/Data2vec_vs_SBERT_512.ipynb
Полученные результаты
Для SBERT (max_length = 512, эпоха = 5):
Лучший результат f1: 0,985034
Средний балл f1: 0,959524
Время стены: 15 мин 36 с
Память увеличена: 5,0294 ГБ
Для Data2vec (max_length = 512, эпоха = 5):
Лучший результат f1: 0,976871
Средний балл f1: 0,957822
Время стены: 15 мин 8 с
Память увеличена: 0,3213 ГБ
Каждый раз, когда вы запускаете модель, результаты могут немного отличаться. В целом, после 5 попыток я могу сделать вывод, что SBERT имеет немного лучшую производительность с точки зрения лучшего результата f1, в то время как Data2vec использует намного меньше памяти. Средние результаты f1 для обеих моделей очень близки.
После прочтения сегодняшней демонстрации у вас должны быть следующие выводы:
- Как токенизировать ваши текстовые данные с помощью предварительно обученных моделей
- Как правильно преобразовать ваши данные в набор данных факела
- Как использовать и настраивать предварительно обученные модели
- Как сохранить модель для будущего использования
- Сравнение производительности между Data2vec и SBERT
Пожалуйста, свяжитесь со мной в LinkedIn.
Ссылка
Баевский и др. (2022). data2vec: Общая основа для самостоятельного обучения речи, зрению и языку. https://arxiv.org/pdf/2202.03555.pdf
Обнимающее лицо. (2022). Текстовая классификация. https://huggingface.co/docs/transformers/tasks/sequence_classification
Реймерс, Н. и Гуревич, И. (2019). Предложение-BERT: встраивание предложений с использованием сиамских сетей BERT. https://arxiv.org/pdf/1908.10084.pdf