Постановка проблемы:

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

Согласно отчету, объем мирового рынка сбора данных и маркировки оценивался в 1,67 млрд долларов США в 2021 году, и ожидается, что совокупный годовой темп роста (CAGR) составит 25,1% с 2022 по 2030 год.

Даже среди Data Scientist существует мнение, что для хорошей производительности им нужен огромный объем данных. Именно здесь на помощь приходят такие методы, как обучение несколькими приемами.

Что такое обучение в несколько выстрелов?

Это часть контролируемого машинного обучения, где модели дается несколько помеченных примеров, а затем она обучается делать выводы (предсказания) на невидимых примерах.

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

Что такое сетфит?

SetFit (Sentence Ttransformer Fine-Tuning): эффективный фреймворк для тонкой настройки Sentence Transformers.

Обучение делится на два этапа:

  1. Точная настройка преобразователя предложений: это происходит в сиамской манере с парами предложений, где цель состоит в том, чтобы максимизировать расстояние между семантически разными предложениями и минимизировать расстояние между семантически подобными предложениями.
  2. Обучение головы классификации: берет встраивание форматированного текста и с помощью метки класса формирует обучающий набор для классификации. В качестве модели классификации используется модель логистической регрессии (я думаю, что в будущем это может быть любая модель классификации).

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

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

При выводе:

  1. Невидимый образец передается в преобразователь предложений (тонко настроенный с использованием нескольких обучающих примеров) для создания плотного встраивания.
  2. Это встраивание форматированного текста используется заголовком классификации для возврата метки класса.

Источник набора данных:

Набор данных собирается с помощью Youtube API. Он содержит коллекцию комментариев YouTube для каналов, связанных с наукой о данных. Наборы данных Kaggle

Примечание. Если вы работаете на kaggle, сначала удалите tensorflow, так как есть проблема с предустановленной версией tf.

%pip uninstall tensorflow -y

Перейдите к разделу Вывод модели, если вы хотите непосредственно увидеть результат в действии.

Установить сетфит

%pip install setfit

Давайте перейдем к примеру кода.

Постановка задачи:

Представьте себя преподавателем, преподающим на YouTube, вы хотели увидеть вопросы, поступающие от студентов. Но в разделе комментариев какой-то беспорядок. Создайте систему для фильтрации вопросов из беспорядка комментариев.

Формально по комментарию можно определить, является ли текст вопросом или нет.

Загрузите набор данных в фрейм данных pandas и отфильтруйте поле комментария.

comments_df = pd.read_csv('/kaggle/input/youtube-data-science-channels-comments/Coreyms_comments.csv',engine='python')
comments_text_df = pd.DataFrame(comments_df['snippet_topLevelComment_snippet_textOriginal'])

Посмотрите образцы комментариев. Запустите приведенную ниже ячейку, чтобы создать образец для каждого класса (вопрос и не_вопрос).

comments_text_df.sample(5)

Курирование данных

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

# questions is a list of text comments which are questions.
# not_questions is a list of text comments which are  not questions.
df = pd.DataFrame()
df['text'] = questions
df['label'] = True

df1 = pd.DataFrame()
df1['text'] = not_questions
df1['label'] = False

combined_comments_df = pd.concat([df,df1])
combined_comments_df = combined_comments_df.reset_index(drop =True)

Преобразование pandas dataFrame в наборы данных Hugging Face

from datasets import Dataset
dataset = Dataset.from_pandas(combined_comments_df)
dataset
from setfit import SetFitModel
model_id = 'sentence-transformers/all-MiniLM-L6-v2'
model = SetFitModel.from_pretrained(model_id)

Этот model_id можно изменить на любую из предварительно обученных моделей sentence-transformers.

Тренировочный сетфит

Давайте определим наш SetFitTrainer.

from sentence_transformers.losses import CosineSimilarityLoss

from setfit import SetFitTrainer

trainer = SetFitTrainer(
    model=model,
    train_dataset=dataset,
    eval_dataset=dataset,
    loss_class=CosineSimilarityLoss,
    num_iterations=20,
    num_epochs=10,
    column_mapping={"text": "text", "label": "label"},
)
trainer.train()

Я также использовал тот же набор данных, что и eval_dataset. Мы также можем определить тренер без eval_dataset.

Примечание. Лучше иметь отдельный набор данных eval_dataset. Для чего нужно снова пометить несколько точек данных.

Вот и все, мы обучили классификатор всего с 16 примерами в каждом.

Если вы хотите, вы можете отправить свою модель в хаб и поделиться ею с другими.

Вывод модели

Обслуживание модели SetFit не сильно отличается от обслуживания любой модели HuggingFace.

Ниже показаны 2 примера для каждого класса.

from setfit import SetFitModel

model = SetFitModel.from_pretrained("tushifire/setfit_youtube_comments_is_a_question")

# Run inference
preds = model(["i loved the spiderman movie!", "pineapple on pizza is the worst 🤮"])
preds
# array([False, False])

preds = model(["""what video do I watch that takes the html_output and insert it into the actual html page?""",
               "Why does for loop end without a break statement"])
preds
# array([ True,  True])

Результаты неплохие.

Мы можем улучшить производительность классификатора:

  1. Использование более крупной предварительно обученной модели
  2. Выполнение поиска по гиперпараметрам
  3. Выявление предварительно обученной модели в том же домене, что и комментарии в социальных сетях, образовательный домен и т. д.

Полный код смотрите на kaggle Notebook.

Ссылка

  1. Рынок данных: https://www.grandviewresearch.com/industry-analysis/data-collection-labeling-market
  2. Блог Hugging Face: https://huggingface.co/blog/setfit
  3. Предобученные модели: https://www.sbert.net/docs/pretrained_models.html
  4. Репозиторий Github: https://github.com/huggingface/setfit
  5. Эффективное обучение в несколько приемов без подсказок https://arxiv.org/abs/2209.11055