Программа для обучения нейронной сети алгоритмом уидроу-хоффа

Алгоритмы обучения

< Лекция 14 || Лекция 15: 123456

В 1957 г. Р.Розенблатт разработал модель, которая вызвала большой интерес у исследователей. Несмотря на некоторые ограничения ее исходной формы, она стала основой для многих современных, наиболее сложных алгоритмов обучения с учителем.

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

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

Рис. 15.3.

Обучение осуществляется следующим образом:

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

  3. Вычисляется значение пороговой функции активации для сигнала NET от каждого нейрона следующим образом:

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

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

  5. Каждый вес модифицируется следующим образом:

  6. Повторяются шаги со второго по пятый до тех пор, пока ошибка не станет достаточно малой.

Как мы видели, персептрон ограничивается бинарными выходами. Б.Уидроу вместе со студентом университета М.Хоффом расширили алгоритм обучения персептрона для случая непрерывных выходов, используя сигмоидальную функцию.

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

Их первая модель — Адалин — имеет один выходной нейрон, более поздняя модель — Мадалин — расширяет ее для случая с многими выходными нейронами.

Обратите внимание

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

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

< Лекция 14 || Лекция 15: 123456

Источник: http://www.intuit.ru/studies/courses/88/88/lecture/20555?page=4

Как работает нейронная сеть: алгоритмы, обучение, примеры, архитектуры

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

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

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

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

Тональность текста определяют признаки — это слова, фразы, структура предложения, которые придают негативную или позитивную окраску.

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

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

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

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

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

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

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

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

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

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

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

  • 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сли машина обнаружит, что она едет быстрее или медленнее требуемой скорости, нейронная сеть будет менять скорость, ускоряя или замедляя автомобиль. Что при этом ускоряется/замедляется? Производные скорости.

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

Важно

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

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

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

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

Гиперпараметры нейросети

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример

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

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

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

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

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

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

Пример:

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

Но

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

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

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

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

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

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

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

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

Поиск компромисса

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

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

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

Совет

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

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

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

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

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

Источник: https://neurohive.io/ru/osnovy-data-science/osnovy-nejronnyh-setej-algoritmy-obuchenie-funkcii-aktivacii-i-poteri/

Нейронная сеть — обучение ИНС с помощью алгоритма обратного распространения

Нейронная сеть — введение
Принцип обучения многослойной нейронной сети с помощью алгоритма обратного распространения

Рассмотрим процесс обучения нейронной сети с использованием алгоритма обратного распространения ошибки (backpropagation).

Для иллюстрации этого процесса используем нейронную сеть состоящую из трёх слоёв и имеющую два входа и один выход:
Каждый нейрон состоит из двух элементов. Первый элемент – дендриты — добавляют весовые коэффициенты ко входным сигналам. Второй элемент – тело — реализует нелинейную функцию, т.н. функцию активации нейрона.

Сигнал е – это взвешенная сумма входных сигналов

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

Символы W(Xm)n представляют вес связи между сетевым входом Xm и нейрона n во входном слое.

Символы y(n) представляют выходной сигнал нейрона n.

Распространение сигнала через скрытый слой.

Обратите внимание

Символы Wmn представляют весовые множители связей между выходом нейрона m и входом нейрона n в следующем слое.

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

Весовые коэффициенты Wmn, используемые для обратного распространения ошибки, равны тем же коэффициентам, что использовались во время вычисления выходного сигнала. Только изменяется направление потока данных (сигналы передаются от выхода ко входу). Этот процесс повторяется для всех слоёв сети. Если ошибка пришла от нескольких нейронов — она суммируются:

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

Коэффициент h влияет на скорость обучения сети.

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

Второй — более сложный метод обучения, начинается с малым значением параметра h. В процессе обучения параметр увеличивается, а затем вновь уменьшается на завершающей стадии обучения.

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

продолжение следует…

Ссылки

Оригинал статьи (на английском)
http://ru.wikipedia.org/wiki/Метод_обратного_распространения_ошибки
en.wikipedia.org/wiki/Backpropagation
Нейросеть в 11 строчек на Python
An overview of gradient descent optimization algorithms

По теме

Нейронная сеть — введение
Пример работы самоорганизующейся инкрементной нейронной сети SOINN

