От линейной модели к нейросети

ЧерновикМатериалы дорабатываются и будут дополняться.

Автор: Евгений Шкумат

Чему научимся

В этом параграфе разберём, как из линейной модели получается нейронная сеть. Вы сможете:

  • объяснить, зачем нейрону нелинейная функция активации;
  • выполнить прямой проход маленькой сети вручную и в Python;
  • проверить формы входа, весов, скрытого слоя и выхода;
  • показать на примере, почему один скрытый слой решает задачу, недоступную прямой.

Когда одной прямой мало

Начнём с учебной задачи о двух признаках. Ответ равен 1, если ровно один из признаков равен 1, и равен 0 во всех остальных случаях. Такую операцию называют исключающим ИЛИ, или XOR.

Таблица 1 — Учебные примеры для операции XOR
x1x_1 x2x_2 Класс yy
0 0 0
0 1 1
1 0 1
1 1 0

Посмотрим на четыре точки на плоскости (рисунок 1). Точки класса 1 стоят в противоположных углах квадрата, а точки класса 0 — в двух других углах. Отрезок между точками (0,1)(0,1) и (1,0)(1,0) пересекает отрезок между (0,0)(0,0) и (1,1)(1,1). Поэтому нельзя провести прямую, которая оставит точки одного класса по одну сторону, а точки другого — по другую.

Четыре точки в углах единичного квадрата: класс 1 — в левом верхнем и правом нижнем, класс 0 — в двух других; пунктирные отрезки между точками одного класса пересекаются в центре.
Рисунок 1 — Точки XOR и отрезки между точками одного класса

Линейная модель из занятия 1.3 и логистическая регрессия из занятия 1.6 проводят именно прямую границу. На этих четырёх примерах любая такая граница верно ответит не более чем на три вопроса, то есть даст accuracy не выше 0,750{,}75. Для решения XOR нужен новый признак, который зависит от x1x_1 и x2x_2 нелинейно. Его и создаёт скрытый слой сети.

Нейрон: взвешенная сумма и активация

Нейрон получает несколько чисел, умножает каждое на свой вес, складывает результаты и прибавляет смещение:

z=w1x1+w2x2+⋯+wnxn+b=w⊤x+b. z = w_1x_1 + w_2x_2 + \dots + w_nx_n + b = \mathbf w^\top \mathbf x + b.

Полученное число zz ещё не является ответом нейрона. К нему применяют функцию активации ff:

a=f(z). a = f(z).

Без функции активации нейрон остаётся линейной моделью: он умеет только взвешивать входы и сдвигать результат. Две такие операции подряд снова дают линейное преобразование, поэтому глубокая сеть без нелинейности не стала бы выразительнее одного слоя.

В скрытых слоях часто используют ReLU:

ReLU⁡(z)=max⁡(0,z). \operatorname{ReLU}(z) = \max(0, z).

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

σ(z)=11+e−z. \sigma(z) = \frac{1}{1 + e^{-z}}.

Сигмоида принимает любое число и возвращает значение от 0 до 1. Если вероятность не меньше 0,50{,}5, относим объект к классу 1, иначе — к классу 0.

Слой и формы данных

Нейроны объединяют в полносвязный слой: каждый его нейрон получает все входы предыдущего слоя. Если на вход подать вектор x\mathbf x, слой вычисляет вектор

h=f(Wx+b). \mathbf h = f(\mathbf W\mathbf x + \mathbf b).

Матрица W\mathbf W хранит веса всех нейронов: её строка соответствует одному нейрону, а столбец — одному входному признаку. Вектор b\mathbf b содержит смещения. Для сети с двумя входами, двумя скрытыми нейронами и одним выходом формы удобно свести в таблицу.

Таблица 2 — Формы данных в сети 2–2–1
Величина Форма Что означает
XX n×2n \times 2 пакет из nn объектов, у каждого два признака
W1W_1 2×22 \times 2 веса двух скрытых нейронов
b1b_1 22 смещения двух скрытых нейронов
HH n×2n \times 2 выходы скрытого слоя для всех объектов
W2W_2 1×21 \times 2 веса выходного нейрона
b2b_2 11 смещение выходного нейрона
zz, pp n×1n \times 1 взвешенная сумма и вероятность для каждого объекта
Два входа соединены с двумя нейронами скрытого слоя, затем с одним выходным нейроном
Рисунок 2 — Сеть 2–2–1: два входа, два скрытых нейрона и один выход

