Нейронные сети на C# - Классификация, приближение и предсказание временного ряда
ОГЛАВЛЕНИЕ
Классификация
Этот пример показывает использование однослойной сети активации с пороговой функцией активации и применением алгоритма обучения перцептрона. Количество нейронов сети равняется количеству разных классов данных, и каждый нейрон обучен классифицировать только определенный класс. При передаче выборки данных обученной сети один нейрон сети должен активироваться (выработать выход, равный 1), но все остальные нейроны должны отключиться (выработать выход, равный 0). Класс выборки данных определяется по номеру активированного нейрона. Если активируются несколько нейронов или ни один из них, то сеть не способна правильно классифицировать предъявленную выборку данных. В случае двумерных выборок данных легко наглядно представить сеть, потому что веса и пороговое значение каждого нейрона представляет собой линию, отделяющую один класс от всех остальных.
// подготовить учебные данные
double[][] input = new double[samples][];
double[][] output = new double[samples][];
// ... подготовка данных ...
// создать перцептрон
ActivationNetwork network = new ActivationNetwork( new ThresholdFunction( ),
2, classesCount );
// создать учителя
PerceptronLearning teacher = new PerceptronLearning( network );
// установить скорость обучения
teacher.LearningRate = learningRate;
// цикл
while ( ... )
{
// выполнить эпоху процедуры обучения
double error = teacher.RunEpoch( input, output );
...
}
Несмотря на простоту архитектуры сети, ее можно использовать для множества разных задач классификации/распознавания. Единственный недостаток этой архитектуры в том, что сеть может классифицировать только линейно разделимые данные.
Приближение
Этот пример показывает использование многослойных нейронных сетей, обученных по алгоритму обратного распространения, применяемому к задаче приближения функции. Допустим, что известно значение функции лишь в ограниченном количестве точек, но надо вычислить функцию в каких-то других точках, находящихся в пределах значений min и max X, для которых известно значение функции. В ходе этапа обучения сеть обучают вырабатывать правильное значение функции для предъявленного значения X. После окончания обучения сеть используется для вычисления значения функции для разных других значений, которые не были доступны сети в ходе процедуры обучения.
// подготовить учебные данные
double[][] input = new double[samples][];
double[][] output = new double[samples][];
// ... подготовка данных ...
// создать многослойную нейронную сеть
ActivationNetwork network = new ActivationNetwork(
new BipolarSigmoidFunction( sigmoidAlphaValue ),
1, neuronsInFirstLayer, 1 );
// создать учителя
BackPropagationLearning teacher = new BackPropagationLearning( network );
// установить скорость и темп обучения
teacher.LearningRate = learningRate;
teacher.Momentum = momentum;
// цикл
while ( ... )
{
// выполнить эпоху процедуры обучения
double error = teacher.RunEpoch( input, output ) / samples;
...
}
Архитектура сети может использоваться для приближения не только двумерных функций. Функцию произвольной размерности можно приблизить посредством многомерной нейронной сети. Но не забывайте, что количество слоев и нейронов сети и такие параметры, как значение альфа сигмоиды, существенно влияют на скорость обучения. Некоторые неправильные настройки сети могут лишить ее способности к обучению. Поэтому будьте осторожны и больше экспериментируйте.
Предсказание временного ряда
Этот пример тоже показывает многослойную нейронную сеть с алгоритмом обучения с обратным распространением, но примененным к другой задаче – предсказанию временного ряда. Задача предсказания временного ряда является очень важной и известной, и много исследователей работает над ней, пробуя множество разных алгоритмов и методов для задачи. Легко объяснить популярность задачи, взглянув на области ее применения. Одна из популярных областей – трейдинг. Если вы сможете предсказать будущие стоимости акций или курсы обмена валют и если сможете сделать это поистине хорошо, то станете богачом. Но надо вернуться к нейронным сетям. В ходе этапа обучения определенное количество предыдущих значений временного ряда предъявляется сети, и сеть обучают предсказывать следующее значение временного ряда. Чем больше учебных выборок есть, тем лучше будет полученная модель прогнозирования. Также очень важный параметр – размер окна – сколько значений из истории используется для предсказания будущего значения. Чем больше размер окна, тем лучше будет полученная модель, но может быть и не так – в зависимости от временного ряда, и требуются эксперименты. Но больший размер окна уменьшает количество требуемых учебных выборок, поэтому это компромиссное значение.
Пример кода для данной задачи аналогичен коду предыдущего примера, изменена только процедура подготовки учебных данных.