Нейронные сети - теория и приложения.
Содержание
Искуственные нейронные сети
Нейронная сеть это вычислительная модель, созданная на основании исследований работы нервной системы человека как попытка создания искуственного интелекта. Разумеется это лишь упрощенная модель, которая не отражает всей сложности процессов происходящих в мозгу человека, однако она нашла применение в областях, где традиционные методы расчета не применимы.В основном это решение задач, сформулировать которые математически крайне сложно, а зачастую и невозможно. Искуственные нейронные сети применяются для:
- Распознование образов
Символов,звуков,анализ изображений. Сеть обучается набором известных образов, а затем может самостоятельно классифицировать до этого не известные ей образы.
- Управление
Создание так называемых мастер-систем, способных принимать решение подобно человеку, управлять техникой даже в случае поломок. Мастер-системы характеризуются значительной адаптивностью. Как правило на вход подаются данные о состоянии системы (Например ориентация самолета в пространстве, его скорости,параметры среды и желаемое направление полета),а на выходе сеть сообщает управление,которое необходимо применить к систем, с целью минимизации функции оценки(например расхождение текущего курса с желаемым).
- Составление прогнозов
Например на котировки акций, сеть обучается по архивам биржи,а затем строит предположение о развитии ситуации на рынке.
- Ассоциативная память
Сети способны запоминать информацию подобно человеческому мозгу, что способствует эффективному сжатию
Структура сети
Сеть состоит из элементов называемых нейронами, соединенных связями, причем каждая связь характеризуется весом. Вес - это коэффициент на который умножается сигнал при прохождении через связь. Нейроны объединяются в слои, нейронная сеть обязательно имеет входной и выходной слои. Количество внутренних или скрытых слоев может быть произвольным, однако по мере увеличения их количества усиливается память сети, что негативно влияет на обучение. Поэтому обычно используются сети с меньшим количеством слоев, но с большим количеством нейронов в каждом.
Активация нейронов
Каждый нейрон представляет из себя некоторую функцию,ее называют функцией активации. В зависимости от предназначения сети испольуются различные типы :
- Бинарные
В зависимости от значения поступившего на вход, нейрон возвращает либо 0 либо 1. Чаще всего используется Функция Хевисайда
- Линейные
- Нелинейные
Нелинейные функции акивации позволяют добиваться результатов меньшим числом нейронов. Наиболее используемой является сигмоидная функция.
Обучение
Для обучения применяется алгоритм обратного распространения ошибки. У сети есть множество входов
, Обозначим через вес, стоящий на ребре, соединяющем i-й и j-й узлы, а через — выход i-го узла. Если нам известен обучающий пример (правильные ответы сети ), то функция ошибки, полученная по методу наименьших квадратов, выглядит так:
На каждом шаге будем добавлять к весу.
- ,
где
-- множитель, задающий скорость "движения".
Алгоритм
При программировании алгоритм выглядит следующим образом:
- Для всех d от 1 до m:
- Подать на вход сети и подсчитать выходы каждого узла.
- Для всех
- .
- Для каждого уровня l, начиная с предпоследнего:
- Для каждого узла j уровня l вычислить
- .
- Для каждого ребра сети {i, j}
- .
- .
- Выдать значения .
где
- коэффициент инерциальнности для сглаживания резких скачков при перемещении по поверхности целевой функцииИспользование
На практике, удобнее разрабатывать алгоритмы в пакете Matlab, где для работы с нейронным сетями есть Neural Network Toolbox. Его средствами можно построить сеть и обучить ее на наборе данных. Для удобства пользователя предусмотрен GUI который запускается командой >>nnstart
Кроме того, можно использовать инструменты NNToolbox прямо в коде
inputs = [1:1:100]; targets =[2:2:200]; Создание сети и задание количества нейронов в скрытом слое hiddenLayerSize = 1; net = fitnet(hiddenLayerSize); Деление данных на набор для обучения,валидации и тестирования. net.divideParam.trainRatio = 80/100; net.divideParam.valRatio = 20/100; net.divideParam.testRatio = 0/100; Обучение сети [net,tr] = train(net,inputs,targets); Тестирование outputs = net(inputs); errors = gsubtract(targets,outputs); performance = perform(net,targets,outputs)