Источник: http://robocraft.ru/blog/algorithm/560.html

Алгоритм обучения Розенблатта

страница 1

Алгоритм обучения Розенблатта
Данный алгоритм был положен в основу обучения однослойных персептронов.

Структура персептрона Розенблатта представляется следующим образом:

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

A-нейроны (ассоциативные) – предназначены для непосредственной обработки входных сигналов. Выходы ассоциативных нейронов соединены с входами нейронов третьего слоя.

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

Отличия алгоритма обучения Розенблатта от алгоритма обучения по правилу Хебба сводятся к следующему:

  1. вводится эмпирический коэффициент α с целью улучшения процесса сходимости: α – скорость обучения;
  2. исключены некоторые действия, которые замедляют процесс обучения, например, обновление весовых коэффициентов (update).
  3. входные образы на вход НС подаются до тех пор, пока не будет достигнута допустимая величина ошибки обучения.
  4. если решение существует, алгоритм обучения Розенблатта сходится за конечное число шагов.

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

, (**)

где t – номер такта; i – номер нейрона во входном слое; j – номер нейрона в слое A; α – скорость обучения; xi – входной сигнал; еj – ошибка обучения.

На каждом шаге обучения вычисляется ошибка обучения еj:

,

где dj – эталонное значение входного сигнала; yj – реальное значение входного сигнала.

Алгоритм обучения Розенблатта сводится к следующей последовательности действий:

  1. Инициализация весовых коэффициентов и порогов значениями, близкими к нулю.

  2. Подача на вход НС очередного входного образа (входного вектора Х), взятого из обучающей выборки, и вычисление суммарного сигнала по всем входам для каждого нейрона j:, где n – размерность входного вектора, xii-я компонента входного вектора, wij – весовой коэффициент связи нейрона j и входа i.

  3. Вычисление значения выхода каждого нейрона:

, где bj – порог, соответствующий нейрону j

  1. Вычисление значения ошибки обучения для каждого нейрона.
  2. Проводится модификация весового коэффициента связи по формуле (**).
  3. Повторение пунктов 2 – 5 до тех пор, пока ошибка сети не станет меньше заданной.

Особенности алгоритма обучения Розенблатта: должна быть задана скорость обучения α и ошибка обучения е.
Пример. Воспроизведение логической функции «И» с помощью НС. Обучение НС

производится в соответствии с алгоритмом обучения Розенблатта.

Значения сигналов – биполярные: 1 и -1. Задаём скорость обучения α = 1.

Инициализируем работу НС:

Вычисляем значение коэффициентов на каждом шаге:

,вычисляются аналогично.

Результаты вычислений сведём в таблицу.

шаг x1 x2 x3 y d w11 w21 b
tt+1t+2t+3t+4 –11-1- –1-11- –-1-1-1-1 –-111-1 –1-1-1-1 02022 02422 0-2022

– дискриминантная линия

x

Процедура Уидроу-Хоффа

Процедура обучения Уидроу-Хоффа применима к персептронам. Уидроу и Хофф модифицировали персептронный алгоритм Розенблатта, используя сигмоидальную функцию активации и непрерывные выходные вектора.

Существуют два варианта реализации процедуры:

  1. Adaline (Adaptive Linear Element) {Адалин}

Модель с одним выходным нейроном. Функция активации в первых вариантах системы линейная, в последующих – сигмоидальная.
Модель с множественными выходными нейронами.

Процедура Уидроу-Хоффа разработана применительно к «чёрному ящику», в котором между входами и выходами существуют только прямые связи.

Выход сети:

Процедура обучения основывается на минимизации ошибки обучения в процессе подачи на вход сети входных образов.

Среднеквадратичная ошибка:, где L – число образов (примеров), которые подаются на вход сети в процессе обучения.

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

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

,

где– ошибка обучения;

α – скорость обучения;

m – число выходных нейронов.

Пороги:

, где– i-тая компонента k-того образа.

С учётом последних двух соотношений выражения для весовых коэффициентов и порога примут следующий вид:

(*)

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

