Если убрать легенду, глубокое обучение — это просто оптимизация функций, как и большинство машинного обучения.

Я объясню, как работает Deep Learning, в два этапа. Во-первых, что такое глубокие нейронные сети. Во-вторых, как заставить их «учиться».

Глубокие нейронные сети — математическая модель

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

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

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

Рассмотрим вектор входного слоя x (размерами nₓ), вектор выходного слоя y (размерами nᵧ) , и a⁽¹⁾,…, a⁽ˡ⁾ каждого скрытого слоя (каждый из которых может иметь произвольное количество измерений). Тогда нейронная сеть обозначается функцией

Давайте визуализируем это на нашем примере, игнорируя скрытые слои:

Далее активация i-го нейрона в слое j обозначается aᵢ⁽ʲ⁾. Для конкретного слоя l вес связи между i-м нейроном слоя l(aᵢ⁽ˡ⁾), а j-нейрон в l+1 (aⱼ⁽ˡ⁺¹⁾) обозначается wᵢⱼ.

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

Следующая формула используется для вычисления активации i-го нейрона в слое l:

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

Проиллюстрируем это на примере:

Кроме того, σ : ℝ → [0,1] — это функция активации, в данном случае — сигмоидальная функция, которая используется для нарушения линейности. Нелинейность важна, потому что она (1) позволяет последующим слоям наращивать друг друга и (2) гарантирует, что значения активации остаются нормализованными (т. е. между 0 и 1). Однако часто используются другие функции активации, такие как ReLU (выпрямленная линейная единица) и tanh (гиперболический тангенс), которые имеют разные диапазоны изображения. (Например, ReLU(x) = max(0, x) имеет набор изображений [0,∞)).

Наконец, путем вычисления всех выражений активации получается результат сети (т. Е. Активации последнего слоя).

Теперь веса соединения часто группируются по слоям и представляются в матричной записи. Матрица весов связей между слоями l и l+1 обозначается как

где N = nₗ — количество нейронов в предыдущем слое l и M = nₗ₊₁, нейронов в следующем слое, l+1. Таким образом, мы можем определить активацию одного слоя как векторную функцию предыдущего (b⁽ˡ⁾ — вектор-столбец смещений нейронов):

Теперь короткое высокоуровневое описание того, как происходит «обучение». Я продолжу развивать это в следующей статье.

Обучение

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

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

Часто используемой функцией стоимости является сумма квадратичных ошибок (SSE), но могут использоваться и другие функции. В любом случае мы обычно можем рассматривать функцию стоимости $C$ как функцию весов(W) и смещений (B) сети, а также ожидаемые входные данные и выходные данные. Однако, поскольку мы можем параметризовать только W и B, мы можем рассматривать C как функцию следующего типа:

Теперь цель процесса обучения состоит в том, чтобы минимизировать функцию стоимости. Часто это достигается с помощью градиентного спуска: на каждом шаге градиент ∇C, что соответствует направлению наибольшего подъема (т. е. направление во входном пространстве, вызывающее наибольшее увеличение выходных данных). Поскольку мы хотим свести к минимуму, мы затем модифицируем ввод, добавляя -∇C. Итеративное повторение этого процесса даст один из локальных минимумов.

Заключительные мысли

Нейронные сети — это просто причудливые функции. Глубокий просто означает, что он имеет «много» слоев. Обучение — это просто оптимизация функций.

На создание этой статьи меня вдохновила серия статей 3Blue1Brown о нейронных сетях. Если вы хотите получить лучшее представление о том, как они работают, это обязательно нужно посмотреть. Все это занимает менее часа, разбито на удобоваримые куски и очень приятно. Вы можете проверить это здесь".