tf.Variable: создание и обновление

TensorFlow.js предоставляет возможность работы с переменными через объект tf.Variable. Переменные используются для хранения параметров моделей, которые изменяются в процессе обучения. В отличие от тензоров tf.Tensor, которые неизменяемы, tf.Variable допускает изменение значений без необходимости пересоздавать объект.


Инициализация tf.Variable

Переменная создается на основе тензора:

const tf = require('@tensorflow/tfjs');

// Создание тензора
const initial = tf.tensor([1, 2, 3, 4]);

// Создание переменной на основе тензора
const v = tf.variable(initial);

Ключевые моменты:

  • tf.variable(initialTensor, trainable=true, name=null)

    • initialTensor — исходный тензор, на основе которого создается переменная.
    • trainable — логическое значение, определяющее, будут ли веса обновляться в процессе оптимизации. По умолчанию true.
    • name — необязательное имя переменной для идентификации в графе модели.

Переменная наследует форму и тип исходного тензора:

console.log(v.shape);  // [4]
console.log(v.dtype);  // 'float32'

Обновление значений переменной

Изменение значений переменной осуществляется через метод .assign():

v.assign(tf.tensor([5, 6, 7, 8]));
console.log(v.dataSync());  // [5, 6, 7, 8]

Особенности метода assign:

  • Принимает тензор той же формы, что и у переменной.
  • Позволяет обновлять данные без создания нового объекта.
  • Используется внутри оптимизаторов для обновления параметров модели.

Атомарные операции с tf.Variable

TensorFlow.js поддерживает математические операции напрямую с переменной, но результат таких операций возвращается в виде нового тензора, а не переменной. Для сохранения результата в исходной переменной требуется .assign():

const increment = tf.scalar(1);
v.assign(v.add(increment));
console.log(v.dataSync());  // [6, 7, 8, 9]

Другие распространенные операции:

  • v.sub(tensor) — вычитание
  • v.mul(tensor) — умножение
  • v.div(tensor) — деление
  • v.square() — возведение в квадрат
  • v.neg() — инверсия знака

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


Переменные и оптимизация

Оптимизаторы TensorFlow.js работают с переменными, автоматически обновляя их значения на основе градиентов:

const learningRate = 0.1;
const optimizer = tf.train.sgd(learningRate);

const w = tf.variable(tf.scalar(0.5));

function loss() {
  return w.square().sub(tf.scalar(1)).square();
}

for (let i = 0; i < 10; i++) {
  optimizer.minimize(loss);
}

console.log(w.dataSync());  // значение стремится к 1

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

  • optimizer.minimize(fn) вычисляет градиенты функции fn относительно переменных, участвующих в вычислениях.
  • Переменные, отмеченные как trainable: true, автоматически обновляются.
  • Для нестандартных обновлений можно использовать tf.tidy() для управления памятью и assign для ручного изменения значений.

Преобразование tf.Variable в tf.Tensor

Иногда необходимо получить неизменяемый тензор из переменной:

const tensorFromVar = v.tensor;
console.log(tensorFromVar instanceof tf.Tensor);  // true

Методы v.data() или v.dataSync() позволяют получить значения в виде массива:

v.data().then(data => console.log(data));  // [6, 7, 8, 9]

Переменные с несколькими измерениями

tf.Variable поддерживает тензоры любой размерности:

const matrix = tf.tensor([[1, 2], [3, 4]]);
const mVar = tf.variable(matrix);

// Изменение значений
mVar.assign(tf.tensor([[5, 6], [7, 8]]));

Форма и тип должны совпадать, иначе будет выброшена ошибка:

// Ошибка: форма не совпадает
// mVar.assign(tf.tensor([1, 2, 3]));

Резюме ключевых особенностей

  • tf.Variable — изменяемый тензор для хранения параметров.
  • Инициализация через tf.variable(initialTensor).
  • Изменение данных методом assign().
  • Используется в оптимизации моделей вместе с градиентами.
  • Поддерживает тензоры любой формы и типа.
  • Операции над переменной возвращают новые тензоры, для сохранения результата используется assign.

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