Операции сравнения и логические операции

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


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

Операции сравнения в TensorFlow.js возвращают тензоры типа bool, где каждый элемент указывает результат сравнения соответствующих элементов исходных тензоров. Основные функции:

  • tf.equal(a, b) — проверяет, равны ли элементы тензоров a и b.
  • tf.notEqual(a, b) — проверяет неравенство элементов.
  • tf.greater(a, b) — возвращает true, если элемент a больше элемента b.
  • tf.greaterEqual(a, b) — возвращает true, если элемент a больше или равен элементу b.
  • tf.less(a, b) — возвращает true, если элемент a меньше элемента b.
  • tf.lessEqual(a, b) — возвращает true, если элемент a меньше или равен элементу b.

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

const a = tf.tensor([1, 3, 5]);
const b = tf.tensor([2, 3, 4]);

const eq = tf.equal(a, b);         // [false, true, false]
const gt = tf.greater(a, b);       // [false, false, true]
const le = tf.lessEqual(a, b);     // [true, true, false]

Каждая из этих функций поддерживает broadcasting, что позволяет сравнивать тензоры разных форм. Например:

const x = tf.tensor([1, 2, 3]);
const y = tf.scalar(2);

const result = tf.greater(x, y);   // [false, false, true]

Логические операции

Логические операции работают с тензорами типа bool и позволяют комбинировать условия:

  • tf.logicalAnd(a, b) — поэлементная логическая конъюнкция (AND).
  • tf.logicalOr(a, b) — поэлементная логическая дизъюнкция (OR).
  • tf.logicalNot(a) — поэлементное отрицание (NOT).
  • tf.logicalXor(a, b) — поэлементное исключающее ИЛИ (XOR).

Пример:

const p = tf.tensor([true, false, true]);
const q = tf.tensor([false, false, true]);

const andResult = tf.logicalAnd(p, q);   // [false, false, true]
const orResult = tf.logicalOr(p, q);     // [true, false, true]
const notResult = tf.logicalNot(p);      // [false, true, false]

Подобные операции особенно полезны при создании масок для фильтрации данных, например:

const data = tf.tensor([10, 20, 30, 40]);
const mask = tf.greater(data, tf.scalar(25)); // [false, false, true, true]
const filtered = data.mul(mask.cast('int32')); // [0, 0, 30, 40]

Использование масок и условий

В TensorFlow.js условные операции позволяют применять элементы тензора только при выполнении определённого условия. Основные подходы:

  • tf.where(condition, a, b) — возвращает элементы из a, если условие condition истинно, иначе элементы из b.
  • tf.booleanMaskAsync(x, mask) — асинхронно извлекает элементы тензора x, где маска mask равна true.

Пример применения tf.where:

const x = tf.tensor([1, 2, 3, 4]);
const y = tf.tensor([10, 20, 30, 40]);
const condition = tf.less(x, tf.scalar(3));

const result = tf.where(condition, x, y); // [1, 2, 30, 40]

Комбинирование логических операций

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

const data = tf.tensor([5, 10, 15, 20, 25]);
const lowerBound = tf.greaterEqual(data, tf.scalar(10));
const upperBound = tf.lessEqual(data, tf.scalar(20));

const rangeMask = tf.logicalAnd(lowerBound, upperBound); // [false, true, true, true, false]
const filtered = data.mul(rangeMask.cast('int32'));      // [0, 10, 15, 20, 0]

Оптимизация и особенности

  1. Broadcasting позволяет применять сравнения и логические операции между тензорами разной формы, что снижает необходимость ручного расширения размеров.
  2. Логические операции в TensorFlow.js работают поэлементно, что делает их безопасными для векторизованных вычислений.
  3. Результаты операций типа bool можно преобразовать в числовые типы через .cast('float32') или .cast('int32'), что удобно для дальнейших вычислений и интеграции с другими слоями модели.

Применение в моделях

Операции сравнения и логические операции часто применяются в:

  • Реализации условной активации слоёв.
  • Создании масок внимания в трансформерах и NLP-моделях.
  • Фильтрации и нормализации данных перед подачей на вход модели.
  • Сложных вычислительных пайплайнах с динамическими ветвями выполнения.

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