Обучение нейронной сети

Нейронные сети в Matlab уже здесь!

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

  • Нейросети – это мощнейший метод имитации явлений и процессов, который позволяет показывать сложнейшие зависимости. Нейронные сети являются нелинейными по своей природе, в то же время как на протяжении нескольких лет для создания моделей применялся линейный подход. А также, во многих случаях нейронные сети помогали преодолеть, так называемое, «проклятие размерности», которая обусловлена тем, что создание модели нелинейных явлений требует большого количества вычислительных ресурсов (в случае большого числа переменных).
  • Следующая особенность нейросетей связана с тем, что используется механизм обучения. Пользователь нейронной системы подбирает представительные данные и запускает обучающий алгоритм, который сам настраивает параметры сети без участия пользователя. От пользователя только требуется набор эвристических знаний
    о том, как следует подготавливать и отбирать данные, выбирать необходимую архитектуру нейронной сети и интерпретировать полученные результаты. Однако следует заметить, что уровень знаний, требующийся от пользователя, который необходим для успешного применения нейронной системы, намного меньше, чем, к примеру, при использовании традиционных методов.

Предлагаемый вниманию читателя сайт входит в серию «Пакеты прикладных программ». Этот сайт посвящен описанию прикладного программного обеспечения фирмы MathWorks, функционирующего под управлением ядра системы MATLAB.

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

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

Тем не менее данный сайт занимает особое место, поскольку в ней описан реальный инструмент для расчета и проектирования нейронных сетей. Этот сайт содержит теорию и описание конкретных нейронных сетей. На нем также включен раздел по системе MATLAB 6 и GUI-интерфейсу для работы с ППП NNT, а также вклю­чает справочный материал по описанию М-функций пакета.

Значительное внимание уделено проектированию контроллеров для систем управления на основе нейронных сетей. Рассмотрено несколько весьма сложных систем управления, для которых процедура проектирования контроллера занимает значительное время.
В первую очередь это модель химического реактора с непрерывным перемешиванием, где используется модель управляемого процесса для предсказания поведения реактора в процессе его функционирования. Другая модель – управление движущимся объектом в магнитном поле. Здесь в качестве модели управляемого процесса используется нелинейная авторегрессионная модель со скользящим средним, которая входит в состав регулятора
и реализуется в виде нейронной сети. Еще один пример связан с управлением роботом, здесь нейронные сети используются для построения как модели управляемого объекта, так и самого регулятора. Работа с этими системами возможна только при наличии ядра системы MATLAB версии 6 и системы Simulink версий 4 (R12) или 5.

Читателю следует выбрать стиль работы с сайтом. Начинающему знакомиться
с теорией и практикой нейронных сетей рекомендуется в первую очередь просмотр демонстрационных примеров и формирование сетей с помощью GUI-интерфейса NNTool. Опытному пользователю, создающему собственные архитектуры искусственных нейронных сетей, следует применять режим работы из командного окна, который позволяет воспользоваться всеми возможностями ППП NNT. Следует также обратить внимание на интерфейс ППП NNT с системой SIMULINK, что позволяет наглядно отображать архитектуру сети и выполнять моделирование как статических, так и динамических нейронных сетей.

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

Также на этот ресурс предназначен для подробного изучения раздела — искусственные нейронные сети в Matlab, а именно изучение моделей нейрона и их архитектуры, обучение нейронных сетей, изучение персептронов, линейных сетей, радиальных базисных сетей, сетей кластеризации и классификации данных, сетей Кохонена, LVQ-сетей, рекурентных сетей (Элмана, Хопфилда). Поэтому к выбору правильной архитектуры необходимо подойти основательно и просмотреть много альтернатив! Поэтому из выше всего сказанного можно сделать вывод, что вам необходимо просмотреть много дополнительной информации и альтернатив!

В этой статье мы рассмотрим возможности использования одного из основных инструментов MatLab для проектирования и обучения нейронных сетей Neural Time Series (ntstool) как с помощью GUI, так и с помощью программного кода (а также коснемся расширения возможностей проектирования с помощью программного кода)

Выбор типа сети

Рис. 1 – Экран приветствия утилиты ntstool

При запуске утилиты ntstool пользователя встречает экран приветствия со следующем текстом приветствия:

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

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

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

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

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

  1. Нелинейная авторегрессионная с внешним входом
  2. Нелинейная вход-выход (Без обратных связей)
  3. Нелинейная авторегрессионная (Генератор)

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

