Интерфейсы и типы

Mind.js — это библиотека для работы с нейронными сетями и машинным обучением на JavaScript. В её основе лежит простая, но мощная архитектура, позволяющая создавать, обучать и использовать модели нейросетей без сложной конфигурации. Ключевым элементом при работе с Mind.js являются интерфейсы и типы данных, которые обеспечивают строгую структуру и предсказуемость поведения сети.


Основные типы данных

Mind.js использует несколько базовых типов данных для представления входов, выходов и параметров сети:

  • Number — числовые значения, чаще всего применяются для представления входных и выходных признаков. Например, пиксели изображения или значения сенсоров.
  • Array — массивы чисел, используемые для многомерных входов и выходов. Это основной формат для подачи данных в нейронную сеть.
  • Object — ключ-значение объекты, применяемые для более сложных структур данных, где важна семантика каждого признака.

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


Интерфейс NeuralNetwork

Центральным интерфейсом библиотеки является NeuralNetwork. Он определяет структуру сети, методы её обучения и прогнозирования:

interface NeuralNetwork {
    train(data: Array<TrainingSample>, options?: TrainOptions): TrainingResult;
    run(input: Array<Number> | Object): Array<Number> | Object;
    fromJSON(json: Object): void;
    toJSON(): Object;
}
  • train — метод обучения сети на предоставленных данных. Принимает массив объектов типа TrainingSample и опциональные параметры обучения TrainOptions.
  • run — выполнение сети на новом наборе входных данных. Возвращает результат предсказания.
  • fromJSON / toJSON — методы сериализации и десериализации модели, обеспечивающие сохранение состояния сети и возможность повторного использования.

Тип TrainingSample

Объект обучающего примера строго типизирован для гарантии корректного обучения:

interface TrainingSample {
    input: Array<Number> | Object;
    output: Array<Number> | Object;
}
  • input — входные данные, могут быть массивом чисел или объектом с ключами признаков.
  • output — ожидаемый результат для соответствующих входных данных. Должен иметь ту же структуру, что и результат метода run.

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


Параметры обучения (TrainOptions)

Библиотека поддерживает гибкую настройку процесса обучения через объект параметров:

interface TrainOptions {
    iterations?: number;
    errorThresh?: number;
    log?: boolean | ((epoch: number, error: number) => void);
    learningRate?: number;
    momentum?: number;
}
  • iterations — максимальное количество итераций обучения. Ограничивает время обучения.
  • errorThresh — порог ошибки, при достижении которого обучение останавливается.
  • log — флаг или функция для логирования прогресса обучения.
  • learningRate — скорость обучения сети, определяет величину изменения весов на каждом шаге.
  • momentum — коэффициент импульса, позволяющий ускорять сходимость и избегать локальных минимумов.

Типы данных для слоёв сети

Mind.js поддерживает работу с разными слоями сети, где каждый слой имеет свои параметры:

interface Layer {
    type: 'input' | 'hidden' | 'output';
    size: number;
    activation?: 'sigmoid' | 'relu' | 'tanh';
}
  • type — определяет роль слоя в сети.
  • size — количество нейронов в слое.
  • activation — функция активации, влияющая на нелинейность вычислений. По умолчанию используется sigmoid.

Выбор правильного типа слоя и функции активации напрямую влияет на точность модели и скорость обучения.


Валидация данных

Mind.js автоматически проверяет соответствие типов входных данных и структуры выходов. Несоответствие типов приводит к исключениям, что предотвращает ошибочные вычисления:

  • Массивы должны иметь одинаковую длину для входов и выходов.
  • Объекты должны содержать все ключи, указанные при обучении.
  • Значения должны быть числовыми.

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


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

const net = new mind.NeuralNetwork();

const trainingData: Array<TrainingSample> = [
    { input: { a: 0, b: 1 }, output: { sum: 1 } },
    { input: { a: 1, b: 0 }, output: { sum: 1 } },
];

const options: TrainOptions = {
    iterations: 20000,
    errorThresh: 0.005,
    learningRate: 0.3,
    log: true,
};

net.train(trainingData, options);

const output = net.run({ a: 1, b: 1 });
console.log(output);

В этом примере видно, как интерфейсы TrainingSample, TrainOptions и метод run взаимодействуют для создания, обучения и использования сети. Типы данных строго соблюдаются на всех этапах.


Применение интерфейсов для масштабирования

Использование строгих интерфейсов позволяет:

  • Масштабировать проекты с множеством сетей, не теряя контроль над типами данных.
  • Разрабатывать расширяемые модули для различных типов задач (регрессия, классификация, прогнозирование).
  • Обеспечить совместимость между разными версиями моделей через JSON-сериализацию.

Интерфейсы Mind.js формируют надежную основу для построения устойчивых и предсказуемых нейронных сетей на JavaScript.