Скрытые слои нейронной сети
Скрытые слои нейронной сети — это слои, которые не являются ни входными, ни выходными, а являются промежуточными шагами в вычислениях сети.
Общие сведения о нейронных сетях и их слоях
Нейронные сети сумели совершить революцию в сере распознавания образов, но по причине невозможности точно интерпретировать принцип действия, их не применяют в таких сферах, как медицина и оценка рисков. Необходимо обеспечить наглядность представления работы сети, которое представит её не в виде чёрного ящика, а хотя бы сделает «полупрозрачным».
Изучить функционирование глубоких нейронных сетей в общем случае считается нетривиальной задачей. Проще изучать глубокие нейронные сети, имеющие низкую размерность, а именно, сети, в которых имеется лишь небольшое количество нейронов в каждом слое. Для сетей с низкой размерностью можно формировать визуализацию, для того чтобы можно было понимать процессы поведения и обучения таких сетей. Такая перспектива позволяет получать более глубокое понимание о поведении нейронных сетей и наблюдать связь, объединяющую нейронные сети с областью математики, называемой топологией.
Перцептроны, которые состоят только из входных и выходных узлов и называются однослойными перцептронами, считаются не очень полезными, так как они не способны к аппроксимации сложных связей вход-выход, характеризующих многие типы реальных явлений. А точнее, однослойные перцептроны ограничиваются решением линейно разделимых задач. И здесь следует отметить, что даже такая основная функция, как логическое «исключающее ИЛИ» (XOR), не считается как линейно разделимая.
Прибавление скрытого слоя между входным и выходным слоями способно превратить перцептрон в универсальный аппроксиматор, а это значит, что он сможет захватывать и воспроизводить чрезвычайно сложные связи между входом и выходом. Присутствие скрытого слоя может сделать процесс обучения немного более сложным, так как весовые коэффициенты между входным и скрытым слоями косвенно могут влиять на конечную ошибку. Ошибка обозначает разницу между выходным значением нейросети и целевым значением, которое задано обучающей информацией.
Метод, который обычно используется для обучения многослойного перцептрона, именуется обратным распространением, то есть, конечная ошибка распространяется обратно в сторону входа нейросети так, что можно эффективно менять веса, которые не подключены непосредственно к выходному узлу. Операция обратного распространения считается расширяемой, то есть, та же самая процедура может позволить обучать веса, которые связаны с произвольным количеством скрытых слоев.
Скрытые слои нейронной сети
На рисунке ниже приведена диаграмма, обобщающая базовую структуру многослойного перцептрона.
Рисунок 1. Структура многослойного перцептрона. Автор24 — интернет-биржа студенческих работ
На вопрос, сколько скрытых слоев необходимо создать, не существует простого ответа. Тем не менее следует отметить, что перцептрон даже с одним скрытым слоем представляет собой достаточно мощную вычислительную систему. Когда не удаётся получить адекватные результаты с одним скрытым слоем, то следует вначале попробовать другие модификации, такие как, оптимизация скорости обучения, увеличение количества эпох обучения или расширение набора обучающих данных. А прибавление второго скрытого слоя может увеличить сложность кода и время вычислений.
Необходимо также не забывать, что перегруженная нейронная сеть является не просто напрасной тратой ресурсов процессора и усилий на формирование кода, а ещё она способна на самом деле нанести «положительный вред», то есть, сделать сеть более восприимчивой к переобучению (перетренированности). Супермощный перцептрон способен вести обработку обучающих данных таким образом, который в определённой степени является аналогом того, как люди иногда могут «перемудрить» над чем-нибудь.
Когда человек уделяет слишком много внимания деталям и прикладывает чрезмерные интеллектуальные усилия к проблеме, которая на самом деле может быть достаточно простой, он упускает «общую картину» и в результате получает решение, которое может оказаться далеко не оптимальным. Аналогично, перцептрон, обладающий избытком вычислительной мощности и недостаточным количеством обучающих данных, способен использовать слишком специфическое решение, вместо того чтобы найти обобщенное решение, которое сможет более эффективно классифицировать новые входные выборки.
Так, когда же всё-таки действительно необходимо несколько скрытых слоев? Здесь можно сослаться на опыт доктора Джеффа Хитона, который утверждал, что один скрытый слой позволяет нейронной сети осуществить аппроксимацию любой функции, включающей непрерывное преобразование из одного конечного пространства в другое. С двумя скрытыми уровнями нейросеть способна предоставить произвольную границу решения с произвольной точностью.
Определение оптимальной размерности для скрытого слоя требует опираться на метод проб и ошибок. Как было указано выше, через чур большое количество узлов является нежелательным, но их количество должно быть достаточным, для того чтобы нейросеть смогла уловить сложности связей между входом и выходом.
Метод проб и ошибок конечно хорош, но, тем не менее, необходимо иметь обоснованную отправную точку. Существуют следующие практические правила, позволяющие выбрать размерности скрытого слоя:
Введение в нейронные сети
Изначально искусственный интеллект (ИИ) считался далекой мечтой, технологией будущего, но это уже не так.
То, что когда-то было предметом исследования, теперь стремительно развивается в реальном мире. ИИ теперь можно найти в самых разных местах, включая ваше рабочее место, школу, банк, больницу и даже ваш телефон.
Это глаза беспилотных автомобилей, голоса Siri и Alexa, умы прогнозов погоды, руки роботизированной хирургии и многое другое.
искусственный интеллект (ИИ) становится обычным явлением в современной жизни. За последние несколько лет ИИ стал основным игроком в широком спектре ИТ-технологий.
Наконец, нейронная сеть используется ИИ для изучения новых вещей.
Итак, сегодня мы узнаем о нейронных сетях, о том, как они работают, их типах, приложениях и многом другом.
Что такое нейронная сеть?
In обучение с помощью машины, нейронная сеть представляет собой запрограммированную сеть искусственных нейронов. Он пытается имитировать человеческий мозг, имея многочисленные слои «нейронов», которые похожи на нейроны в нашем мозгу.
Первый слой нейронов будет принимать фотографии, видео, звук, текст и другие входные данные. Эти данные проходят через все уровни, при этом выходные данные одного уровня передаются другому. Это критично для самых сложных задач, таких как обработка естественного языка для машинного обучения.
Однако в других случаях предпочтительнее стремиться к сжатию системы для уменьшения размера модели при сохранении точности и эффективности. Обрезка нейронной сети — это метод сжатия, который включает удаление весов из обученной модели. Рассмотрим нейронную сеть искусственного интеллекта, обученную отличать людей от животных.
Картинка будет разделена на светлую и темную части первым слоем нейронов. Эти данные будут переданы в следующий слой, который определит, где находятся ребра.
Следующий слой попытается распознать формы, созданные комбинацией ребер. В соответствии с данными, на которых он был обучен, данные будут проходить через многочисленные слои аналогичным образом, чтобы определить, является ли представленное вами изображение человеком или животным.
Когда данные передаются в нейронную сеть, она начинает их обрабатывать. После этого данные обрабатываются по своим уровням для получения желаемого результата. Нейронная сеть — это машина, которая учится на структурированном вводе и отображает результаты. В нейронных сетях могут происходить три типа обучения:
- Контролируемое обучение — входные и выходные данные передаются алгоритмам с использованием помеченных данных. После того, как их научили анализировать данные, они прогнозируют предполагаемый результат.
- Неконтролируемое обучение — ИНС обучается без помощи человека. Размеченных данных нет, и выходные данные определяются шаблонами, найденными в выходных данных.
- Усиление обучения когда сеть учится на обратной связи, которую она получает.
Как работают нейронные сети?
Искусственные нейроны используются в нейронных сетях, которые представляют собой сложные системы. Искусственные нейроны, также известные как перцептроны, состоят из следующих компонентов:
- вход
- Вес
- Смещение
- Функция активации
- Результат
Слои нейронов, из которых состоят нейронные сети. Нейронная сеть состоит из трех слоев:
- Входной слой
- Скрытый слой
- Выходной слой
Данные в виде числового значения отправляются на входной слой. Скрытые слои сети — это те, которые выполняют больше всего вычислений. Выходной слой, последний, но не менее важный, прогнозирует результат. Нейроны доминируют друг над другом в нейронной сети. Нейроны используются для построения каждого слоя. Данные перенаправляются на скрытый слой после того, как их получит входной слой.
Веса применяются к каждому входу. В скрытых слоях нейронной сети вес — это значение, которое переводит входящие данные. Веса функционируют путем умножения входных данных на значение веса во входном слое.
Затем он запускает значение первого скрытого слоя. Входные данные преобразуются и передаются на другой уровень через скрытые слои. Выходной слой отвечает за генерацию конечного результата. Входные данные и веса перемножаются, и результат доставляется в нейроны скрытого слоя в виде суммы. Каждому нейрону дается смещение. Чтобы вычислить сумму, каждый нейрон суммирует полученные им входные данные.
После этого значение проходит через функцию активации. Результат функции активации определяет, активирован ли нейрон. Когда нейрон активен, он отправляет информацию другим слоям. С помощью этого метода данные создаются в сети до тех пор, пока нейрон не достигнет выходного слоя. Прямое распространение — еще один термин для этого.
Метод подачи данных во входной узел и получения выходных данных через выходной узел известен как распространение с прямой связью. Когда входные данные принимаются скрытым слоем, происходит прямое распространение. Он обрабатывается по функции активации и затем передается на выход.
Результат прогнозируется нейроном в выходном слое с наибольшей вероятностью. Обратное распространение происходит, когда вывод неверен. Веса инициализируются для каждого входа при создании нейронной сети. Обратное распространение — это процесс корректировки весов каждого входа, чтобы уменьшить количество ошибок и обеспечить более точный результат.
Типы нейронной сети
1. Персептрон
Модель персептрона Мински-Пейперта — одна из самых простых и старых моделей нейронов. Это наименьшая единица нейронной сети, которая выполняет определенные вычисления для обнаружения характеристик или бизнес-аналитики во входящих данных. Он принимает взвешенные входные данные и применяет функцию активации для получения окончательного результата. TLU (пороговая логическая единица) — другое название персептрона.
Perceptron — это бинарный классификатор, представляющий собой обучаемую систему с учителем, которая делит данные на две группы. Логические ворота такие как AND, OR и NAND, могут быть реализованы с помощью персептронов.
2. Нейронная сеть с прямой связью
Самая базовая версия нейронных сетей, в которой входные данные поступают исключительно в одном направлении, проходят через искусственные нейронные узлы и выходят через выходные узлы. Входные и выходные слои присутствуют в местах, где могут присутствовать или не присутствовать скрытые слои. На основании этого их можно охарактеризовать как однослойную или многослойную нейронную сеть с прямой связью.
Количество используемых слоев определяется сложностью функции. Он распространяется только вперед в одном направлении и не распространяется назад. Здесь веса остаются постоянными. Входные данные умножаются на веса для подачи функции активации. Для этого используется функция активации классификации или функция активации шага.
3. Многослойный персептрон
Введение в сложные нейронные сети, в котором входные данные направляются через множество слоев искусственных нейронов. Это полностью связанная нейронная сеть, поскольку каждый узел связан со всеми нейронами следующего слоя. Во входном и выходном слоях присутствует несколько скрытых слоев, т.е. по меньшей мере три или более слоев.
Он обладает двунаправленным распространением, что означает, что он может распространяться как вперед, так и назад. Входные данные умножаются на веса и отправляются в функцию активации, где они изменяются с помощью обратного распространения, чтобы минимизировать потери.
Проще говоря, веса — это машинные значения из нейронных сетей. В зависимости от несоответствия между ожидаемыми результатами и входными данными обучения они саморегулируются. Softmax используется в качестве функции активации выходного слоя после нелинейных функций активации.
4. Сверточная нейронная сеть
В отличие от традиционного двумерного массива, сверточная нейронная сеть имеет трехмерную конфигурацию нейронов. Первый слой известен как сверточный слой. Каждый нейрон в сверточном слое обрабатывает информацию только из ограниченной части поля зрения. Подобно фильтру, входные объекты берутся в пакетном режиме.
Сеть понимает изображения по частям и может выполнять эти действия множество раз, чтобы закончить всю обработку изображения.
Во время обработки изображение преобразуется из RGB или HSI в оттенки серого. Дальнейшие изменения значения пикселя помогут в обнаружении краев, а изображения можно сортировать по нескольким группам. Однонаправленное распространение происходит, когда CNN содержит один или несколько сверточных слоев, за которыми следует объединение, а двунаправленное распространение происходит, когда выходные данные слоя свертки отправляются в полностью подключенную нейронную сеть для классификации изображений.
Для извлечения определенных элементов изображения используются фильтры. В MLP входы взвешиваются и передаются в функцию активации. RELU используется в свертке, в то время как MLP использует нелинейную функцию активации, за которой следует softmax. В распознавании изображений и видео, семантическом анализе и обнаружении парафраз сверточные нейронные сети дают отличные результаты.
5. Сеть радиального смещения
За входным вектором следует слой нейронов RBF и выходной слой с одним узлом для каждой категории в сети радиальных базовых функций. Вход классифицируется путем сравнения его с точками данных из обучающего набора, где каждый нейрон поддерживает прототип. Это один из примеров обучающего набора.
Каждый нейрон вычисляет евклидово расстояние между входом и его прототипом, когда необходимо классифицировать новый входной вектор [n-мерный вектор, который вы пытаетесь классифицировать]. Если у нас есть два класса, класс A и класс B, новые входные данные, подлежащие категоризации, больше похожи на прототипы класса A, чем на прототипы класса B.
В результате он может быть помечен или отнесен к классу А.
6. Рекуррентная нейронная сеть
Рекуррентные нейронные сети предназначены для сохранения выходных данных слоя, а затем передачи их обратно во входные данные, чтобы помочь спрогнозировать результат слоя. прямая связь нейронной сети обычно это начальный слой, за которым следует слой рекуррентной нейронной сети, где функция памяти запоминает часть информации, которая была у нее на предыдущем временном шаге.
В этом сценарии используется прямое распространение. Он сохраняет данные, которые понадобятся в будущем. В случае, если прогноз неверен, скорость обучения используется для внесения незначительных корректировок. В результате, по мере развития обратного распространения, оно будет становиться все более точным.
Приложения
Нейронные сети используются для решения проблем с данными в различных дисциплинах; некоторые примеры показаны ниже.
- Распознавание лиц. Решения по распознаванию лиц служат эффективными системами наблюдения. Системы распознавания связывают цифровые фотографии с человеческими лицами. Они используются в офисах для выборочного входа. Таким образом, системы верифицируют человеческое лицо и сравнивают его со списком идентификаторов, хранящихся в его базе данных.
- Прогноз акций. Инвестиции подвержены рыночным рискам. Практически трудно предвидеть будущее развитие крайне нестабильного фондового рынка. До появления нейронных сетей постоянно меняющиеся бычья и медвежья фазы были непредсказуемы. Но что все изменило? Конечно, мы говорим о нейронных сетях… Многослойный персептрон MLP (разновидность системы искусственного интеллекта с прямой связью) используется для создания успешного прогноза запасов в режиме реального времени.
- Соцсети – Как бы банально это ни звучало, социальные сети изменили приземленный путь существования. Поведение пользователей социальных сетей изучается с помощью искусственных нейронных сетей. Для конкурентного анализа данные, ежедневно поступающие через виртуальные взаимодействия, собираются и анализируются. Действия пользователей социальных сетей копируются нейронными сетями. Поведение людей может быть связано с моделями расходов людей после анализа данных через социальные сети. Данные из приложений социальных сетей добываются с помощью многослойного персептрона ANN.
- Здравоохранение. В современном мире люди используют преимущества технологий в сфере здравоохранения. В сфере здравоохранения сверточные нейронные сети используются для обнаружения рентгеновских лучей, компьютерной томографии и ультразвука. Данные медицинских изображений, полученные в результате вышеупомянутых тестов, оцениваются и оцениваются с использованием моделей нейронных сетей, поскольку CNN используется при обработке изображений. При разработке систем распознавания голоса также используется рекуррентная нейронная сеть (РНС).
- Отчет о погоде. До внедрения искусственного интеллекта прогнозы метеорологического отдела никогда не были точными. Прогнозирование погоды делается в основном для того, чтобы предсказать погодные условия, которые произойдут в будущем. Прогнозы погоды используются для прогнозирования вероятности стихийных бедствий в современный период. Прогнозирование погоды выполняется с использованием многослойного персептрона (MLP), сверточных нейронных сетей (CNN) и рекуррентных нейронных сетей (RNN).
- Защита. В логистике, анализе вооруженных нападений и определении местонахождения предметов используются нейронные сети. Они также используются для воздушного и морского патрулирования, а также для управления автономными дронами. Искусственный интеллект дает оборонной промышленности столь необходимый импульс для масштабирования своих технологий. Для обнаружения наличия подводных мин используются сверточные нейронные сети (CNN).
Преимущества
- Даже если несколько нейронов в нейронной сети не работают должным образом, нейронные сети все равно будут генерировать выходные данные.
- Нейронные сети способны обучаться в режиме реального времени и адаптироваться к изменяющимся настройкам.
- Нейронные сети могут научиться выполнять множество задач. Обеспечить правильный результат на основе предоставленных данных.
- Нейронные сети обладают силой и способностью обрабатывать несколько задач одновременно.
Недостатки бонуса без депозита
- Нейронные сети используются для решения задач. Он не раскрывает объяснение того, «почему и как» он вынес свои суждения из-за сложности сетей. В результате доверие к сети может быть подорвано.
- Компоненты нейронной сети взаимозависимы друг от друга. Другими словами, нейронные сети требуют (или очень зависят от них) компьютеров с достаточной вычислительной мощностью.
- Процесс нейронной сети не имеет определенного правила (или эмпирического правила). В методе проб и ошибок правильная структура сети устанавливается путем поиска оптимальной сети. Это процедура, требующая тонкой настройки.
Заключение
Поле нейронные сети быстро расширяется. Крайне важно изучить и понять концепции в этом секторе, чтобы иметь возможность иметь дело с ними.
В этой статье были рассмотрены многие типы нейронных сетей. Вы можете использовать нейронные сети для решения проблем с данными в других областях, если вы узнаете больше об этой дисциплине.
Нейросети — это просто
Все большие аспекты нашей жизнедеятельности охватывает искусственный интеллект. Все чаще новостные ленты пестрят сообщениями «нейросеть научили . » И каждый раз, когда речь заходит об искусственном интеллекте, мы рисуем в своей голове какие-то фантастические образы. Кажется, что это что-то сложное, сверхъестественное и необъяснимое. И создание такого чуда под силу только большой группе ученных мужей. И конечно, мы можем только восхищаться, при этом никогда не сможем повторить нечто даже приближенное на своем домашнем ПК. Но поверьте: «не так страшен черт, как его малюют». Давайте попробуем разобраться, что же представляют из себя нейронные сети, и как можно их применить в нашей торговле.
1. Принципы построения искусственных нейронных сетей
В Википедии дано такое определение нейросети:
«Иску́сственная нейро́нная се́ть — математическая модель, а также её программное или аппаратное воплощение, построенная по принципу организации и функционирования биологических нейронных сетей — сетей нервных клеток живого организма.»
Т.е. искусственная нейронная сеть — это некая сущность, состоящая из массива искусственных нейронов с организованной взаимосвязью между ними. При этом организация взаимосвязей между нейронами создана по образу и подобию процессов в мозгу живого организма.
На рисунке ниже представлена схема простой нейронной сети. На ней кружочками обозначены нейроны, а линиями показаны связи между нейронами. Как видно на рисунке, нейроны расположены слоями, которые делят на 3 группы. Синим цветом обозначен слой входных нейронов на которые подается исходная информация. Зеленым и красным обозначены выходные нейроны, которые выдают результат работы нейронной сети. Между ними расположены серые нейроны, образующие, так называемый скрытый слой.
Несмотря на различие слоев, вся нейронная сеть построена из одинаковых нейронов, имеющих несколько элементов для входных сигналов и только один для выдачи результата. Внутри нейрона организована обработка поступившей информации с выдачей простого логического результата. К примеру, «Да» или «Нет». Применительно к теме торговли это может быть сигнал на сделку или указывать ее направление.
Исходная информация попадает на слой входных нейронов, обрабатывается и результат работы нейронов служит исходной информацией для нейронов последующего слоя. Операции повторяются от одного слоя к другому, пока не будет достигнут слой выходных нейронов. Таким образом, исходная информация обрабатывается и фильтруется от слоя к слою и на выходе нейронная сеть выдает некий результат.
В зависимости от сложности решаемых задач и создаваемых моделей количество нейронов в каждом слое может варьироваться. А также возможны вариации нейронных сетей с несколькими скрытыми слоями. Все это делает нейронную сеть более сложной, что позволяет решать более сложные задачи. Но в тоже время и требует больших вычислительных ресурсов.
Поэтому при создании своей модели нейронной сети нам нужно четко понимать какую информацию и в каком объеме мы будем обрабатывать, а также, что мы хотим получить в результате. От этого зависит количество необходимых нейронов в слоях модели.
Если мы хотим подать на вход нейронной сети некий массив данных из 10 элементов, то входной слой сети должен содержать 10 нейронов. Это позволит принять весь массив данных. Избыточные входные нейроны будут лишь балластом.
Количество выходных нейронов определяется ожидаемым результатом. Для получения однозначного логического результата достаточно одного выходного нейрона. Если требуется получить ответ на несколько вопросов, то необходимо создать по одному нейрону на каждый вопрос.
Скрытые слои нейронной сети являются неким аналитическим центром, который обрабатывает и анализирует полученную информацию. Следовательно, количество нейронов в слое зависит от вариативности данных предыдущего слоя, т.е. каждый нейрон предполагает некую гипотезу развития событий.
Количество скрытых слоев определяется причинно-следственной связью между исходными данными и ожидаемым результатом. К примеру, если мы строим нашу модель применительно к технике «5 почему», то логично использовать 4 скрытых слоя, которые в сумме с выходным слоем дадут возможность поставить 5 вопросов к исходным данным.
- нейронная сеть строится из одинаковых нейронов, следовательно, для построения модели нам достаточно создать один класс нейронов;
- нейроны в модели организованы слоями;
- поток информации в нейронной сети организован в виде последовательной передачи данных через все слои модели от входных нейронов к выходным;
- количество входных нейронов обусловлено объемом анализируемой информации за один проход, а количество выходных нейронов — объемом результирующих данных;
- т.к. на выходе нейрона формируется некий логический результат, то и вопросы поставленные перед нейронной сетью должны предполагать однозначный ответ.
2. Как устроен искусственный нейрон
Получив представление о структуре нейронной сети, давайте рассмотрим построение модели искусственного нейрона. Ведь именно в его недрах осуществляются математические вычисления и принимается решения. И тут возникает вопрос: каким образом реализовать множество различных решений из одних исходных данных используя одну математическую формулу. Решение было найдено в изменении связей между нейронами. Для каждой связи определяется некий весовой коэффициент, который определяет влияние данного входного значения на результат принимаемого решения.
Математическая модель нейрона состоит из двух функций. Вначале суммируются произведения входных данных на их весовые коэффициенты.
А затем на основании полученного значения вычисляется результирующее значение в, так называемой, функции активации. На практике применяются различные варианты функции активации, но наибольшее распространение получили такие функции:
- Сигмовидная функция — диапазон возвращаемых значений от «0» до «1»
- Гиперболический тангенс — диапазон возвращаемых значений от «-1» до «1»
Выбор функции активации зависит от решаемых задач. Так, если в результате обработки исходных данных ожидаем получить логический ответ, то предпочтение отдается сигмовидной функции. В реалиях трейдинга, я предпочитаю использовать гиперболический тангенс. Где значение «-1» соответствует сигналу на продажу, а значение «1» — сигналу на покупку. Результат между пороговыми значениями говорит о некой неопределенности.
3. Обучение сети
Как выше было сказано, вариативность результатов каждого нейрона и нейронной сети в целом зависит от подобранных весовых коэффициентов для связей между нейронами. Решение задачи подбора правильных весовых коэффициентов называется обучением нейронной сети.
Для обучения нейронной сети существуют различные алгоритмы и методы:
- Обучение с учителем;
- Обучение без учителя;
- Обучение с подкреплением.
Метод обучения определяется от наличия исходных данных и поставленных перед нейронной сетью задач.
Обучение с учителем используется при наличии достаточного набора исходных данных с соответствующими правильными ответами на поставленные вопросы. В процессе обучения на вход нейронной сети подаются исходные данные и полученный на выходе сети результат сверяется с заведомо известным правильным ответом. После чего корректируются веса в сторону снижения ошибки.
Обучение без учителя применяется при наличии массива исходных данных и отсутствии правильных ответов на поставленные вопросы. При таком обучении нейронная сеть ищет схожие наборы данных и позволяет разделить исходные данные на схожие группы.
Обучение с подкреплением применяется когда нет правильных ответов, но есть понимание того, что должны получить в итоге. В ходе обучения на вход нейросети подаются исходные данные и сеть пытается решить задачу. После проверки результата дается обратная связь сети в виде определенной награды. В процессе обучения нейронная сеть стремиться к максимальной награде.
В данной статье мы будем использовать обучение с учителем. В качестве примера я выбрал метод обратного распространения ошибки. Такой подход позволяет организовать постоянное обучение нейронной сети в режиме реального времени.
В основе данного метода лежит использование выходной ошибки нейронной сети для коррекции ее весов. Сам алгоритм обучения состоит из двух этапов. Вначале на основании входных данных рассчитывается результирующее значение нейронной сети, которое сравнивается с эталонным и вычисляется ошибка. Далее осуществляется обратный проход с распространением ошибки от выхода сети к ее входам с коррекцией всех весовых коэффициентов. Данный подход итеративный и обучение сети осуществляется пошагово, что позволяет после обучения на исторических данных перейти к обучению сети в режиме online.
Метод обратного распространения ошибки использует стохастический градиентный спуск, что позволяет достичь приемлемого минимума ошибки. А благодаря возможности обучения нейронной сети online, поддерживать этот минимум на длительном временном интервале.
4. Строим свою нейронную сеть средствами MQL
После осмысления теории работы нейронных сетей можно перейти к практической части статьи. Чтобы лучше показать алгоритм работы НС, я предлагаю сделать пример полностью средствами языка MQL5 без использования сторонних библиотек. И начнем мы работу с создания классов для хранения данных об элементарных связях между нейронами.
4.1. Связи
Вначале создадим класс СConnection для хранения весового коэффициента одной связи. И создадим его наследником класса CObject. Данный класс будет содержать две переменные типа double: weight для хранения непосредственно значения весового коэффициента и deltaWeight, в которой будем хранить величину последнего изменения весового коэффициента (используется при обучении). Чтобы не использовать дополнительные методы для работы с переменными сделаем их публичными. Начальное значение переменных будет задаваться в конструкторе класса.
Также, для возможности последующего сохранения информации о связях создадим методы сохранения данных в файл Save и последующего чтения Load. Данные методы построены по классической схеме с получением хендла файла в параметрах метода, проверяем его состоятельность и записываем данные (или считываем в методе Load).
Следующим шагом создадим массив для хранения весов CArrayCon на базе класса CArrayObj. Здесь мы переопределим два виртуальных метода CreateElement и Type. Первый будет использоваться для создания нового элемента, а второй будет идентифицировать наш класс.
В параметрах метода создания нового элемента CreateElement будем передавать индекс создаваемого элемента. В самом методе проверим его действительность, проверим размер массива хранения данных и изменим его при необходимости. А затем создадим новый экземпляр класса СConnection, задав начальный вес случайной величиной.
4.2. Нейрон
Следующим шагом создадим искусственный нейрон. Как я уже писал выше, в качестве функции активации для своего нейрона я использую гиперболический тангенс. Диапазон результирующих значений данной функции лежит от «-1» до «1». Значение «-1» дает сигнал на продажу, а «1» — на покупку.
Класс искусственного нейрона CNeuron, также как и предыдущий элемент СConnection, создадим наследником класса CObject, но его структура будет немного сложнее.
В параметрах конструктора класса передадим количество исходящих связей нейрона и его порядковый номер в слое (потребуется для последующей идентификации нейрона). В теле метода зададим константы, сохраним полученные данные и создадим массив исходящих связей.
Методы setOutputVal и getOutputVal служат для обращения к результирующему значению нейрона. Непосредственный расчет результирующего значения нейрона осуществляется в методе feedForward. В параметрах данный метод получает предшествующий слой нейронов.
В теле метода организован цикл по перебору всех нейронов предыдущего слоя и суммирования произведения результирующих значений нейронов с весовыми коэффициентами. После расчета суммы вычисляется результирующее значение нейрона в методе activationFunction (функция активации нейрона вынесена в отдельный метод).
Следующий блок методов используется при обучении нейронной сети. Вначале создадим метод вычисления производной для функции активации activationFunctionDerivative. Это необходимо чтобы определить какое требуется изменение суммирующей функции для компенсации ошибки результирующего значения нейрона.
Далее создаем два метода расчета градиента для корректировки весовых коэффициентов. Необходимость создания 2-х методов обусловлена различием в расчете ошибки результирующего значения для нейронов выходного слоя и скрытых слоев. Для выходного слоя ошибка рассчитывается как разница результирующего и эталонного значения, в то время как для нейронов скрытых слоев ошибка рассчитывается как сумма градиентов всех нейронов последующего слоя взвешенных на весовые коэффициенты связей между нейронами. Данный расчет вынесен в отдельный метод sumDOW.
Затем градиент определяется как произведение ошибки на производную от функции активации.
Рассмотрим детальнее метод определения ошибки нейрона скрытого слоя sumDOW. В параметрах данные метод получает указатель на последующий слой нейронов. В теле метода сначала обнуляем итоговую переменную sum, затем организуем цикл по перебору всех нейронов последующего слоя и просуммируем произведение градиентов нейронов на весовой коэффициент связи с ним.
После проведенной выше подготовительной работы осталось создать метод пересчета весовых коэффициентов updateInputWeights. В моей модели нейрон хранит исходящие весовые коэффициенты, поэтому метод обновления весовых коэффициентов получает в параметрах предшествующий слой нейронов.
В теле метода создан цикл по перебору всех нейронов предыдущего слоя с корректировкой их весовых коэффициентов влияния именно на текущий нейрон.
Хочу обратить внимание, что корректировка весов осуществляется с применением двух коэффициентов eta (притупляет реакцию на текущее отклонение) и alpha (коэффициент инертности). Подобный подход помогает в некоторой мере усреднить влияние ряда последующих итераций обучения и отсеять шумовые данные.
4.3. Нейронная сеть
После создания искусственного нейрона нам предстоит объединить созданные объекты в единую сущность — нейронную сеть. Мы должны понимать, что создаваемые объекты должны быть гибкими и позволять создавать нейронные сети различных конфигураций. Это позволит нам воспользоваться плодами наших трудов для решения различных задач.
Как уже писалось выше, нейронная сеть состоит из слоев нейронов. Следовательно, первое, что мы сделаем, это объединим нейроны в слой. Для этого создадим класс CLayer, унаследовав основные методы от класса CArrayObj.
В параметрах метода инициализации класса CLayer зададим количество элементов последующего слоя. А также мы перепишем два виртуальных метода CreateElement (создание нового нейрона слоя) и Type (метод идентификации объекта).
При создании нового нейрона укажем его порядковый номер в параметрах метода. В теле метода сначала проверим действительность полученного индекса. Затем проверим размер массива для хранения указателей на экземпляры объектов нейрона, при необходимости увеличим размер массива. Далее создадим новый нейрон. При успешном создании нового экземпляра нейрона, зададим его начальное значение и изменим количество объектов в массиве и выходим из метода с результатом true.
Аналогичным подходом создадим класс CArrayLayer для хранения указателей на слои нашей сети.
Отличие от предыдущего класса можно увидеть в специфике метода создания нового элемента массива CreateElement. В параметры этого метода передадим количество нейронов в создаваемом и последующем слоях. В теле метода поверим количество нейронов в создаваемом слое. При отсутствии нейронов в создаваемом слое, выходим из метода с значением false. Далее проверяем необходимость изменения размера массива для хранения указателей. И затем переходим непосредственно к созданию экземпляров объектов: создаем новый слой и организовываем цикл по созданию нейронов. На каждом шаге проверяем созданный объект. При появлении ошибки выходим из метода с значением false. После создания всех элементов сохраняем в массиве указатель на созданный слой и выходим из метода с результатом true.
Создание отдельных классов для слоя и массива слоев позволяет нам создавать нейронные сети различной конфигурации без изменения самих классов. Мы получили довольно гибкую сущность, позволяющая извне задавать количество слоев и нейронов в каждом слое.
И наконец переходим к созданию класса нашей нейронной сети CNet.
Благодаря проделанной выше работе сам класс нейронной сети содержит минимум переменных и методов. В представленном коде только две статические переменные для расчета и хранения средней ошибки (recentAverageSmoothingFactor и recentAverageError) и указатель на массив слоев нашей нейронной сети layers.
Давайте подробнее остановимся на методах данного класса. В параметрах конструктора класса передается указатель на массив данных типа int. Количество элементов в массиве указывает на количество слоев в создаваемой нейронной сети, а каждый элемент массива содержит количество нейронов в соответствующем слое. Таким образом, мы делаем наш класс универсальным для создания практически любой сложности нейронной сети.
В теле метода проверяем действительность переданного указателя и организовываем цикл по созданию слоев нейронной сети. Надо сказать, что для выходного слоя нейронов указывается нулевое количество выходных связей.
Метод feedForward предназначен для расчета значения нейронной сети. В параметрах метод получает массив входных значений, на основании которых будут рассчитываться результирующие значения нейронной сети.
В теле метода проверим действительность полученного указателя и нулевого слоя нашей сети. Затем полученные исходные данные зададим в качестве результирующих значений нейронов нулевого слоя и организуем двойной цикл с поэтапным пересчетом результирующих значений нейронов по всей нейронной сети от первого скрытого слоя до выходных нейронов.
Для получения самого результата предназначен метод getResults, в котором организован цикл по сбору результирующих значений с нейронов выходного слоя.
Процесс обучения нейронной сети построен в методе backProp. В параметрах метод получает массив эталонных значений. В теле метода проверяем действительность полученного массива и считаем среднеквадратичную ошибку результирующего слоя. Затем в цикле пересчитываем градиенты нейронов во всех слоях. После чего в последнем цикле метода актуализируем весовые коэффициенты связей между нейронами на основании рассчитанных ранее градиентов.
Чтобы не переобучать нашу нейронную сеть при перезапуске программы, создадим методы сохранения данных в локальный файл Save и последующей загрузки данных из файла Load.
Более подробно с кодом всех методов класса можно ознакомиться во вложении.
Заключение
В данной статье я попытался рассказать и показать как можно создать нейронную сеть для своих нужд в домашних условиях. Конечно, это лишь вершина айсберга. И в статье рассмотрен лишь один из возможных вариантов — перцептрон, предложенный Фрэнком Розенблаттом в далеком 1957 году. С тех пор прошло уже более 60 лет и появились другие модели. Но данная модель по прежнему жизнеспособна и дает неплохие результаты, в чем каждый может удостовериться на собственном опыте. Для желающих более глубоко погрузиться в тему искусственного интеллекта я посоветую обратиться к соответствующей литературе, т.к. полностью раскрыть труды ученых мужей не возможно даже в серии статей.
Искусственные нейронные сети. Часть 2
В этой части мы изучим принципы работы нейронных сетей и напишем нейронную сеть из 2 слоев.
Нейронные сети состоят из связанных между собой нейронов.
Подробнее о нейронах я писал в предыдущей части.
Нейронные сети делятся на слои:
Скрытые слои это слои между входным и выходным, количество скрытых слоев может быть любым.
Мы напишем нейронную сеть из 2 слоев, входного и выходного слоев.
Вначале разберем принципы работы нейронных сетей.
Как я уже говорил нейронные сети делятся на слои. В каждом слое некоторое количество нейронов. Выходы всех нейронов в слое, отправляются на входы всех нейронов следующего слоя.
Схема нейронной сети из 3 слоев с 2 нейронами на входе, 3 скрытыми, 1 выходным будет выглядеть так
Такая связь между слоями называется, прямой связью.
В итоге у нас получилось 3 слоя и 6 нейронов.
Для больших проектов это немного, но так как мы только учимся, мы напишем нейронную сеть из 2 слоев с 2 входными нейронами и 1 выходным.
Схема для нашей нейронной сети
Создадим файл NeuronNet.py
Подключим класс нейрона который писали в прошлой части:
Опишем в файле класс NeuronNet и конструктор для него:
В конструкторе класса создается массив из объектов класса Neuron размером в 3 нейрона. Нейрону передаем в параметры число 2, так как входов для всех нейронов будет по 2.
Для работы нейронной сети нам надо запустить функцию активации нейронов, запустить функцию активации 3 нейрона и передать ему выходы из 1 и 2 нейрона, на вход 1 и 2 нейрону передаем входные данные полученные от пользователя:
В итоге у нас получился класс NeuronNet. Который мы записали в файл NeuronNet.py.
Полное содержание NeuronNet.py:
Теперь создадим файл main.py, чтобы проверить работоспособность нашей нейронной сети.
Подключим к файлу main.py библиотеку numpy и наш файл NeuronNet.py:
Создадим объект нейронной сети:
Объявим массив с входными данными и передадим его в нейронную сеть:
Полное содержание файла:
Теперь запустим наш код. Введем в консоль:
Запустим еще раз
Наша программа будет выдавать каждый раз новый результат так как веса и смещения нейронов генерируются случайно. Это исправится когда мы начнем обучать нашу нейронную сеть.