Применение трансформеров

Модерация отзывов на сайте с помощью ИИ
(под ИИ имею ввиду модели машинного обученния класса генеративные трансформеры)
Если мы хотим определять нежелательные отзывы (нарушающие наши правила использования сайта) — это задача классификации. Т.е даем модели на входе комментарий (текст) и говорим классифицируй — нарушает правила или нет.
Можно классифицировать по бОльшему числу классов, например «хороший отзыв», «нарушает закон РФ», «содержит мат», «спам»
Архитектура модели для такой задачи, верхнеуровнево, состоит из:
- Токенизатора (который превращает текст отзыва в векторное представление — тензор)
- Модели (которая этот тензор классифицирует — говорит к какому классу он принадлежит)
Сама модель, на самом деле, тоже состоит из частей. Опять же верхнеуровнево это:
- Body (тело модели), которое возвращает только признаки (скрытые состояния) — понимание введенного текста в контексте.
- Head — которая уже заточена под определенную задачу, в данном случае классификация.
Головы можно менять. Использовать разные головы под разные задачи, с одной и той же моделью в качестве тела. Кроме этого можно подбирать разные токенизаторы и модели.
Hugging face представляет библиотеку, с которой можно быстро выстраивать такие конвееры, заменяя любую часть пайплайна и находя лучшую для вас комбинацию.
Для задачи модерации пользовательских отзывов на русском языке существует несколько готовых моделей на Hugging Face, которые можно использовать как «голову» (classificationhead) поверх русскоязычных BERT‑моделей. Например:
- s-nlp/russian_toxicity_classifier
- cointegrated/rubert-tiny-toxicity
- Mnwa/modernbert-toxic-russian
- t-bank-ai/response-toxicity-classifier-base
Одна из них от Т-банка, как видите.
Примеры кода
from transformers import pipeline
classifier = pipeline("sentiment-analysis")
classifier(
[
"I've been waiting for a HuggingFace course my whole life.",
"I hate this so much!",
]
)
from transformers import AutoTokenizer
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
raw_inputs = [
"I've been waiting for a HuggingFace course my whole life.",
"I hate this so much!",
]
inputs = tokenizer(raw_inputs, padding=True, truncation=True, return_tensors="pt")
from transformers import AutoModelForSequenceClassification
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)
outputs = model(**inputs)
print(outputs.logits)
tensor([[-1.5607, 1.6123],
[ 4.1692, -3.3464]], grad_fn=<AddmmBackward>)
import torch
predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
print(predictions)
tensor([[4.0195e-02, 9.5980e-01],
[9.9946e-01, 5.4418e-04]], grad_fn=<SoftmaxBackward>)