Матричное умножение: tf.matMul

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

Синтаксис и аргументы

tf.matMul(a, b, transposeA = false, transposeB = false)

Аргументы:

  • a — первый тензор. Должен быть двумерным или более высокой размерности (в случае батчевого умножения).
  • b — второй тензор. Размерности должны быть совместимы с размерностями a.
  • transposeA — булевый флаг, указывающий, следует ли транспонировать тензор a перед умножением. По умолчанию false.
  • transposeB — булевый флаг для транспонирования тензора b. По умолчанию false.

Возвращаемое значение: новый тензор, являющийся результатом матричного умножения.

Принципы работы

Матрицы умножаются по правилу: число столбцов первой матрицы должно совпадать с числом строк второй. Если A имеет размерность [m, n], а B[n, p], результат tf.matMul(A, B) будет иметь форму [m, p].

Пример базового умножения:

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

c.print(); // [[19, 22], [43, 50]]

Здесь выполняется стандартное умножение матриц:

[ ]

Транспонирование

Параметры transposeA и transposeB позволяют изменить ориентацию матриц перед вычислением. Это полезно, когда данные изначально представлены в «неправильной» форме.

Пример:

const a = tf.tensor2d([[1, 2], [3, 4]]);
const b = tf.tensor2d([[5, 6], [7, 8]]);
const c = tf.matMul(a, b, true, false);

c.print(); // [[26, 30], [38, 44]]

В данном случае a транспонируется и становится [ [1,3], [2,4] ], что изменяет результат умножения.

Батчевое умножение матриц

tf.matMul поддерживает многомерные тензоры, где первые размерности рассматриваются как батчи. Это позволяет эффективно обрабатывать сразу несколько пар матриц.

Пример батчевого умножения:

const a = tf.tensor3d([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]); // shape [2, 2, 2]
const b = tf.tensor3d([[[1, 0], [0, 1]], [[1, 1], [1, 1]]]); // shape [2, 2, 2]
const c = tf.matMul(a, b);

c.print();
// [[[1, 2], [3, 4]], [[11, 11], [15, 15]]]

Здесь первая размерность [2] представляет две отдельные матрицы для умножения в одном вызове.

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

TensorFlow.js использует WebGL и WebGPU для ускорения операций с тензорами на GPU. tf.matMul автоматически оптимизирует вычисления в зависимости от устройства:

  • На CPU используются многопоточность и оптимизированные алгоритмы BLAS.
  • На GPU вычисления выполняются параллельно, что позволяет ускорить умножение больших матриц в сотни раз.

Частые ошибки

  1. Несовпадение размерностей: ошибка возникает, если число столбцов первой матрицы не совпадает с числом строк второй.
  2. Неправильное использование батчевых размерностей: при работе с 3D или 4D тензорами необходимо убедиться, что батчи одинаковой длины.
  3. Избыточное копирование данных: создание новых тензоров для каждой операции увеличивает нагрузку на память; рекомендуется использовать tf.tidy для управления памятью.

Практическое применение

  • Нейронные сети: вычисление z = X·W + b для линейного слоя.
  • Компьютерное зрение: операции свертки часто сводятся к матричному умножению после преобразования входных данных в матрицы через im2col.
  • Обработка графов и рекомендаций: умножение разреженных матриц для вычисления весов и предсказаний.

Полезные методы совместно с tf.matMul

  • tf.transpose() — ручное транспонирование тензора перед умножением.
  • tf.add() или tf.addN() — добавление смещения после умножения.
  • tf.tidy() — управление жизненным циклом тензоров для оптимизации памяти.

Матрица-умножение является ядром многих алгоритмов, поэтому понимание всех нюансов tf.matMul позволяет эффективно строить модели и оптимизировать вычисления в TensorFlow.js.