Пример реализации ИИ на JS
Хотя использование внешних библиотек может упростить задачу написания кода для машинного обучения, я могу предложить вам пример, который использует только стандартные возможности языка JavaScript без использования внешних библиотек. Этот пример реализует простую нейронную сеть с одним скрытым слоем и функцией активации ReLU.
Подготовка данных
Для начала создадим некоторые простые обучающие данные, которые будут представлять собой линейную функцию с добавлением некоторого шума.
const NUM_TRAINING_POINTS = 100; const TRAINING_DATA = [];
for (let i = 0; i < NUM_TRAINING_POINTS; ++i) {
const x = i / NUM_TRAINING_POINTS;
const y = x + Math.random() * 0.2 - 0.1; // добавляем шум от -0.1 до +0.1
TRAINING_DATA.push([x, y]);
}
console.log("Training Data: ", TRAINING_DATA);Реализация функции активации ReLU
Реализуем функцию активации ReLU, которая возвращает максимальное значение между нулём и переданным ей аргументом.
function relu(x) {
return Math.max(0, x);
}Архитектура нейронной сети
Создадим архитектуру нейронной сети с одним скрытым слоем. У нас есть входные данные, которые представляют собой вектор [x], промежуточный слой с весами w1, который преобразует вход в скрытое состояние, и выходной слой с весом w2, который преобразует скрытое состояние в результат.
class NeuralNetwork {
constructor(nInputs, nHiddenNodes, nOutputs) {
this.nInputs = nInputs;
this.nHiddenNodes = nHiddenNodes;
this.nOutputs = nOutputs;
this.initializeWeights();
}
initializeWeights() {
this.weights1 = Array.from({ length: this.nHiddenNodes }, () => Math.random());
this.weights2 = Array.from({ length: this.nOutputs }, () => Math.random());
}
predict(input) {
const hiddenState = this.weights1.map((weight, index) => weight * input[index]).reduce((sum, val) => sum + relu(val), 0);
const output = this.weights2.map((weight, index) => weight * hiddenState).reduce((sum, val) => sum + val, 0);
return output;
}
train(trainingData, numEpochs, learningRate) {
for (let epoch = 0; epoch < numEpochs; ++epoch) {
trainingData.forEach(([input, desiredOutput]) => {
const predictedOutput = this.predict(input);
const error = desiredOutput - predictedOutput;
this.updateWeights(input, error, learningRate);
});
}
}
updateWeights(input, error, learningRate) {
const hiddenState = this.weights1.map((weight, index) => weight * input[index]).reduce((sum, val) => sum + relu(val), 0);
const dOutputErrorWrtHidden = this.weights2.map((weight, index) => weight * error).reduce((sum, val) => sum + val, 0);
this.weights1 = this.weights1.map((weight, index) => weight + learningRate * (error * input[index] * (hiddenState > 0 ? 1 : 0)));
this.weights2 = this.weights2.map((weight, index) => weight + learningRate * dOutputErrorWrtHidden * hiddenState);
}
}Тренировка модели
Запустим процесс тренировки модели на наших обучающих данных.
const NETWORK = new NeuralNetwork(1, 10, 1); NETWORK.train(TRAINING_DATA, 1000, 0.01);
Оценка модели
Теперь проверим модель на тестовых данных, чтобы увидеть её производительность.
const TEST_DATA = [];
for (let i = 0; i < 10; ++i) {
const x = i / 10;
const y = x + Math.random() * 0.2 - 0.1;
TEST_DATA.push([x, y]);
}
TEST_DATA.forEach(([input, expected]) => {
const actual = NETWORK.predict(input);
console.log(`Actual Output: ${actual}, Expected Output: ${expected}`);
});Этот код представляет собой базовую реализацию простой нейронной сети с функцией активации ReLU. Она позволяет обучать модель на данных и оценивать её результаты.