Скрытый слой нейронной сети

Скрытый слой нейронной сети

.collapse">Содержание

Введение

Всем привет. Я начинаю цикл статей, в которых буду объяснять элементарную линейную алгебру, статистику и т.п. Этот цикл подойдёт как для школьников, так и для студентов, которые начинают изучать нейронные сети или вообще только знакомятся с машинным обучением. Примеры я буду показывать на языке Python с использованием библиотеки NumPy. Данная библиотека позволяет работать с линейной алгеброй во много раз быстрее, чем без неё.

Нейрон

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

Значок сигмы(буква похожая на Е) предназначен для того, чтобы упростить запись суммы. X — входной значение, W — весовой коэффициент. Если бы мы не использовали значок суммирования(сигму), то мы могли бы увидеть такую запись: . Это на случай, когда у нас два входа. Из этого всего исходит, что количество весовых коэффициентов(w), зависит от количества входов(x). И получается, что математическое строение нейрона — суммарный результат произведений весовых коэффициентов на входные значения.

На Python с библиотекой NumPy это выглядит так:

Функция np.dot перемножает массивы(матрицы) и суммирует полученные результаты. Как раз то что нам нужно, а функция np.array позволяет нам создать массив. print выводит информацию.

Входные значения

Прежде чем подавать данные на нейронную сеть, их нужно нормализовать к виду от 0 до 1. Таким образом мы получим с вами вещественное число(десятичную дробь). Это делают из-за того, что нейронные сети не способны понять наши единицы измерения, поэтому данные приводят к одному виду. Чтобы произвести нормализацию данных — нужно наши входные значения делить на максимальное из всех наших входных значений. Например, у нас есть такие входы: 5, 3, 9, 1. Самое максимальное здесь — 9. Мы берём 5 и делим на 9, берём 3 и делим на 9 и т.д

Функция np.amax позволяет нам вытащить самое максимальное число из двумерного массива(матрицы).

Слои нейронных сетей

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

Весовые коэффициенты

Это связи, благодаря которым мы получаем какие-либо модифицированные значения. В формулах их обозначают буквой W. Они берут входное значение и умножают на своё весовое значение.

Чтобы поставить правильные весовые коэффициенты — мы должны обучить нашу нейронную сеть.

Обучение нейронной сети- это процесс, в котором параметры нейронной сети настраиваются посредством моделирования среды, в которую эта сеть встроена.

Перед обучением нужно иметь базу готовых входов и выходов, на основе которых обучается нейронная сеть.

Перед обучением весовые коэффициенты нейронной сети задаются случайным образом. Например вот так:

Мы создали двумерный массив 3 * 4 cо случайными значениями.

Самый распространённый метод обучения нейронных сетей — обратное распространение ошибки. В следующих статьях мы рассмотрим метод градиентного спуска.

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

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

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

Дельта правило имеет такую формулу:

Weight — вес, n — скорость обучения(обычно равная 0.0001, 0.1 или вообще не используется), input — входное значение, либо значение пришедшее со скрытых слоёв; error — модифицированная ошибки(локальная ошибка умноженная на весовой коэффициент), либо локальная ошибки полученная на выходе(разность между правильным ответом и ответом нейронной сети).

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

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

Пороговая функция

Когда суммарный результат в нейроне достиг какого-то определённого порога(T), нейрон выдаёт 1. Если суммарный результат не достиг этого порога, то нейрон выдаст 0. То есть мы умножили весовые коэффициенты на входные значения, сложили результаты произведений и получили суммарный результат. Если он больше порога, то 1. Если меньше порога, то 0.

Это можно представить таким условием:

Логистическая функция

Такая функция преобразует суммарный результат нейрона в число от 0 до 1.
Функция представляет из себя формулу:

Читайте также:  Onkyo r n855 отзывы

e — экспонента, показательная функция; -x — суммарный результат нейрона.

На графиках функций представляется так:

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

Создадим обучающую выборку:

Проведём нормализацию входных и выходных данных. Входные данные нормализуем таким образом: берём каждое значение и делим на максимальное из всех значений.
Выходные данные изменяются в пределах от 0 до 100. Разделим каждое число на 100.

Пускай в скрытом слое будет три нейрона, которые имеют по два синапса каждый. Количество синапсов = количеству входов. И в выходном слое будет один выходной нейрон, у которого три синапса, так как сигнал передают три скрытых нейрона.

Будем подавать данные снова и снова 10 000 раз. Подаём входные сигналы на входной слой. От входного слоя передаём по синапсам на скрытый слой, суммируем, проводим через функцию активации в каждом нейроне. Отправляем на выходной слой, обрабатываем и получаем ответ.

Цикл не завершается. Вычисляем локальную ошибку, отправляем по синапсам, корректируем по дельта-правилу.

Теперь остаётся вывести данные с выходного слоя: print(l2 * 100)
Умножаем на 100, так как вначале на 100 делили.

Спасибо за внимание. В следующей статье я расскажу вам всё о линейной алгебре в кратком формате.

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

Искусственная нейронная сеть обычно обучается с учителем. Это означает наличие обучающего набора (датасета), который содержит примеры с истинными значениями: тегами, классами, показателями.

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

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

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

Искусственная нейронная сеть состоит из трех компонентов:

  • Входной слой;
  • Скрытые (вычислительные) слои;
  • Выходной слой.

Обучение нейросетей происходит в два этапа:

  • Прямое распространение ошибки;
  • Обратное распространение ошибки.

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

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

