Введение в нейронные сети


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



Нейронные сети извлекают из данных идентифицирующие признаки, не требующие запрограммированного понимания. Компоненты сети включают нейроны, связи, веса, смещения, функции распространения и правила обучения. Нейроны получают входные сигналы, управляемые порогами и функциями активации. Соединения включают веса и смещения, регулирующие передачу информации. Обучение, корректировка весов и смещений, происходит в три этапа: вычисление входных данных, генерация выходных данных и итеративное совершенствование, повышающее квалификацию сети в решении различных задач.

Процесс грубо говоря такой:

  1. Нейронная сеть моделируется новой средой.
  2. Затем в результате моделирования изменяются свободные параметры нейронной сети.
  3. Нейронная сеть по-новому реагирует на окружающую среду благодаря изменению своих свободных параметров.


Важность нейронных сетей

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

Как работают нейронные сети?

Давайте разберемся на примере, как работает нейронная сеть:

Рассмотрим нейронную сеть для классификации электронной почты. На входной слой поступают такие характеристики, как содержание письма, информация об отправителе и тема. Эти входные данные, умноженные на настроенные веса, проходят через скрытые слои. В процессе обучения сеть учится распознавать шаблоны, указывающие на то, является ли письмо спамом или нет. Выходной слой с помощью бинарной функции активации предсказывает, является ли письмо спамом (1) или нет (0). По мере того как сеть итеративно улучшает свои веса с помощью обратного распространения, она становится искусной в различении спама и легитимных писем, демонстрируя практичность нейронных сетей в реальных приложениях, таких как фильтрация электронной почты.

Работа нейронной сети

Нейронные сети - это сложные системы, которые имитируют некоторые особенности работы человеческого мозга. Она состоит из входного слоя, одного или нескольких скрытых слоев и выходного слоя, состоящего из слоев искусственных нейронов, которые соединены между собой. Два этапа основного процесса называются обратным и прямым распространением.

Прямое распространение

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

  • Вычисление потерь: Выходные данные сети оцениваются в сравнении с реальными значениями цели, и для вычисления разницы используется функция потерь. Для задачи регрессии в качестве функции затрат обычно используется средняя квадратичная ошибка (MSE).
  • Функция потерь:
  • Градиентный спуск: Градиентный спуск используется сетью для уменьшения потерь. Чтобы уменьшить погрешность, веса изменяются на основе производной потерь по отношению к каждому весу.
  • Регулировка весов: Веса корректируются в каждом соединении путем применения этого итерационного процесса, или обратного распространения, в обратном направлении по всей сети.
  • Обучение: Во время обучения на различных образцах данных весь процесс прямого распространения, вычисления потерь и обратного распространения выполняется итеративно, что позволяет сети адаптироваться и изучать закономерности на основе данных.
  • Функции активации: Нелинейность модели вносится функциями активации, такими как выпрямленная линейная единица (ReLU) или сигмоид. Их решение о том, следует ли "запустить" нейрон, основывается на взвешенном входном сигнале в целом.
Обучение нейронной сети

1. Обучение с помощью контролируемого обучения

При контролируемом обучении нейронная сеть управляется учителем, который имеет доступ к обеим парам вход-выход. Сеть создает выходы на основе входов, не принимая во внимание окружающую обстановку. При сравнении этих выходов с известными учителю желаемыми выходами генерируется сигнал ошибки. Чтобы уменьшить количество ошибок, параметры сети изменяются итеративно и останавливаются, когда производительность достигает приемлемого уровня.

2. Обучение без контроля

Эквивалентные выходные переменные отсутствуют в неконтролируемом обучении. Его основная цель - постичь глубинную структуру входящих данных (X). При этом нет инструктора, который бы давал советы. Вместо этого предполагается моделирование закономерностей и взаимосвязей данных. Такие слова, как регрессия и классификация, относятся к контролируемому обучению, в то время как неконтролируемое обучение связано с кластеризацией и ассоциацией.

3. Обучение с применением подкрепления

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

Пример простейшей нейронной сети на C#

Простейшая нейронная сеть может состоять из одного слоя (однослойная сеть) без использования библиотек глубокого обучения. В примере ниже представлен код на C# для простой однослойной нейронной сети для решения задачи бинарной классификации с использованием градиентного спуска. Этот пример создает и обучает нейронную сеть для логической функции И (AND).

using System;

class NeuralNetwork
{
private double[] weights;
private double bias;
private double learningRate = 0.1;

public NeuralNetwork(int inputSize)
{
    // Инициализация весов и смещения
    weights = new double[inputSize];
    RandomizeWeights();
    bias = 0;
}

private void RandomizeWeights()
{
    Random rand = new Random();
    for (int i = 0; i < weights.Length; i++)
    {
        weights[i] = rand.NextDouble() * 2 - 1; // Случайные значения от -1 до 1
    }
}

private double Sigmoid(double x)
{
    // Сигмоидная функция активации
    return 1 / (1 + Math.Exp(-x));
}

public int Predict(int[] input)
{
    // Прогнозирование на основе текущих весов и смещения
    double sum = bias;
    for (int i = 0; i < weights.Length; i++)
    {
        sum += input[i] * weights[i];
    }

    return Sigmoid(sum) > 0.5 ? 1 : 0; // Простая пороговая функция для бинарной классификации
}

public void Train(int[] input, int target)
{
    // Обучение сети на одном примере
    int prediction = Predict(input);
    double error = target - prediction;

    // Обновление весов и смещения с использованием градиентного спуска
    for (int i = 0; i < weights.Length; i++)
    {
        weights[i] += learningRate * error * input[i];
    }

    bias += learningRate * error;
}
}


class Program
{
static void Main()
{
// Пример использования нейронной сети для логической функции AND

    // Входные данные для обучения (все возможные комбинации входов)
    int[][] trainingDataInputs = {
        new int[] { 0, 0 },
        new int[] { 0, 1 },
        new int[] { 1, 0 },
        new int[] { 1, 1 }
    };

    // Ожидаемые результаты (решения) для каждой комбинации входов
    int[] trainingDataOutputs = { 0, 0, 0, 1 };

    // Создание и обучение нейронной сети
    NeuralNetwork neuralNetwork = new NeuralNetwork(inputSize: 2);

    for (int epoch = 0; epoch < 10000; epoch++)
    {
        for (int i = 0; i < trainingDataInputs.Length; i++)
        {
            neuralNetwork.Train(trainingDataInputs[i], trainingDataOutputs[i]);
        }
    }

    // Прогнозирование результатов после обучения
  Console.WriteLine("Предсказания после обучения:");

    foreach (var input in trainingDataInputs)
    {
        int prediction = neuralNetwork.Predict(input);
        Console.WriteLine($"Входящие данные: [{input[0]}, {input[1]}], Предсказание: {prediction}");
Console.ReadKey();
    }
}
}
результат вывода на консоль программы

Этот код создает простую однослойную нейронную сеть, обучает ее на логической функции И (AND) и выводит прогнозы после обучения. В реальных задачах потребуется более сложная архитектура сети и больше данных для обучения.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, Q-learning, нейронные сети, си шарп




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Создание помощника в преферанс. Этап третий: распознавание масти
Периодическое копирование файлов в C++ с паузой
Manifest v3 и пример расширения для браузеров на основе Chromium