1. Нелинейная авторегрессионная с внешним входом:

Рис. 2 – NARX NN

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

Для генерации с помощью программного кода нужно использовать следующую команду:

MATLAB

1 narxnet(inputDelays,feedbackDelays,hiddenSizes,trainFcn)

Аргументы:

  • inputDelays — Входной вектор задержки (По умолчанию = 1:2)
  • feedbackDelays — Вектор обратных задержек (По умолчанию = 1:2)
  • hiddenSizes — Количество скрытых нейронов (По умолчанию = 10)
  • trainFcn — Метод обучения ( По умолчанию = ‘trainlm’)

С помощью команды closeloop(net), есть возможность замкнуть контур этой сети для получения рекуррентной сети.

Рис. 3 – NARX NN

2. Нелинейная вход-выход (Без обратных связей ):

Реализует простейшую сеть прямого распространения.

Рис. 4 – NIO NN

Для генерации с помощью программного кода нужно использовать следующую команду:

MATLAB

1 narnet(feedbackDelays,hiddenSizes,trainFcn)

Аргументы:

  • inputDelays — Входной вектор задержки (По умолчанию = 1:2)
  • hiddenSizes — Количество скрытых нейронов (По умолчанию = 10)
  • trainFcn — Метод обучения ( По умолчанию = ‘trainlm’)

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

Рис. 5 – NAR NN

Пример создания нейронных сетей с помощью кода

MATLAB

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 inputDelays = 1:10; feedbackDelays = 1:10; hiddenLayerSize = 20; %Нейронные сети без обратных связей netx = narxnet(inputDelays,feedbackDelays,hiddenLayerSize); net = narnet(feedbackDelays,hiddenLayerSize); %Нейронные сети с обратными связями netxc = closeloop(netx); netc = closeloop(net); %Для просмотра полученных сетей: view(net)

Выбор данных для обучения, и их подготовка

Рис. 6 – Окно выбора параметров

В утилите ntstool выбор данных для обучения не составляет проблем, поэтому рассмотрим выбор параметров в коде:

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

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

Синтаксис команды:

MATLAB

1 = preparets(net,Xnf,Tnf,Tf,EW)

Аргументы:

  • Net —Нейронная сеть
  • Xnf — Не возвращаемые входные данные
  • Tnf — Не возвращаемые выходные данные
  • Tf — Выходные данные
  • EW — Вес ошибок (По умолчанию = {1})

Возвращаемые значения:

  • Xs — Перемещенные входы
  • Xi — Изначальные состояния входных задержек
  • Ai — Изначальные состояния скрытых нейронов
  • Ts — Перемещенные выходы
  • EWs — Перемещенные веса ошибок

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

Синтаксис команды tonndata:

MATLAB

1 = tonndata(x,columnSamples,cellTime)

Аргументы:

  • x — Матрица или ячейка – массив матриц
  • columnSamples — True если исходные данные представлены в виде колонок, false если в виде строк
  • cellTime — True если исходные данные представлены в виде колоноками ячеек матрицы, false если в виде матрицы

Возвращаемые значения:

  • y— Исходные данные, конвертированные в стандартный вид
  • wasMatrix — True если исходные данные представлены в виде матриц

Шаг 0. Разбираемся, как устроены нейронные сети

Проще всего разобраться с принципами работы нейронных сетей можно на примере Teachable Machine — образовательного проекта Google.

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

Например, можно научить Teachable Machine при поднятой вверх ладони говорить «Hi». При поднятом вверх большом пальце — «Cool», а при удивленном лице с открытым ртом — «Wow».

Для начала нужно обучить нейросеть. Для этого поднимаем ладонь и нажимаем на кнопку «Train Green» — сервис делает несколько десятков снимков, чтобы найти на изображениях закономерность. Набор таких снимков принято называть «датасетом».

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

Как только нейросеть обучена, её можно использовать. Teachable Machine показывает коэффициент «уверенности» — насколько система «уверена», что ей показывают один из навыков.

Кроткое видео о работе Teachable Machine

Шаг 1. Готовим компьютер к работе с нейронной сетью

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

Для создания собственной нейронной сети понадобится Python — один из наиболее минималистичных и распространенных языков программирования, и TensorFlow — открытая библиотека Google для создания и тренировки нейронных сетей.

Устанавливаем Python

Если у вас Windows: скачиваем установщик с официального сайта Python и запускаем его. При установке нужно поставить галочку «Add Python to PATH».

На macOS Python можно установить сразу через Terminal:

brew install python

