Нейронные сети достигли удивительной производительности во многих задачах, связанных с ML/AI, таких как распознавание речи, компьютерное зрение и NLP. Их популярность как мощных инструментов классификации и регрессии означает, что многие новички часто сталкиваются с ними при первом знакомстве с ML.

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

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

Повестка дня

  1. Структура
  2. Обучение

Состав

Персептрон

Первый шаг к пониманию НС — понять, из чего они состоят — из нейронов.

Искусственный нейрон в НС функционирует аналогично биологическим нейронам в нашем теле, получая входные данные, обрабатывая их и производя некоторый результат.

Примером такого нейрона является персептрон.

Персептрон следует следующей формуле для расчета выходных данных на основе входных данных.

Помните, что x1 и x2 являются входными данными, w1 и w2 — соответствующими весами для входных данных, а b — смещением смещения (постоянным). функция Хевисайда/шага. Таким образом, выход персептрона всегда равен 0 или 1. Обратите внимание, что порог — это наименьшее необходимое значение «у», чтобы персептрон вывел 1 — для обычной функции Хевисайда порог будет равен 0.
Например, предположим, что мы хотим имитировать логический элемент И с помощью персептрона.

Логический элемент И с двумя входами выдает 1, только если оба входа равны 1. Далее предположим, что наш персептрон выглядит так:

Если оба входа равны 1, взвешенная сумма равна 5 (1 * 3 + 1 * 2). Следовательно, порог ограничителя также должен быть равен 5, так как ограничитель должен выводить 1 только в том случае, если на входе не менее 5.

Одна важная характеристика персептрона, приведенная выше, заключается в том, что веса каждого входа не равны. Это означает, что значение входа x1 оказывает большее влияние на выход по сравнению с x2 — или персептрон более чувствителен к x1.

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

Чтобы прояснить общую лексику NN, используя изображение выше:

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

Входной слой/выходной слой — синий столбец нейронов и зеленый столбец нейронов соответственно. Данные начинаются на входном уровне, а классификация/регрессия сети задается на выходном уровне.

Скрытые слои — черные столбцы нейронов посередине. По существу слои между входом и выходом.

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

Входное измерение — количество входных объектов/точек данных (например, 4 для первого скрытого слоя) для слоя.

Единицы — количество нейронов в слое.

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

Веса/параметры — сила связи между двумя нейронами, визуализируемая в виде линии, соединяющей их.

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

from keras.models import Sequential
from keras.layers import Dense
import numpy as np
model = Sequential()
model.add(Dense(units=16, activation='relu', input_dim=2))
model.add(Dense(units=1, activation='sigmoid'))
training_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], "float32")
training_target_data = np.array([[0], [1], [1], [0]], "float32")
test_data = np.array([[1, 0]], "float32")
test_target_data = np.array([[1]], "float32")

Модель имеет входной слой и выходной слой, определенные в строках 8 и 9. Первый слой имеет 16 нейронов, входную размерность 2 (поскольку каждая выборка обучающих данных имеет 2 точки данных) и функцию активации ReLU. Второй слой (выходной) имеет один нейрон и сигмовидную функцию активации для обеспечения вывода. Структура модели визуализируется ниже.

Важно помнить, что NN относятся к группе похожих моделей, которые могут незначительно различаться по структуре и фокусироваться на разных задачах, связанных с ML (CNN, RNN, LSTM и т. д.). Тип NN, описанный в этом разделе, является самым простым и называется ИНС. Тем не менее, ANN являются наиболее фундаментальными из NN, и их достаточно для многих задач. Они также позволяют легче понять каждую вариацию.

Обучение

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

Функция стоимости

Основой обучения является Функция стоимости, которая является мерой ошибки между тем, что предсказывает модель, и фактическим выходным значением. Он рассчитывается по следующей формуле, где n — общее количество обучающих выборок, i — отдельная обучающая выборка, а f представляет НН.

Обратите внимание, что термины «функция стоимости» и «потери» используются почти взаимозаменяемо — «потери» просто относятся к значению ошибки на одной обучающей выборке, а не на всем наборе данных.
В предыдущем разделе были введены веса/параметры как мера силы связи между двумя нейронами, визуализированная в виде линии, соединяющей их. Перед обучением весам присваиваются случайные значения.

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

Прямое/обратное распространение

Предположим, что приведенная выше модель пытается классифицировать входное изображение как число от 1 до 4. Обратите внимание, что есть 4 выходных нейрона, обозначающих достоверность (0–1) того, что входное изображение представляет собой каждое число в диапазоне.
Когда обучающая выборка поступает в сеть, данные перемещаются слева направо по слоям модели — это называется прямым распространением. В конце данные классифицируются и подсчитываются потери.
Используя потери для этого конкретного обучающего примера, веса/смещения для всех слоев изменяются с помощью метода, называемого обратным распространением. Это включает не только их увеличение или уменьшение, но и расчет того, какие относительные пропорции этих изменений вызывают наиболее быстрое уменьшение функции стоимости сети.

