Построение многослойного персептрона#

Простой пример#

Одна из самых простых нейронных сетей - функция, определённая следующим образом (трёхслойный персептрон):

image.png

где \(x_1\), \(x_2\) - какие-то действительные числа, образующие входной слой. Эти числа домнажаются на соответствующие веса w, суммируются согласно направлению стрелок и подаются на вход нейрону ближайшего слоя. В самом нейроне к сумме на входе применяется т.н. функция активации \(f_i\). Затем ситуация повторяется пока не дойдём по последнего выходного слоя y. Все слои, которые не являются входными или выходными называются скрытыми, тут такой всего один.

Смысл функции активации - усилить или ослабить суммарный входной сигнал. Типичный пример функции активации - сигмоид:

\[ f(x)=1 /\left(1+e^{-x}\right) \]

Для простоты пусть функции активации на всей нейронах будут одинаковые сигмоиды.

Итого видим, что наш перспептрон как функция из \(\mathbb{R}^2\) в \(\mathbb{R}\) зависит от 14 параметров (весов). Подбирая эти параметры, можно аппроксимировать любую другую функцию \(\tilde{g}:\mathbb{R}^2\rightarrow\mathbb{R}\). Подбирать эти веса можно, например, градиентным спуском (об этом ниже).

Т.е. нейросеть - семейство функций определенного вида, зависящая определённым образом от набора параметров (весов), подбирая которые можно аппроксимировать какие-либо зависимости.

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

Общая формулировка. Виды функций активации#

В целом, многослойный перспептрон будет выглядеть следующим образом (произвольная размерность и количество различных слоёв):

original image

Различные варианты функций активации можно посмотреть здесь: ru.wikipedia.org/wiki/Функция_активации. Самые простые и часто используемые функции активации - это сигмоид, ReLU, ступенька.

Примечание. Естественно, персептрон - это самое простое семейство нейронных сетей. Архитектуру можно существенно усложнить, добавив связи не только между соседними слоями или дополнительные преобразования (пример - «сжатие» входного слоя, заданного в виде матрицы).

Примечание. Важно найти баланс между объёмом слоёв и их количеством. Практически никаких аналитических результатов по сходимости нейронных сетей на данный момент нет, но в последнее десятилетие хорошо себя зарекоммендовали «глубокие» нейронные сети в большим количеством скрытых относительно небольших слоёв.

Почему оно работает? Теорема Колмогорова-Арнольда#

Теорема Арнольда-Колмогорова. Если \(f\) - это многомерная непрерывная функция, то \(f\) можно записать в виде конечной композиции непрерывных функций одной переменной и бинарной операции сложения. А именно,

\[ f(\mathbf{x})=f\left(x_1, \ldots, x_n\right)=\sum_{q=0}^{2 n} \Phi_q\left(\sum_{p=1}^n \phi_{q, p}\left(x_p\right)\right) \]

Примечание. Теорема в чистом виде говорит о том, что двухслойным персептроном можно приблизить что угодно (грамотно подбирая веса и функции активации в каждом нейроне). К сожалению, конструктивного алгоритма построения этих функций придумать не удалось, поэтому вот и изгаляемся с более сложными архитектурами, где дополнительно стараемся приблизить эти самые функции \(\phi\) и \(\Phi\).