Библиотека Synaptic представляет собой чисто JavaScript-фреймворк для создания и обучения нейронных сетей. Для использования в Node.js необходимо выполнить установку через npm:
npm install synaptic
После установки подключение производится стандартным способом:
const synaptic = require('synaptic');
Для работы в браузере библиотека доступна через CDN:
<script src="https://cdn.jsdelivr.net/npm/synaptic@1.1.4/dist/synaptic.js"></script>
Synaptic строится вокруг трёх ключевых объектов:
Neuron — отдельный нейрон, реализующий активацию и
передачу сигналов.Layer — слой нейронов, способный принимать входные
данные и выдавать выходные.Network — сеть, объединяющая несколько слоев в
полноценную архитектуру.Для генератора текста посимвольно удобно использовать Feedforward Network, состоящую из входного слоя, скрытых слоёв и выходного слоя.
Для посимвольной генерации необходимо:
Пример подготовки словаря и преобразования текста:
const text = "hello world";
const chars = Array.from(new Set(text));
const charToIndex = {};
const indexToChar = {};
chars.forEach((char, index) => {
charToIndex[char] = index;
indexToChar[index] = char;
});
function charToVector(char) {
const vector = Array(chars.length).fill(0);
vector[charToIndex[char]] = 1;
return vector;
}
function vectorToChar(vector) {
return indexToChar[vector.indexOf(Math.max(...vector))];
}
Для генератора текста оптимальна следующая структура:
Пример создания сети:
const { Layer, Network } = synaptic;
const inputLayer = new Layer(chars.length);
const hiddenLayer = new Layer(100);
const outputLayer = new Layer(chars.length);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
const myNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
Для обучения можно использовать стандартный Trainer, который поддерживает различные методы оптимизации. В случае посимвольного генератора удобен метод backpropagation.
Подготовка обучающих примеров:
const trainingData = [];
const seqLength = 3;
for (let i = 0; i < text.length - seqLength; i++) {
const inputSeq = text.slice(i, i + seqLength).split('').map(charToVector);
const outputChar = charToVector(text[i + seqLength]);
// Сглаживаем входной массив в один вектор
const inputFlat = [].concat(...inputSeq);
trainingData.push({
input: inputFlat,
output: outputChar
});
}
Обучение сети:
const Trainer = synaptic.Trainer;
const trainer = new Trainer(myNetwork);
trainer.train(trainingData, {
rate: 0.1,
iterations: 2000,
error: 0.005,
shuffle: true,
log: 100
});
Для генерации текста необходимо:
Пример генерации:
function generateText(seed, length = 50) {
let result = seed;
let inputSeq = seed.split('').map(charToVector);
for (let i = 0; i < length; i++) {
const inputFlat = [].concat(...inputSeq);
const output = myNetwork.activate(inputFlat);
// Выбираем наиболее вероятный символ
const nextChar = vectorToChar(output);
result += nextChar;
inputSeq.push(charToVector(nextChar));
inputSeq.shift(); // поддерживаем длину последовательности
}
return result;
}
console.log(generateText("hel"));
seqLength) —
влияет на способность сети учитывать контекст.rate) — слишком
высокая скорость может привести к расходимости, слишком низкая — к
медленному обучению.Для улучшения генерации текста полезно:
sigmoid, tanh).Гибкая настройка этих параметров позволяет создавать генераторы текста с разнообразным стилем и степенью предсказуемости.