Главная       Скачать       Коммерческая поддержка       FAQ       Forum       О нас       Английская версия

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

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

Содержание

    1 Нейронные сети в ALGLIB
    2 Работа с нейронными сетями
    3 Доступные архитектуры
    4 Обучение
    5 Кросс-валидация
    6 Формат обучающего множества
    7 Предобработка данных
    8 Manual entries

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

В основу реализации нейронных сетей в ALGLIB положены два принципа: 1) отношение к нейронным сетям, как к всего лишь одному из алгоритмов классификации/регрессии, и 2) разумная простота средств для работы с нейронными сетями. В соответствии с первым принципом в ALGLIB нет "специального нейросетевого раздела", нейронные сети занимают свое место среди других алгоритмов схожей функциональности и представлены в ALGLIB на общих основаниях. Второй принцип требует более подробного обсуждения.

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

Работа с нейронными сетями

Нейронная сеть в ALGLIB представлена структурой MultiLayerPerceptron. Хотя эта структура имеет открытые поля, для работы с ней следует использовать исключительно подпрограммы ALGLIB, не обращаясь к полям напрямую. Работа с нейронными сетями осуществляется в такой последовательности:

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

Доступные архитектуры

Пакет ALGLIB позволяет создавать нейронные сети без скрытых слоев, с одним скрытым слоем и с двумя скрытыми слоями. Соединения идут от входного слоя к первому из скрытых (если он есть), затем ко второму, затем - к выходному. "Короткие" соединения от входного слоя к выходному отсутствуют. Скрытые слои имеют одну из стандартных сжимающих функций активации, однако для выходного слоя нейронной сети возможно большее разнообразие. Выходной слой может быть линейным (такие сети используются в задачах аппроксимации), может иметь сжимающую функцию активации (в случае, если выходы сети ограничены определенным диапазоном). Также доступны сети с ограниченной сверху (или снизу) функцией активации. В простейшем случае (граница - ноль) эта функция стремится к x при x стремящемся к +∞, и экспоненциально стремится к нулю при x стремящемся к -∞.

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

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

Обучение

Для обучения нейронной сети пользователь может использовать три алгоритма. Первый из них - L-BFGS алгоритм (limited memory BFGS), квази-Ньютоновский метод с трудоемкостью итерации, линейной по количеству весовых коэффициентов WCount и размеру обучающего множества NPoints, и умеренными требованиями к дополнительной памяти - O(WCount). Этот алгоритм идеально подходит для решения задач высокой размерности, и неплохо ведет себя на задачах средней и малой размерности. Критериями останова служат малая величина шага (менее передаваемого в подпрограмму значения WStep) или превышение заданного числа итераций алгоритма (параметра MaxIts).

Замечание #1
В качестве WStep имеет смысл выбрать число порядка 0.01. Иногда, если задача очень трудна, можно понизить его до 0.0001, но обычно хватает и 0.01.

Замечание #2
Во многих нейросетевых пакетах критерием останова служит достаточно малое значение функции ошибки. Проблема в том, что если вы решаете не учебную, а реальную задачу, то вы не знаете заранее, насколько хорошо она может быть решена. Некоторые задачи можно решить с высокой точностью, а для некоторых ошибка классификации в 26% считается хорошим результатом. Поэтому бессмысленно указывать в качестве критерия останова какую-то "достаточно малую ошибку". ДО того, как вы решите задачу, вы не знаете, какое значение надо указать - а ПОСЛЕ решения задачи вам уже не нужно указывать критерий останова.

Второй алгоритм - это модифицированный метод Левенберга-Марквардта, использующий точный гессиан функции ошибки (НЕ линеаризованную аппроксимацию). На задачах малой и средней размерности (до нескольких сотен весовых коэффициентов) этот алгоритм часто оказывается быстрее L-BFGS, но его главное достоинство - даже не скорость работы, а то, что он вообще не нуждается в указании критериев останова. Этот метод всегда точно находит один из локальных минимумов функции (если только задача не окажется настолько сложна, что он ошибочно решит на полпути, что уже оказался в минимуме). Впрочем, есть и недостатки - трудоемкость итерации равна O(NPoints·WCount 2), затраты памяти - O(WCount 2).

Третий алгоритм - метод раннего останова. Этот метод используется в составе одного из алгоритмов конструирования ансамблей нейронных сетей.

Замечание #3
Ни традиционный BackProp, ни RProp в пакете ALGLIB не реализованы в связи с полным и безоговорочным устареванием. QuickProp не реализован в силу того, что вряд ли он окажется лучше L-BFGS.

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

Замечание #4
Если вы не знаете, какое значение Decay хорошо для вашей задачи, поэкспериментируйте со значениями в диапазоне от 0.001 (слабая регуляризация) до 100 (очень сильная регуляризация). Перебирайте значения, начав с минимального и увеличивая Decay в 3-10 раз на каждом шаге, и проверяйте при помощи кросс-валидации или тестового множества, насколько хороша способность сети к обобщению. Обратите внимание, что если вы укажете слишком маленькое значение Decay (ниже 0.001), оно будет автоматически повышено до минимально допустимого - пакет ALGLIB всегда осуществляет хотя бы минимальную регуляризацию задачи.

Кросс-валидация

Кросс-валидация является хорошо известным методом оценки способности сложных моделей к обобщению. В пакет ALGLIB входят две подпрограммы, получающих кросс-валидационную оценку способности сети к обобщению. Первая использует в качестве базового алгоритма обучения метод Левенберга-Марквардта, вторая - L-BFGS алгоритм.

Формат обучающего множества

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

Предобработка данных

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

Manual entries

C++ mlpbase subpackage   mlptrain subpackage   
C# mlpbase subpackage   mlptrain subpackage   

This article is intended for personal use only.

Скачать ALGLIB

C#

Исходный код на C#

Downloads page

 

C++

Исходный код на C++

Downloads page

 

C++, арифметика высокой точности

Исходный код на C++, использующий библиотеки MPFR/GMP.

Исходный код GMP доступен на сайте gmplib.org. Исходный код MPFR доступен на сайте www.mpfr.org.

Downloads page

 

FreePascal

Исходный код на Free Pascal.

Downloads page

 

Delphi

Исходный код на Delphi.

Downloads page

 

VB.NET

Исходный код на VB.NET.

Downloads page

 

VBA

Исходный код на VBA.

Downloads page

 

Python

Исходный код на Python (CPython и IronPython).

Downloads page

 

 

ALGLIB® - numerical analysis library, 1999-2017.
ALGLIB is registered trademark of the ALGLIB Project.