Рубрики
Без рубрики

Тренинги без ярлыков

Эта статья является частью серии учебных пособий по Txtai, платформе семантического поиска с AI. Почти … с меткой ShowDev, MachineLearning, NLP, Python.

Эта статья является частью учебной серии о txtai , Семантический поисковый платформ с AI с AI.

Почти все доступные данные немечено. Маркированные данные требуют усилий, чтобы вручную просмотреть и/или требует времени для сбора. Классификация с нулевым выстрелом принимает существующие большие языковые модели и проводит сравнение сходства между текстом кандидата и списком этикетки. Было показано, что это выступает на удивление хорошо.

Проблема с классификаторами с нулевым выстрелом заключается в том, что им необходимо иметь большое количество параметров (400 м+), чтобы хорошо выполнять общие задачи, которые поставляются с значительными требованиями к аппаратному обеспечению.

В этой статье рассматриваются использование классификаторов с нулевым выстрелом для создания учебных данных для небольших моделей. Простая форма дистилляции знаний.

Установить txtai и все зависимости.

pip install txtai

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

import random

from datasets import load_dataset

from txtai.pipeline import Labels

def batch(texts, size):
    return [texts[x : x + size] for x in range(0, len(texts), size)]

# Set random seed for repeatable sampling
random.seed(42)

ds = load_dataset("glue", "sst2")

sentences = random.sample(ds["train"]["sentence"], 1000)

# Load a zero shot classifier - txtai provides this through the Labels pipeline
labels = Labels("microsoft/deberta-large-mnli")

train = []

# Zero-shot prediction using ["negative", "positive"] labels
for chunk in batch(sentences, 32):
    train.extend([{"text": chunk[x], "label": label[0][0]} for x, label in enumerate(labels(chunk, ["negative", "positive"]))])

Далее мы будем использовать учебный набор, который мы только что создали, чтобы обучить меньшую модель Electra.

from txtai.pipeline import HFTrainer

trainer = HFTrainer()
model, tokenizer = trainer("google/electra-base-discriminator", train, num_train_epochs=5)

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

Во-первых, давайте посмотрим, какая базовая точность для модели с нулевым выстрелом будет против набора оценки SST2. Напоминание о том, что это не видел ни одного из данных обучения SST2.

labels = Labels("microsoft/deberta-large-mnli")
results = [row["label"] == labels(row["sentence"], ["negative", "positive"])[0][0] for row in ds["validation"]]
sum(results) / len(ds["validation"])
0.8818807339449541

Точность 88,18%, неплохой для модели, которая вообще не была обучена набору данных! Показывает силу нулевой классификации.

Далее, давайте протестируем нашу модель, обученную на 1000 с ноль-выстрелами.

labels = Labels((model, tokenizer), dynamic=False)

results = [row["label"] == labels(row["sentence"])[0][0] for row in ds["validation"]]
sum(results) / len(ds["validation"])
0.8864678899082569

88,65% Точность! Не будет слишком увлечен процентами, но это, по крайней мере, соответствует точности классификатора с нулевым выстрелом, если не превышает его.

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

В этом записном книжке изучался метод создания обученных текстовых классификаторов без доступных данных обучения. Учитывая количество ресурсов, необходимых для выполнения крупномасштабных классификаторов с нулевым выстрелом, этот метод является простым способом создания более мелких моделей, настроенных для определенных задач. В этом примере классификатор с нулевым выстрелом имеет параметры 400 м, а обученный текстовый классификатор имеет 110 м.

Оригинал: “https://dev.to/neuml/train-without-labels-375j”