One-hot кодирование

One-hot кодирование — это метод представления категориальных данных в виде бинарных векторов, где каждой категории соответствует уникальный индекс, а значение в этом индексе равно 1, а все остальные элементы вектора — 0. Этот подход широко применяется при работе с нейронными сетями, так как большинство моделей требуют числового представления входных данных.


Основные принципы

Пусть имеется множество категорий: ['красный', 'зелёный', 'синий']. Каждая категория преобразуется в вектор фиксированной длины, равной количеству категорий. Для данного примера:

  • 'красный'[1, 0, 0]
  • 'зелёный'[0, 1, 0]
  • 'синий'[0, 0, 1]

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


Создание one-hot векторов в TensorFlow.js

TensorFlow.js предоставляет встроенные функции для преобразования категориальных данных в формат one-hot.

import * as tf from '@tensorflow/tfjs';

// Пример категориальных данных
const labels = [0, 1, 2, 1]; // Индексы категорий
const numClasses = 3;

// Преобразование в one-hot векторы
const oneHotLab els = tf.oneHot(labels, numClasses);

oneHotLabels.print();

Результат:

[[1, 0, 0],
 [0, 1, 0],
 [0, 0, 1],
 [0, 1, 0]]

Ключевые моменты:

  • tf.oneHot(indices, depth) — indices: массив индексов категорий, depth: общее число категорий.
  • В результате создаётся тензор типа float32 по умолчанию.
  • Поддерживаются многомерные индексы, что позволяет создавать one-hot для батчей данных сразу.

Работа с текстовыми данными

Для текста сначала необходимо преобразовать слова в числовые индексы. Пример с набором слов:

const vocabulary = ['кот', 'собака', 'птица'];
const wordToIndex = {
  'кот': 0,
  'собака': 1,
  'птица': 2
};

const text = ['кот', 'птица', 'собака'];
const indices = text.map(word => wordToIndex[word]);

const oneHotT ext = tf.oneHot(indices, vocabulary.length);
oneHotText.print();

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


Интеграция с обучением модели

При обучении моделей TensorFlow.js one-hot часто используется для меток классов. Например, при многоклассовой классификации:

const xs = tf.tensor2d([
  [0.1, 0.2],
  [0.4, 0.5],
  [0.7, 0.8]
]);

const ys = tf.oneHot([0, 1, 2], 3); // Метки классов

const model = tf.sequential();
model.add(tf.layers.dense({units: 5, inputShape: [2], activation: 'relu'}));
model.add(tf.layers.dense({units: 3, activation: 'softmax'}));

model.compile({optimizer: 'adam', loss: 'categoricalCrossentropy', metrics: ['accuracy']});

model.fit(xs, ys, {epochs: 50}).then(() => {
  console.log('Обучение завершено');
});

Особенности:

  • Для многоклассовой классификации необходима функция потерь categoricalCrossentropy.
  • Выходной слой должен иметь количество нейронов, равное числу категорий.
  • Метки в формате one-hot позволяют корректно рассчитывать градиенты для всех классов одновременно.

Альтернативы и расширенные возможности

  • Sparse one-hot: Иногда удобно использовать числовые индексы напрямую с sparseCategoricalCrossentropy, что экономит память.
  • Обработка батчей: tf.oneHot можно применять к многомерным массивам, формируя батчи данных для обучения.
  • Встраивание в pipeline: One-hot кодирование может быть объединено с нормализацией входных данных, токенизацией текста и другими методами предобработки для создания полного потока подготовки данных.

Важные советы по производительности

  1. Не создавать тензоры в цикле без tf.tidy — это может привести к утечке памяти.
  2. Использовать tf.oneHot вместо ручного создания массивов — это обеспечивает оптимизацию под GPU и WebGL.
  3. Проверять размерность — часто ошибки возникают из-за несоответствия размерности входных данных и меток.

One-hot кодирование в TensorFlow.js — фундаментальный инструмент для работы с категориальными данными и текстом, обеспечивающий правильное представление информации для нейронных сетей. Правильное применение этого подхода повышает точность моделей и упрощает обработку данных при обучении.