Поэлементные операции и broadcasting

Keras.js — это библиотека для запуска предобученных моделей Keras прямо в браузере на JavaScript с использованием WebGL. Для эффективной работы с тензорами в Keras.js критически важно понимать поэлементные операции и broadcasting, так как они лежат в основе большинства вычислений нейронных сетей.


Поэлементные операции

Поэлементные операции выполняются индекс за индексом, то есть каждая операция применяется к соответствующим элементам входных массивов. В Keras.js это реализуется на уровне Tensor объектов.

Примеры поэлементных операций:

  • Сложение: C = A + B, где каждый элемент C[i] = A[i] + B[i].
  • Вычитание: C = A - B.
  • Умножение: C = A * B.
  • Деление: C = A / B.
  • Функции активации: ReLU, sigmoid, tanh также применяются поэлементно.

Особенности реализации:

  • Операции не создают циклы вручную. Keras.js использует WebGL шейдеры для выполнения вычислений на GPU.
  • Все поэлементные операции требуют совпадения формы тензоров, если не используется broadcasting.
const a = new KerasJS.Tensor([2, 2], Float32Array.from([1, 2, 3, 4]));
const b = new KerasJS.Tensor([2, 2], Float32Array.from([5, 6, 7, 8]));
const c = a.add(b); // каждый элемент a[i] + b[i]

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


Broadcasting

Broadcasting — это механизм, который позволяет выполнять поэлементные операции над тензорами разных форм, автоматически расширяя меньший тензор до формы большего.

Основные правила broadcasting:

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

Пример:

const a = new KerasJS.Tensor([3, 1], Float32Array.from([1, 2, 3]));
const b = new KerasJS.Tensor([1, 4], Float32Array.from([10, 20, 30, 40]));
const c = a.add(b);
  • Тензор a имеет форму [3,1].
  • Тензор b имеет форму [1,4].
  • Broadcasting расширяет a до [3,4] и b до [3,4], после чего выполняется поэлементное сложение.

Примеры практического использования

  1. Сложение смещений (bias) к матрице активаций:
const X = new KerasJS.Tensor([32, 128]); // 32 примера, 128 нейронов
const bias = new KerasJS.Tensor([128]);  // bias для каждого нейрона
const output = X.add(bias); // bias автоматически broadcast
  1. Масштабирование и нормализация данных:
const features = new KerasJS.Tensor([64, 10]);
const scale = new KerasJS.Tensor([1, 10]); // один коэффициент на каждую колонку
const normalized = features.mul(scale); // broadcasting по строкам
  1. Элементарные функции активации:
const preActivation = new KerasJS.Tensor([128]);
const activated = preActivation.relu(); // ReLU применяется поэлементно

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

  • WebGL ускорение: поэлементные операции и broadcasting в Keras.js реализованы через шейдеры. Это позволяет обрабатывать большие массивы чисел на GPU.
  • Избегание лишних копий: создание новых тензоров при каждом действии может потреблять память. При работе с большими батчами рекомендуется использовать inPlace версии функций, если они доступны.
  • Контроль форм: корректное понимание broadcasting предотвращает ошибки типа «Shapes do not match» и повышает стабильность вычислений.

Важные особенности

  • Поэлементные операции в Keras.js всегда возвращают новый тензор.
  • Broadcasting работает автоматически, но необходимо следить за совместимостью размеров.
  • Операции поддерживаются как для float32, так и для int32 типов данных.
  • Использование broadcasting сокращает код и делает его выразительным, избавляя от ручного повторения массивов.

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