В уроке 13 мы упёрлись в стену: один нейрон не берёт XOR. В уроке 15 перцептрон подтвердил это делом — на неразделимых данных он мечется без конца. Сегодня мы пробьём стену, и окажется, что она невысокая: достаточно одного скрытого слоя, который не проводит границу, а перекраивает само пространство, где она проводится.

Стена, к которой мы вернулись

Соберём вместе два тупика прошлых уроков. Логический нейрон Мак-Каллока–Питтса не смог вычислить XOR: его единичные наборы лежат на разных диагоналях квадрата, а одна прямая две диагонали не разделит. Перцептрон Розенблатта не смог обучиться на неразделимой паре ирисов: там, где прямой между классами не существует, правило коррекции по ошибке вечно доворачивает границу, не сходясь. Оба тупика — одно и то же ограничение, сформулированное на языке логики и на языке геометрии: один нейрон умеет только линейную границу.

Марвин Минский и Сеймур Пейперт в 1969 году показали этот предел с математической строгостью, и многие прочли их книгу как приговор всему направлению. Приговор оказался ошибкой чтения: предел касался одного слоя, а не идеи нейросети. Выход, который тогда не разглядели, геометрически прост, и мы построим его руками — без всякого обучения, просто расставив веса, как в уроке 13.

Скрытый слой: прямые как новые признаки

Идея одна и коротка. Поставим между входом и выходом промежуточный слой нейронов — назовём его скрытым. Каждый скрытый нейрон, как обычно, проводит свою прямую и выдаёт 00 или 11: он отвечает на вопрос «по какую сторону от моей прямой лежит точка?». Выходной нейрон получает на вход не исходные координаты x1,x2x_1,x_2, а ответы скрытых нейронов — и проводит свою прямую уже в этом новом пространстве.

Ключ вот в чём: скрытые нейроны не решают задачу, они меняют систему координат. Исходные признаки «длина» и «ширина» заменяются признаками «справа ли от прямой h1h_1» и «справа ли от прямой h2h_2». И задача, неразделимая в старых координатах, может оказаться разделимой в новых. Граница по-прежнему прямая — но прямая в пространстве, которое скрытый слой перекроил.

XOR за три нейрона, вид сбоку

Вернёмся к XOR и построим сеть руками, пользуясь вентилями из урока 13. Нам нужно, чтобы выход был 11 на «разных» наборах (0,1),(1,0)(0,1),(1,0) и 00 на «одинаковых» (0,0),(1,1)(0,0),(1,1). Возьмём два скрытых нейрона:

h1=1[x1+x21] (ИЛИ),h2=1[x1+x21] (НЕ-И),h_1 = \mathbf 1[x_1 + x_2 \ge 1]\ (\text{ИЛИ}), \qquad h_2 = \mathbf 1[x_1 + x_2 \le 1]\ (\text{НЕ-И}),

и один выходной, берущий их И: y=1[h1+h22]y=\mathbf 1[h_1 + h_2 \ge 2]. Проверим по строкам. На (0,0)(0,0): h1=0h_1=0 (сумма 0<10<1), значит y=0y=0. На (1,1)(1,1): h2=0h_2=0 (сумма 2>12>1), значит y=0y=0. На (0,1)(0,1) и (1,0)(1,0): сумма ровно 11, оба скрытых нейрона выдают 11, и y=1y=1. Единицы стоят точно на «разных» наборах — это XOR. Три нейрона в два слоя взяли то, что одному не по силам.

x1x_1x2x_2h1h_1 (ИЛИ)h2h_2 (НЕ-И)yy (И)
00010
01111
10111
11100
Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Схема двухслойной сети: два входа идут к двум скрытым нейронам ИЛИ и НЕ-И, их выходы сходятся в выходной нейрон И, дающий XOR; рядом таблица истинности
Рис. 16.1. XOR из трёх нейронов: скрытый слой из двух прямых и выходной И

Два входа, скрытый слой из двух нейронов (h1=h_1= ИЛИ, h2=h_2= НЕ-И) и выходной y=y= И. Каждый скрытый нейрон проводит свою прямую в исходном квадрате; выходной комбинирует их ответы. Веса расставлены руками — никакого обучения, только логика урока 13.

Главный трюк: пространство, в котором XOR разделим

Теперь — сердце урока. Посмотрим, куда скрытый слой отправляет четыре входные точки. В исходных координатах (x1,x2)(x_1,x_2) единицы XOR лежат на одной диагонали, нули — на другой, и прямой их не разнять. Но нанесём те же четыре точки в новых координатах (h1,h2)(h_1,h_2) — по ответам скрытых нейронов.

