Universal Sentence Encoder

Universal Sentence Encoder (USE) — это мощная модель для получения векторных представлений предложений, фраз и текстовых блоков, которая позволяет эффективно выполнять задачи обработки естественного языка, такие как поиск по смыслу, классификация текста и кластеризация. В TensorFlow.js модель доступна для использования прямо в браузере или на сервере с Node.js, что обеспечивает удобство интеграции в веб-приложения.

Особенности модели

  • Представление текста в виде векторов фиксированной длины. USE преобразует текст любой длины в вектор размерности 512, сохраняя семантическую информацию.
  • Поддержка мультизадачности. Модель обучена на разнообразных корпусах текста, включая Wikipedia, веб-страницы и диалоги, что позволяет работать с широким спектром текстов.
  • Оптимизирована для JavaScript. TensorFlow.js версия позволяет выполнять все вычисления на клиенте или сервере без необходимости использовать Python.

Установка и подключение

В Node.js проект USE подключается через пакет @tensorflow-models/universal-sentence-encoder:

import * as use from '@tensorflow-models/universal-sentence-encoder';
import * as tf from '@tensorflow/tfjs-node';

Для браузерного использования подключение происходит через скрипт:

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder"></script>

После подключения модели необходимо её загрузить:

const model = await use.load();

Получение векторных представлений

Применение модели к тексту позволяет получить вектор фиксированной размерности, пригодный для последующей обработки:

const sentences = [
  "TensorFlow.js позволяет выполнять машинное обучение в браузере.",
  "Universal Sentence Encoder создаёт векторные представления предложений."
];

const embeddings = await model.embed(sentences);

embeddings.print();
  • Метод embed возвращает объект Tensor, где каждая строка соответствует вектору предложения.
  • Размерность тензора равна [число_предложений, 512].

Сравнение семантики предложений

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

function cosineSimilarity(vecA, vecB) {
  const dotProduct = vecA.dot(vecB).dataSync()[0];
  const normA = vecA.norm().dataSync()[0];
  const normB = vecB.norm().dataSync()[0];
  return dotProduct / (normA * normB);
}

const sentenceA = embeddings.slice([0, 0], [1, 512]);
const sentenceB = embeddings.slice([1, 0], [1, 512]);
const similarity = cosineSimilarity(sentenceA, sentenceB);
console.log('Косинусное сходство:', similarity);
  • Косинусное сходство лежит в диапазоне [-1, 1].
  • Значение ближе к 1 означает высокую семантическую близость.

Классификация текста

USE можно использовать как встроенный слой эмбеддинга для нейронных сетей:

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

const labels = tf.tensor([[1,0,0],[0,1,0],[0,0,1]]); // пример для трех классов

await modelTF.compile({optimizer: 'adam', loss: 'categoricalCrossentropy', metrics: ['accuracy']});
await modelTF.fit(embeddings, labels, {epochs: 10});
  • Входной слой получает 512-мерный вектор, сгенерированный USE.
  • Выходной слой соответствует числу классов задачи.
  • Такой подход позволяет использовать USE как готовый инструмент для классификации без необходимости обучать сложные языковые модели с нуля.

Работа с большим объёмом данных

  • Использование батчей для обработки текста повышает производительность и уменьшает нагрузку на память:
const batchSize = 32;
for (let i = 0; i < sentences.length; i += batchSize) {
  const batch = sentences.slice(i, i + batchSize);
  const batchEmbeddings = await model.embed(batch);
  // обработка batchEmbeddings
}
  • В Node.js можно ускорить работу за счет использования GPU через @tensorflow/tfjs-node-gpu.

Интеграция в приложения

  • Для поиска по смыслу в базе данных достаточно сохранить векторы предложений и вычислять сходство при запросах.
  • Для классификации отзывов, комментариев и текстовых данных можно использовать USE в качестве предварительной обработки перед подачей данных в нейронную сеть.
  • Для кластеризации текстов применяются алгоритмы вроде K-means к векторам, полученным с помощью модели.

Оптимизация и производительность

  • В браузере использование WebGL через TensorFlow.js позволяет ускорять вычисления.
  • Для мобильных и слабых устройств рекомендуется работать с меньшими батчами и асинхронной загрузкой модели.
  • Модель кэшируется после загрузки, что уменьшает время повторного использования.

Совместимость и ограничения

  • USE работает с английским текстом, но эксперименты показывают, что векторные представления могут использоваться для других языков с осторожностью.
  • Модель лучше справляется с короткими и средними предложениями; для очень длинных текстов рекомендуется разбивать их на сегменты.
  • Векторные эмбеддинги фиксированной длины (512) удобны для интеграции, но не сохраняют позиционной информации слов.