Зададим начальные веса случайным образом:

Умножим входные данные на веса для формирования скрытого слоя:

  • h1 = (x1 * w1) + (x2 * w1)
  • h2 = (x1 * w2) + (x2 * w2)
  • h3 = (x1 * w3) + (x2 * w3)

Выходные данные из скрытого слоя передается через нелинейную функцию (функцию активации), для получения выхода сети:

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

  • Суммарная ошибка (total_error) вычисляется как разность между ожидаемым значением «y» (из обучающего набора) и полученным значением «y_» (посчитанное на этапе прямого распространения ошибки), проходящих через функцию потерь (cost function).
  • Частная производная ошибки вычисляется по каждому весу (эти частные дифференциалы отражают вклад каждого веса в общую ошибку (total_loss)).
  • Затем эти дифференциалы умножаются на число, называемое скорость обучения или learning rate (η).

Полученный результат затем вычитается из соответствующих весов.

В результате получатся следующие обновленные веса:

  • w1 = w1 — (η * ∂(err) / ∂(w1))
  • w2 = w2 — (η * ∂(err) / ∂(w2))
  • w3 = w3 — (η * ∂(err) / ∂(w3))

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

Популярный мем о том, как Карлсон стал Data Science разработчиком

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

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

Частные производные

Частные производные можно вычислить, поэтому известно, какой был вклад в ошибку по каждому весу. Необходимость производных очевидна. Представьте нейронную сеть, пытающуюся найти оптимальную скорость беспилотного автомобиля. Eсли машина обнаружит, что она едет быстрее или медленнее требуемой скорости, нейронная сеть будет менять скорость, ускоряя или замедляя автомобиль. Что при этом ускоряется/замедляется? Производные скорости.

Читайте также:  Ведьмак 3 моды на ps4

Разберем необходимость частных производных на примере.

Предположим, детей попросили бросить дротик в мишень, целясь в центр. Вот результаты:

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

Ошибка нескольких детей может уменьшиться, но общая ошибка все еще увеличивается.

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

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

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

Скорость обучения (learning rate)

Скорость обучения является очень важным гиперпараметром. Если скорость обучения слишком мала, то даже после обучения нейронной сети в течение длительного времени она будет далека от оптимальных результатов. Результаты будут выглядеть примерно так:

С другой стороны, если скорость обучения слишком высока, то сеть очень быстро выдаст ответы. Получится следующее:

Функция активации (activation function)

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

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

Функция потери (loss function)

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

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

Функция потерь одномерна и не является вектором, поскольку она оценивает, насколько хорошо нейронная сеть работает в целом.

Некоторые известные функции потерь:

  • Квадратичная (среднеквадратичное отклонение);
  • Кросс-энтропия;
  • Экспоненциальная (AdaBoost);
  • Расстояние Кульбака — Лейблера или прирост информации.

Cреднеквадратичное отклонение – самая простая фукция потерь и наиболее часто используемая. Она задается следующим образом:

Функция потерь в нейронной сети должна удовлетворять двум условиям:

  • Функция потерь должна быть записана как среднее;
  • Функция потерь не должна зависеть от каких-либо активационных значений нейронной сети, кроме значений, выдаваемых на выходе.

Глубокие нейронные сети

Глубокое обучение (deep learning) – это класс алгоритмов машинного обучения, которые учатся глубже (более абстрактно) понимать данные. Популярные алгоритмы нейронных сетей глубокого обучения представлены на схеме ниже.

Популярные алгоритмы нейронных сетей (http://www.asimovinstitute.org/neural-network-zoo)

Более формально в deep learning:

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

Пример

Рассмотрим однослойную нейронную сеть:

Здесь, обучается первый слой (зеленые нейроны), он просто передается на выход.

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

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

Не следует путать с широкой нейронной сетью.

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

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

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

Главное — баланс

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

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

Проклятье размерности

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

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

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

Компромисс

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

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

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

Следовательно, как правило, невозможно иметь маленькое смещение и маленькую дисперсию одновременно.

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

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

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

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

Среди многослойных нейронных сетей можно выделить четыре наиболее значимых и важных класса нейронных сетей:

  • сети прямого распространения – все связи направлены строго от входных нейронов к выходным. Такие сети еще называют многослойным персептроном, по аналогии с обычным персептроном Розенблатта, в котором только один скрытый слой;
  • реккурентные нейронные сети или сети обратного распространения – сигнал в таких сетях с выходных нейронов или нейронов скрытого слоя частично передается обратно на входы нейронов входного слоя;
  • радиально базисные функции – вид многослойной нейронной сети, имеющий скрытый слой из радиальных элементов и выходной слой из линейных элементов. Сети этого типа довольно компактны и быстро обучаются. Радиально базисная сеть обладает следующими особенностями: один скрытый слой, только нейроны скрытого слоя имеют нелинейную активационную функцию и синаптические веса входного и скрытого слоев равны единицы;
  • самоорганизующиеся карты или сеть Кохонена. Такой класс многослойных нейронных сетей, как правило, обучается без учителя и успешно применяется в задачах распознавания. Сети такого класса способны выявлять новизну во входных данных: если после обучения сеть встретится с набором данных, непохожим ни на один из известных образцов, то она не сможет классифицировать такой набор и тем самым выявит его новизну. Сеть Кохонена имеет всего два слоя: входной и выходной, составленный из радиальных элементов.
Ссылка на основную публикацию
Adblock detector