Алгоритм обучения по правилу Уидроу-Хофа сводится к следующей последовательности действий:

  1. Задаются значения параметров: скорости обучения α и допустимой ошибки обучения Eдоп (EminEдоп)
  2. Случайным образом инициализируются значения весовых коэффициентов и порогов W, B.
  3. На вход сети подаётся входной вектор (входной образ) X={x1, x2,..,xn} и вычисляется значение выхода
  4. Вычисляются значения весовых коэффициентов и порогов в соответствии с формулами (*).
  5. Вычисляется значение ошибки обучения
  6. Проверяем выполнение условия EkEдоп. Если неравенство верно для всех k, то переходим к пункту 7, в противном случае (Ek> Eдоп) – к пункту 3.
  7. Останов.

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

Особенности процедуры Уидроу-Хоффа (другое название – δ-правило):

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

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

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

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

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

Важно

Функцию XOR можно реализовать с помощью сети второго порядка HON (Higher Order Network), имеющей следующий вид:

Кроме скалярных входов имеются входы взаимодействия переменных.

Функция активации выходного нейрона – пороговая.

Для реализации функции XOR весовые коэффициенты должны иметь следующие значения:

Источник: http://vmest.ru/nuda/algoritm-obucheniya-rozenblatta/main.html

Основные модели и методы теории искусственных нейронных сетей

Е.С.Борисов

среда, 19 октября 2005 г.

Математическая теория искусственных нейронных сетей многие идеи берёт из нейробиологической теории, согласно которой нервная система человека состоит из двух типов клеток — нейронов и нейроглии.

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

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

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

Рисунок 1: нервная клетка

Составные части нейрона :

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

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

Искусственная нейронная сеть это совокупность нейронных элементов и связей между ними [1].

Рисунок 2: математическая модель нейрона

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

  • Нейрон обладает группой синапсов — однонаправленных входных связей, соединенных с выходами других нейронов. Каждый синапс характеризуется величиной синаптической связи или ее весом .
  • Каждый нейрон имеет текущее состояние, которое обычно определяется, как взвешенная сумма его входов:
  • Нейрон имеет аксон — выходную связь данного нейрона, с которой сигнал (возбуждения или торможения) поступает на синапсы следующих нейронов. Выход нейрона есть функция его состояния:Функция называется функцией активации. Примеры такой функции приведены на рис. 3.
Рисунок 3: различные виды функции активации

a) пороговая
б) линейная ограниченная
в) биполярный сигмоид

Множество всех нейронов искусственной нейронной сети можно разделить на подмножества — т.н. слои. Взаимодействие нейронов происходит послойно.

Слой искусственной нейронной сети это множество нейронов на которые в каждый такт времени параллельно поступают сигналы от других нейронов данной сети [1].

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

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

Проблема синтеза искусственной нейронной сети сильно зависит от задачи, дать общие подробные рекомендации затруднительно. В большинстве случаев оптимальный вариант искусственной нейронной сети получается опытным путем[2].

Искусственные нейронные сети могут быть программного и аппаратного исполнения. Реализация аппаратная обычно представляет собой параллельный вычислитель, состоящий из множества простых процессоров [3].

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

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

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

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

Элементами этих двух множеств есть пары , где

  • — вход, для обучаемой нейронной сети;
  • — идеальный (желаемый) выход сети для входа ;

Так же определяется функция ошибки . Обычно это средняя квадратичная ошибка [3]:

где

  • — количество обработанных нейронной сетью примеров;
  • — реальный выход нейронной сети;
  • — желаемый (идеальный) выход нейронной сети;

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

Общая схема обучения «с учителем» выглядит так :

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

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

  3. Проверка правильности работы сети — на вход в определенном порядке подаются контрольные примеры. Для каждого примера вычисляется ошибка (ошибка обобщения).

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

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

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

По этому принципу построен алгоритм Розенблатта. Данный метод был предложен Ф.Розенблаттом в 1959 г. для искусственной нейронной сети, названной персептрон (perceptron)[4]. Персептрон имеет пороговую функцию активации, его схема представлена здесь. Правило обучения для персептрона выглядит так [1] :

(1)

где

  • — -тый вход искусственной нейронной сети
  • — желаемый (идеальный) -тый выход нейронной сети
  • — коэффициент (скорость обучения)

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

Персептрон Розенблатта ограничивается бинарными выходами. Видроу и Хофф изменили модель Розенблатта. Их первая модель — ADALINE (Adaptive Linear Element) имела один выходной нейрон и непрерывную линейную функцию активации нейронов[6].