На рисунке 2 данные идут слева направо: каждый вход связан с обоими скрытыми нейронами, а их выходы собираются в один ответ. Прямой проход — это последовательное применение таких слоёв. Веса при этом не меняются: мы только вычисляем ответ. Число нейронов в слое называют его шириной, а число слоёв — глубиной. Сеть из таблицы имеет один скрытый слой и часто называется многослойным перцептроном, или MLP.

Разбираем сеть для XOR

Зададим конкретные веса. Пока это не результат обучения, а специально подобранный пример, на котором удобно считать вручную:

W1=(1111),b1=(−0,5−1,5),W2=(1−3),b2=−0,25. W_1 = \begin{pmatrix}1 & 1\\ 1 & 1\end{pmatrix},\qquad b_1 = \begin{pmatrix}-0{,}5\\ -1{,}5\end{pmatrix},\qquad W_2 = \begin{pmatrix}1 & -3\end{pmatrix},\qquad b_2 = -0{,}25.

Скрытые нейроны вычисляют

h1=ReLU⁡(x1+x2−0,5),h2=ReLU⁡(x1+x2−1,5). h_1 = \operatorname{ReLU}(x_1 + x_2 - 0{,}5),\qquad h_2 = \operatorname{ReLU}(x_1 + x_2 - 1{,}5).

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

z=h1−3h2−0,25,p=σ(z). z = h_1 - 3h_2 - 0{,}25,\qquad p = \sigma(z).

Проверим два случая. Для входа (0,1)(0,1) получаем h1=0,5h_1 = 0{,}5, h2=0h_2 = 0, затем z=0,25z = 0{,}25 и p≈0,56p \approx 0{,}56. Это больше 0,50{,}5, поэтому сеть отвечает 1. Для входа (1,1)(1,1) получаем h1=1,5h_1 = 1{,}5, h2=0,5h_2 = 0{,}5, затем z=−0,25z = -0{,}25 и p≈0,44p \approx 0{,}44. Теперь ответ 0.

Таблица 3 — Прямой проход сети 2–2–1 на примерах XOR
x1x_1 x2x_2 h1h_1 h2h_2 zz pp Ответ
0 0 0 0 −0,25 0,44 0
0 1 0,5 0 0,25 0,56 1
1 0 0,5 0 0,25 0,56 1
1 1 1,5 0,5 −0,25 0,44 0

Сеть решила задачу не потому, что стала «умнее» прямой, а потому, что скрытый слой построил новые признаки: «есть хотя бы одна единица» и «есть обе единицы». Выходной нейрон сравнивает их и даёт высокий ответ только в двух средних строках. Вероятности здесь близки к 0,50{,}5, поскольку веса выбраны для простых вычислений. При обучении в следующем параграфе они подстроятся так, чтобы ответы стали увереннее.

Тот же расчёт в Python

Повторим вычисления без внешних библиотек. Функции relu и sigmoid принимают одно число, а forward выполняет весь прямой проход.

import math


def relu(z):
    return max(0.0, z)


def sigmoid(z):
    return 1 / (1 + math.exp(-z))


def forward(x1, x2):
    h1 = relu(x1 + x2 - 0.5)
    h2 = relu(x1 + x2 - 1.5)
    z = h1 - 3 * h2 - 0.25
    return h1, h2, z, sigmoid(z)


for x1, x2 in [(0, 0), (0, 1), (1, 0), (1, 1)]:
    h1, h2, z, p = forward(x1, x2)
    answer = int(p >= 0.5)
    print(f"{x1} {x2} | {h1:.1f} {h2:.1f} | {z:+.2f} | {p:.3f} | {answer}")

Программа напечатает:

0 0 | 0.0 0.0 | -0.25 | 0.438 | 0
0 1 | 0.5 0.0 | +0.25 | 0.562 | 1
1 0 | 0.5 0.0 | +0.25 | 0.562 | 1
1 1 | 1.5 0.5 | -0.25 | 0.438 | 0