Точка (0,0)(0,0) даёт (h1,h2)=(0,1)(h_1,h_2)=(0,1); точка (1,1)(1,1) даёт (1,0)(1,0); а обе «разные» точки (0,1)(0,1) и (1,0)(1,0) дают одно и то же (1,1)(1,1). Смотрите, что произошло: два нуля XOR разъехались в углы (0,1)(0,1) и (1,0)(1,0) скрытого квадрата, а обе единицы слиплись в угол (1,1)(1,1). В новом пространстве класс единиц собрался в одной точке, класс нулей — в двух других, и теперь их спокойно разделяет одна прямая (например, h1+h22h_1+h_2\ge 2). Задача, неразделимая на входе, стала линейно разделимой после скрытого слоя:

(x1,x2)  скрытый слой  (h1,h2),{(0,1),(1,0)}(1,1),{(0,0) ⁣ ⁣(0,1), (1,1) ⁣ ⁣(1,0)}.(x_1,x_2)\ \xrightarrow{\ \text{скрытый слой}\ }\ (h_1,h_2), \qquad \{(0,1),(1,0)\}\mapsto(1,1),\quad \{(0,0)\!\to\!(0,1),\ (1,1)\!\to\!(1,0)\}.
Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Два квадрата рядом: слева входное пространство с точками XOR на разных диагоналях, неразделимыми прямой; справа пространство скрытых признаков, где единицы слились в один угол, а нули разошлись, и одна прямая их разделяет; стрелка между квадратами подписана скрытый слой
Рис. 16.2. Скрытый слой перекраивает пространство: XOR становится разделимым

Слева — четыре точки XOR во входных координатах: единицы (закрашены) и нули на скрещенных диагоналях, прямой не разделить. Справа — те же точки в координатах скрытого слоя (h1,h2)(h_1,h_2): обе единицы слились в угол (1,1)(1,1), нули разошлись, и синяя прямая делит классы. Скрытый слой не провёл границу — он перекроил пространство так, что граница стала прямой.

От двух прямых к любой границе

XOR потребовал двух скрытых прямых. А что можно огородить бо́льшим их числом? Выходной нейрон, берущий И нескольких скрытых, срабатывает только там, где выполнены все их условия сразу:

y=1[jhjm],hj=1[wjxbj],y=\mathbf 1\Bigl[\textstyle\sum_{j} h_j \ge m\Bigr], \qquad h_j=\mathbf 1[w_j\cdot x\ge b_j],

и при пороге mm, равном числу скрытых нейронов, это в точности пересечение всех их полуплоскостей. Пересечение полуплоскостей — это выпуклый многоугольник: тремя прямыми огораживается треугольник, четырьмя — четырёхугольник, и так любая выпуклая область. Возьмём вместо И — ИЛИ, и выход сработает там, где выполнено хоть одно условие: получится объединение областей, уже не обязательно выпуклое.

Отсюда общий вывод, к которому мы вернёмся строго в уроке об универсальности: достаточным числом скрытых прямых можно очертить какую угодно область на плоскости, а значит, двухслойная сеть способна отделить какие угодно перемешанные классы. Кривая граница — это просто много коротких прямых кусочков, и каждый кусочек даёт один скрытый нейрон. Стена XOR оказалась не стеной, а низким порожком: перешагнуть его позволяет один промежуточный слой.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева три прямые от скрытых нейронов и заштрихованный треугольник их пересечения; справа изогнутая замкнутая граница, составленная из многих коротких прямых отрезков, каждый помечен как один скрытый нейрон
Рис. 16.3. Пересечение полуплоскостей: скрытые прямые огораживают область

Слева: три скрытых нейрона задают три прямые, а выходной И оставляет только их общее пересечение — треугольник. Справа: много скрытых прямых, скомбинированных выходным слоем, очерчивают гладкую на вид кривую — на деле она собрана из коротких линейных кусков, по одному на скрытый нейрон. Композиция простого даёт сложное.

На реальных данных: две луны и горб проката

XOR — идеальный, но крошечный пример. Чтобы увидеть кривую границу живьём, возьмём классический для машинного обучения набор «две луны»: два серпа точек, вложенных друг в друга так, что ни одна прямая их не разделит — линейно неразделимая пара, как versicolor и virginica из урока 15, только нагляднее. Один нейрон здесь бессилен; двухслойная сеть с несколькими скрытыми прямыми огибает серпы кусочной границей и разделяет их почти без ошибок.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева два переплетённых серпа точек двух классов с наилучшей прямой, которая делает много ошибок; справа те же точки с изогнутой кусочно-линейной границей двухслойной сети, разделяющей серпы почти без ошибок
Рис. 16.4. Две луны: прямая не справится, скрытый слой огибает серпы