(2)

Метод обучения Видроу-Хоффа известен еще как дельта-правило (delta-rule). Этот метод ставит своей целью минимизацию функции ошибки в пространстве весовых коэффициентов.

(3)

где

  • — количество обработанных и сетью примеров
  • — ошибка для k-го примера
  • — реальный выход сети для k-го примера
  • — желаемый (идеальный) выход сети для k-го примера

Минимизация осуществляется методом градиентного спуска

где

Таким образом весовые коэффициенты изменяются по правилу

(4)

На рис.4 изображён пример результатов работы линейного классификатора на основе ADALINE.

Рисунок 4: результат работы ADALINE

Реализация ADALINE в системе Octave [  здесь  ].

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

Решение этой задачи был предложено Д.Румельхартом с соавторами в 1986 году[5]. Предложенный метод обучения многослойной искусственной нейронной сети, был назван методом обратного распространения ошибки. Основная идея этого метода состояла в распространение сигналов ошибки от выходов сети к её входам, в направлении, обратном прямому распространению сигналов в обычном режиме работы.

Метод обратного распространения ошибки (error back propagation) это итеративный градиентный алгоритм обучения многослойной искусственной нейронной сети без обратных связей [5,3]. При обучении ставится задача минимизации функции ошибки:

(5)

где

  • — реальное значение -того выхода сети;
  • — идеальное (желаемое) значение -того выхода сети;

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

(6)

где

  • — весовой коэффициент синаптической связи, соединяющей -ый и -ый узлы сети;
  • — коэффициент скорости обучения;
  • Второй множитель (6)
    (7)

    Здесь

    • — выход нейрона номер ,
    • — взвешенная сумма его входных сигналов, то есть аргумент активационной функции.
    • Первый множитель в (7) раскладывается следующим образом:
      (8)

    где число нейронов слоя

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

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

  • Третий множитель (7), есть выход -того нейрона предыдущего слоя.

Введя новую переменную

(9)

мы получим рекурсивную формулу для расчетов величинслоя из величинслоя .

(10)

Для выходного слоя

(11)

Теперь мы можем записать (6) в раскрытом виде:

(12)

Для методов обучения ''без учителя'', так же как и методов обучения ''с учителем'', требуется множество учебных примеров.

Процесс обучения, как и в случае обучения ''с учителем'', сводится к подстраиванию весовых коэффициентов.

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

Метод Хебба основывается на биологическом феномене обучения путем повторения и привыкания. Этот феномен еще известен как эффект проторения[7].

При обучении искусственной нейронной сети сигнальным методом Хебба[8] усиливаются связи между возбужденными нейронами, в данном случае веса изменяются по следующему правилу:

(13)

где

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

Существует также дифференциальный метод обучения Хебба.

(14)

Здесь

  • и выходное значение нейрона слоя соответственно на итерациях и ;
  • и то же самое для нейрона слоя .

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

В.А.Головко, под ред.проф.А.И.Галушкина Нейронные сети: обучение, организация и применение. — Москва : ИПРЖР, 2001С.Короткий Нейронные сети — http://lii.newmail.ruЛ.Г.Комарцова, А.В. Максимов Нейрокомпьютеры. — Москва : МГТУ им. Н.Э.Баумана, 2002F.Rosenblatt Principles of Neurodinamics. — New York: Spartan Books,1962.
Русский перевод:
Ф.Розенблатт Принципы нейродинамики. — Москва : Мир, 1965.D.E.Rumelhart, G.E.Hinton, R.J.Williams Learning internal representations by error propagation. // In Parallel distributed processing, vol. 1, pp. 318-62. Cambridg, MA: MIT Press, 1986.В.Widrow, M.Hoff Adaptive switching circuits. // IRE WESCON Convention Record, part 4, pp. 96-104. New York: Institute of Radio Engineers, 1960.Ю.И.Петунин Приложение теории случайных процессов в биологии и медицине. — Киев : Наукова Думка, 1981.D.O.Hebb Organization of behavior. — New York: Science Editions, 1949.
Evgeny S. Borisov
2005-10-19

Источник: http://mechanoid.kiev.ua/neural-net-base.html

Как обучить свою первую глубокую нейронную сеть

