Примеры нейронных сетей

Изучаем нейронные сети за четыре шага

Рассказывает Per Harald Borgen

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

Шаг 1. Нейроны и метод прямого распространения

Так что же такое «нейронная сеть»? Давайте подождём с этим и сперва разберёмся с одним нейроном.

Нейрон похож на функцию: он принимает на вход несколько значений и возвращает одно.

Круг ниже обозначает искусственный нейрон. Он получает 5 и возвращает 1. Ввод — это сумма трёх соединённых с нейроном синапсов (три стрелки слева).

В левой части картинки мы видим 2 входных значения (зелёного цвета) и смещение (выделено коричневым цветом).

Входные данные могут быть численными представлениями двух разных свойств. Например, при создании спам-фильтра они могли бы означать наличие более чем одного слова, написанного ЗАГЛАВНЫМИ БУКВАМИ, и наличие слова «виагра».

Входные значения умножаются на свои так называемые «веса», 7 и 3 (выделено синим).

Теперь мы складываем полученные значения со смещением и получаем число, в нашем случае 5 (выделено красным). Это — ввод нашего искусственного нейрона.

Потом нейрон производит какое-то вычисление и выдает выходное значение. Мы получили 1, т.к. округлённое значение сигмоиды в точке 5 равно 1 (более подробно об этой функции поговорим позже).

Если бы это был спам-фильтр, факт вывода 1 означал бы то, что текст был помечен нейроном как спам.

Иллюстрация нейронной сети с Википедии.

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

Я очень рекомендую посмотреть серию видео от Welch Labs для улучшения понимания процесса.

Шаг 2. Сигмоида

После того, как вы посмотрели уроки от Welch Labs, хорошей идеей было бы ознакомиться с четвертой неделей курса по машинному обучению от Coursera, посвящённой нейронным сетям — она поможет разобраться в принципах их работы. Курс сильно углубляется в математику и основан на Octave, а я предпочитаю Python. Из-за этого я пропустил упражнения и почерпнул все необходимые знания из видео.

Сигмоида просто-напросто отображает ваше значение (по горизонтальной оси) на отрезок от 0 до 1.

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

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

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

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

Шаг 3. Метод обратного распространения ошибки

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

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

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

Скриншот из руководства Мэтта Мазура по методу обратного распространения ошибки.

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

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

Шаг 4. Создание своей нейронной сети

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

Ещё одной полезной статьёй оказалась A Neural Network in 11 lines of Python от IAmTrask. В ней содержится удивительное количество знаний, сжатых до 11 строк кода.

Скриншот руководства от IAmTrask

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

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

После этого можно ознакомиться с руководством Wild ML от Denny Britz, в котором разбираются нейронные сети посложнее.

Скриншот из руководства WildML

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

Для поиска хороших наборов данных можете посетить мой сайт Datasets.co и выбрать там подходящий.

Так или иначе, теперь вам лучше начать свои эксперименты, чем слушать мои советы. Лично я сейчас изучаю Python-библиотеки для программирования нейронных сетей, такие как Theano, Lasagne и nolearn.

Удачи!

