Предел линейности: почему один нейрон не решает XOR

Урок объясняет, почему один нейрон бессилен против XOR и зачем нужны скрытые слои.

Линейная разделимость — это свойство задачи, при котором два класса точек можно разделить одной прямой. Один нейрон умеет только это.

Геометрия одного нейрона

Нейрон считает w1*x1 + w2*x2 + b и сравнивает с нулём. Уравнение w1*x1 + w2*x2 + b = 0 — это прямая на плоскости. С одной стороны прямой нейрон выдаёт 1, с другой — 0. Значит, один нейрон способен решить задачу, только если правильный ответ можно отделить прямой линией.

AND и OR разделимы, а XOR — нет

Для AND точка (1,1) с ответом 1 стоит в углу, а остальные три точки с ответом 0 — рядом. Между ними легко провести прямую. То же для OR. А вот XOR (исключающее ИЛИ) выдаёт 1 для (0,1) и (1,0), но 0 для (0,0) и (1,1). На плоскости единицы оказываются по диагонали друг от друга, и нули — тоже по диагонали. Никакая прямая не отделит одну диагональ от другой.

x1x2ANDORXOR
00000
01011
10011
11110

Докажем перебором

Переберём множество вариантов весов и смещения и посмотрим на лучший результат, который вообще может выдать один нейрон на XOR.

def step(s):
    return 1 if s >= 0 else 0

def score(w1, w2, b):
    data = [((0,0),0), ((0,1),1), ((1,0),1), ((1,1),0)]
    ok = 0
    for (a, c), y in data:
        if step(w1*a + w2*c + b) == y:
            ok += 1
    return ok

best = 0
for w1 in [-1, 0, 1]:
    for w2 in [-1, 0, 1]:
        for b in [-2, -1, 0, 1, 2]:
            best = max(best, score(w1, w2, b))

print("Лучший результат одного нейрона на XOR:", best, "из 4")
print("4 из 4 не достигается ни при каких весах — XOR не линейно разделим.")

Вывод:

Лучший результат одного нейрона на XOR: 3 из 4
4 из 4 не достигается ни при каких весах — XOR не линейно разделим.

Максимум — три из четырёх. Это не вопрос неудачного перебора: математически доказано, что одиночный линейный нейрон не может реализовать XOR. Именно этот факт в 1969 году едва не похоронил направление нейросетей (книга Минского и Паперта «Перцептроны»).

Выход — добавить слой

Решение оказалось простым: поставить между входом и выходом скрытый слой нейронов. Первый слой может, например, вычислить промежуточные признаки «хотя бы один вход равен 1» (OR) и «оба входа равны 1» (AND), а выходной нейрон скомбинирует их. Так нелинейная задача собирается из линейных кусочков. Как именно обучить такую сеть — тема четвёртого раздела.

Итог

  • Один нейрон проводит ровно одну прямую границу.
  • XOR не разделить прямой — одиночный нейрон выдаёт максимум 3 из 4.
  • Скрытый слой позволяет собрать нелинейную границу из линейных частей.
Проверьте себя
1. Почему один нейрон не может решить XOR?
AXOR требует слишком больших весов
BКлассы XOR нельзя разделить одной прямой (не линейно разделимы)
CВ XOR слишком много входов
DSigmoid не подходит для XOR
2. Что показал перебор весов в примере?
AНейрон решил XOR при удачных весах
BМаксимум 3 из 4 — полного решения нет ни при каких весах
CПеребор завис
DXOR совпадает с OR
3. Как сеть всё-таки решает XOR?
AУвеличивают learning rate
BДобавляют скрытый слой, который строит нелинейную границу из линейных частей
CМеняют step на sigmoid
DДобавляют больше обучающих примеров
Поддержать проект