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

Сеть — это композиция слоёв

Одиночный нейрон считает φ(wx)\varphi(w\cdot x): взвешивает входы и пропускает через активацию. Слой — это просто много таких нейронов бок о бок, каждый со своими весами смотрит на один и тот же вход xx и выдаёт своё число. Сложим их веса построчно в матрицу WW (одна строка на нейрон), смещения — в вектор bb, и весь слой запишется одной строкой:

h=φ(Wx+b).h = \varphi(W x + b).

Здесь xx — вектор входов, Wx+bWx+b — вектор из счётов всех нейронов разом, а φ\varphi применяется к каждой координате. Это то же самое, что вычислить нейроны по одному, но записанное как единая операция над векторами, матрично-векторное умножение. Сеть получается, когда выход одного слоя становится входом следующего:

h=φ(W1x+b1),y^=softmax(W2h+b2).h = \varphi(W_1 x + b_1), \qquad \hat y = \operatorname{softmax}(W_2 h + b_2).

Первый слой превращает вход xx в скрытые признаки hh, второй делает из этих признаков ответ y^\hat y. Вся сеть — это композиция двух простых операций, функция, которая берёт вектор чисел на входе и отдаёт вектор чисел на выходе. Больше в ней ничего нет.

Соберём сеть для ирисов

Хватит абстракций, возьмём живую задачу. Ирисы Фишера из урока о перцептроне: четыре измерения цветка (длина и ширина лепестка и чашелистика) и три вида — setosa, versicolor, virginica. Построим крошечную сеть: четыре входа, скрытый слой из шести нейронов с активацией tanh\tanh, выходной слой из трёх нейронов — по одному на вид. Веса этой сети уже настроены (как именно их настраивают, мы узнаем в уроке о backprop); сейчас важно другое — проследить, как сеть считает.

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

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Схема сети: четыре входных узла (измерения цветка) соединены со слоем из шести скрытых нейронов, те — с тремя выходными узлами по одному на вид ириса; на выходе softmax даёт вероятности
Рис. 18.1. Сеть 4–6–3 для ирисов: входы, скрытый слой, выходы

Сеть для ирисов: четыре входа (измерения цветка), скрытый слой из шести tanh\tanh-нейронов и три выхода. Каждая стрелка — вес; их у первого слоя 6×4=246\times 4=24, у второго 3×6=183\times 6=18. Softmax на выходе превращает три счёта в три вероятности видов. Крошечная сеть, но это уже полноценная архитектура.

Прогон одного цветка, шаг за шагом

Возьмём первый цветок датасета — setosa с измерениями (5,1;3,5;1,4;0,2)(5{,}1;\,3{,}5;\,1{,}4;\,0{,}2) см. Проследим его путь через сеть.

Сначала вход приводят к общему масштабу — вычитают среднее и делят на разброс, как в уроке о кластерах, иначе признаки с крупными числами задавят мелкие. Цветок превращается в стандартизованный вектор

x=(0,90; 1,03; 1,34; 1,31).x = (-0{,}90;\ 1{,}03;\ -1{,}34;\ -1{,}31).

Первый слой умножает его на матрицу W1W_1, добавляет b1b_1 и пропускает через tanh\tanh. Получается вектор из шести скрытых признаков:

h=tanh(W1x+b1)=(0,55; 0,98; 1,00; 0,99; 0,97; 1,00).h = \tanh(W_1 x + b_1) = (-0{,}55;\ -0{,}98;\ 1{,}00;\ -0{,}99;\ -0{,}97;\ 1{,}00).

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

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Пошаговая схема прогона: слева четыре стандартизованных измерения, затем шесть столбиков скрытых активаций tanh, затем три выходных счёта, справа три вероятности softmax с явным победителем setosa
Рис. 18.2. Forward pass: от измерений цветка к вероятностям видов

Путь цветка сквозь сеть слева направо: четыре стандартизованных измерения, шесть скрытых активаций tanh\tanh (столбики от 1-1 до 11), три выходных счёта и, наконец, три вероятности softmax. Для этого setosa сеть выдаёт 0,9980{,}998 на нужном виде — уверенное попадание. Ни одного обучения на этом рисунке: только прогон уже готовых весов.

Softmax: три счёта в три вероятности

Выходные счёта — произвольные числа, они не похожи на вероятности: могут быть отрицательными, не складываются в единицу. Превращает их в вероятности функция softmax — обобщение сигмоиды из прошлого урока на несколько классов:

softmax(z)k=ezkjezj.\operatorname{softmax}(z)_k = \frac{e^{z_k}}{\sum_j e^{z_j}} .

Каждый счёт возводят в экспоненту (это делает все числа положительными и раздвигает большие сильнее малых) и делят на сумму, и получаются KK положительных чисел, складывающихся ровно в 11. Их и читают как вероятности классов. Для нашего setosa три выходных счёта после softmax дали

y^=(0,998; 0,002; 0,000),\hat y = (0{,}998;\ 0{,}002;\ 0{,}000),

