Траектория «Нейросети» · конспект 1 из 12

Системы уравнений и нейрон

О чём эта тема
Нейросетевой метод рассматривается как способ приближённого решения переопределённой системы уравнений, связывающей признаки объекта с искомой величиной. Вводится формальное определение нейрона, весовой матрицы и функции активации — базовый аппарат, на котором строятся все последующие конспекты траектории.
Аннотация
Конспект начинается с матричной записи системы линейных уравнений и метода наименьших квадратов как классического способа приближённого решения переопределённых систем. Затем вводится формальное определение нейрона — элемента, комбинирующего входные сигналы с помощью весовой матрицы, — и рассматриваются основные функции активации: линейная, сигмоида, гиперболический тангенс и ReLU; отдельная подглавка показывает нейрон как вычислительный граф, в котором смена функции узла превращает линейную регрессию в логистическую или в персептрон. Завершается конспект обсуждением линейной разделимости — на примере логических функций И, ИЛИ и «исключающее ИЛИ» показывается, какие задачи один нейрон решить способен, а какие принципиально нет, — и слоистой архитектурой сети: входной, скрытые и выходной слои, широкие и глубокие сети.
Пререквизиты
Матрицы и операции над ними, ранг матрицы, скалярное произведение векторов — курс линейной алгебры. Понятие производной не используется в этом конспекте и потребуется только в конспекте 2.
Мотивация
Пусть по группе студентов известны часы подготовки к экзамену и полученный балл. Требуется найти зависимость балла от часов подготовки, чтобы прогнозировать результат для новых студентов. Наблюдений обычно больше, чем неизвестных коэффициентов зависимости, и все они содержат погрешность измерения — точного решения такая система не имеет. Задача — найти приближённое решение, минимизирующее суммарную ошибку. Это в точности то, чем занимается нейросеть, только для более широкого класса зависимостей, чем линейные.

1. Система уравнений как модель зависимости

Комикс: один нейрон говорит «говорят, каждый третий не знает особенности нейросетей», соседние нейроны отвечают «я тоже» и «я знаю»
Из презентации курса «Нейросети: начало»

«Истина не тускнеет от повторения»

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

Сами уравнения при этом не выводятся логически из первых принципов, а возникают из наблюдений: если для множества объектов зафиксированы значения признаков \(x_1,\ldots,x_n\) и соответствующих им величин \(y_1,\ldots,y_n\), повторяющаяся закономерность в этих парах свидетельствует о существовании зависимости между ними. Чем больше таких наблюдений, тем увереннее можно утверждать, что зависимость — не случайное совпадение, а закономерность, которую стоит описать уравнением.

Пусть имеется \(m\) наблюдений, в каждом из которых зафиксированы значения \(n\) признаков \(x_{i1},\ldots,x_{in}\) и значение целевой величины \(y_i\), \(i=1,\ldots,m\). Линейная модель зависимости задаётся коэффициентами \(w_1,\ldots,w_n\) и свободным членом \(w_0\):

\[ y_i = w_1 x_{i1} + w_2 x_{i2} + \cdots + w_n x_{in} + w_0, \qquad i=1,\ldots,m \tag{1.1}\]

Введя матрицу \(X\) размера \(m \times (n+1)\), первый столбец которой заполнен единицами (для учёта \(w_0\)), а вектор неизвестных коэффициентов обозначив \(w = (w_0, w_1,\ldots,w_n)^{\mathsf T}\), систему (1.1) записывают в матричной форме:

\[ Xw = Y \tag{1.2}\]

Возможны ровно три случая, сколько решений может иметь система линейных уравнений (1.2), и все три определяются сравнением ранга матрицы \(X\) с рангом расширенной матрицы \([X\mid Y]\) и числом неизвестных \(n+1\) (теорема Кронекера — Капелли):

Сколько решений имеет система?
одно
\(\operatorname{rank}X=\operatorname{rank}[X\mid Y]=n+1\)
бесконечное множество
\(\operatorname{rank}X=\operatorname{rank}[X\mid Y] < n+1\)
ни одного
\(\operatorname{rank}X < \operatorname{rank}[X\mid Y]\)

Первый случай — точное решение \(w=X^{-1}Y\), возможное только при \(m=n+1\). Второй случай практического интереса для нас не представляет: он означает, что данных недостаточно, чтобы однозначно определить зависимость. Третий случай — типичный для реальных измерений: наблюдений больше, чем неизвестных (\(m>n+1\), система переопределена), и из-за шума измерений ранг расширенной матрицы, как правило, оказывается больше ранга \(X\) — точного решения нет.

1.1. Метод наименьших квадратов