Нейронные сети

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

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

  • Alyuda NeuroIntelligence — Нейросетевое программное обеспечение и расширение для Excel, предназначенное для прогнозирования и анализа данных. Поддерживает несколько алгоритмов. Доступна trial-версия.
  • Amygdala — Программное обеспечение с открытым исходным кодом для моделирования нейронных сетей, написанное на C++.
  • Annie — Нейросетевая библиотека для C + + (Windows и Linux) с открытым исходным кодом. Поддерживает MLP, RBF и сети Хопфилда. Наличие интерфейсов для Matlab’s Neural Network Toolbox.
  • Artificial Intelligence Recurrent Asymmetric Networks (NARIA) — Открытый проект о симуляции человеко-подобного интеллекта с помощью нейронных сетей.
  • Cortex — Приложение, реализующее нейронные сети обратного распространения.
  • DELVE — Стандартная среда для оценки эффективности методов обучения. Включает в себя набор данных и архив методов обучения.
  • EasyNN — Нейросетевое программное обеспечение для Windows с числовыми, текстовыми и графичискими функциями.
  • ECANSE — Предоставляет среду разработки для проектирования, моделирования и тестирования нейронных сетей и их применения для производства оптимизированного программного решения.
  • FANN — Нейросетевая библиотека исполняемая в ANSI C. Создает многослойные сети прямого распространения с поддержкой как полносвязных и и сетей со структурными связями. Поддерживает выполнение в фиксированной точке для быстрой работы на системах, как IPAQ.
  • Fann Neural Network for Mathematica — Бесплатная интерактивная среда для Mathematica, включающая распознавание образов и предсказания временных рядов.
  • Genesis — Платформа для моделирования сложных нейронных систем.
  • Java library — Java-библиотека с открытыым кодом, реализующая сети прямого распространения такие как: многослойные персептроны, обобщенные и модульные сети прямого распространения.
  • Joone — (Java Object Oriented Neural Engine) — свободно распространяемый нейросетевой фреймворк на Java. Может быть расширен новыми модулями.
  • libF2N2 — Нейросетевая библиотека с открытым исходным кодом. Реализует нейронные сети прямого распространения на C++ и PHP.
  • Lightweight Neural Network++ — Свободно распространяемое программное обоеспечение. Реализует нейронные сети прямого распространения и неккоторые мтеоды обучения.
  • LTF-Cimulator — Симулятор LTF-C нейронных сетей для решения задач классификации.
  • Netlab — Библиотека MATLAB- функций для моделирования нейросетевых алгоритмов, основанных на книге «Neural Networks for Pattern Recognition» Chris Bishop.
  • NetMaker — Моделирует MLP, RMLP and каскадно-корреляционные сети с динамической подстройкой архитектуры. Включает различные учебные данные, ошибки и активационные функции.
  • Neurak — бесплатная среда для разработки и применения искусственных нейронных сетей.
  • Neural Network Framework — Фреймворк для создания нейронных сетей с произвольной топологией и смешанного типа нейронов. Включает в себя техническую информацию и почтовые рассылки.
  • Neural Network Leaves Recognition — Нейронная сеть, предназначенная для распознования. Написана на Java. Java-Applet также доступен.
  • Neural Network Models in Excel — Бесплатное программное обеспечение, реализующее нейронные сети для решения задач прогнозирования и классификации в Excel. Используется обратное распространение. Может обрабатывать пропущенные значения и категориальные данные.
  • Neural Network Toolbox for MATLAB — среда для исследований нейронных сетей, проектирования и моделирования их в MATLAB.
  • Neural Networks at your Fingertips — Нейросетевой симулятор, реализующий 8 различный архитектур со встроенным примером приложений запрограммированных на ANSI C.
  • NeuralWorks — Professional II/PLUS является средой для разработки нейронных сетей для Windows и Unix. Predict — нейросетевой инструмент для решения задач прогнозирования и классификации для Unix или как надстройка Excel для Windows.
  • NeuroBox -dotNET-библиотека, реализованная на C# для создания, распространения и обучения сложных нейронных сетей прямого распространения.
  • Neuromat — Программное обеспечение для разработки байесовских нейронных сетей.
  • NeuroMine — Нейрсетевые COM+ компонены и среда разработки для предсказания и анализа данных. Поддерживает несколько алгоритмов. Доступна trial-версия.
  • Neuropilot Project — Набор демо java-апплетов, реализующих обученные нейронные сети для пилотирования лунно-посадочного модуля на ландшафты различной сложности.
  • NeuroShell Predictor — Программное обеспечени для прогнозирования и оценки на основе нейронные сетей. Доступна демо-версия.
  • NeuroSolutions — Среда раработки нейронных сетей с графичиским интерфейсом. Поддерживает несколько типо сетей и алгоритмов обучения. Доступна trial-версия.
  • NeuroXL — MS Excel надстройки на основе нейронных сетей. Предназначены для предсказания, классификации и финансового прогнозирования.
  • NNSYSID Toolbox — Набор инструментов для MATLAB, реализующий нейронные сети для идентификации нелинейных динамических систем.
  • Penguinwerks — Нейросетевая библиотека с открытым исходным кодом на C# для создания многослойных персептронов.
  • Pythia — Программное обеспечение для моделирования нейронных сетей с обратным распространением. Доступна ознакомительная версия.
  • Simbrain — Бесплатный Java-набор для моделирования нейронных сетей.
  • Stuttgart Neural Network Simulator — На сайте представлено описание возможностей симулятора для Unix и X11, а также информация о том, как можно получить SNNS и онлайн руководство пользователя.
  • Temporal Difference Learning Project — Java-исходники, реализующие обучение методом случайного поиска и Tic Tac Toe.
  • Tiberius — Нейросетевое программное обеспечение для решения задач классификации и регрессии. Поддерживает ODBC и Excel.
  • Torch — Библиотека, реализующая современные алгоритмы машинного обучения. A library of state-of-the-art machine learning algorithms. Лицензия GPL. Работает в Unix and Linux средах.
  • Tradecision — Нейросетевое программное обеспечение для технического анализа и торговли на фондовом рынке. Доступна демо-версия.
  • Xerion — Симулятор нейронной сети на C и Tcl. Состоит из библиотек на C для создания сетей.
  • Prediction with neural network — Учебник, который включает в себя Java-апплет для проведения экспериментов предсказания в режиме онлайн.
  • Neuroph — Нейросетевой фреймворк на Java с открытым исходным кодом, который может быть использован для создания и обучения основных типов нейронных сетей. Сайт содержит полный исходных код, документацию и информацию о проекте.
  • University of Hertfordshire Neural Network Software — Нейросетевое программное обеспечение написанное на Java с полным исходным кодом.

