← На главную

Перцептрон Розенблатта: обучение для проведения границы решения

08.06.2026 00:28 · hackernews

В 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, решение.

Читать оригинал →