В прошлом посте мы видели математическую модель нейрона и один тип нейронной сети: многослойный персептрон (MLP). Я упомянул термин «функция активации», но не показал типы функций активации и не объяснил, как сеть находит наилучшие веса на каждом слое, так что давайте сделаем это!

Функции активации

Функции активации отвечают за введение нелинейного поведения в нейронную сеть, поэтому они чрезвычайно важны.

сигмовидная

Сигмоид принимает реальное значение в качестве входных данных и выводит значение от 0 до 1, поэтому сигмоид часто используется для генерации вероятности в выходном слое. Математически сигмовидная функция записывается так:

Производную сигмоиды можно вычислить по правилу частных и записать как

Обратите внимание, что если S(x) близко к 0 или 1, то S’(x) близко к нулю. По этой причине сигмоид не следует использовать в скрытых слоях, потому что, если S’(x) близко к нулю, нейронная сеть очень медленно обновляет ваши веса и, следовательно, сеть не может «обучаться» должным образом. Эта проблема известна как проблема исчезающего градиента.

Гиперболический тангенс

Сигмоид принимает действительное значение в качестве входных данных и выводит значение от -1 до 1.

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

Софтмакс

Функция softmax нормализует вектор, содержащий n элементов, в распределение вероятностей по n элементам. Softmax используется в выходном слое для прогнозирования вероятности того, что вывод будет одним из классов.

Выпрямленная линейная единица (ReLU)

Широко используется, потому что более эффективен в вычислительном отношении, что означает, что сеть может обучаться быстрее и сходиться за меньшее время.

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

Существуют и другие функции активации, такие как Leaky ReLU, Parametric ReLU и Exponential Linear Unit. Изучение этих функций остается домашним заданием.

Функция потери

До сих пор мы говорили о том, как входные данные умножаются на веса и передаются от слоя к слою, пока сеть не выдаст какой-то результат, но как сеть «узнает» правильные веса? Откуда берутся эти веса? Где они живут? Что они едят? Давай выясним!

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

Давайте подумаем о задаче классификации.

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

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

Итак, мы дадим много пар (temp_1, влажность_1), (temp_2, влажность_2), …, (temp_k, влажность_k), и для каждой пары наша сеть вычислит то выражение, которое мы уже знаем, и выведет 0 или 1. Мы должны сравнить прогнозы сети с фактическими значениями 0 и 1, которые у нас есть, чтобы мы могли вычислить ошибки нашей сети.

Именно эта ошибка используется для обновления весов. То есть функция потерь позволяет сети «узнавать» веса. Существует два типа ошибок: локальная ошибка — это ошибка одного предсказания, а глобальная ошибка — это сумма локальных ошибок.

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

Средняя абсолютная ошибка (MAE)

Это просто среднее значение абсолютной ошибки.

где N — количество наблюдений в наших данных поезда.

Среднеквадратическая ошибка (MSE)

Это среднее квадратов ошибок. MSE широко используется в задачах регрессии.

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

Среднеквадратичная ошибка (RMSE)

RMSE — это всего лишь корень MSE. Преимущество RMSE перед MSE состоит в том, что единицей измерения ошибки является та же единица измерения проблемы и, следовательно, ее легче интерпретировать.

Перекрестная энтропия

Он в основном используется в задачах бинарной классификации.

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

Вероятность всех предсказаний, если предположить, что они независимы, равна

лучше работать с суммами, чем с произведениями, поэтому возьмем минус логарифм обеих частей, чтобы получить

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

Перекрестная энтропия может быть адаптирована более чем к двум классам.

Существуют и другие функции потерь, такие как потеря Хубера, дивергенция Кульбака-Лейблера, дивергенция Дженсена-Шеннона и другие.

Обратное распространение

Хорошо, теперь мы знаем, что нейронная сеть использует данные для некоторых вычислений с начальными весами (откуда они берутся?), и, в конце концов, мы можем вычислить ошибку сети. Но как именно эта ошибка позволяет сети «выучить» правильные веса?

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

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

и помните (часть 2), что

Для простоты обозначим

Таким образом, мы можем видеть, что все веса в каждом слое вносят свой вклад в производную J. Мы можем записать производные, используя цепное правило. Предположим, мы хотим найти парциальное относительно W², поэтому

Хорошо, теперь у нас есть производные, которые помогают нам найти минимум, но как обновляются веса? Ответ

Альфа — это параметр, называемый скоростью обучения. Это выражение вдохновлено известной «классической» оптимизацией, как показано ниже.

Инициализация параметров

Хорошо, теперь мы знаем, как функция потерь используется для обновления весов, но откуда берутся эти веса?

Инициализация параметра (веса) важна для нашей сети, чтобы быстрее найти минимум функции потерь. Мы можем инициализировать веса случайным образом, выбирая значения, например, из равномерного распределения U[-1,1] или нормального распределения N(0,1). Но один из лучших способов — это инициализация Glorot! Это делается путем выборки значений из специального равномерного распределения.

n_k — количество нейронов в слое k.

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

Это все, ребята, пока…

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