Пощупать нейросети или конструктор нейронных сетей


Я давно интересовался нейросетями, но только с позиции зрителя – следил за новыми возможностями, которые они дают по сравнению с обычным программированием. Но никогда не лез ни в теорию, ни в практику. И вдруг (после сенсационной новости о AlphaZero) мне захотелось сделать свою нейросеть. Посмотрев несколько уроков по этой теме на YouTube, я немного врубился в теорию и перешёл к практике. В итоге я сделал даже лучше, чем свою нейросеть. Получился конструктор нейросетей и наглядное пособие по ним (то есть можно смотреть, что творится внутри нейросети). Вот как это выглядит:

А теперь немного подробнее. С помощью этого конструктора можно создавать сети прямого распространения (Feedforward neural network) до 8 скрытых слоёв (плюс слой входов и слой выходов, итого 10 слоёв (обычно 4-х слоёв более чем достаточно)) в каждом слое до 30 нейронов (ограничение связано с тем, что всё это одновременно отображается на экране, если будут просьбы в комментариях выпущу версию без ограничений и визуализации). Функция активации всех нейронов – сигмоид на основе логистической функции. Также можно обучать получившиеся сети методом обратного распространения ошибки градиентным спуском по заданным примерам. И, самое главное, можно посмотреть на каждый нейрон в каждом отдельном случае (какое значение он передаёт дальше, его смещение (поправку, bias) – нейроны с отрицательным смещением белые, с положительным – ярко-зелёные), связи нейронов в зависимости от их веса помечены красным – положительные, синим – отрицательные, а также отличаются по толщине – чем больше модуль веса, тем толще. А если навести мышку на нейрон, то можно ещё посмотреть какой сигнал на него приходит, и какое конкретно у него смещение. Это полезно, чтобы понять, как работает конкретная сеть или показать студентам принцип работы сетей прямого распространения. Но самое главное – свою сеть можно сохранить в файл и поделиться с миром.
Далее будут инструкции по пользованию программой, встраиванию созданных сетей в свои проекты, а также разбор нескольких сетей, идущих в комплекте.

Как пользоваться конструктором