Например, предположим, что входное изображение 2 дается модели, и создается следующий вывод:

Уверенность модели в правильном классе (2) ниже, чем в другом классе (3).
Интуитивный способ увеличить выход активации нейрона «2» может заключаться в увеличении выхода функций активации нейронов в предыдущем слое, поскольку это то, что выходной нейрон модели получает в качестве входных данных.
Однако невозможно напрямую изменить вывод активации, так как это предопределенная функция.

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

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

Последние 2 узла называются a^(n-1) и a^(n) (обратите внимание, что верхние индексы обозначают номера нейронов, а не показатели степени). Пусть w^(n) — вес, соединяющий a^(n-1)и a^(n)иb^(n) быть уклоном. Помните, что:

Чтобы уменьшить и в конечном итоге найти минимум функции стоимости, необходимо сначала выяснить, насколько чувствительна функция стоимости к небольшим изменениям весов в сети. Это делается, начиная с веса, ближайшего к выходу, или в данном случае w^n.
Поскольку чувствительность по существу описывает производную, цель состоит в том, чтобы найти отношение производной функции стоимости к производной функции веса. Используя правило цепочки, можно упростить:

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

Когда закончить обучение?

Как правило, модель должна закончить обучение, когда функция стоимости будет минимальной (конвергенция). Пример показан ниже:

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

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

Гиперпараметры

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

  • Коэффициент разделения обучения и тестирования. Вероятно, это самый распространенный гиперпараметр. Коэффициент разделения обучения и тестирования определяет, какая часть набора данных должна быть выделена для обучения и тестирования. Общие значения включают 60–40% или 70–30%, но также используются и другие соотношения. Главный фактор, о котором следует помнить, заключается в том, что должен существовать баланс между обучающими и тестовыми наборами, чтобы модель обучалась без переобучения и имелось достаточно тестовых данных для получения точной картины производительности модели.
  • Скорость обучения. Один из наиболее важных гиперпараметров. Скорость обучения соответствует тому, насколько должны изменяться веса модели каждый раз, когда функция стоимости модели рассчитывается после каждой обучающей выборки. Высокая скорость обучения означает, что веса агрессивно изменяются, чтобы найти минимум функции стоимости как можно скорее, но это может привести к непредсказуемым последствиям, когда параметры сильно колеблются каждую эпоху или минимум функции стоимости пройден. И наоборот, более низкая скорость обучения означает, что веса изменяются более мелким образом, но это может привести к тому, что модели потребуется больше времени для обучения, а рост производительности станет стагнирующим.
    Поэтому необходимо экспериментировать, чтобы найти наилучшую скорость обучения. Однако, как правило, они представляют собой очень маленькое положительное значение в диапазоне 0–1.
    Дополнительную информацию можно найти здесь:
    https://machinelearningmastery.com/understand-the-dynamics-of-learning -скорость-на-нейронных-сетях-глубокого-обучения/
  • Алгоритмы оптимизации.Оптимизаторы — это методы, в которых модель изменяет веса/смещения в зависимости от функции стоимости. Существует множество различных методов, которые можно использовать, но многие из них требуют более подробного объяснения, чтобы полностью понять, как они влияют на нейронную сеть.
    В этой статье более подробно рассматриваются различные типы оптимизаторов: https://towardsdatascience.com/ оптимизаторы-для-обучения-нейронной-сети-59450d71caf6
  • Выбор функции активации. Помните, что у каждого слоя есть функция активации, которая служит для сжатия/обработки взвешенных входных данных до желаемого выходного диапазона. Примеры таких функций включают ReLU, Softmax и Sigmoid.
    Как правило, все скрытые уровни используют одну и ту же функцию активации для обеспечения согласованности обработки промежуточной сети. Функция активации, используемая для NN, чаще всего является ReLU по целому ряду причин, наиболее важной из которых является ее способность бороться с проблемой исчезающего градиента. Ниже приведен график функции ReLU (формула max(0.0, x))
    Выходные слои имеют функции активации, соответствующие типу задачи машинного обучения, которую модель призвана решить. Например, в задачах классификации часто используется сигмовидная функция, а в задачах регрессии требуется линейная выходная функция.

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

Последние мысли

Надеемся, что эта статья послужила для того, чтобы вызвать четкое концептуальное понимание того, как и почему NN. Существует множество вариантов для изучения, таких как RNN и LSTM, которые специализируются на решении различных типов задач ML/AI.
Спасибо за чтение! Если помогло, рассмотрите возможность подключения в LinkedIn — буду рад услышать ваше мнение.