У нас на руках все детали: слой умеет гнуть пространство
из урока о глубине, а гладкая активация
из прошлого урока пропускает через себя обучение.
Сегодня мы соберём из них первую целую нейронную сеть и прогоним сквозь
неё настоящий цветок — не обучая её, а просто глядя, как вход
превращается в ответ.
Сеть — это композиция слоёв
Одиночный нейрон считает φ(w⋅x): взвешивает входы и
пропускает через активацию. Слой — это просто много таких нейронов
бок о бок, каждый со своими весами смотрит на один и тот же вход x и
выдаёт своё число. Сложим их веса построчно в матрицу W (одна строка
на нейрон), смещения — в вектор b, и весь слой запишется одной
строкой:
h=φ(Wx+b).
Здесь x — вектор входов, Wx+b — вектор из счётов всех нейронов
разом, а φ применяется к каждой координате. Это то же самое,
что вычислить нейроны по одному, но записанное как единая операция над
векторами, матрично-векторное умножение. Сеть получается, когда выход
одного слоя становится входом следующего:
h=φ(W1x+b1),y^=softmax(W2h+b2).
Первый слой превращает вход x в скрытые признаки h, второй делает из
этих признаков ответ y^. Вся сеть — это композиция двух простых
операций, функция, которая берёт вектор чисел на входе и отдаёт вектор
чисел на выходе. Больше в ней ничего нет.
Соберём сеть для ирисов
Хватит абстракций, возьмём живую задачу. Ирисы Фишера из
урока о перцептроне: четыре измерения цветка (длина и
ширина лепестка и чашелистика) и три вида — setosa, versicolor,
virginica. Построим крошечную сеть: четыре входа, скрытый слой из шести
нейронов с активацией tanh, выходной слой из трёх нейронов — по
одному на вид. Веса этой сети уже настроены (как именно их настраивают,
мы узнаем в уроке о backprop); сейчас важно другое —
проследить, как сеть считает.
Схема ниже — вся наша сеть: четыре входных узла, шесть скрытых, три
выходных, а между ними — веса, которые мы прогоним численно.
Рис. 18.1. Сеть 4–6–3 для ирисов: входы, скрытый слой, выходы
Сеть для ирисов: четыре входа (измерения цветка), скрытый слой из шести
tanh-нейронов и три выхода. Каждая стрелка — вес; их у первого слоя
6×4=24, у второго 3×6=18. Softmax на выходе превращает
три счёта в три вероятности видов. Крошечная сеть, но это уже
полноценная архитектура.
Прогон одного цветка, шаг за шагом
Возьмём первый цветок датасета — setosa с измерениями
(5,1;3,5;1,4;0,2) см. Проследим его путь через сеть.
Сначала вход приводят к общему масштабу — вычитают среднее и делят на
разброс, как в уроке о кластерах, иначе признаки с
крупными числами задавят мелкие. Цветок превращается в
стандартизованный вектор
x=(−0,90;1,03;−1,34;−1,31).
Первый слой умножает его на матрицу W1, добавляет b1 и
пропускает через tanh. Получается вектор из шести скрытых признаков:
Каждое из этих чисел есть ответ одного скрытого нейрона: насколько сильно
сработал его выученный признак. Мы не знаем заранее, что «значит»
третий или пятый нейрон, — сеть сама подобрала эти признаки при
обучении, но их шесть чисел уже несут в себе всё, что сеть поняла про
цветок. Второй слой берёт эти шесть чисел, умножает на W2, добавляет
b2 и получает три выходных счёта, по одному на вид. Осталось
превратить счёта в вероятности.
Рис. 18.2. Forward pass: от измерений цветка к вероятностям видов
Путь цветка сквозь сеть слева направо: четыре стандартизованных
измерения, шесть скрытых активаций tanh (столбики от −1 до 1),
три выходных счёта и, наконец, три вероятности softmax. Для этого
setosa сеть выдаёт 0,998 на нужном виде — уверенное попадание. Ни
одного обучения на этом рисунке: только прогон уже готовых весов.
Softmax: три счёта в три вероятности
Выходные счёта — произвольные числа, они не похожи на вероятности:
могут быть отрицательными, не складываются в единицу. Превращает их в
вероятности функция softmax — обобщение сигмоиды
из прошлого урока на несколько классов:
softmax(z)k=∑jezjezk.
Каждый счёт возводят в экспоненту (это делает все числа положительными
и раздвигает большие сильнее малых) и делят на сумму, и получаются
K положительных чисел, складывающихся ровно в 1. Их и читают как
вероятности классов. Для нашего setosa три выходных счёта после softmax
дали
y^=(0,998;0,002;0,000),
то есть сеть на 99,8% уверена, что это setosa, и не ошиблась.
Softmax не просто выбирает наибольший счёт, а сообщает, насколько
уверенно, это «мягкий максимум», сохраняющий градации сомнения, а
потому пригодный для обучения градиентом.
Когда сеть сомневается честно
Не каждый цветок так однозначен, как setosa. Прогоним versicolor,
что растёт на границе с virginica: его измерения похожи на оба вида, и
сеть это чувствует. Её выход —
y^=(0,001;0,55;0,449),
почти поровну между versicolor и virginica. Формально сеть выбирает
versicolor (у него чуть больше), и на этом цветке она права, но её
уверенность — всего 55% против 45%. Это не поломка, а честность:
цветок и вправду пограничный, и раздувать уверенность до 99% было бы
ложью. Softmax передал ровно ту меру сомнения, которая заложена в
данных.
Такая калибровка — большое достоинство. Модель, которая не только
угадывает, но и сообщает, насколько уверена, куда полезнее уверенного
болтуна: по вероятности 0,55 врач назначит перепроверку, а по
0,998 — нет. Способность честно сомневаться прямо вытекает из
softmax и вернётся к нам, когда речь пойдёт о доверии к моделям в
уроке о безопасности ИИ.
Рис. 18.3. Три цветка, три ответа: уверенность и сомнение
Три цветка сквозь одну сеть. setosa и virginica сеть узнаёт уверенно —
один столбик почти во всю высоту. Пограничный versicolor даёт два почти
равных столбика (0,55 и 0,45): сеть склоняется к верному ответу,
но честно признаёт сомнение. Вероятности softmax — это и выбор,
и мера уверенности в нём.
Все цветки разом: векторизация
Мы прогнали цветы по одному, но на практике их подают пачками. И тут
матричная запись раскрывается сполна. Сложим измерения n
цветков в матрицу X размера n×4 — строка на цветок. Тогда
скрытые признаки всей пачки считаются одним умножением:
H=tanh(XW1⊤+b1),
где H — матрица n×6 скрытых активаций всех цветков сразу. Не
цикл по цветкам, а одно матричное умножение, которое процессоры и
видеокарты выполняют молниеносно. Это и есть векторизация: записать
вычисление над множеством объектов как операцию над матрицами. Вся
скорость современных сетей стоит на том, что forward pass — это
несколько больших матричных умножений, а их железо считает
параллельно.
Русская линия: узнавание как признаки
Мысль, что распознавание — это извлечение признаков, а не сравнение с
образцами, оформил советский учёный Михаил Бонгард. В книге «Проблема
узнавания» (1967), работая в Институте проблем передачи информации, он
описал узнавание образов как поиск информативных признаков, по которым
объект относят к классу, — ровно то, что делает скрытый слой нашей
сети, добывая из измерений цветка шесть чисел-признаков. Бонгард
придумал и знаменитые «задачи Бонгарда»: пары наборов картинок, где
надо угадать отличающее их правило. Эти головоломки до сих пор служат
пробным камнем для искусственного интеллекта — многие из них не даются
даже современным моделям, потому что требуют находить признак, которого
в данных прямо не видно.
Лаборатория: прогоните цветок сами
Forward pass: от измерений цветка к вероятностям видов
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
Порядок опытов. Двигайте четыре измерения цветка или выбирайте готовый
пример — и следите, как сигнал течёт по сети: входы стандартизуются,
скрытый слой загорается шестью активациями tanh, softmax превращает
выходные счёта в три вероятности видов. Найдите настройки, при которых
сеть уверена почти на сто процентов, и настройки, где она колеблется
между двумя видами. Вы своими руками прогоняете тот самый forward pass,
что мы разобрали по шагам, — и видите, что вся сеть есть цепочка
умножений и активаций, ведущая от чисел на входе к вероятностям на
выходе.
Сборка: вход, слои, ответ
Первая целая сеть оказалась именно тем, что обещали детали: композицией
слоёв. Слой — это φ(Wx+b), много нейронов, сложенных в одну
матричную операцию; сеть — несколько слоёв подряд, функция от входного
вектора к выходному. Мы прогнали сквозь неё настоящий ирис: измерения
стандартизовались, первый слой добыл шесть скрытых признаков, второй
превратил их в три счёта, а softmax — в три вероятности, честно уверенные
для ясного цветка и честно сомневающиеся для пограничного. Пачку цветов
та же сеть считает одним матричным умножением — оттого и любит
видеокарты. Мы ни разу не обучали её: веса были готовы, а урок был про
то, как сеть считает, а не как учится. Но именно этот вопрос — откуда
берутся веса, превращающие сырые измерения в верный ответ, — теперь
единственный оставшийся. Чтобы к нему подступиться, надо сначала
научиться измерять ошибку сети одним числом и понять, как это число
уменьшать. С функции потерь и градиентного спуска начинается следующий
разговор — про то, как сеть находит свои веса сама.