Балансировка шеста: управляющая сеть с подкреплением вручную

Для работы с Synaptic достаточно подключить библиотеку через npm или использовать CDN. В среде Node.js установка выполняется командой:

npm install synaptic

После установки библиотеку можно импортировать:

const synaptic = require('synaptic');

Для браузера доступен вариант через тег <script>:

<script src="https://cdnjs.cloudflare.com/ajax/libs/synaptic/1.1.4/synaptic.js"></script>

После подключения становится доступен основной функционал: создание нейронов, слоёв, сетей, обучение с учителем и без.


Основные компоненты Synaptic

Нейрон (Neuron) Нейрон — базовый строительный блок сети. Его можно настраивать вручную, изменяя веса и пороги.

let neuron = new synaptic.Neuron();

Методы нейрона:

  • activate(input) — активация нейрона с входным сигналом.
  • project(targetNeuron) — соединение с другим нейроном.
  • propagate(rate, target) — корректировка весов на основе ошибки.

Слой (Layer) Слой объединяет несколько нейронов в блок, который может быть входным, скрытым или выходным.

let inputLayer = new synaptic.Layer(3);
let hiddenLayer = new synaptic.Layer(4);
let outputLayer = new synaptic.Layer(2);

Методы слоя:

  • activate(inputs) — активация всех нейронов слоя.
  • project(targetLayer) — соединение слоя с другим слоем.
  • set({bias, squash}) — настройка смещения и функции активации.

Сеть (Network) Сеть объединяет слои и управляет их взаимодействием.

let myNetwork = new synaptic.Network({
    input: inputLayer,
    hidden: [hiddenLayer],
    output: outputLayer
});

Сеть можно активировать и обучать:

  • activate(inputArray) — вычисляет выход сети.
  • propagate(rate, targetArray) — обновляет веса на основе ошибки.

Конфигурация сети для балансировки шеста

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

  • угол наклона шеста
  • угловая скорость
  • позиция платформы
  • скорость платформы

Выход: сила, прикладываемая к платформе (влево или вправо).

Создание слоев:

let inputLayer = new synaptic.Layer(4);   // 4 входа
let hiddenLayer = new synaptic.Layer(8);  // 8 нейронов в скрытом слое
let outputLayer = new synaptic.Layer(1);  // 1 выход

Соединение слоев:

inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

Сеть можно обернуть в объект Network для удобного управления:

let network = new synaptic.Network({
    input: inputLayer,
    hidden: [hiddenLayer],
    output: outputLayer
});

Обучение сети вручную

Для задачи с подкреплением обучение происходит без учителя, путем корректировки весов на основе ошибки текущего состояния.

  1. Инициализация весов: веса задаются случайно или маленькими числами около нуля.
  2. Расчет выхода:
let output = network.activate([angle, angularVelocity, position, velocity]);
  1. Выбор действия: сила движения определяется выходом нейросети.
  2. Оценка ошибки:
let error = desiredAngle - actualAngle;
  1. Коррекция весов:
network.propagate(learningRate, [error]);

Особенности:

  • Для стабилизации можно использовать несколько итераций на каждом шаге симуляции.
  • Часто применяется уменьшение learningRate по мере обучения.
  • Сеть постепенно учится удерживать шест, минимизируя отклонение угла.

Управление циклом симуляции

Пример цикла симуляции:

function step(state) {
    // state: [угол, скорость угла, позиция, скорость]
    let force = network.activate(state)[0]; 
    // применение силы к платформе
    applyForce(force);
    
    // получение нового состояния после применения силы
    let newState = getState();  
    let error = 0 - newState[0];  // минимизация угла
    
    network.propagate(0.05, [error]);
}

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


Тонкости настройки сети

  • Функция активации нейронов: Neuron.squash можно установить на synaptic.Neuron.squash.TANH для выхода в диапазоне [-1, 1].
  • Смещение нейронов (bias): важно для компенсации начальных отклонений шеста.
  • Размер скрытого слоя: слишком маленький — сеть не сможет учесть все параметры, слишком большой — переобучение и замедление обучения.
  • Скорость обучения (learningRate): рекомендуется начинать с небольшого значения (0.01–0.05) и постепенно уменьшать.

Мониторинг и отладка

  • Визуализация угла шеста и силы помогает увидеть прогресс.
  • Вывод весов нейронов позволяет понять, какие входы оказывают наибольшее влияние.
  • Логирование ошибки на каждом шаге: снижение ошибки говорит о корректной настройке сети.

Итоговая структура сети

Входной слой (4 нейрона)
         │
         ▼
Скрытый слой (8 нейронов)
         │
         ▼
Выходной слой (1 нейрон)

Соединение полностью связное: каждый нейрон предыдущего слоя связан со всеми нейронами следующего. Вес каждой связи корректируется на каждом шаге симуляции, обеспечивая адаптацию сети к условиям балансировки шеста.