Слои встраивания Embedding

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

Основная концепция

Слой Embedding реализует отображение вида:

[ ]

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

Преимущества использования Embedding:

  • Снижение размерности представления категориальных данных.
  • Выделение семантических и синтаксических закономерностей между элементами.
  • Повышение эффективности обучения моделей NLP по сравнению с one-hot кодированием.

Синтаксис слоя в Keras.js

В Keras.js слой Embedding создаётся аналогично Keras для Python, с основными параметрами:

const embeddingLayer = new KerasJS.layers.Embedding({
  inputDim: 10000,   // размер словаря
  outputDim: 128,    // размерность векторов
  inputLength: 50    // длина входной последовательности
});
  • inputDim — количество уникальных индексов во входных данных (размер словаря).
  • outputDim — размерность векторов встраивания.
  • inputLength — длина входной последовательности, обязательна для моделей Sequential.

Особенности работы

  1. Инициализация весов: веса слоя Embedding обычно инициализируются случайными значениями и обучаются методом обратного распространения ошибки.
  2. Обработка последовательностей: на вход слой принимает одномерный массив индексов. Для батчей используется двумерная структура: [batch_size, sequence_length].
  3. Выход: после применения слоя выходная тензорная форма имеет вид [batch_size, sequence_length, outputDim], где каждый индекс заменяется на обучаемый вектор.

Применение в текстовых моделях

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

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

Пример подготовки входных данных:

// Словарь слов
const wordIndex = { 'привет': 1, 'мир': 2, 'машина': 3 };

// Последовательности
const sequences = [
  [1, 2],       // "привет мир"
  [3, 1, 2]     // "машина привет мир"
];

// Паддинг до длины 4
const paddedSequences = sequences.map(seq => {
  while (seq.length < 4) seq.push(0);
  return seq;
});

Использование предобученных векторов

Keras.js позволяет загружать веса Embedding из предобученных моделей, что ускоряет обучение и повышает качество распознавания семантики. Веса должны быть представлены в формате .bin или .json для Keras.js:

const embeddingLayer = new KerasJS.layers.Embedding({
  inputDim: 10000,
  outputDim: 128,
  inputLength: 50,
  weights: [pretrainedWeights],  // массив весов
  trainable: false               // фиксируем веса при обучении
});

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

  • trainable: установка в false позволяет использовать слой только для извлечения признаков, что полезно при работе с предобученными эмбеддингами.
  • maskZero: параметр для игнорирования индекса 0 в последовательностях (важно при паддинге). В Keras.js поддержка маскирования может требовать ручной обработки.
  • Регуляризация: можно применять Dropout после слоя Embedding, чтобы предотвратить переобучение.

Примеры архитектур с Embedding

  • Модель для классификации текста:
const model = new KerasJS.models.Sequential();
model.add(new KerasJS.layers.Embedding({
  inputDim: 5000,
  outputDim: 128,
  inputLength: 100
}));
model.add(new KerasJS.layers.LSTM({ units: 64 }));
model.add(new KerasJS.layers.Dense({ units: 1, activation: 'sigmoid' }));
  • Модель для генерации текста:
model.add(new KerasJS.layers.Embedding({
  inputDim: vocabSize,
  outputDim: 256,
  inputLength: seqLength
}));
model.add(new KerasJS.layers.GRU({ units: 512, returnSequences: true }));
model.add(new KerasJS.layers.TimeDistributed({
  layer: new KerasJS.layers.Dense({ units: vocabSize, activation: 'softmax' })
}));

Слой Embedding обеспечивает мощный инструмент для работы с категориальными и текстовыми данными в браузере и Node.js. Его гибкость позволяет интегрировать предобученные векторы и строить глубокие последовательные модели без необходимости ручного кодирования сложных признаков.