В 1958 году исследователь Фрэнк Розенблатт построил машину под названием перцептрон, скопировав принцип работы одного нейрона: если сигналы достаточно сильны — нейрон срабатывает. В основе лежит простая формула: output = 1, если (w · x + b) > 0, иначе 0. x — это входные данные, w — вес, b — смещение (bias).
Проще всего это понять на примере человека. Джон Доу решает, принять ли предложение о работе. Он взвешивает факторы (входы) и умножает их на то, насколько они для него важны (веса). Если сумма превышает порог (bias), он говорит «да». Это и есть перцептрон.
Самый простой случай — определить, положительное ли число. Машина делает предсказание: (weight * value + bias) > 0. В начале вес и bias — случайные числа. Если предсказание неверно, мы корректируем вес и bias: error = result - prediction, weight += learning_rate * error * value, bias += learning_rate * error. Один полный проход по данным — это epoch. Повторение epoch — это training.
Для задачи «число положительное?» bias не нужен, граница решения (decision boundary) сама встаёт на 0. Но если мы хотим определить, сдал ли студент экзамен (проходной балл — 50), без bias граница намертво приклеивается к 0. Машина не может отделить «ниже 50» от «50 и выше». bias двигает границу левее или правее, позволяя ей встать там, где нужно.
Learning rate (скорость обучения) — размер каждого шага коррекции. Маленькие шаги медленные, большие — могут перескочить. Normalization (нормализация) сжимает входные данные в небольшой диапазон (например, от 0 до 1). Без неё большие числа (вроде 100 баллов) заставляют вес прыгать, и обучение идёт рывками.
Вот полный код перцептрона на Python:
import random
learning_rate = 0.1
EPOCHS = 100
weight = random.uniform(-1, 1)
bias = random.uniform(-1, 1)
data = [(i*0.1, True) for i in range(1, 501)]
data += [(i*0.1, False) for i in range(-500, 0)]
random.shuffle(data)
for epoch in range(EPOCHS):
for value, result in data:
prediction = (weight * value + bias) > 0
if prediction != result:
error = result - prediction
weight += learning_rate * error * value
bias += learning_rate * error
decision_boundary = -bias / weight
print(f"weight = {weight:.3f}")
print(f"bias = {bias:.3f}")
print(f"decision boundary = {decision_boundary:.3f}")
Один нейрон рисует только одну прямую линию. Но когда их объединяют в слои, получается нейронная сеть, способная учить сложные формы. Каждый нейрон внутри неё делает то же самое: вес, bias, решение.