Арифметические операции

TensorFlow.js предоставляет набор инструментов для работы с многомерными массивами данных (тензорами) и выполнения над ними арифметических операций. Основной объект библиотеки — tf.Tensor, который является фундаментальной структурой данных. Арифметические операции применяются к тензорам элемент-wise, что означает, что операция выполняется отдельно для каждого элемента соответствующих массивов.


Создание тензоров

Тензоры создаются с помощью функции tf.tensor, которая принимает массив значений и необязательный параметр формы (shape):

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

Ключевой момент: если форма массива не указана, она выводится автоматически из вложенности массива. В TensorFlow.js поддерживаются тензоры до 6 измерений.


Сложение и вычитание

Для сложения используется метод tf.add:

const x = tf.tensor([1, 2, 3]);
const y = tf.tensor([4, 5, 6]);
const z = tf.add(x, y); // Результат: [5, 7, 9]

Вычитание выполняется с помощью tf.sub:

const w = tf.sub(y, x); // Результат: [3, 3, 3]

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

  • Операции поддерживают broadcasting. Если тензоры имеют разную форму, библиотека автоматически расширяет меньший тензор до формы большего, если это возможно.

Умножение и деление

Для умножения используется tf.mul, для деления — tf.div:

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

const mulResult = tf.mul(a, b); // [4, 10, 18]
const divResult = tf.div(b, a); // [4, 2.5, 2]

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

  • tf.mul и tf.div выполняют поэлементные операции, а не матричные.
  • Для матричного умножения используется tf.matMul.

Возведение в степень

Для возведения тензора в степень применяется tf.pow:

const t = tf.tensor([2, 3, 4]);
const tSquared = tf.pow(t, 2); // [4, 9, 16]

Также поддерживается возведение в тензорную степень:

const t2 = tf.tensor([1, 2, 3]);
const result = tf.pow(t, t2); // [2^1, 3^2, 4^3] -> [2, 9, 64]

Арифметические функции с одним аргументом

TensorFlow.js содержит ряд встроенных функций для преобразования тензоров:

  • tf.abs(t) — абсолютное значение
  • tf.neg(t) — отрицание
  • tf.sqrt(t) — квадратный корень
  • tf.exp(t) — экспонента
  • tf.log(t) — натуральный логарифм
const t = tf.tensor([-1, 4, 9]);
const sqrtT = tf.sqrt(tf.abs(t)); // [1, 2, 3]

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


Смешивание операций

Арифметические операции можно комбинировать в цепочки:

const a = tf.tensor([1, 2, 3]);
const b = tf.tensor([4, 5, 6]);
const c = tf.tensor([7, 8, 9]);

const result = tf.add(tf.mul(a, b), c); // a * b + c -> [11, 18, 27]

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


Операции с матрицами

Для двумерных тензоров (матриц) применяются как поэлементные операции, так и матричное умножение:

const m1 = tf.tensor2d([[1, 2], [3, 4]]);
const m2 = tf.tensor2d([[5, 6], [7, 8]]);

const elementWise = tf.add(m1, m2); // [[6, 8], [10, 12]]
const matMul = tf.matMul(m1, m2);    // [[19, 22], [43, 50]]

Разница: tf.add выполняет сложение поэлементно, tf.matMul — классическое матричное умножение.


Broadcasting

Broadcasting позволяет автоматически согласовывать формы тензоров при арифметических операциях. Пример:

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

const result = tf.add(a, b); // [[11, 22], [13, 24]]

Правила broadcasting:

  1. Если размеры тензоров различны, меньший тензор «растягивается» по размерности.
  2. Размерность 1 может расширяться до размера соответствующего измерения.
  3. Если размеры не совместимы, возникает ошибка.

Управление памятью

TensorFlow.js работает как на CPU, так и на GPU. Каждый тензор занимает память до явного освобождения:

const t = tf.tensor([1, 2, 3]);
// используем t для операций
t.dispose(); // освобождает память

Для автоматического управления можно использовать блоки tf.tidy:

const result = tf.tidy(() => {
    const a = tf.tensor([1, 2, 3]);
    const b = tf.tensor([4, 5, 6]);
    return tf.add(a, b); // a и b будут автоматически освобождены
});

Итоговые рекомендации по арифметике

  • Использовать поэлементные функции (tf.add, tf.mul, tf.pow) для операций на одинаковых или broadcast-совместимых тензорах.
  • Для матриц применять tf.matMul вместо поэлементного умножения.
  • Всегда контролировать память через dispose или tf.tidy.
  • Комбинировать операции можно, но следует учитывать порядок выполнения и размерность тензоров.

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