Создание простой нейронной сети: шаг за шагом

Наша цель — создать и объяснить простую нейронную сеть, которая сможет обучаться распознаванию различий. Мы сосредоточимся на практической реализации, используя рисунки и код, чтобы сделать процесс максимально понятным.


1. Биологическое вдохновение: как работает мозг?

Мозг можно представить как сложную сеть, состоящую из миллиардов нейронов. Каждый нейрон получает сигналы от других нейронов через синапсы . Если суммарный входной сигнал превышает определенный порог, нейрон генерирует электрический импульс (потенциал действия), который передается дальше по цепочке.

На рисунке ниже показано, как это выглядит:

Упрощенная модель нейрона: входные сигналы, обработка и выходной импульс.
Схема работы нейрона.

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


2. Искусственный нейрон: упрощенная модель

Искусственный нейрон — это математическая модель, которая имитирует работу биологического нейрона. Он принимает входные данные, обрабатывает их и выдает выходной сигнал.

Основные компоненты искусственного нейрона:

  1. Входы (x₁, x₂, …, xₙ): Это данные, которые поступают в нейрон.
  2. Веса (w₁, w₂, …, wₙ): Каждый вход умножается на соответствующий вес, который определяет важность этого входа.
  3. Сумматор: Суммирует взвешенные входы: .
  4. Функция активации: Преобразует сумму в выходное значение. Примеры функций активации:
    • Ступенчатая функция: Возвращает 0 или 1.
    • Сигмоида: Возвращает значение между 0 и 1.
    • ReLU (Rectified Linear Unit): Возвращает .

На рисунке ниже показана работа искусственного нейрона:

 

Модель искусственного нейрона с входами, весами, сумматором и функцией активации.


3. Архитектура нашей нейронной сети

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

Архитектура сети:

  1. Входной слой: Принимает данные (например, координаты точек на изображении).
  2. Выходной слой: Один нейрон, который решает, к какому классу относится входной объект.

Пример архитектуры:

Входной слой (n нейронов) → Выходной слой (1 нейрон)

4. Обучение нейронной сети

Обучение нейронной сети заключается в подборе весов так, чтобы сеть правильно классифицировала входные данные. Мы будем использовать метод градиентного спуска для минимизации ошибки.

Шаги обучения:

  1. Инициализация весов: Начальные значения весов задаются случайным образом.
  2. Прямое распространение (forward pass): Вычисляем выходное значение сети.
  3. Вычисление ошибки: Используем функцию потерь, например, среднеквадратичную ошибку (MSE):
  4. Обратное распространение (backpropagation): Корректируем веса на основе градиента функции потерь.
  5. Повторяем шаги 2–4: Пока ошибка не станет достаточно малой.

5. Реализация на Python

Теперь давайте напишем код для нашей простой нейронной сети. Мы будем использовать библиотеку NumPy для математических операций.

import numpy as np

# Функция активации (сигмоида)
def sigmoid(x):
return 1 / (1 + np.exp(-x))

# Производная сигмоиды
def sigmoid_derivative(x):
return x * (1 — x)

# Обучающие данные
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) # Входные данные
y = np.array([[0], [1], [1], [0]]) # Целевые значения

# Инициализация весов
np.random.seed(1)
weights = 2 * np.random.random((2, 1)) — 1

# Обучение сети
for iteration in range(10000):
# Прямое распространение
output = sigmoid(np.dot(X, weights))

# Вычисление ошибки
error = y — output

# Обратное распространение
adjustments = error * sigmoid_derivative(output)
weights += np.dot(X.T, adjustments)

# Тестирование сети
print(«Результат после обучения:»)
print(output)

 

Объяснение кода:

  1. Мы используем сигмоиду как функцию активации.
  2. Веса инициализируются случайными значениями.
  3. В процессе обучения сеть корректирует веса, чтобы минимизировать ошибку.
  4. После обучения сеть может предсказывать выходные значения для новых данных.

6. Визуализация работы сети

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

import matplotlib.pyplot as plt

# График ошибки
errors = []
for iteration in range(10000):
output = sigmoid(np.dot(X, weights))
error = y — output
errors.append(np.mean(np.abs(error)))
adjustments = error * sigmoid_derivative(output)
weights += np.dot(X.T, adjustments)

plt.plot(errors)
plt.title(«Изменение ошибки во время обучения»)
plt.xlabel(«Эпохи»)
plt.ylabel(«Ошибка»)
plt.show()

График покажет, как ошибка уменьшается с каждым шагом обучения.

7. Применение нейронной сети

Наша сеть теперь может распознавать различия между двумя классами данных. Например, если мы обучаем сеть на данных о цветах (длина лепестков и чашелистиков), она сможет классифицировать их на два вида.

Пример использования:

new_data = np.array([[0.8, 0.2], [0.1, 0.9]])
predictions = sigmoid(np.dot(new_data, weights))
print(«Предсказания для новых данных:»)
print(predictions)

8. Заключение

Мы создали простую нейронную сеть, которая может обучаться распознаванию различий. Хотя эта сеть очень проста, она демонстрирует основные принципы работы нейросетей:

  • Входные данные и веса.
  • Функция активации.
  • Обучение с помощью градиентного спуска.

Эта модель может быть расширена для решения более сложных задач, таких как распознавание изображений или обработка естественного языка. Однако даже в своей базовой форме она уже способна выполнять полезные задачи.

Дополнительные материалы: