Использование с TypeScript

Для использования библиотеки Brain.js в проектах на TypeScript необходимо учитывать типизацию входных данных и конфигурацию нейросетей. Brain.js предоставляет классы для создания различных видов нейросетей: Feedforward, LSTM, GRU, что требует правильного указания типов для входных и выходных данных.

Установка библиотеки и типовых определений осуществляется командой:

npm install brain.js
npm install --save-dev @types/brain.js

Импорт осуществляется через стандартный синтаксис ES6:

import { NeuralNetwork, ITrainingData } from 'brain.js';

Типизация данных для обучения

Тип ITrainingData описывает структуру обучающего примера:

interface ITrainingData {
  input: number[] | { [key: string]: number };
  output: number[] | { [key: string]: number };
}

Использование типизированных данных обеспечивает строгую проверку и предотвращает ошибки на этапе компиляции. Например:

const trainingData: ITrainingData[] = [
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] },
];

Создание и конфигурация нейросети

Для создания Feedforward нейросети применяется класс NeuralNetwork. Можно задавать параметры сети через объект конфигурации INeuralNetworkOptions:

import { NeuralNetwork, INeuralNetworkOptions } from 'brain.js';

const config: INeuralNetworkOptions = {
  activation: 'sigmoid', // Функция активации: 'sigmoid', 'relu', 'leaky-relu', 'tanh'
  hiddenLayers: [3],     // Количество нейронов в скрытых слоях
  learningRate: 0.01,    // Скорость обучения
};

const net = new NeuralNetwork(config);

Параметры activation и learningRate критичны для сходимости сети. Размер скрытого слоя определяется экспериментально в зависимости от сложности задачи.

Обучение сети

Метод train принимает массив данных с типом ITrainingData[] и возвращает объект с результатами обучения:

const result = net.train(trainingData, {
  iterations: 20000,
  errorThresh: 0.005,
  log: true,
  logPeriod: 1000,
});

Ключевые параметры:

  • iterations — максимальное количество эпох обучения.
  • errorThresh — порог допустимой ошибки.
  • log и logPeriod — позволяют отслеживать процесс обучения.

Тип result имеет структуру:

{
  error: number;
  iterations: number;
  trainingTime: number;
}

Прогнозирование с типизацией

После обучения сеть можно использовать для предсказаний через метод run. Для сохранения типизации рекомендуется явно указывать тип выходного значения:

const output: number[] = net.run([1, 0]) as number[];
console.log('Предсказание:', output);

Для сетей с объектными входами и выходами:

const outputObj: { [key: string]: number } = net.run({ a: 1, b: 0 }) as { [key: string]: number };

Сохранение и загрузка сети

Brain.js позволяет сериализовать обученную сеть в JSON и восстановить её позже:

const json = net.toJSON();
const net2 = new NeuralNetwork();
net2.fromJSON(json);

С помощью TypeScript можно типизировать JSON для проверки структуры:

interface INetworkJSON {
  sizes: number[];
  layers: Record<string, Record<string, number>>;
  outputLookup: boolean;
  inputLookup: boolean;
  inputMap?: Record<string, number>;
  outputMap?: Record<string, number>;
}

Использование LSTM и GRU

Для последовательных данных применяются LSTM и GRU сети:

import { LSTMTimeStep } from 'brain.js';

const lstm = new LSTMTimeStep({
  inputSize: 1,
  hiddenLayers: [10, 10],
  outputSize: 1,
});

const sequenceData = [[1, 2, 3, 4, 5], [10, 20, 30, 40]];
lstm.train(sequenceData, { iterations: 5000 });

Типизация входных данных для последовательностей:

const sequence: number[][] = [[1, 2, 3], [4, 5, 6]];

Советы по строгой типизации

  1. Всегда использовать ITrainingData для входных и выходных данных.
  2. Явно указывать тип возвращаемого значения run.
  3. Для сериализации и десериализации использовать интерфейсы JSON.
  4. Проверять типы параметров конфигурации сети (INeuralNetworkOptions, ILSTMTimeStepOptions).

Оптимизация обучения

  • Использовать нормализацию данных в диапазоне [0, 1] или [-1, 1].
  • Минимизировать количество скрытых нейронов, чтобы избежать переобучения.
  • Контролировать скорость обучения и функцию активации для устойчивости сети.

Правильная типизация с TypeScript обеспечивает контроль ошибок на этапе компиляции, упрощает поддержку кода и повышает читаемость больших проектов, использующих Brain.js.