Поскольку точного решения нет, задачу заменяют на поиск \(w\), минимизирующего невязку \(u = Y - Xw\). Название метода объясняется тем, какая мера невязки для этого выбрана: не сумма самих отклонений \(u_i\) (они разного знака и просто взаимно уничтожились бы), а сумма их квадратов — каждое отклонение \(u_i\) геометрически можно представить стороной квадрата площадью \(u_i^2\), и минимизируется именно суммарная площадь всех таких квадратов:

\[ J(w) = \lVert Y - Xw \rVert^2 = \sum_{i=1}^m u_i^2 \;\to\; \min_w \tag{1.3}\]
Тренажёр: почему «метод наименьших квадратов»

Каждый красный квадрат построен на отрезке-невязке между точкой наблюдения и прямой \(y=kx+w_0\); площадь квадрата равна \(u_i^2\). Двигайте \(k\) и \(w_0\), наблюдайте, как меняется суммарная площадь \(S(w)\), и попробуйте найти минимум вручную, прежде чем нажать кнопку с точным решением. Данные точек — иллюстративные, подобраны для демонстрации, а не измерены.

Решение этой задачи (нормальное уравнение метода наименьших квадратов) выписывается в явном виде:

\[ w^{*} = (X^{\mathsf T}X)^{-1}X^{\mathsf T}Y \tag{1.4}\]

Формула (1.4) — точное аналитическое решение, но только для линейной зависимости и только при условии, что критерий качества — именно сумма квадратов отклонений. Нейросетевой метод обобщает эту схему на нелинейные зависимости и произвольные (не обязательно квадратичные) критерии, но платит за это отказом от аналитического решения в пользу итерационного поиска — ему посвящён конспект 2.

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

1.2. Как «увидеть» закономерности в сложных явлениях?

Линейная модель (1.1)–(1.2) хорошо описывает зависимости, которые заранее можно записать уравнением. Но не любую закономерность удаётся угадать и явно выписать в виде формулы. Один и тот же подход — поиск зависимости между входом и выходом по множеству наблюдений — оказывается применим и к задачам, где вид зависимости заранее неизвестен и, вероятно, нелинеен:

Городские сцены и их семантическая сегментация: автомобили, дорога, здания и пешеходы размечены разными цветами
Вход — изображение сцены; выход — класс каждого пикселя (сегментация)
Осциллограмма и спектрограмма произнесённого слова «yes» с разметкой границ фонем Y, E, S
Вход — звуковая волна; выход — границы и метки фонем в произнесённом слове
Перенос стиля: фотография Эйфелевой башни (содержимое) + картина «Звёздная ночь» (стиль) = переделанное изображение
Вход — изображение и стиль; выход — изображение, перерисованное в этом стиле

Изображение, звуковая волна и стиль живописи описываются числами (яркость пикселей, амплитуда сигнала), но зависимость между входом и результатом здесь не сводится к явной формуле вида (1.1) — её нужно извлечь из множества примеров. Нейросетевой метод — это способ находить такие зависимости вычислительно, когда явно выписать уравнение невозможно или непрактично. Дальше рассматривается минимальный вычислительный элемент, из которого строится это решение, — нейрон.

2. Формальное определение нейрона

входные сигналы выход

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

Пусть на вход нейрона \(j\) поступают сигналы \(x_1,\ldots,x_N\) от \(N\) предшествующих элементов сети. Комбинированный ввод нейрона \(j\) определяется как

\[ \mathrm{net}_j = \sum_{i=1}^{N} x_i w_{ij} + w_{0j}, \tag{1.5}\]

где \(w_{ij}\) — вес связи, идущей от элемента \(i\) к нейрону \(j\), а \(w_{0j}\) — свободный член (смещение, англ. bias) нейрона \(j\). Формула (1.5) для одного нейрона с линейной активацией и является в точности моделью (1.1): нейрон с линейной активацией — это один линейный регрессионный прогноз, оформленный в виде вычислительного элемента.

Веса связей между двумя слоями сети записывают весовой матрицей \(W\): элемент \(w_{ij}\) (строка \(i\), столбец \(j\)) — вес связи, идущей от элемента \(j\) одного слоя к элементу \(i\) следующего. Такая запись удобна тем, что вычисление комбинированного ввода всех нейронов слоя сразу становится одним матричным умножением: \(\mathrm{net} = W x + w_0\).

2.1. Функция активации

Для каждого элемента нейронной сети имеется определённое правило, по которому из значения комбинированного ввода вычисляется выходное значение; это правило называется функцией активации. Выходной сигнал нейрона \(j\) получают применением функции активации \(f\) к комбинированному вводу:

\[ y_j = f(\mathrm{net}_j) \tag{1.6}\]

Употребительные функции активации:

\[ \begin{array}{ll} f_{\text{лин}}(x) = x, \qquad & f_{\text{сигм}}(x) = \dfrac{1}{1+e^{-x}},\\[1.6ex] f_{\tanh}(x) = \dfrac{e^{x}-e^{-x}}{e^{x}+e^{-x}}, \qquad & f_{\mathrm{ReLU}}(x) = \max(0, x) \end{array} \tag{1.7}\]
линейная сигмоида гиперб. тангенс ReLU
Графики функций активации (1.7); горизонтальная линия — уровень \(f=0\)

Сигмоида \(f_{\text{сигм}}\) монотонно преобразует любое вещественное число в интервал \((0,1)\), что удобно интерпретировать как вероятность принадлежности одному из двух классов: значения выше \(0{,}5\) относят к одному классу, ниже — к другому. Порог \(0{,}5\) соответствует нулевому значению комбинированного ввода: \(f_{\text{сигм}}(0)=0{,}5\).

График сигмоиды с пояснениями: значение −2 преобразуется в вероятность около 0,1 (класс 0), значение 2 — в вероятность около 0,9 (класс 1)
Сигмоида как классификатор — иллюстрация из презентации курса «Нейросети: начало»

Этими четырьмя функциями список не исчерпывается: далее в траектории встретятся softmax — обобщение сигмоиды на несколько классов (конспект 3) — и другие варианты; какие функции активации предпочтительны в каких задачах, будет обсуждаться по мере появления этих задач.

Типичная ошибка Забывают, что порог принятия решения \(0{,}5\) для сигмоиды соответствует \(\mathrm{net}=0\), а не какому-то отдельному настраиваемому параметру: изменить порог классификации — значит изменить веса или смещение так, чтобы точка \(\mathrm{net}=0\) сдвинулась в нужное место, а не подставить другое число вместо \(0{,}5\) при уже вычисленном \(\mathrm{net}\).

2.2. Нейрон как вычислительный граф

На нейрон полезно посмотреть ещё с одной стороны — как на вычислительный граф. Этот взгляд объясняет, почему из нейронов так естественно собираются сети. Вычислительный граф состоит из входных узлов, куда подаются данные, узла-функции, который их обрабатывает, и выходного узла с результатом; данные текут в одном направлении — от входов к выходу:

Вычислительный граф: два входных узла соединены с узлом-функцией, из которого выходит узел результата
Вычислительный граф: данные текут от входов через функцию к выходу. Из статьи MLU-Explain «Neural Networks» (Дж. Уилбер, 2023)

Таким графом можно представить самые разные алгоритмы. Например, линейная регрессия из раздела 1 — это вычислительный граф, в котором нужно изменить всего две вещи: приписать каждому ребру от входа к функции вес и сделать функцией взвешенную сумму — в точности комбинированный ввод (1.5):

x₁ x₂ w₁ w₂ Σ выход линейная регрессия: f = w₁x₁ + w₂x₂ + w₀
Линейная регрессия как граф
x₁ x₂ w₁ w₂ f(Σ) выход f = сигмоида → лог. регрессия; f = ступенька → перцептрон
Смена функции меняет алгоритм

Нативные схемы по мотивам MLU-Explain

Дальше — ключевое наблюдение. Захотели вместо регрессии классификацию — меняем функцию узла на сигмоиду, и граф вычисляет логистическую регрессию; ставим пороговую функцию — получаем персептрон. Сам граф не меняется, меняется только функция. Этот особенный узел — принимающий входы, выполняющий взвешенную операцию и пропускающий результат через функцию — и называется искусственным нейроном; это ровно определение из начала раздела 2, увиденное глазами графа. В нейросетях функции таких узлов обязаны быть нелинейными — это те самые функции активации из подглавки 2.1 (почему линейных недостаточно, станет ясно в разделе 3 на примере XOR). Прохождение данных через граф от входов к выходу называется прямым проходом (англ. forward pass) — термин, который будет постоянно использоваться при обучении сети в конспекте 2.

Интерактив: от вычислительного графа к нейросети

Кнопкой «далее» пройдите девять шагов: вычислительный граф на ваших глазах станет линейной регрессией, затем — логистической регрессией и персептроном (сменой функции узла), обрастёт скрытыми слоями и превратится в полную нейросеть; в выходном узле при этом перестраивается граница решения на задаче классификации. Все шаги повторяют логику этой подглавки и заглядывают вперёд — в раздел 3.

3. Линейная разделимость: нейрон как классификатор

Возьмём пороговую функцию активации (функцию Хевисайда) — историческую функцию активации персептрона Розенблатта (1958). Это простейшая кусочно-линейная функция: она меняет своё значение скачком, когда аргумент достигает порога:

\[ f_{\text{пор}}(x) = \begin{cases}1, & x > 0\\ 0, & x \le 0\end{cases} \tag{1.8}\]
График пороговой функции активации: значение 0 слева от порога, скачок до 1 в нуле
Пороговая функция активации — иллюстрация из презентации курса «Нейросети: начало»