то есть сеть на 99,8%99{,}8\% уверена, что это setosa, и не ошиблась. Softmax не просто выбирает наибольший счёт, а сообщает, насколько уверенно, это «мягкий максимум», сохраняющий градации сомнения, а потому пригодный для обучения градиентом.

Когда сеть сомневается честно

Не каждый цветок так однозначен, как setosa. Прогоним versicolor, что растёт на границе с virginica: его измерения похожи на оба вида, и сеть это чувствует. Её выход —

y^=(0,001; 0,55; 0,449),\hat y = (0{,}001;\ 0{,}55;\ 0{,}449),

почти поровну между versicolor и virginica. Формально сеть выбирает versicolor (у него чуть больше), и на этом цветке она права, но её уверенность — всего 55%55\% против 45%45\%. Это не поломка, а честность: цветок и вправду пограничный, и раздувать уверенность до 99%99\% было бы ложью. Softmax передал ровно ту меру сомнения, которая заложена в данных.

Такая калибровка — большое достоинство. Модель, которая не только угадывает, но и сообщает, насколько уверена, куда полезнее уверенного болтуна: по вероятности 0,550{,}55 врач назначит перепроверку, а по 0,9980{,}998 — нет. Способность честно сомневаться прямо вытекает из softmax и вернётся к нам, когда речь пойдёт о доверии к моделям в уроке о безопасности ИИ.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Три набора столбиков вероятностей: setosa с почти полной уверенностью на одном виде, virginica тоже уверенно, versicolor с почти равными столбиками 0.55 и 0.45 между двумя видами
Рис. 18.3. Три цветка, три ответа: уверенность и сомнение

Три цветка сквозь одну сеть. setosa и virginica сеть узнаёт уверенно — один столбик почти во всю высоту. Пограничный versicolor даёт два почти равных столбика (0,550{,}55 и 0,450{,}45): сеть склоняется к верному ответу, но честно признаёт сомнение. Вероятности softmax — это и выбор, и мера уверенности в нём.

Все цветки разом: векторизация

Мы прогнали цветы по одному, но на практике их подают пачками. И тут матричная запись раскрывается сполна. Сложим измерения nn цветков в матрицу XX размера n×4n\times 4 — строка на цветок. Тогда скрытые признаки всей пачки считаются одним умножением:

H=tanh(XW1+b1),H = \tanh(X W_1^{\top} + b_1),

где HH — матрица n×6n\times 6 скрытых активаций всех цветков сразу. Не цикл по цветкам, а одно матричное умножение, которое процессоры и видеокарты выполняют молниеносно. Это и есть векторизация: записать вычисление над множеством объектов как операцию над матрицами. Вся скорость современных сетей стоит на том, что forward pass — это несколько больших матричных умножений, а их железо считает параллельно.

Русская линия: узнавание как признаки

Мысль, что распознавание — это извлечение признаков, а не сравнение с образцами, оформил советский учёный Михаил Бонгард. В книге «Проблема узнавания» (1967), работая в Институте проблем передачи информации, он описал узнавание образов как поиск информативных признаков, по которым объект относят к классу, — ровно то, что делает скрытый слой нашей сети, добывая из измерений цветка шесть чисел-признаков. Бонгард придумал и знаменитые «задачи Бонгарда»: пары наборов картинок, где надо угадать отличающее их правило. Эти головоломки до сих пор служат пробным камнем для искусственного интеллекта — многие из них не даются даже современным моделям, потому что требуют находить признак, которого в данных прямо не видно.

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

Forward pass: от измерений цветка к вероятностям видов

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

Порядок опытов. Двигайте четыре измерения цветка или выбирайте готовый пример — и следите, как сигнал течёт по сети: входы стандартизуются, скрытый слой загорается шестью активациями tanh\tanh, softmax превращает выходные счёта в три вероятности видов. Найдите настройки, при которых сеть уверена почти на сто процентов, и настройки, где она колеблется между двумя видами. Вы своими руками прогоняете тот самый forward pass, что мы разобрали по шагам, — и видите, что вся сеть есть цепочка умножений и активаций, ведущая от чисел на входе к вероятностям на выходе.

Сборка: вход, слои, ответ

Первая целая сеть оказалась именно тем, что обещали детали: композицией слоёв. Слой — это φ(Wx+b)\varphi(Wx+b), много нейронов, сложенных в одну матричную операцию; сеть — несколько слоёв подряд, функция от входного вектора к выходному. Мы прогнали сквозь неё настоящий ирис: измерения стандартизовались, первый слой добыл шесть скрытых признаков, второй превратил их в три счёта, а softmax — в три вероятности, честно уверенные для ясного цветка и честно сомневающиеся для пограничного. Пачку цветов та же сеть считает одним матричным умножением — оттого и любит видеокарты. Мы ни разу не обучали её: веса были готовы, а урок был про то, как сеть считает, а не как учится. Но именно этот вопрос — откуда берутся веса, превращающие сырые измерения в верный ответ, — теперь единственный оставшийся. Чтобы к нему подступиться, надо сначала научиться измерять ошибку сети одним числом и понять, как это число уменьшать. С функции потерь и градиентного спуска начинается следующий разговор — про то, как сеть находит свои веса сама.

Задачи