Предел линейности: почему один нейрон не решает 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). На плоскости единицы оказываются по диагонали друг от друга, и нули — тоже по диагонали. Никакая прямая не отделит одну диагональ от другой.
| x1 | x2 | AND | OR | XOR |
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Докажем перебором
Переберём множество вариантов весов и смещения и посмотрим на лучший результат, который вообще может выдать один нейрон на 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.
- Скрытый слой позволяет собрать нелинейную границу из линейных частей.