Для работы с нейронной сетью подойдет Python 2.7 или более старшая версия.

Устанавливаем виртуальное окружение

Открываем командную строку на Windows или Terminal на macOS и последовательно вводим несколько команд:

pip install —upgrade virtualenv
virtualenv —system-site-packages Название
source Название/bin/activate

На компьютер будет установлен инструмент для запуска программ в виртуальном окружении. Он позволит устанавливать и запускать все библиотеки и приложения внутри одной папки — в команде она обозначена как «Название».

Устанавливаем TensorFlow

Вводим команду:

pip install tensorflow

Всё, библиотека TensorFlow установлена в выбранную папку. На macOS она находится по адресу Macintosh HD/Users/Имя_пользователя/, на Windows — в корне C://.

Можно проверить работоспособность библиотеки последовательно вводя команды:

python
import tensorflow as tf
hello = tf.constant(‘Hello, TensorFlow’)
sess = tf.Session()
print(sess.run(hello))

Если установка прошла успешно, то на экране появится фраза «Hello, Tensorflow».

Шаг 4. Переобучаем модель

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

Переходим в папку с классификатором

Открываем командную строку и вводим команду, чтобы перейти в папку с классификатором.

cd C://Название/ cd Название

Запускаем процесс обучения

python scripts/retrain.py —output_graph=tf_files/retrained_graph.pb —output_labels=tf_files/retrained_labels.txt —image_dir=tf_files/flower_photos

Что указано в команде:

  • retrain.py — название Python-скрипта, который отвечает за запуск процесса обучения нейронной сети.
  • output_graph — создаёт новый файл с графом данных. Он и будет использоваться для определения того, что находится на картинке.
  • output_labels — создание нового файла с метками. В нашем примере это ромашки, подсолнухи, одуванчики, тюльпаны или розы.
  • image_dir — путь к папке, в которой находятся изображения с цветами.

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

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

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

Перед тестированием нейросети нужно открыть файл label_image.py, находящийся в папке scripts в любом текстовом редакторе и заменить значения в строках:

input_height = 299
input_width = 299
input_mean = 0
input_std = 255
input_layer = «Mul»

Нейронные сети для начинающих. Часть 1


Привет всем читателям Habrahabr, в этой статье я хочу поделиться с Вами моим опытом в изучении нейронных сетей и, как следствие, их реализации, с помощью языка программирования Java, на платформе Android. Мое знакомство с нейронными сетями произошло, когда вышло приложение Prisma. Оно обрабатывает любую фотографию, с помощью нейронных сетей, и воспроизводит ее с нуля, используя выбранный стиль. Заинтересовавшись этим, я бросился искать статьи и «туториалы», в первую очередь, на Хабре. И к моему великому удивлению, я не нашел ни одну статью, которая четко и поэтапно расписывала алгоритм работы нейронных сетей. Информация была разрознена и в ней отсутствовали ключевые моменты. Также, большинство авторов бросается показывать код на том или ином языке программирования, не прибегая к детальным объяснениям.
Поэтому сейчас, когда я достаточно хорошо освоил нейронные сети и нашел огромное количество информации с разных иностранных порталов, я хотел бы поделиться этим с людьми в серии публикаций, где я соберу всю информацию, которая потребуется вам, если вы только начинаете знакомство с нейронными сетями. В этой статье, я не буду делать сильный акцент на Java и буду объяснять все на примерах, чтобы вы сами смогли перенести это на любой, нужный вам язык программирования. В последующих статьях, я расскажу о своем приложении, написанном под андроид, которое предсказывает движение акций или валюты. Иными словами, всех желающих окунуться в мир нейронных сетей и жаждущих простого и доступного изложения информации или просто тех, кто что-то не понял и хочет подтянуть, добро пожаловать под кат.

Первым и самым важным моим открытием был плейлист американского программиста Джеффа Хитона, в котором он подробно и наглядно разбирает принципы работы нейронных сетей и их классификации. После просмотра этого плейлиста, я решил создать свою нейронную сеть, начав с самого простого примера. Вам наверняка известно, что когда ты только начинаешь учить новый язык, первой твоей программой будет Hello World. Это своего рода традиция. В мире машинного обучения тоже есть свой Hello world и это нейросеть решающая проблему исключающего или(XOR). Таблица исключающего или выглядит следующим образом:

a b c
0 0 0
0 1 1
1 0 1
1 1 0

Соответственно, нейронная сеть берет на вход два числа и должна на выходе дать другое число — ответ. Теперь о самих нейронных сетях.

