Предобработка текста: токенизация, padding, attention mask

ONNX Runtime Web предоставляет мощные инструменты для работы с моделями машинного обучения в браузере и Node.js, требуя от разработчика внимательной подготовки входных данных. Для моделей обработки естественного языка (NLP) ключевым этапом является предобработка текста, включающая токенизацию, padding и формирование attention mask.

Токенизация

Токенизация — процесс разбиения текста на отдельные единицы, которые модель способна интерпретировать. В контексте ONNX Runtime Web чаще всего применяются токенизаторы, совместимые с трансформерами, такими как BERT, GPT или RoBERTa.

  • Преобразование текста в токены: Каждое слово или подслово преобразуется в числовой идентификатор. Это необходимо, поскольку модель работает с векторными представлениями токенов.
  • Использование pre-trained токенизаторов: Для ONNX моделей обычно используют токенизаторы из Hugging Face или конвертированные в формате tokenizer.json, чтобы обеспечить идентичность токенов и словаря модели.

Пример в JavaScript с использованием библиотеки @huggingface/tokenizers:

import { Tokenizer } from '@huggingface/tokenizers';

const tokenizer = await Tokenizer.fromFile('tokenizer.json');
const encoded = tokenizer.encode("Пример текста для токенизации");
console.log(encoded.ids); // массив числовых идентификаторов токенов

Ключевой момент: результат токенизации должен быть представлен в виде массива чисел фиксированной длины, пригодной для передачи в ONNX Runtime Web.

Padding

Модели трансформеров ожидают входы одинаковой длины. Для текстов разной длины используется padding — добавление специальных токенов (обычно [PAD]) до заданной максимальной длины последовательности.

  • Определение максимальной длины: Обычно выбирается максимальная длина, поддерживаемая моделью (max_length), либо длина самой длинной последовательности в батче.
  • Наполнение последовательностей: Токены [PAD] добавляются либо в конец, либо в начало последовательности в зависимости от модели. BERT, например, использует пост-padding.

Пример:

const maxLength = 16;
const paddedIds = [...encoded.ids];
while (paddedIds.length < maxLength) {
    paddedIds.push(0); // 0 обычно обозначает [PAD]
}

Padding обеспечивает корректную работу модели и предотвращает ошибки при пакетной обработке нескольких текстов.

Attention mask

Attention mask указывает модели, какие токены являются значимыми, а какие — заполнителями ([PAD]). Это необходимо для корректного расчета внимания в трансформерах.

  • Формат: Массив из единиц и нулей, где 1 соответствует реальному токену, а 0 — токену padding.
  • Назначение: Модель игнорирует нули при вычислении self-attention, предотвращая влияние padding на выходные векторы.

Пример формирования attention mask:

const attentionMask = paddedIds.map(id => id === 0 ? 0 : 1);

Для батчей формируется двумерный массив размером [batch_size, sequence_length].

Подготовка входных данных для ONNX Runtime Web

ONNX Runtime Web принимает тензоры в формате TypedArray. После токенизации, padding и создания attention mask, данные преобразуются в тензоры типа Int32Array или Float32Array.

import * as ort from 'onnxruntime-web';

const inputIdsTensor = new ort.Tensor('int32', Int32Array.from(paddedIds), [1, maxLength]);
const attentionMaskTensor = new ort.Tensor('int32', Int32Array.from(attentionMask), [1, maxLength]);

const session = await ort.InferenceSession.create('model.onnx');
const feeds = { input_ids: inputIdsTensor, attention_mask: attentionMaskTensor };
const results = await session.run(feeds);

Важно учитывать, что имена входных тензоров (input_ids, attention_mask) должны соответствовать именам, ожидаемым моделью ONNX.

Практические рекомендации

  • Всегда проверять, совпадает ли словарь токенизатора с используемой моделью.
  • Для динамических батчей необходимо согласовывать длину последовательностей через padding, чтобы все последовательности имели одинаковый размер.
  • Attention mask обязателен для всех моделей трансформеров; игнорирование маски может привести к неправильным результатам.
  • Для эффективного выполнения в браузере следует использовать WebAssembly или WebGL ускорение, поддерживаемое ONNX Runtime Web.

Предобработка текста — критический этап, напрямую влияющий на точность и производительность модели в веб-среде. Правильная токенизация, padding и формирование attention mask обеспечивают корректное функционирование трансформеров на клиентской стороне.