Содержание статьи
Основы глубокого обучения — начнем с искусственной нейронной сети (Artificial Neural Network)
Вступление
Знаете ли вы, что первая нейронная сеть была обнаружена в начале 1950-х годов?
Глубокое обучение (DL) и нейронная сеть (NN) в настоящее время являются одними из самых оригинальных изобретений в современном столетии. Их невероятная способность извлекать уроки из данных и окружающей среды делает их лучшим выбором для специалистов по машинному обучению.
Глубокое обучение и нейронная сеть лежат в основе таких продуктов, как автомобили с автоматическим управлением, программное обеспечение для распознавания изображений, системы рекомендаций (экспертные системы) и т.д. Очевидно, что, будучи мощным алгоритмом, он также очень адаптивен к различным типам данных.
Люди думают, что нейронная сеть — чрезвычайно сложная тема для изучения. Следовательно, либо некоторые из них не используют его, либо те, кто его использует, используют его как черный ящик. Есть ли смысл делать что-то, не зная, как нейронная сеть работает? НЕТ!
В этой статье я попытался объяснить концепцию нейронной сети простыми словами. Понимание этой статьи требует немного биологии и большого терпения. К концу этой статьи вы станете уверенным аналитиком, готовым начать работать с нейронными сетями. Если вы ничего не понимаете — заходите в комментарии к статье.
Примечание. Эта статья лучше всего подходит для пользователей среднего уровня в области наук о данных и машинного обучения. Начинающим может быть сложно.
1. Что такое нейронная сеть?
Нейронные сети (NN), также называемые искусственными нейронными сетями, названы в честь искусственного представления о работе нервной системы человека. Помните эту схему? Большинство из нас учили в средней школе!
Давайте начнем описание с того, как работает наша нервная система. Нервная система состоит из миллионов нервных клеток или нейронов.
Нейрон имеет следующую структуру:
Основные компоненты нейронной сети
- Дендриты — принимает на вход от других нейронов сигнал в форме электрического импульса.
- Тело клетки — оно генерирует выводы из этих входных данных и решает, какие действия предпринять.
- Терминалы аксона — передают выходы в форме электрического импульса.
Проще говоря, каждый нейрон получает информацию от множества других нейронов через дендриты. Затем он выполняет требуемую обработку на входе и посылает другой электрический импульс через аксоны в терминальные узлы, откуда он передается на множество других нейронов.
ANN работает очень похожим образом. Общая структура нейронной сети выглядит следующим образом:
Эта фигура изображает типичную нейронную сеть с работой одного нейрона. Давайте разберем эту схему.
Вход в каждый нейрон подобен дендриту. Как и в нервной системе человека, нейрон (хоть и искусственный!) объединяет все входные данные и выполняет с ними операцию. Наконец, он передает выходные данные всем другим нейронам (следующего слоя), к которым он подключен.
Нейронная сеть делится на 3 слоя:
- Входной слой: тренировочные наблюдения подаются через эти нейроны
- Скрытые слои: это промежуточные слои между входом и выходом, которые помогают нейронной сети изучать сложные отношения между данными.
- Выходной слой: окончательный результат извлекается из двух предыдущих слоев.
Например: в случае проблемы классификации с 5 классами, выход позже будет иметь 5 нейронов.
Давайте начнем с изучения функциональности каждого нейрона с примерами.
2. Как работает один нейрон?
В этом разделе мы рассмотрим работу одного нейрона на простых примерах. Идея состоит в том, чтобы дать вам некоторое представление о том, как нейрон вычисляет выходные данные, используя входные данные.
Различные компоненты:
- x1 , x2 ,…, xN: входы в нейрон. Это могут быть как фактические наблюдения из входного слоя, так и промежуточное значения из одного из скрытых слоев.
- х0: единица смещения. Это постоянное значение, добавляемое к входу функции активации. Он работает аналогично термину перехвата и обычно имеет значение +1.
- w0 , w1 , w2 ,…, wN: весовые коэффициенты на каждом входе. Обратите внимание, что даже единица смещения имеет вес.
- а: выход нейрона, который рассчитывается как:
***РИС***
Здесь f — функция активации . Это делает нейронную сеть чрезвычайно гибкой и дает возможность оценивать сложные нелинейные отношения в данных. Это может быть гауссова функция, логистическая функция (Сигмоида), гиперболическая функция или даже линейная функция в простых случаях.
Позволяет реализовать 3 фундаментальные функции — ИЛИ И НЕ, используя Нейронные сети. Это поможет нам понять, как они работают. Вы можете предположить, что это похоже на проблему классификации, где мы прогнозируем выходной сигнал (0 или 1) для различной комбинации входных данных.
Мы будем моделировать эти линейные классификаторы с помощью следующей функции активации:
***РИС***
Пример 1: И
Функция AND может быть реализована как:
Выход этого нейрона:
a = f (-1,5 + x1 + x2)
Таблица истинности для этой реализации:
***РИС***
Здесь мы видим, что функция AND успешно реализована. Столбец «а» соответствует «X1 И X2». Обратите внимание, что здесь вес единицы смещения равен -1,5. Но это не фиксированное значение. Интуитивно, мы можем понимать это как что-либо, что делает общее значение положительным только тогда, когда x 1 и x 2 положительны. Таким образом, любое значение между (-1, -2) будет работать.
Пример 2: ИЛИ
Функция OR может быть реализована как:
***РИС***
Выход этого нейрона:
a = f (-0,5 + x1 + x2)
Таблица истинности для этой реализации:
***РИС***
Столбец «а» соответствует «X1 ИЛИ X2». Мы можем видеть, что, просто изменяя вес единицы смещения, мы можем реализовать функцию ИЛИ. Это очень похоже на приведенный выше. Интуитивно понятно, что здесь единица смещения такова, что взвешенная сумма будет положительной, если любой из x1 или x2 станет положительным.
Пример 3: НЕ
Как и в предыдущих случаях, функция NOT может быть реализована следующим образом:
***РИС***
Выход этого нейрона:
a = f (1 — 2 * x1)
Таблица истинности для этой реализации:
***РИС***
Опять же, соответствие желаемому значению подтверждает функциональность. Я надеюсь, что с этими примерами вы получите некоторое представление о том, как работает нейрон внутри нейронной сети. Здесь я использовал очень простую функцию активации.
Примечание : как правило, вместо того, что я использовал здесь, будет использоваться логистическая функция , потому что она дифференцируема и делает возможным определение градиента. Там только 1 улов. И, то есть, он выдает плавающее значение, а не точно 0 или 1.
3. Почему многослойные сети полезны?
После понимания работы одного нейрона, давайте попробуем понять, как нейронная сеть может моделировать сложные отношения, используя несколько слоев. Чтобы понять это, мы возьмем пример функции XNOR .
Напомним, таблица истинности функции XNOR выглядит следующим образом:
***РИС***
Здесь мы можем видеть, что выход равен 1, когда оба входа одинаковы, в противном случае 0. Этот тип отношений не может быть смоделирован с использованием одного нейрона . (Не верьте мне? Попробуйте!) Таким образом, мы будем использовать многослойную сеть. Идея использования нескольких слоев заключается в том, что сложные отношения можно разбить на более простые функции и объединить.
Позволяет сломать функцию XNOR.
***ФУНКЦИИ***
Теперь мы можем реализовать это, используя любой из упрощенных случаев. Я покажу вам, как реализовать это, используя 2 случая.
Случай 1: X1 XNOR X2 = (A’.B ‘) + (AB)
Здесь задача состоит в том, чтобы спроектировать нейрон для модели A’.B ‘. Это можно легко смоделировать с помощью следующего:
***РИС***
Выход этого нейрона:
a = f (0,5 — x1 — x2)
Таблица истинности для этой функции:
***РИС***
Я думаю, что теперь вы можете понять, как работают многоуровневые слои. Давайте сделаем еще одну реализацию того же случая.
Случай 2: X1 XNOR X2 = НЕ [(A + B). (A ‘+ B’)]
В приведенном выше примере мы должны были отдельно рассчитать A’.B ‘. Что если мы хотим реализовать функцию, просто используя базовые функции AND, OR, NOT. Рассмотрим следующую семантику:
***РИС***
Здесь нейроны выполняют следующие действия:
1 : такой же , как A
а 2 : реализует А ‘
а 3 : то же, что и В
а 4 : реализует B ‘
а 5 : реализует OR, эффективно А + В
a 6 : реализует ИЛИ, эффективно A ‘+ B’
a 7 : эффективно реализует AND (A + B). (A ‘+ B’)
a 8: реализует NOT, эффективно NOT [(A + B). (A ‘+ B’)], что является окончательным XNOR
Обратите внимание, что обычно нейрон подается в каждый другой нейрон следующего слоя, кроме единицы смещения. В этом случае я избавился от нескольких соединений со слоя 1 на слой 2. Это потому, что их веса равны 0, и их добавление сделает его визуально громоздким для восприятия.
Таблица правды:
***РИС***
Наконец, мы успешно реализовали функцию XNOR. Этот метод сложнее, чем в случае 1. Следовательно, вы должны всегда предпочитать случай 1. Но идея здесь в том, чтобы показать, как сложные функции могут быть разбиты на несколько уровней. Я надеюсь, что преимущества нескольких слоев теперь прояснились.
4. Общая структура нейронной сети
Теперь, когда мы рассмотрели некоторые базовые примеры, давайте определим общую структуру, в которую попадает каждая нейронная сеть. Мы также увидим уравнения, которым нужно следовать, чтобы определить выходные данные с учетом входных данных. Это известно как прямое распространение .
Общая нейронная сеть может быть определена как:
***РИС***
Он имеет L слоев с 1 входным слоем, 1 выходным слоем и L-2 скрытыми слоями. Терминология:
L: количество слоев
N i : количество нейронов в i- м слое, исключая единицу смещения, где i = 1,2,…, L
a i (j) : выход j- го нейрона в i- м слое, где i = 1,2… L | j = 0,1,2… .N i
Поскольку выходные данные каждого слоя формируют входные данные следующего уровня, давайте определим уравнение для определения выходных данных i + 1- го слоя, используя выходные данные i- го слоя в качестве входных данных.
Входные данные для i + 1- го слоя:
***Формулы***
Матрица весов от i- го до i + 1- го слоя:
***Формулы***
Выход i + 1- го слоя может быть рассчитан как:
***Формулы***
Используя эти уравнения для каждого последующего слоя, мы можем определить конечный результат. Количество нейронов в выходном слое будет зависеть от типа проблемы. Это может быть 1 для задачи регрессии или двоичной классификации или несколько для задач классификации нескольких классов.
Но это только определение выхода за 1 прогон. Конечная цель — обновить вес модели, чтобы минимизировать функцию потерь. Веса обновляются с использованием алгоритма обратного распространения, который мы рассмотрим далее.
5. Обратное распространение
Алгоритмы обратного распространения (BP) работают, определяя потери (или ошибки) на выходе и затем распространяя их обратно в сеть. Веса обновляются, чтобы минимизировать ошибку, возникающую из-за каждого нейрона. Я не буду вдаваться в подробности алгоритма, но постараюсь дать вам некоторое представление о том, как он работает.
Первым шагом к минимизации ошибки является определение градиента каждого узла относительно. окончательный вывод. Так как это многослойная сеть, определить градиент не очень просто.
Давайте разберемся с градиентами для многослойных сетей. Давайте сделаем шаг назад от нейронных сетей и рассмотрим очень простую систему следующим образом:
***Рис***
Здесь есть 3 входа, простая обработка которых:
***Формулы***
Теперь нам нужно определить градиенты a, b, c, d по выходу e. Следующие случаи очень просты:
***Рис***
Однако для определения градиентов для a и b нам нужно применить правило цепочки.
***Рис***
И, таким образом, градиент может быть вычислен путем простого умножения градиента входного сигнала на узел с выходным сигналом этого узла. Если вы все еще в замешательстве, просто внимательно прочитайте уравнение 5 раз, и вы получите его!
Но реальные случаи не так просты. Давайте возьмем другой пример. Рассмотрим случай, когда один вход подается в несколько элементов на следующем слое, поскольку это почти всегда имеет место с нейронной сетью.
***Рис***
В этом случае все остальные градиенты будут очень похожи на вышеприведенный пример, за исключением «m», потому что m подается в 2 узла. Здесь я покажу, как определить градиент для m и покоя, который вы должны рассчитать самостоятельно.
***Рис***
Здесь вы можете видеть, что градиент — это просто сумма двух разных градиентов. Я надеюсь, что облачный покров постепенно исчезает, и все становится ясным. Просто поймите эти понятия, и мы вернемся к этому.
Прежде чем двигаться вперед, давайте подведем итоги всего процесса, стоящего за оптимизацией нейронной сети. Различные этапы каждой итерации:
Выберите архитектуру сети , т.е. количество скрытых слоев, количество нейронов в каждом слое и функцию активации
Инициализировать веса случайным образом
Используйте прямое распространение чтобы определить выходной узел
Найди ошибку модели, используя известные метки
Back-распространение информации о распространите ошибку в сети и определите ошибку для каждого узла
Обновление с весами , чтобы свести к минимуму градиент
До сих пор мы рассмотрели # 1 — # 3, и у нас есть некоторая интуиция в # 5. Теперь давайте начнем с № 4 — № 6. Мы будем использовать ту же общую структуру NN, как описано в разделе 4.
# 4- Найти ошибку
***Формулы***
Здесь y (i) — фактический результат из данных обучения
# 5- Обратное распространение ошибки в сеть
Ошибка для уровня L-1 должна быть сначала определена с использованием следующего:
***Рис***
где i = 0,1,2,… .., NL-1 (количество узлов в L-1-м слое)
Интуиция от понятий, обсужденных в первой половине этого раздела:
Мы увидели, что градиент узла является функцией градиентов всех узлов следующего слоя . Здесь ошибка в узле основана на взвешенной сумме ошибок во всех узлах следующего уровня, которые принимают выходные данные этого узла в качестве входных данных. Так как ошибки рассчитываются с использованием градиентов каждого узла, коэффициент входит в картину.
f ‘(x) (i) относится к производной функции активации для входов, поступающих в этот узел. Обратите внимание, что x относится к взвешенной сумме всех входов в текущем узле до применения функции активации.
За этим правилом цепочки следует умножение градиента текущего узла, т. Е. F ‘(x) (i), на градиент последующих узлов, который получается из первой половины RHS уравнения.
Этот процесс должен повторяться последовательно от L-1- го уровня до 2- го слоя. Обратите внимание, что первый слой — это только входы.
# 6- Обновление весов, чтобы минимизировать градиент
***Формулы***
где,
l = 1,2,… .., (L-1) | индекс слоев (исключая последний слой)
i = 0,1,… .., N l | индекс узла в l- м слое
k = 1,2,…., N l + 1 | индекс узла в l + 1- м слое
W ik (l) относится к весу от l- го уровня до l + 1- го уровня от i- го узла до k- го узла
Leave a Reply