Что такое нейрон?


Нейрон — это вычислительная единица, которая получает информацию, производит над ней простые вычисления и передает ее дальше. Они делятся на три основных типа: входной (синий), скрытый (красный) и выходной (зеленый). Также есть нейрон смещения и контекстный нейрон о которых мы поговорим в следующей статье. В том случае, когда нейросеть состоит из большого количества нейронов, вводят термин слоя. Соответственно, есть входной слой, который получает информацию, n скрытых слоев (обычно их не больше 3), которые ее обрабатывают и выходной слой, который выводит результат. У каждого из нейронов есть 2 основных параметра: входные данные (input data) и выходные данные (output data). В случае входного нейрона: input=output. В остальных, в поле input попадает суммарная информация всех нейронов с предыдущего слоя, после чего, она нормализуется, с помощью функции активации (пока что просто представим ее f(x)) и попадает в поле output.


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

Как работает нейронная сеть?


В данном примере изображена часть нейронной сети, где буквами I обозначены входные нейроны, буквой H — скрытый нейрон, а буквой w — веса. Из формулы видно, что входная информация — это сумма всех входных данных, умноженных на соответствующие им веса. Тогда дадим на вход 1 и 0. Пусть w1=0.4 и w2 = 0.7 Входные данные нейрона Н1 будут следующими: 1*0.4+0*0.7=0.4. Теперь когда у нас есть входные данные, мы можем получить выходные данные, подставив входное значение в функцию активации (подробнее о ней далее). Теперь, когда у нас есть выходные данные, мы передаем их дальше. И так, мы повторяем для всех слоев, пока не дойдем до выходного нейрона. Запустив такую сеть в первый раз мы увидим, что ответ далек от правильно, потому что сеть не натренирована. Чтобы улучшить результаты мы будем ее тренировать. Но прежде чем узнать как это делать, давайте введем несколько терминов и свойств нейронной сети.

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

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

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

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

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

Ошибка

Ошибка — это процентная величина, отражающая расхождение между ожидаемым и полученным ответами. Ошибка формируется каждую эпоху и должна идти на спад. Если этого не происходит, значит, вы что-то делаете не так. Ошибку можно вычислить разными путями, но мы рассмотрим лишь три основных способа: Mean Squared Error (далее MSE), Root MSE и Arctan. Здесь нет какого-либо ограничения на использование, как в функции активации, и вы вольны выбрать любой метод, который будет приносить вам наилучший результат. Стоит лишь учитывать, что каждый метод считает ошибки по разному. У Arctan, ошибка, почти всегда, будет больше, так как он работает по принципу: чем больше разница, тем больше ошибка. У Root MSE будет наименьшая ошибка, поэтому, чаще всего, используют MSE, которая сохраняет баланс в вычислении ошибки.
MSE

Root MSE

Arctan

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

НЕЙРО́ННЫЕ СЕ́ТИ

НЕЙРО́ННЫЕ СЕ́ТИ искусственные, многослойные высокопараллельные (т. е. с большим числом независимо параллельно работающих элементов) логические структуры, составленные из формальных нейронов. Начало теории нейронных сетей и нейрокомпьютеров положила работа американских нейрофизиологов У. Мак-Каллока и У. Питтса «Логическое исчисление идей, относящихся к нервной деятельности» (1943), в которой они предложили математическую модель биологического нейрона. Среди основополагающих работ следует выделить модель Д. Хэбба, который в 1949 г. предложил закон обучения, явившийся стартовой точкой для алгоритмов обучения искусственных нейронных сетей. На дальнейшее развитие теории нейронной сети существенное влияние оказала монография американского нейрофизиолога Ф. Розенблатта «Принципы нейродинамики», в которой он подробно описал схему перцептрона (устройства, моделирующего процесс восприятия информации человеческим мозгом). Его идеи получили развитие в научных работах многих авторов. В 1985–86 гг. теория нейронных сетей получила «технологический импульс», вызванный возможностью моделирования нейронных сетей на появившихся в то время доступных и высокопроизводительных персональных компьютерах. Теория нейронной сети продолжает достаточно активно развиваться в начале 21 века. По оценкам специалистов, в ближайшее время ожидается значительный технологический рост в области проектирования нейронных сетей и нейрокомпьютеров. За последние годы уже открыто немало новых возможностей нейронных сетей, а работы в данной области вносят существенный вклад в промышленность, науку и технологии, имеют большое экономическое значение.