Для начала скачайте архив отсюда.
Распакуйте в корень диска D:\
Запустите NeuroNet.exe
Можете попробовать «Загрузить» какую-нибудь сеть, посмотреть на неё, нажать «Обучение», увидеть её точность, потыкать стрелки влево, вправо (по бокам), чтобы посмотреть различные варианты входных (левый столбец нейронов) и выходных (правый) данных, нажать «Стоп» и попробовать ввести свои входные данные (разрешены любые значения от 0 до 1, учитывайте это при создании своих сетей и нормализуйте входные и выходные данные).
Теперь как строить свои сети. Первым делом необходимо задать архитектуру сети (количество нейронов в каждом слое через запятую), нажать «Построить» (или сначала «Снести», затем построить, если у Вас на экране уже отображается другая сеть), нажать «Обучающая выборка», «Удалить всё» и ввести свои обучающие примеры, согласно инструкции на экране. Также можно указать на вход и на выход маленькие квадратные картинки (максимум 5х5 пикселей), из которых будут определены нормализованные значения яркости пикселей (не учитывая их цвет), для чего нужно нажать на «in» и «out» соответственно. Нажать «Добавить пример», повторить процедуру нужное количество раз. Нажать «Готово», «Обучение» и как точность станет удовлетворительной (обычно 98%), нажать «Стоп», иконку в виде дискеты (сохранить), дать сети имя и радоваться, что Вы сами создали нейросеть. Дополнительно можете устанавливать скорость обучения ползунком «Точнее/Быстрее», а также визуализировать не каждый 50й шаг, а каждый 10й или 300й, как Вам угодно.

Разбор сетей, идущих в комплекте

Начнём с классики – «XOR(Полусумматор)». Среди прочих, в частности, эту задачу – сложение по модулю 2 – в 1969 году приводили в качестве примера ограниченности нейросетей (а именно однослойных перцептронов). В общем, имеется два входа (со значениями либо 0, либо 1 у каждого), наша же задача — ответить 1, если значения входов разные, 0 – если одинаковые.

Далее «Количество-единиц». Три входа (0 либо 1 на каждом). Требуется посчитать, сколько было подано единиц. Реализовано как задача классификации – четыре выхода на каждый вариант ответа (0,1,2,3 единицы). На каком выходе максимальное значение, соответственно таков и ответ.

«Умножение» – Два входа (вещественные от 0 до 1), на выход их произведение.

«4-5» – На вход подаются нормализованные значения яркости пикселей картинки 4х4, на выходе имеем нормализованные значения яркости пикселей картинки 5х5.

Сеть задумывалась, как увеличение качества большой картинки на 25%, вышел же интересный фильтр для фото:

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

Архитектура нейронных сетей

ИНС может рассматриваться как направленный граф со взвешенными связями, в котором искусственные нейроны являются узлами. По архитектуре связей ИНС могут быть сгруппированы в два класса (рис. 5): сети прямого распространения, в которых графы не имеют петель, и рекуррентные сети, или сети с обратными связями.

Сеть РБФ (радиально-базисных функций) — искусственная нейронная сеть, которая использует радиальные базисные функции как функции активации.

АРТ ‑ Адаптивная резонансная теория, сети адаптивного резонанса — разновидность искусственных нейронных сетей основанная на теории адаптивного резонанса Стивена Гроссберга и Гейла Карпентера. Включает в себя модели, использующие обучение с учителем и без учителя и используются при решении задач распознавания образов и предсказания.

Нейронные сети различают по:

· структуре сети (связей между нейронами);

· особенностям модели нейрона;

· особенностям обучения сети.

По структуре нейронные сети можно разделить (рисунок 8) на:

· неполносвязные (или слоистые) и полносвязные;

· со случайными и регулярными связями;

· с симметричными и несимметричными связями.

Рисунок 8 – Классификация нейронных сетей по структуре

Неполносвязные нейронные сети (описываемые неполносвязным ориентированным графом и обычно называемые перцептронами), подразделяются на однослойные (простейшие перцептроны) и многослойные, с прямыми, перекрестными и обратными связями. В нейронных сетях с прямыми связями нейроны j-ого слоя по входам могут соединяться только с нейронами i-ых слоев, где j > i , т.е. с нейронами нижележащих слоев. В нейронных сетях с перекресными связями допускаются связи внутри одного слоя, т.е. выше приведенное неравенство заменяется на j > = i . В нейронных сетях с обратными связями используются и связи j-ого слоя по входам с i-ым при j < i.

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

· полносвязные (рисунок 9, а);

· многослойные или слоистые (рисунок 9, б);

· слабосвязные (с локальными связями) (рисунок 9, в).

Рисунок 9 – Архитектуры нейронных сетей: а – полносвязная сеть, б – многослойная сеть с последовательными связями, в – слабосвязные сети

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