Слева — «две луны» и лучшая прямая: она ошибается на десятках точек, потому что классы переплетены. Справа — граница двухслойной сети из нескольких скрытых нейронов огибает оба серпа и разделяет их почти идеально. Каждый излом границы — работа одного скрытого нейрона.

Чего мы пока не умеем

За всё приходится платить, и здесь плата такая: веса скрытого слоя мы расставили руками, зная ответ заранее. Для XOR это легко — четыре строки, логика на виду. Но для «двух лун» с их сотнями точек, а тем более для картинок и текстов, подобрать веса промежуточных нейронов вручную немыслимо: мы не знаем заранее, какие прямые проводить в скрытом пространстве.

И здесь возникает трудность, которая застопорила нейросети на годы. Правило перцептрона из урока 15 учит по ошибке только выходной нейрон: для него известен правильный ответ. А какой «правильный ответ» у скрытого нейрона? Никто не говорит ему, какую прямую проводить, — его цель определяется лишь тем, как его выход потом используют следующие слои. Как разослать ошибку с выхода назад, к скрытым весам, чтобы каждый узнал свою долю вины? Формально скрытый вес wjw_j влияет на ошибку EE не напрямую, а через выход:

Ewj=Eyиз выходаyhjhjwj,\frac{\partial E}{\partial w_j} =\underbrace{\frac{\partial E}{\partial y}}_{\text{из выхода}}\cdot \frac{\partial y}{\partial h_j}\cdot \frac{\partial h_j}{\partial w_j},

и чтобы посчитать эту цепочку, ошибку нужно провести назад через все промежуточные звенья. Такой способ — обратное распространение ошибки — нашли только в 1980-х, и ему посвящён отдельный урок. Пока же запомним разделение: сегодня мы доказали, что многослойная сеть может решить нелинейную задачу; как научить её решать самой — вопрос следующего блока.

Русская линия: теорема Колмогорова

Почему композиция простых элементов способна выразить что угодно — вопрос не инженерный, а математический, и глубочайший ответ на него дал Андрей Колмогоров. В 1957 году он вместе с учеником Владимиром Арнольдом доказал теорему о суперпозиции: любую непрерывную функцию многих переменных можно точно представить композицией и суммой функций одной переменной. Иными словами, «сложная функция многих аргументов» всегда разбирается на слои простых одномерных функций — ровно та архитектура, что у нейросети: слой преобразований, потом сложение, потом снова преобразование.

Колмогоров решал тринадцатую проблему Гильберта и не думал о нейронных сетях, но его теорема стала теоретическим фундаментом идеи, что глубины и композиции достаточно для представления любой зависимости. Спустя почти семьдесят лет к ней вернулись снова: современные Колмогоров-Арнольд сети (KAN) прямо строятся по этой теореме, заменяя фиксированные функции активации обучаемыми одномерными. Стена XOR, которую мы сегодня перешагнули, и представление любой функции по Колмогорову — два конца одной мысли: сложное есть композиция простого.

Лаборатория: согните пространство руками

Скрытые прямые и кусочная граница: разделите две луны

Загружается живая иллюстрация…

Порядок опытов. Перед вами «две луны», неразделимые прямой. Добавляйте скрытые нейроны — каждый рисует свою прямую — и настраивайте их наклон и сдвиг; выходной слой комбинирует их в И или ИЛИ. Соберите из нескольких прямых замкнутую область вокруг одного серпа и посмотрите, как счётчик верно разделённых точек ползёт вверх. Переключитесь на XOR и убедитесь, что двух скрытых прямых хватает. Вы делаете руками ровно то, чему сеть научится сама в следующем блоке, — гнёте пространство, пока граница не станет простой.

Сборка: стена оказалась порожком

Три урока над нами висел предел одного нейрона — одна прямая, одна линейная граница, бессилие перед XOR и переплетёнными классами. Сегодня он снят одним ходом: скрытый слой не проводит границу лучше, а меняет пространство, в котором она проводится. Три нейрона превратили неразделимый XOR в разделимый, отправив его единицы в один угол нового пространства; много скрытых прямых огораживают какую угодно область, а кривая граница оказалась набором коротких прямых кусков. На «двух лунах» и на горбе велопроката мы увидели этот приём в деле. Осталась одна, но большая нехватка: веса скрытого слоя мы ставили руками, потому что у скрытого нейрона нет своего «правильного ответа». Научить сеть находить эти веса самой — задача обратного распространения, а чтобы к нему подойти, нужно сперва сменить язык: заменить жёсткий порог гладкой функцией и научиться измерять ошибку числом, которое можно уменьшать. С этого начинается разговор об оптимизации, к которому мы переходим.

Задачи