Компиляция модели: compile

Компиляция модели — ключевой этап в процессе работы с нейронными сетями. В TensorFlow.js метод compile задаёт параметры обучения, оптимизатор, функцию потерь и метрики, которые будут использоваться при обучении модели. Без компиляции модель нельзя обучать с помощью метода fit.

Основной синтаксис

model.compile({
  optimizer: 'sgd',
  loss: 'meanSquaredError',
  metrics: ['accuracy']
});

Параметры метода compile:

  • optimizer — определяет алгоритм оптимизации весов модели. Может быть строкой (например, 'sgd', 'adam') или экземпляром класса оптимизатора (tf.train.sgd(0.01)).
  • loss — функция потерь, используемая для оценки ошибки модели. Строковые значения, такие как 'categoricalCrossentropy' или 'meanSquaredError', либо пользовательская функция потерь.
  • metrics — массив метрик, которые будут рассчитываться при обучении и оценке модели ('accuracy', 'mse', 'mae' и т. д.).

Оптимизаторы

TensorFlow.js предоставляет готовые оптимизаторы, реализованные как методы в tf.train. Наиболее часто используемые:

  • SGD (tf.train.sgd(learningRate)) — стохастический градиентный спуск, базовый метод оптимизации.
  • Adam (tf.train.adam(learningRate)) — адаптивный оптимизатор с автоматической настройкой скорости обучения.
  • RMSProp (tf.train.rmsprop(learningRate)) — хорошо работает с рекуррентными сетями и нестабильными градиентами.

Пример использования оптимизатора с заданной скоростью обучения:

const optimizer = tf.train.adam(0.001);
model.compile({
  optimizer: optimizer,
  loss: 'categoricalCrossentropy',
  metrics: ['accuracy']
});

Функции потерь

Функция потерь определяет, насколько предсказания модели отклоняются от реальных значений. Основные функции потерь:

  • meanSquaredError (MSE) — среднеквадратичная ошибка, часто используется для задач регрессии.
  • meanAbsoluteError (MAE) — средняя абсолютная ошибка, менее чувствительна к выбросам.
  • categoricalCrossentropy — кросс-энтропия для задач многоклассовой классификации.
  • binaryCrossentropy — кросс-энтропия для двоичной классификации.
  • Пользовательские функции потерь — можно реализовать через функцию, принимающую два тензора: yTrue и yPred.

Пример пользовательской функции потерь:

const customLoss = (yTrue, yPred) => {
  return tf.mean(tf.square(tf.sub(yTrue, yPred)));
};

model.compile({
  optimizer: 'adam',
  loss: customLoss,
  metrics: ['mse']
});

Метрики

Метрики позволяют отслеживать эффективность модели на каждом этапе обучения. В compile можно использовать как встроенные метрики ('accuracy', 'mse'), так и собственные функции:

const customMetric = (yTrue, yPred) => {
  return tf.mean(tf.abs(tf.sub(yTrue, yPred)));
};

model.compile({
  optimizer: 'sgd',
  loss: 'meanSquaredError',
  metrics: [customMetric]
});

Особенности компиляции для разных типов моделей

  1. Последовательная модель (tf.Sequential) Компиляция применяется ко всей модели целиком. Пример:

    const model = tf.sequential();
    model.add(tf.layers.dense({units: 32, inputShape: [10], activation: 'relu'}));
    model.add(tf.layers.dense({units: 3, activation: 'softmax'}));
    
    model.compile({
      optimizer: 'adam',
      loss: 'categoricalCrossentropy',
      metrics: ['accuracy']
    });
  2. Модель с функциональным API (tf.model) Компиляция работает аналогично, но часто применяется для сложных архитектур с несколькими входами и выходами. Можно указать отдельные функции потерь для каждого выхода:

    const model = tf.model({inputs: inputLayer, outputs: [output1, output2]});
    model.compile({
      optimizer: 'adam',
      loss: ['meanSquaredError', 'categoricalCrossentropy'],
      metrics: [['mse'], ['accuracy']]
    });

Практические советы

  • Сбалансированный выбор функции потерь и метрик: для классификации используется кросс-энтропия, для регрессии — MSE или MAE.
  • Эксперименты с оптимизаторами и скоростью обучения позволяют избежать переобучения и ускорить сходимость.
  • Компиляция после определения всех слоев модели: изменение структуры после compile требует повторной компиляции.
  • Проверка правильности формы тензоров: несоответствие размеров входов и выходов часто приводит к ошибкам при компиляции.

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