В многослойных нейронных сетях нейроны объединяются в слои. Слой содержит совокупность нейронов с едиными входными сигналами. Число нейронов в слое может быть любым и не зависит от количества нейронов в других слоях. В общем случае сеть состоит из Q слоев, пронумерованных слева направо. Внешние входные сигналы подаются на входы нейронов входного слоя (его часто нумеруют как нулевой), а выходами сети являются выходные сигналы последнего слоя. Кроме входного и выходного слоев в многослойной нейронной сети есть один или несколько скрытых слоев. Связи от выходов нейронов некоторого слоя q к входам нейронов следующего слоя (q+1) называются последовательными.

В свою очередь, среди многослойных нейронных сетей выделяют следующие типы.

1) Монотонные. Это частный случай слоистых сетей с дополнительными условиями на связи и нейроны. Каждый слой кроме последнего (выходного) разбит на два блока: возбуждающий и тормозящий. Связи между блоками тоже разделяются на тормозящие и возбуждающие. Если от нейронов блока А к нейронам блока В ведут только возбуждающие связи, то это означает, что любой выходной сигнал блока является монотонной неубывающей функцией любого выходного сигнала блока А. Если же эти связи только тормозящие, то любой выходной сигнал блока В является невозрастающей функцией любого выходного сигнала блока А. Для нейронов монотонных сетей необходима монотонная зависимость выходного сигнала нейрона от параметров входных сигналов.

2) Сети без обратных связей. В таких сетях нейроны входного слоя получают входные сигналы, преобразуют их и передают нейронам первого скрытого слоя, и так далее вплоть до выходного, который выдает сигналы для интерпретатора и пользователя. Если не оговорено противное, то каждый выходной сигнал q-гo слоя подастся на вход всех нейронов (q+1)-гo слоя; однако возможен вариант соединения q-гo слоя с произвольным (q+p)-м слоем.

Среди многослойных сетей без обратных связей различают полносвязанные (выход каждого нейрона q-гo слоя связан с входом каждого нейрона (q+1)-гo слоя) и частично полносвязанные. Классическим вариантом слоистых сетей являются полносвязанные сети прямого распространения (рисунок 10).

Рисунок 10 – Многослойная (двухслойная) сеть прямого распространения

3) Сети с обратными связями. В сетях с обратными связями информация с последующих слоев передается на предыдущие. Среди них, в свою очередь, выделяют следующие:

· слоисто-циклические, отличающиеся тем, что слои замкнуты в кольцо: последний слой передает свои выходные сигналы первому; все слои равноправны и могут как получать входные сигналы, так и выдавать выходные;

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

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

В качестве примера сетей с обратными связями на рисунке 11 представлены частично-рекуррентные сети Элмана и Жордана.

Рисунок 11 – Частично-рекуррентные сети: а – Элмана, б – Жордана

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

Известные нейронные сети можно разделить по типам структур нейронов на:

· гомогенные (однородные);

· гетерогенные.

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

Еще одна классификация делит нейронные сети на:

· синхронные;

· асинхронные.

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

По используемым на входах и выходах сигналам нейронные сети можно разделить на:

· аналоговые;

· бинарные.

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

По моделированию времени нейронные сети подразделяются на сети:

· с непрерывным временем;

· с дискретным временем.

Для программной реализации применяется как правило дискретное время.

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

· подачу сигналов на синапсы входных нейронов;

· подачу сигналов на выходы входных нейронов;

· подачу сигналов в виде весов синапсов входных нейронов;

· аддитивную подачу на синапсы входных нейронов.

По способу съема информации с выходов нейронной сети различают:

· съем с выходов выходных нейронов;

· съем с синапсов выходных нейронов;

· съем в виде значений весов синапсов выходных нейронов;

· аддитивный съем с синапсов выходных нейронов.

По организации обучения разделяют обучение нейронных сетей:

· с учителем (supervised neural networks);

· без учителя (nonsupervised).

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

По способу обучения разделяют обучение:

· по входам

· по выходам.

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

По способу предъявления примеров различают:

· предъявление одиночных примеров

· предъявление «страницы» примеров.

В первом случае изменение состояния нейронной сети (обучение) происходит после предъявления каждого примера. Во втором – после предъявления «страницы» (множества) примеров на основе анализа сразу их всех.

Под состоянием нейронной сети, которое может изменяться, обычно понимается:

· веса синапсов нейронов (карта весов – map) (коннекционистский подход);

