TensorFlow.js — это библиотека для создания и обучения моделей машинного обучения непосредственно в браузере или на Node.js с использованием JavaScript. Основное преимущество заключается в том, что вычисления могут выполняться на клиентской стороне с использованием GPU через WebGL, что открывает возможности интерактивных и визуализированных приложений.
Модель в TensorFlow.js строится вокруг тензоров — многомерных массивов данных, которые являются основой всех вычислений. Основные операции над тензорами включают:
tf.tensor(),
tf.zeros(), tf.ones().add,
sub, mul, div.reshape,
transpose, slice.Тензоры поддерживают автоматическое дифференцирование через
tf.grad и tf.variable, что позволяет строить
сложные модели с градиентным спуском.
В TensorFlow.js нейронные сети строятся из слоев
(Layers API) или с использованием низкоуровневого API
(Core API). Наиболее часто применяются слои:
Dense — полностью связанный слой.Conv2D — сверточный слой для обработки
изображений.LSTM и GRU — рекуррентные слои для работы
с последовательностями.Dropout — регуляризация для предотвращения
переобучения.Пример создания простой модели:
const model = tf.sequential();
model.add(tf.layers.dense({units: 64, activation: 'relu', inputShape: [100]}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
model.compile({
optimizer: 'adam',
loss: 'categoricalCrossentropy',
metrics: ['accuracy']
});
Здесь ключевым является inputShape, определяющий форму
входных данных, и activation, задающий функцию активации
нейронов.
Механизм внимания (Attention) позволяет модели сосредотачиваться на наиболее значимых частях входной последовательности. Основная идея заключается в том, чтобы вычислять веса важности для каждого элемента последовательности и использовать их для формирования представления контекста.
Вычисление внимания происходит через скалярное произведение запросов и ключей с последующей нормализацией:
const scores = tf.matMul(Q, K, false, true);
const weights = tf.softmax(scores);
const output = tf.matMul(weights, V);
Здесь matMul используется для вычисления сходства между
Q и K, а softmax нормализует веса так, чтобы их сумма была
равна 1. Итоговое output — это взвешенная сумма значений
V.
TensorFlow.js поддерживает реализацию внимания через слои и матричные операции. Пример слоя self-attention:
class SelfAttention extends tf.layers.Layer {
constructor(config) {
super(config);
this.numHeads = config.numHeads;
this.keyDim = config.keyDim;
}
build(inputShape) {
this.Wq = this.addWeight('Wq', [inputShape[2], this.keyDim], 'float32', tf.initializers.glorotNormal());
this.Wk = this.addWeight('Wk', [inputShape[2], this.keyDim], 'float32', tf.initializers.glorotNormal());
this.Wv = this.addWeight('Wv', [inputShape[2], this.keyDim], 'float32', tf.initializers.glorotNormal());
super.build(inputShape);
}
call(inputs) {
const Q = tf.matMul(inputs, this.Wq.read());
const K = tf.matMul(inputs, this.Wk.read());
const V = tf.matMul(inputs, this.Wv.read());
const scores = tf.matMul(Q, K, false, true).div(Math.sqrt(this.keyDim));
const weights = tf.softmax(scores);
return tf.matMul(weights, V);
}
computeOutputShape(inputShape) {
return inputShape;
}
}
Ключевой момент — деление на корень квадратный из размерности
ключа при вычислении scores. Это стабилизирует
градиенты и предотвращает взрыв значения softmax.
Для обучения модели с вниманием используются стандартные оптимизаторы и функции потерь:
adam, sgd,
rmsprop.categoricalCrossentropy для классификации,
meanSquaredError для регрессии.Градиенты вычисляются автоматически через tf.variable и
model.fit:
await model.fit(xTrain, yTrain, {
batchSize: 32,
epochs: 50,
validationSplit: 0.2
});
Важное свойство TensorFlow.js — возможность интерактивного обучения прямо в браузере с визуализацией прогресса.
Для анализа работы модели удобно визуализировать веса внимания:
const attentionWeights = tf.softmax(tf.matMul(Q, K, false, true));
attentionWeights.print();
Это позволяет понять, на какие элементы последовательности модель фокусируется, и обеспечивает интерпретируемость результата.