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

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

Каждая нейронная сеть имеет разные веса и смещения. Каждый вход в узел имеет связанный вес, и каждый узел имеет смещение. Базовый алгоритм в нейронных сетях такой же: умножьте входные данные на их связанный вес и добавьте смещение узла. Возьмите это новое значение и сделайте то же самое для следующего узла: умножьте это новое значение на связанный вес и добавьте смещение следующего узла. (Он будет усложняться функциями активации, но давайте вернемся к этому чуть позже). Если в одном узле оказывается более одного значения, возьмите их сумму.

По сути, нейронная сеть - это просто набор линейных функций вида wᵢ × x + bᵢ!

Чтобы лучше понять, как это работает, давайте рассмотрим одну из простейших нейронных сетей - одну с одним входом, двумя узлами в своем единственном скрытом слое и одним выходом. Мы не будем использовать функцию активации на этой конкретной модели.

Наши веса и смещения, указанные выше, были выбраны случайным образом для иллюстрации, и давайте начнем с ввода x = 2.

x = 2 перемещается к двум узлам. В верхней ветви мы умножаем x на w₁ и прибавляем b₁, поэтому: 3 (2) + (-2) = 4. То же самое проделываем с x с w₂ и b₂: 4 (2) + 4 = 12.

Эти значения 4 и 12 теперь покидают скрытый слой и снова преобразуются следующими весами и смещениями к выходному узлу. Смещение добавляется только один раз, когда произведение весов и входных данных находится «в» узле.

Когда два или более значения находятся в одном узле, мы просто суммируем их. Мы вычисляем это как 1 (4) + (-0,5) (12) +2 = 0, поэтому наше выходное значение равно 0.

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

Мы можем взглянуть на то, что эта модель производит на выходе с разными входами. Мы уже знаем, что происходит, когда мы добавляем сюда x = 2. При x = 3 получаем следующее:

При x = 4 наш результат равен 2.
x = 5 дает нам результат 3.
x = 6 дает нам результат 4.

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

Почему?
Верхний путь представляет собой композицию f₁ = 3x-2 и f₂ = 1x.
Нижний путь представляет собой композицию g₁ = 4x + 4 и g₂ = -0,5x.

f₂(f₁) = (3x-2) = 3x -2
g₂(g₁) = -0.5(4x+4) = -2x -2

Суммируя их вместе в последнем узле и добавляя два, получаем
(3x -2) + (-2x -2) + 2 = x - 2

Без функции активации нейронная сеть сможет моделировать только ЛИНЕЙНЫЕ данные. Каждое из этих преобразований является линейной функцией, и составление и суммирование набора линейных функций просто дает вам еще одну линейную функцию! Независимо от того, какие веса и смещения мы выбираем, и независимо от того, насколько сложна структура сети, все это можно упростить до линейной функции. Магия нейронных сетей оживает с введением функции активации на каждом уровне. Это позволяет нашим нейронным сетям не только моделировать линейные данные, но и переходить к гораздо более сложным структурам.

Используя ту же простую модель, давайте добавим часто используемую функцию активации на наш скрытый и выходной слой: сигмовидную функцию. Эта функция красиво сжимает все действительные значения до значений от 0 до 1. Очень отрицательные значения близки к 0, очень положительные значения близки к 1.

Перейдя на скрытый слой, мы здесь:

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

Наш выходной узел перед активацией теперь будет содержать значение (с округлением):
(0,982 * 1) + (0,999 * -0,5) +2 = 2,482. Активация этого слоя путем вычисления 2,482 в нашей сигмоидной функции дает:

Понятно, что это уже не линейная модель - это значение функций активации. Есть много функций активации на выбор, включая другие сигмоидные функции, такие как tanh и arctan (используются довольно редко), но другие полезные функции активации - это функции relu и softmax - последние обычно используются на уровне вывода для мульти классификационные модели.

Мы также можем добавлять больше слоев, смешивать и сопоставлять различные функции активации и добавлять больше узлов к каждому слою, увеличивая сложность и, надеюсь, улучшая показатели нашей нейронной сети как модели.

Это было отредактировано 13 мая, чтобы исправить ошибку при добавлении смещения.