· веса синапсов и пороги нейронов (обычно в этом случае порог является более легко изменяемым параметром, чем веса синапсов);

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

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

пороговой ;

Наиболее часто в качестве функций активации используются следующие виды сигмоид:

Функция Ферми (экспоненциальная сигмоида):

Рациональная сигмоида (при =0 вырождается в т.н. пороговую функцию активации):

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

,

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

Перечисленные функции относятся к однопараметрическим.

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

Наиболее распространенные модели нейронных сетей:

· модель Хопфилда;

· машина Больцмана;

· сеть Кохонена;

· модель Хэмминга;

· многослойный персептрон.

Виды архитектур нейронных сетей



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

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

Составляющие искусственной нейронной сети

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

Модель нейрона показана на рисунке 1.

Рис. 1. Модель искусственного нейрона

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

– линейная функция:

– сигмоид:

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

В искусственных нейронных сетях присутствует разнообразный набор таких активационных функций.

Путём объединения нескольких нейронов создаётся искусственная нейронная сеть.

Персептроны

Персептрон — система из сенсоров разных типов: сенсоры (S), ассоциативные (A) и реагирующие (R) . Общий вид персептрона представлен на рисунке 2.

Рис. 2. архитектура персептрона

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

Сеть Хопфилда

Сеть Хопфилда — этот вид сети представляет из себя полносвязный граф представленный на рисунке 3.

Рис. 3. архитектура сети Хопфилда

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

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

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

Свёрточная нейронная сеть

Это вид сети сильно отличается от остальных, в основном используется для работы с графической и аудио информацией. Модель такой сети представлена на рисунке 4. Эта архитектура обрабатывает данные не целиком, а фрагментами, но при этом данные не дробятся на части, а осуществляется своего рода последовательный прогон. Затем данные передаются дальше по слоям. Кроме свёрточных слоёв (С) используются также слои объединения (P — pooling). Например, из аудиодорожки выбираются только ключевые моменты: пики амплитуд и паузы. Слои объединения сжимаются с глубиной (обычно степенью двойки). К конечным слоям добавляются несколько персептронов (сеть прямого распространения), для последующей обработке данных.

Рис. 4. архитектура свёрточной нейронной сети

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

Рекуррентная нейронная сеть

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

Рис. 5. архитектура рекуррентной нейронной сети

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

Выводы

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

Литература:

  1. Электронный ресурс: Динамика популярности по запросу «Искусственный интеллект» Google.com https://www.google.ru/trends/explore?date=all_2008&gprop=news&q= %2Fm %2F0mkz&hl=ru
  2. Фрэнк Розенблатт. Принципы нейродинамики. Перцептроны и теория механизмов мозга. Издательство «Мир», 1965г — стр. 82
  3. Электронный ресурс: Зоопарк архитектур нейронных сетей / Хабрахабр https://m.habrahabr.ru/company/wunderfund/blog/313696/
  4. Электронный ресурс: Учебник по нейронным сетям / Neuralnet http://neuralnet.info/глава-3-персептроны/#история-персептрона

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

Теория

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

Преобразования, которые происходят на уровне отдельных нейронов, очень просты, однако даже совсем небольшие нейронные сети способны на многое. Все многообразие поведения червя Caenorhabditis elegans — движение, поиск пищи, различные реакции на внешние раздражители и многое другое — закодировано всего в трех сотнях нейронов. И ладно черви! Даже муравьям хватает 250 тысяч нейронов, а то, что они делают, машинам определенно не под силу.

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

Электромеханический мозг с моторчиком

Машина Розенблатта называлась Mark I Perceptron. Она предназначалась для распознавания изображений — задачи, с которой компьютеры до сих пор справляются так себе. Mark I был снабжен подобием сетчатки глаза: квадратной матрицей из 400 фотоэлементов, двадцать по вертикали и двадцать по горизонтали. Фотоэлементы в случайном порядке подключались к электронным моделям нейронов, а они, в свою очередь, к восьми выходам. В качестве синапсов, соединяющих электронные нейроны, фотоэлементы и выходы, Розенблатт использовал потенциометры. При обучении перцептрона 512 шаговых двигателей автоматически вращали ручки потенциометров, регулируя напряжение на нейронах в зависимости от точности результата на выходе.

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

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

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

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

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