В данной статье представлена реализация простой нейросети на языке программирования JavaScript.
Мы сосредоточим внимание на архитектуре сети, процессе обучения с использованием алгоритма обратного распространения ошибки и функцией активации ReLU (Rectified Linear Unit).
Пример приведен на основе задачи классификации, используя логическую функцию AND в качестве обучающего набора данных.
Введение
Машинное обучение и нейросети находят широкое применение в различных областях, включая обработку изображений, анализ текста и предсказание временных рядов.
В данной работе мы сосредоточимся на разработке простой нейросети с использованием JavaScript, которая может быть легко интегрирована в веб-приложения.
Нейросети состоят из слоев нейронов, которые обрабатывают данные и обучаются на примерах для выполнения задач классификации или регрессии.
Архитектура нейросети
Функции активации
Нейросеть использует функции активации для управления выходными значениями нейронов.
В нашем примере используется функция ReLU, которая возвращает входное значение, если оно положительное, и ноль в противном случае.
Эта функция эффективна для решения задач с ненормализованными входными данными и помогает избежать проблемы исчезающего градиента.
function relu(x) {
return x › 0 ? x : 0;
}
function reluDerivative(x) {
return x › 0 ? 1 : 0;
}
Структура нейросети
Наша нейросеть состоит из одного скрытого слоя и одного выходного нейрона.
Веса и смещение инициализируются случайными значениями, что позволяет нейросети начинать обучение с произвольной конфигурации.
function SimpleNeuralNetwork(inputSize, outputSize) {
this.weights = [];
for (var i = 0; i ‹ inputSize; i++) {
this.weights.push(Math.random());
}
this.bias = Math.random();
this.learningRate = 0.01;
Процесс обучения
На этапе прямого прохода нейросеть принимает входные данные и применяет к ним веса и смещение, получая выходное значение.
Это значение затем передается через функцию активации.
this.forward = function(input) {
var weightedSum = 0;
for (var i = 0; i ‹ inputSize; i++) {
weightedSum += this.weights[i] * input[i];
}
weightedSum += this.bias;
return relu(weightedSum);
};
Обратное распространение ошибки позволяет нейросети обновлять свои веса на основе ошибки, найденной при сравнении выходного значения с ожидаемым результатом.
На каждом шаге алгоритма, после вычисления градиента для каждого веса и смещения, происходит их обновление с учетом скорости обучения.
this.train = function(inputs, targets, epochs) {
for (var epoch = 0; epoch ‹ epochs; epoch++) {
for (var index = 0; index ‹ inputs.length; index++) {
var input = inputs[index];
var target = targets[index];
var output = this.forward(input);
var error = target - output;
var gradient = reluDerivative(output);
var slope = error * gradient;
for (var i = 0; i ‹ inputSize; i++) {
this.weights[i] += slope * input[i] * this.learningRate;
}
this.bias += slope * this.learningRate;
}
}
};
Для демонстрации работы нейросети был использован обучающий набор данных, представляющий логическую функцию AND:
var inputs = [ [0, 0],
[0, 1],
[1, 0],
[1, 1]
];
var targets = [0, 0, 0, 1]; // Ожидаемый вывод для функции AND
nn.train(inputs, targets, 10000); // Обучение нейросети
for (var i = 0; i ‹ inputs.length; i++) { var input = inputs[i];
sys.onEvent("Input: " + input + " -› Output: " + nn.forward(input));
}
Данная статья описывает основы построения простой нейросети на JavaScript. Мы рассмотрели архитектуру, функцию активации, процесс обучения и пример использования с логической функцией AND.
Данная реализация служит основой для дальнейших исследований и более сложных архитектур, включая многослойные нейросети и использование других функций активации.
Потенциал JavaScript в области машинного обучения открывает новые горизонты для разработки интерактивных приложений, основанных на нейросетях.
[scroll=]
Add(MainForm,2953706,581,126)
{
Width=816
Height=662
}
Add(VBJScript,9290393,630,168)
{
WorkPoints=#6:doWork|
EventPoints=#7:onEvent|
DataPoints=#2:D1|
Language=1
Script=#16:function Main() |1:{|21: // Функции активации|18:function relu(x) {|25: return x > 0 ? x : 0;|1:}|0:|28:function reluDerivative(x) {|25: return x > 0 ? 1 : 0;|1:}|0:|20:// Простая нейросеть|53:function SimpleNeuralNetwork(inputSize, outputSize) {|37: // Инициализация весов и смещения|22: this.weights = [];|41: for (var i = 0; i < inputSize; i++) {|41: this.weights.push(Math.random());|5: }|30: this.bias = Math.random();|29: this.learningRate = 0.01;|0:|20: // Прямой проход|36: this.forward = function(input) {|28: var weightedSum = 0;|45: for (var i = 0; i < inputSize; i++) {|54: weightedSum += this.weights[i] * input[i];|9: }|33: weightedSum += this.bias;|33: return relu(weightedSum);|6: };|0:|25: // Обучение нейросети|52: this.train = function(inputs, targets, epochs) {|54: for (var epoch = 0; epoch < epochs; epoch++) {|65: for (var index = 0; index < inputs.length; index++) {|42: var input = inputs[index];|44: var target = targets[index];|0:|32: // Прямой проход|49: var output = this.forward(input);|0:|36: // Вычисление ошибки|44: var error = target - output;|0:|43: // Обратное распространение|54: var gradient = reluDerivative(output);|45: var slope = error * gradient;|0:|46: // Обновление весов и смещения|53: for (var i = 0; i < inputSize; i++) {|76: this.weights[i] += slope * input[i] * this.learningRate;|17: }|55: this.bias += slope * this.learningRate;|13: }|9: }|6: };|1:}|0:|33:// Пример использования нейросети|39:var nn = new SimpleNeuralNetwork(2, 1);|0:|33:// Обучающие данные (AND функция)|14:var inputs = [|11: [0, 0],|11: [0, 1],|11: [1, 0],|10: [1, 1]|2:];|0:|62:var targets = [0, 0, 0, 1]; // Ожидаемый вывод для функции AND|0:|54:nn.train(inputs, targets, 1000); // Обучение нейросети|0:|23:// Проверка результатов|41:for (var i = 0; i < inputs.length; i++) {|26: var input = inputs[i];|71: sys.onEvent("Input: " + input + " -> Output: " + nn.forward(input));|1:}|0:|0:|3: }|0:|65:/******************* Начало **********************************/|28:function doWork(Data,Index){|7:Main();|1:}|68:/************* Конец *********************************************/|
UseName=0
link(onEvent,13834763:doString,[])
}
Add(Button,16270591,581,168)
{
Left=5
Top=15
link(onClick,9290393:doWork,[])
}
Add(Memo,62219,728,168)
{
Left=90
Top=5
Width=710
Height=615
}
Add(FormatStr,13834763,672,168)
{
Mask="%1\r\n||======================================||\r\n%2"
link(onFString,62219:doAdd,[])
}
Редактировалось 3 раз(а), последний 2024-12-17 18:05:10