Результат совпадает с таблицей. В библиотеках для нейросетей те же действия выполняются сразу для пакета объектов: вход получает форму (n, 2), после первого слоя — (n, 2), после выходного — (n, 1). Если форма не совпала, чаще всего перепутаны число признаков и число объектов.

Попробуйте сами

  1. Вычислите вручную прямой проход для входа (1,0)(1,0): найдите h1h_1, h2h_2, zz, вероятность и ответ. Затем проверьте себя программой. Для самопроверки: h1=0,5h_1=0{,}5, h2=0h_2=0, z=0,25z=0{,}25, p≈0,56p\approx0{,}56, ответ 1.

  2. Замените в программе смещение b2b_2 на 0,250{,}25. Пересчитайте все четыре строки и объясните, почему сеть перестала решать XOR. Для самопроверки: все вероятности окажутся больше 0,50{,}5, поэтому сеть ответит 1 всем объектам и угадает только два ответа из четырёх.

  3. Для сети, которая получает пять объектов с четырьмя признаками и имеет скрытый слой из трёх нейронов, выпишите формы XX, W1W_1, b1b_1, HH, W2W_2 и b2b_2. Проверьте, что число столбцов каждой матрицы совпадает с размером входа следующей операции.

  4. Уберите ReLU из сети и оставьте только линейные преобразования. Покажите, что два слоя можно заменить одним линейным преобразованием. Объясните, почему после этого задача XOR снова становится нерешаемой.

Что стоит унести с собой

Нейрон вычисляет взвешенную сумму входов и применяет к ней функцию активации. Слой объединяет несколько таких нейронов, а прямой проход последовательно передаёт данные от входа к выходу. Нелинейная активация нужна, чтобы сеть могла строить границы сложнее прямой. На примере XOR мы увидели, как скрытый слой создаёт новые признаки, а выходной слой принимает по ним решение.

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

Самопроверка

Вопрос 1

Зачем в нейрон добавляют функцию активации?

Подсказка

Что произойдёт, если оставить только взвешенные суммы и смещения?

Решение

B. Без нелинейной активации несколько слоёв сводятся к одному линейному преобразованию, поэтому граница остаётся прямой.

Вопрос 2

Какую форму имеет матрица весов слоя из трёх нейронов для четырёх входных признаков?

Подсказка

Строка матрицы соответствует одному нейрону, столбец — одному входу.

Решение

A. Три нейрона дают три строки, четыре признака — четыре столбца. Смещений при этом три, а не четыре.

Вопрос 3

Чему равно ReLU⁡(−2)+ReLU⁡(3)\operatorname{ReLU}(-2) + \operatorname{ReLU}(3)?

Подсказка

ReLU заменяет отрицательное значение нулём, а положительное оставляет как есть.

Решение

B. ReLU⁡(−2)=0\operatorname{ReLU}(-2)=0, ReLU⁡(3)=3\operatorname{ReLU}(3)=3, поэтому сумма равна 3.

Вопрос 4

Почему одна прямая не решает задачу XOR?

Подсказка

Нарисуйте четыре точки квадрата и соедините точки класса 1.

Решение

B. Точки классов расположены через одну, и отрезки, соединяющие пары, пересекаются. Прямая не может развести концы пересекающихся отрезков по разные стороны.

Вопрос 5

Почему при входе (0,1)(0,1) второй скрытый нейрон не активен?

Подсказка

Сначала вычислите взвешенную сумму второго нейрона, затем примените ReLU.

Решение

A. 1−1,5=−0,51-1{,}5=-0{,}5, поэтому ReLU⁡(−0,5)=0\operatorname{ReLU}(-0{,}5)=0. Выход второго нейрона равен нулю.

Вопрос 6

Что произойдёт, если убрать ReLU и оставить только линейные слои?

Подсказка

Подставьте выход первого слоя во второй и раскройте скобки.

Решение

B. Если H=W1X+b1H=W_1X+b_1, а Z=W2H+b2Z=W_2H+b_2, то Z=(W2W1)X+(W2b1+b2)Z=(W_2W_1)X+(W_2b_1+b_2). Это снова линейное преобразование, поэтому XOR остаётся неразрешимым.

Файлы

Дополнительные материалы