18+
реклама
18+
Бургер менюБургер меню

Александр Иванов – Python в аудио-спецэффектах. Как работают нейросети изнутри. (страница 4)

18

Искусственный нейрон получает на вход несколько чисел. Он умножает каждое число на свой вес — параметр, который определяет важность этого входа. Затем он суммирует все взвешенные входы, добавляет смещение — ещё один параметр — и применяет к результату функцию активации. Функция активации решает, насколько сильным будет выход нейрона. Если взвешенная сумма большая и положительная — выход близок к единице. Если маленькая или отрицательная — к нулю.

Формула нейрона предельно проста:

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)