Александр Иванов – Python в аудио-спецэффектах. Как работают нейросети изнутри. (страница 4)
Искусственный нейрон получает на вход несколько чисел. Он умножает каждое число на свой вес — параметр, который определяет важность этого входа. Затем он суммирует все взвешенные входы, добавляет смещение — ещё один параметр — и применяет к результату функцию активации. Функция активации решает, насколько сильным будет выход нейрона. Если взвешенная сумма большая и положительная — выход близок к единице. Если маленькая или отрицательная — к нулю.
Формула нейрона предельно проста:
y = f(w1·x1 + w2·x2 + ... + wn·xn + b)
где x1, x2 — входы, w1, w2 — веса, b — смещение, f — функция активации, y — выход.
Веса и смещение — это то, что нейрон настраивает в процессе обучения. В начале они случайные, и нейрон выдаёт бессмысленный результат. Но у нас есть обучающие примеры — входы и правильные ответы для них. Мы подаём вход, смотрим на выход нейрона, сравниваем с правильным ответом и вычисляем ошибку. Затем мы чуть-чуть меняем веса так, чтобы ошибка уменьшилась. Повторяем тысячи раз. Постепенно нейрон учится давать правильные ответы.
Пишем нейрон на Python
Давайте реализуем эту идею в коде. Мы создадим класс для одного нейрона и научим его решать простейшую задачу: определять, громкий звук или тихий.
python
import numpy as np
class SingleNeuron:
"""
Один искусственный нейрон.
Принимает один входной признак и выдаёт бинарное предсказание.
"""
def __init__(self):
# Инициализируем вес и смещение случайными малыми значениями
self.weight = np.random.randn() * 0.1
self.bias = np.random.randn() * 0.1
def sigmoid(self, x):
"""Сигмоидная функция активации: превращает любое число в значение от 0 до 1."""
return 1.0 / (1.0 + np.exp(-x))
def forward(self, x):
"""
Прямой проход: вычисляет выход нейрона по входу x.
x — одно число (например, средняя громкость аудиофрагмента).
"""
z = self.weight * x + self.bias
return self.sigmoid(z)
def train_step(self, x, y_true, learning_rate=0.1):
"""
Один шаг обучения.
x — входное значение
y_true — правильный ответ (0 или 1)
learning_rate — скорость обучения
"""
# Прямой проход
y_pred = self.forward(x)
# Вычисляем ошибку (разница между предсказанием и истиной)
error = y_pred - y_true
# Вычисляем градиенты (насколько нужно изменить параметры)
# Для сигмоиды: производная = y_pred * (1 - y_pred)
d_weight = error * y_pred * (1 - y_pred) * x
d_bias = error * y_pred * (1 - y_pred)
# Обновляем параметры
self.weight -= learning_rate * d_weight
self.bias -= learning_rate * d_bias
return error
# Создаём нейрон
neuron = SingleNeuron()
# Готовим обучающие данные
# Представим, что мы измерили среднюю громкость нескольких аудиофрагментов
# Значения около 0.8 — громкий звук (метка 1)
# Значения около 0.2 — тихий звук (метка 0)
train_data = [
(0.15, 0.0), (0.22, 0.0), (0.18, 0.0), (0.25, 0.0), (0.10, 0.0), # тихие
(0.75, 1.0), (0.82, 1.0), (0.70, 1.0), (0.88, 1.0), (0.79, 1.0), # громкие
]
print("Обучение одного нейрона:")
print("Эпоха | Вес | Смещение | Пример | Предсказание | Истина | Ошибка")
print("-" * 70)
# Обучаем нейрон
for epoch in range(200):
total_error = 0
for x, y_true in train_data:
y_pred = neuron.forward(x)