Введение в нейронные сети на примере нейронной сети Хопфилда |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2016-05-30 13:20 Статья посвящена введению в нейронные сети и примеру их реализации. В первой части дано небольшое теоретическое введение в нейронные сети на примере нейронной сети Хопфилда. Показано, как осуществляется обучение сети и как описывается ее динамика. Во второй части показано, как можно реализовать алгоритмы, описанные в первой части при помощи языка С++. Разработанная программа наглядно показывает способность нейронной сети очищать от шума ключевой образ. В конце статьи есть ссылка на исходный код проекта. Теоретическое описание Введение Для начала, необходимо определить, что такое нейрон. В биологии нейрон - специализированная клетка, из которой состоит нервная система. Биологический нейрон имеет строение, показанное на рис.1.
Рис.1 Схема нейрона Нейронную сеть можно ввести как совокупность нейронов и их взаимосвязей. Следовательно, для того, чтобы определить искусственную (не биологическую) нейронную сеть необходимо:
В качестве архитектуры нейронной сети будет использоваться сеть Хопфилда. Данная модель, видимо, является наиболее распространенной математической моделью в нейронауке. Это обусловлено ее простотой и наглядность. Сеть Хопфилда показывает, каким образом может быть организована память в сети из элементов, которые не являются очень надежными. Экспериментальные данные показывают, что при увеличении количества вышедших из строя нейронов до 50%, вероятность правильного ответа крайне близка к 100%. Даже поверхностное сопоставление нейронной сети (например, мозга) и Фон-Неймановской ЭВМ показывает, насколько сильно различаются эти объекты: к примеру, частота изменения состояний нейронов («тактовая частота») не превышает 200Гц, тогда как частота изменения состояния элементов современного процессора может достигать нескольких ГГц (Гц). Сеть состоит из N искусственных нейронов, аксон каждого нейрона связан с дендритами остальных нейронов, образуя обратную связь. Архитектура сети изображена на рис. 2.
Рис.2 Архитектура нейронной сети Хопфилда Каждый нейрон может находиться в одном из 2-х состояний: где - состояние нейрона в момент . «Возбуждению» нейрона соответствует , а «торможению» . Дискретность состояний нейрона отражает нелинейный, пороговый характер его функционирования и известный в нейрофизиологи как принцип «все или ничего». Динамика состояния во времени -ого нейрона в сети из нейронов описывается дискретной динамической системой: где - матрица весовых коэффициентов, описывающих взаимодействие дендритов -ого нейрона с аксонами -ого нейрона. Стоит отметить, что и случай не рассматриваются. Обучение и устойчивость к шуму Обучение сети Хопфилда выходным образам сводится к вычислению значений элементов матрицы . Формально можно описать процесс обучения следующим образом: пусть необходимо обучить нейронную сеть распознавать образов, обозначенных . Входной образ представляет собой: где - шум, наложенный на исходный образ . Важной характеристикой нейронной сети является отношение числа ключевых образов , которые могут быть запомнены, к числу нейронов сети : . Для сети Хопфилда значение не больше 0.14. Вычисление квадратной матрицы размера для ключевых образов производится по правилу Хебба: где означает -ый элемент образа . Стоит отметить, что в силу коммутативности операции умножения, соблюдается равенство Входной образ, который предъявляется для распознавания соответствует начальным данным для системы, служащий начальным условием для динамической системы (2): Уравнений (1), (2), (3), (4) достаточно для определения искусственной нейронной сети Хопфилда и можно перейти к ее реализации. Реализация нейронной сети Хопфилда Реализация нейронной сети Хопфилда, определенной выше будет производиться на языке C++. Для упрощения экспериментов, добавим основные определения типов, напрямую связанных с видом нейрона и его передаточной функции в класс simple_neuron, а производные определим далее. Самыми основными типами, напрямую связанными с нейроном являются:
На основе этих типов можно ввести остальные базовые типы:
Листинг 1. Определение новых типов Обучение сети, или, вычисление элементов матрицы в соответствии с (3) производится функцией learn_neuro_net, принимающей на вход список обучающих образов и возвращающей объект типа link_coeffs_t. Значения вычисляются только для нижнетреугольных элементов. Значения верхнетреугольных элементов вычисляются в соответствии с (4). Общий вид метода learn_neuro_net показан в листинге 2. Листинг 2. Обучение нейронной сети Обновление состояний нейронов реализовано с помощью функтора neuro_net_system. Аргументом метода _do функтора является начальное состояние , являющееся распознаваемых образом (в соответствии с (5)) - ссылка на объект типа neurons_line. Метод функтора модифицирует передаваемый объект типа neurons_line до состояния нейронной сети в момент времени . Значение жестко не фиксировано и определяется выражением: т.е., когда состояние каждого нейрона не изменилось за 1 «такт». Для вычисления (2) применены 2 алгоритма STL:
Исходный код функтора neurons_net_system и метода calculate класса simple_neuron показан в листинге 3. Листинг 3. Функтор, реализующий работу нейронной сети Для вывода в консоль входных и выходных образов создан тип neurons_line_print_descriptor, который хранит ссылку на образ и формат форматирования (ширину и высоту прямоугольника, в который будет вписан образ). Для этого типа переопределен оператор <<. Исходный код типа neurons_line_print_descriptor и оператора вывода в поток показан в листинге 4. Листинг 4. Вывод в поток состояния нейронной сети Пример работы нейронной сети Для проверки работоспособности реализации, нейронная сеть была обучена 2 ключевым образам: Рис.3 Ключевые образы На вход подавались искаженные образы. Нейронная сеть корректно распознала исходные образы. Искаженные образы и распознанные образы показаны на рис.4, 5 Рис.4 Распознавание образа 1 Рис.5 Распознавание образа 2 Запуск программы производится из командной строки строчкой вида: AppName WIDTH HEIGHT SOURCE_FILE [LEARNE_FILE_N], где: AppNaame - название исполняемого файла; WIDTH, HEIGHT - ширина и высота прямоугольника, в который будут вписываться выходной и ключевые образы; SOURCE_FILE - исходный файл с начальным образом; [LEARNE_FILE_N] - один или несколько файлов с ключывыми образами (через пробел). Исходный код выложен на GitHub -> https://github.com/RainM/hopfield_neuro_net В репозитории проект CMake, из которого можно сгенерировать проект Visual Studio (VS2015 компилирует проект успешно) или обычные Unix Makefile-ы. Использованная литература
Источник: habrahabr.ru Комментарии: |
|