Для нейрона с двумя входами \(x_1,x_2\) условие \(\mathrm{net}=0\), то есть

\[ w_1 x_1 + w_2 x_2 + w_0 = 0, \tag{1.9}\]

задаёт на плоскости \((x_1,x_2)\) прямую. Нейрон относит точки по одну сторону прямой к классу \(1\), по другую — к классу \(0\). Значит, единственный нейрон с пороговой активацией способен точно реализовать только линейно разделимую функцию — такую, для которой точки обоих классов можно разделить одной прямой (в общем случае — гиперплоскостью).

Логические функции двух аргументов И и ИЛИ линейно разделимы. Функция «исключающее ИЛИ» (XOR) — нет: на плоскости \((x_1,x_2)\) её единичные значения (точки \((0,1)\) и \((1,0)\)) и нулевые (точки \((0,0)\) и \((1,1)\)) расположены на противоположных диагоналях единичного квадрата, и никакая прямая не отделяет одну диагональ от другой. Это обстоятельство — не техническое ограничение конкретной реализации, а математический факт: для любых \(w_1, w_2, w_0\) хотя бы одна из четырёх точек будет классифицирована неверно. Именно этот факт лёг в основу критики персептрона в работе М. Минского и С. Пейперта «Perceptrons» (1969) и на десятилетия снизил интерес к нейросетевым методам.

Тренажёр: линейная разделимость
x₁x₂цельnetвыход 

Оранжевая линия — граница \(\mathrm{net}=0\); закрашенная точка — цель класса 1, незакрашенная — класса 0. Подберите \(w_1,w_2,w_0\) вручную для И и ИЛИ, затем переключитесь на XOR и убедитесь, что добиться 4 из 4 не удаётся ни при каком подборе.

Типичная ошибка Полагают, что задачу XOR можно решить, просто подбирая веса дольше или точнее. Дело не в качестве подбора: XOR не является линейно разделимой функцией в исходных координатах \((x_1,x_2)\), поэтому никакой единственный нейрон с линейной границей решения не даст верный результат на всех четырёх точках одновременно.

3.1. Решение XOR сетью из нескольких нейронов

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

\[ \mathrm{XOR}(x_1,x_2) = \mathrm{AND}\bigl(\mathrm{OR}(x_1,x_2),\; \mathrm{NAND}(x_1,x_2)\bigr) \tag{1.10}\]

Зафиксируем веса вручную (в конспекте 2 будет показано, как такие веса находятся автоматически, обучением, а не подбором):

\[ h_1 = f_{\text{пор}}(x_1+x_2-0{,}5) \quad(\text{реализует OR}), \qquad h_2 = f_{\text{пор}}(-x_1-x_2+1{,}5) \quad(\text{реализует NAND}) \tag{1.11}\]
\[ y = f_{\text{пор}}(h_1+h_2-1{,}5) \quad(\text{реализует AND над } h_1, h_2) \tag{1.12}\]

Проверка на всех четырёх входах:

x₁x₂h₁ (OR)h₂ (NAND)yXOR(x₁,x₂)
000100
011111
101111
111000

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

3.2. Архитектура сети: слои

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

входной скрытые слои выходной
Слоистая архитектура сети прямого распространения (по мотивам MLU-Explain)

Входной и выходной слои диктуются задачей: сколько признаков — столько входов, что предсказываем — таков выход. Скрытая же часть — во многом произвольна, и здесь проектирование сети становится больше искусством, чем наукой. Сеть может быть широкой — много нейронов в слое, или глубокой — много скрытых слоёв. Чем больше нейронов, тем более сложные закономерности сеть способна выучить — ценой риска переобучения (эта тема ждёт нас в конспекте 5) и вычислительной стоимости. Такую сеть можно собрать и потренировать вживую — добавляя слои и нейроны, посмотреть, как меняется граница решения на разных наборах данных, — в интерактиве ниже; к обучению весов мы приступим в конспекте 2, а границы решения настоящих сетей увидим в конспекте 3.

Интерактив: соберите и обучите свою нейросеть

Кнопками «+»/«−» задайте число скрытых слоёв и нейронов в них, выберите набор данных и нажимайте «Обучить: 1 эпоха» — фон рассеянного графика показывает текущую границу решения сети, а график справа — рост точности по эпохам. Попробуйте линейно неразделимые данные (кольца, спирали): сеть без скрытых слоёв с ними не справится — ровно по причинам из подглавки 3.1, — а сеть с одним-двумя скрытыми слоями выучит границу любой формы. «Сбросить веса» начинает обучение заново со случайных весов.

Подглавки 2.2 и 3.2 и оба интерактива — по визуальному введению MLU-Explain — открытого проекта Amazon Machine Learning University; перевод-адаптация.

Контрольные вопросы