Пошаговое руководство по обучению нейронной сети.

Автор: Пит Уорден (Pete Warden)

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

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

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

Совет

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

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

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

Устанавливаем виртуальную машину

Для работы с виртуальной машиной нам понадобится компьютер с OS X или Linux и свободное ПО для виртуализации Vagrant. Если у вас еще нет Vagrant, перейдите по ссылке и следуйте инструкциям в разделе «Getting Started» («Приступая к работе»).

После установки Vagrant открываем новое окно терминала и создаем каталог для виртуальной машины с помощью следующих команд:

mkdir ~/dl_webcast cd ~/dl_webcast

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

vagrant box add dl_webcast https://d2rlgkokhpr1uq.cloudfront.net/dl_webcast.box

Загрузив образ, запускаем новый виртуальный сервер:

vagrant init dl_webcast vagrant up

Входим в виртуальную машину:

vagrant ssh

Используем предварительно обученную нейронную сеть

Я покажу вам, как работать с фреймворком для глубокого обучения Caffe, разработанным Янцином Цзя (Yangqing Jia) и командой Berkeley Vision and Learning Center (BVLC).

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

cd ~/caffe

Мы будем использовать нейронную сеть, основанную на архитектуре Крижевского (Krizhevsky) и его команды, позволившей им выиграть соревнование ImageNet 2012.

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

Данная сеть способна распознавать 1 000 различных категорий объектов. Классификация выполняется с помощью простой команды:

python python/classify.py —print_results examples/images/cat.jpg foo

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

[('kit fox', '0.27215'), ('red fox', '0.19984'), ('wood rabbit', '0.13209'), ('hare', '0.07283'), ('Egyptian cat', '0.06632')]

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

https://github.com/BVLC/caffe/blob/master/examples/images/cat.jpg

Обратите внимание

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

~/dl_webcast/

В файловой системе виртуальной машины они появятся в следующем каталоге:

/vagrant/

Самостоятельно обучаем нейронную сеть

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

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

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

Одной из первых задач, для решения которых были применены сверточные нейронные сети (convolutional neural network), была задача распознавания рукописных цифр. Ян Лекун (Yann LeCun) сделал большой вклад в данную область знаний в 90-е годы, а версия его архитектуры LeNet включена в состав Caffe. Загрузим набор данных MNIST, состоящий из 70 000 изображений рукописных цифр:

cd data/mnist ./get_mnist.sh cd ../.. cd examples/mnist

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

prototxt в редакторе nano (или в любом другом) и изменить последнюю строку, задав CPU вместо GPU, потому что в виртуальной машине мы не можем использовать преимущества видеокарты.

Запустим процесс обучения с помощью следующего скрипта:

./train_lenet.sh

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

ls -l

Мы должны увидеть созданный файл со следующим именем:

lenet_iter_10000

Важно

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

python python/classify.py —print_results —model_def examples/mnist/lenet.prototxt —pretrained_model examples/mnist/lenet_iter_10000 —force_grayscale —center_only —labels_file data/mnist/mnist_words.txt —images_dim 28,28 data/mnist/sample_digit.png foo

В результате получим сообщение о том, что с вероятностью 100% это цифра 4, что соответствует действительности!

Руководство по установке

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

vagrant box add ubuntu-14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box

После создания и инициализации виртуальной машины, входим в нее и запускаем процесс установки CUDA. Чтобы собрать Caffe, необходимы заголовочные файлы и библиотеки CUDA, даже если мы собираемся работать только на CPU. Поэтому нам не обойтись без пакета CUDA, размер которого составляет 900 МБ.

sudo apt-get install linux-headers-uname -r curl -O «http://developer.download.nvidia.com/compute/cuda/6_0/rel/installers/cuda_6.0.37_linux_64.run» chmod +x cuda_6.0.37_linux_64.run sudo ./cuda_6.0.37_linux_64.run —kernel-source-path=/usr/src/linux-headers-3.13.0-30-generic/

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

echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64' >> ~/.bashrc source ~/.bashrc

Теперь установим ряд зависимостей с помощью apt-get:

Источник: http://datareview.info/article/kak-obuchit-i-primenit-svoyu-pervuyu-glubokuyu-neyronnuyu-set/

Ссылка на основную публикацию