Меню

Алгоритм обратного распространения ошибки для многослойного персептрона

Введение

  • В последнее время, с ростом популярности этих двух методов появилось много библиотек на Matlab, R, Python, C ++ и т.д., которые получают на вход обучающий набор и автоматически создают соответствующую нейронную сеть для вашей задачи.
  • Однако при использовании готовых библиотек бывает сложно понять, что именно происходит и как мы получаем оптимизированную сеть. А ведь знание основ решения важно для дальнейшего развития этих методов. Итак, в данной статье мы создадим очень простую структуру для алгоритма нейронной сети.
  • Мы постараемся понять, как работает базовый тип нейронной сети — перцептрон с одним нейроном и многослойный перцептрон — замечательный алгоритм, который отвечает за обучение сети (градиентный спуск и обратное распространение). Эти сетевые модели будут основой для более сложных моделей, существующих на сегодняшний день.

Краткий обзор истории

  • Первая нейронная сеть была задумана Уорренном Маккалоком и Уолтером Питтсом в 1943 году. Они написали великолепную статью о том, как должны работать нейроны, а затем построили модель на основе своих идей — создали простую нейронную сеть с электрическими цепями.
  • Исследования в области искусственного интеллекта быстро развивались, и в 1980 году Кунихико Фукусима разработал первую настоящую многослойную нейронную сеть.
  • Первоначальной целью нейронной сети было создание компьютерной системы, способной решать проблемы подобно тому, как это делает человеческий мозг. Однако, со временем исследователи сменили фокус и начали использовать нейронные сети для решения особенных задач. С тех пор нейронные сети выполняют самые разнообразные задачи, включая компьютерное зрение, распознавание голоса, машинный перевод, фильтрацию социальных сетей, настольные игры или видеоигры, медицинскую диагностику, прогноз погоды, прогнозирование временных рядов, распознавание (изображения, текста, голоса) и др.

Компьютерная модель нейрона: перцептрон

Перцептрон

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

  • z = sum(weight_i * x_i) + bias

Где weight — это вес сети, X — это входное значение, i — индекс веса или входные данные, а смещение — это специальный вес, который не имеет множитель в виде входного значения (можем считать, что входные данные всегда равны 1.0).

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

  • y = 1.0 если z >= 0.0, иначе 0.0

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

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

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

Входы нейронов представлены вектором x = [x1, x2, x3,…, xN], который может соответствовать, к примеру, ряду торговых цен актива, значениям технических индикаторов, числовой последовательности в пикселях изображения. Когда они попадают к нейрону, они умножаются на соответствующие синаптические веса, которые являются элементами вектора w = [w1, w2, w3, …, wN], и таким образом генерируют значение z, обычно называемое потенциалом активации, согласно выражению:

b обеспечивает более высокую степень свободы и не зависит от входа в это выражение, что обычно соответствует нейрону смещения (склонности). Затем z-значение проходит через функцию активации σ, которая отвечает за ограничение этого значения определенным интервалом (например, 0 — 1), что дает окончательное выходное значение и значение нейрона. Некоторые используемые триггерные функции: шаг, сигмоид, гиперболический тангенс, softmax и ReLU («rectified linear unit»).

Чтобы проиллюстрировать процесс, направленный на достижение предела разделимости классов, ниже мы показываем две ситуации, которые демонстрируют их сближение к стабилизации с учетом только двух входов {x1 и x2}

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

Стохастический градиент

Градиентный спуск — это процесс минимизации функции в направлении градиента функции стоимости.

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

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

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

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

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

  • w = w + learning_rate * (expected — predicted) * x

Где w оптимизируется, learning_rate — это скорость обучения, которую мы должны установить (например, 0.1), (expected — predicted) — ошибка прогнозирования для модели в обучающих данных, относящихся к весу, а x — входное значение.

Для стохастического градиентного спуска требуются два параметра:

  • Коэффициент обучения: используется для ограничения размера корректировки веса при каждом его обновлении.
  • Эпохи — сколько раз обучающие данные должны выполняться при обновлении веса.

Они вместе с обучающими данными будут аргументами для функции.

Нам нужно выполнить 3 цикла в функции:

1. Цикл для каждой эпохи.

2. Цикл для каждой строки в обучающих данных для эпохи.

3. Цикл для каждого веса, который обновляется для одной строке в одной эпохи.

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

Для каждого входного атрибута есть свой вес, и они постоянно обновляются, например:

  • w(t+1)= w(t) + learning_rate * (expected(t) — predicted(t)) * x(t)

Смещение обновляется аналогичным образом, только без входа, поскольку оно не связано с конкретным входным значением:

  • bias(t+1) = bias(t) + learning_rate * (expected(t) — predicted(t)).

Применение модели нейрона:

Теперь перейдем к практическому применению.

Этот урок разделен на 2 части:

1. Делаем прогнозы

2. Оптимизация веса сети

Эти шаги обеспечат основу для реализации и применения алгоритма перцептрона к другим задачам классификации.

Нам нужно определить количество столбцов в нашем наборе X, для этого мы определяем константу

#define nINPUT 3

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

1. Делаем прогнозы

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

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

Ниже приведена функция predict, которая прогнозирует выходное значение для строки исходя от определенного набора весов.

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

template <typename Array>
double predict(const Array &X[][nINPUT], const Array &weights[], const int row=0)
  {
   double z = weights[0];
   for(int i=0; i<ArrayRange(X, 1)-1; i++)
     {
      z+=weights[i+1]*X[row][i];
     }
   return activation(z);
  }

Перенос нейронов:

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



double activation(const double activation) 
  {
   return activation>=0.0?1.0:0.0;
  }

Мы получаем в качестве аргумента в функции прогнозирования входной набор X, массив с весами (W) и строку, для которой прогнозируется входной набор X.

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

Мы также можем использовать заранее подготовленные веса, чтобы делать прогнозы для этого набора данных.

double weights[] = {-0.1, 0.20653640140000007, -0.23418117710000003};

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

#define nINPUT 3



void OnStart()
  {

   random.seed(42);
   double dataset[][nINPUT] = {     
                               {2.7810836,2.550537003,0},
                               {1.465489372,2.362125076,0},
                               {3.396561688,4.400293529,0},
                               {1.38807019,1.850220317,0},
                               {3.06407232,3.005305973,0},
                               {7.627531214,2.759262235,1},
                               {5.332441248,2.088626775,1},
                               {6.922596716,1.77106367,1},
                               {8.675418651,-0.242068655,1},
                               {7.673756466,3.508563011,1}
                              };
   double weights[] = {-0.1, 0.20653640140000007, -0.23418117710000003};
   for(int row=0; row<ArrayRange(dataset, 0); row++)
     {
      double predict = predict(dataset, weights, row);
      printf("Expected=%.1f, Predicted=%.1f", dataset[row][nINPUT-1], predict);
     }
  }


template <typename Array>
double predict(const Array &X[][nINPUT], const Array &weights[], const int row=0)
  {
   double z = weights[0];
   for(int i=0; i<ArrayRange(X, 1)-1; i++)
     {
      z+=weights[i+1]*X[row][i];
     }
   return activation(z);
  }



double activation(const double activation) 
  {
   return activation>=0.0?1.0:0.0;
  }

Есть два входных значения (X1 и X2) и три коэффициента веса (bias, w1 и w2). Уравнение активации, которое мы моделируем для данной проблемы, выглядит так:

activation = (w1 * X1) + (w2 * X2) + b

Или с конкретными значениями веса, мы вручную выбираем как:

activation = (0.206 * X1) + (-0.234 * X2) + -0.1

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

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

2. Оптимизируем веса сети

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

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

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



template <typename Array>
void train_weights(Array &weights[], const Array &X[][nINPUT], double l_rate=0.1, int n_epoch=5)
  {
   ArrayResize(weights, ArrayRange(X, 1));
   for(int i=0; i<ArrayRange(X, 1); i++)
     {
      weights[i]=random.random();
     }
     
   for(int epoch=0; epoch<n_epoch; epoch++)
     {
      double sum_error = 0.0;
      for(int row=0; row<ArrayRange(X, 0); row++)
        {
         double y = predict(X, weights, row);
         double error = X[row][nINPUT-1] - y;
         sum_error += pow(error, 2);
         weights[0] = weights[0] + l_rate * error;

         for(int i=0; i<ArrayRange(X, 1)-1; i++)
           {
            weights[i+1] = weights[i+1] + l_rate * error * X[row][i];
           }
        }
      printf(">epoch=%d, lrate=%.3f, error=%.3f",epoch, l_rate, sum_error);
     }
  }

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

Давайте протестируем нашу функцию с одним и тем же набором данных, представленным выше.

#define nINPUT 3



void OnStart()
  {

   random.seed(42);
   double dataset[][nINPUT] = {     
                               {2.7810836,2.550537003,0},
                               {1.465489372,2.362125076,0},
                               {3.396561688,4.400293529,0},
                               {1.38807019,1.850220317,0},
                               {3.06407232,3.005305973,0},
                               {7.627531214,2.759262235,1},
                               {5.332441248,2.088626775,1},
                               {6.922596716,1.77106367,1},
                               {8.675418651,-0.242068655,1},
                               {7.673756466,3.508563011,1}
                              };
   double weights[];
   train_weights(weights, dataset);
   ArrayPrint(weights, 20);
   for(int row=0; row<ArrayRange(dataset, 0); row++)
     {
      double predict = predict(dataset, weights, row);
      printf("Expected=%.1f, Predicted=%.1f", dataset[row][nINPUT-1], predict);
     }
  }


template <typename Array>
double predict(const Array &X[][nINPUT], const Array &weights[], const int row=0)
  {
   double z = weights[0];
   for(int i=0; i<ArrayRange(X, 1)-1; i++)
     {
      z+=weights[i+1]*X[row][i];
     }
   return activation(z);
  }



double activation(const double activation) 
  {
   return activation>=0.0?1.0:0.0;
  }



template <typename Array>
void train_weights(Array &weights[], const Array &X[][nINPUT], double l_rate=0.1, int n_epoch=5)
  {
   ArrayResize(weights, ArrayRange(X, 1));
   ArrayInitialize(weights, 0);
     
   for(int epoch=0; epoch<n_epoch; epoch++)
     {
      double sum_error = 0.0;
      for(int row=0; row<ArrayRange(X, 0); row++)
        {
         double y = predict(X, weights, row);
         double error = X[row][nINPUT-1] - y;
         sum_error += pow(error, 2);
         weights[0] = weights[0] + l_rate * error;

         for(int i=0; i<ArrayRange(X, 1)-1; i++)
           {
            weights[i+1] = weights[i+1] + l_rate * error * X[row][i];
           }
        }
      printf(">epoch=%d, lrate=%.3f, error=%.3f",epoch, l_rate, sum_error);
     }
  }

Мы используем скорость обучения 0,1 и обучаем модель только для 5 эпох или 5 показов весов для всего набора обучающих данных.

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

Мы видим, как быстро алгоритм выучивает проблему.

Этот тест можно найти в файле PerceptronScript.mq5.

Многослойный перцептрон

  • Объединеняем нейроны в слои

   С одним нейроном мало что можно сделать, но мы можем объединить их в многоуровневую структуру, каждый с разным количеством нейронов, и сформировать нейронную сеть, называемую многослойным перцептроном («multi layer perceptron, MLP»). Вектор входных значений X проходит через начальный слой, выходные значения которого связаны со входами следующего уровня, и так далее, пока сеть не предоставит выходные значения последнего слоя в качестве результата. Сеть может быть организована в несколько слоев, что делает ее глубокой и способной выучить все более сложные отношения.

Обучение MLP

   Для того, чтобы такая сеть работала, ее нужно обучать. Это как учить ребенка читать. Обучение MLP происходит в контексте машинного обучения с учителем, но как это работает?

Обучение с учителем:

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

Пример 1:

  • Учитывая набор данных о размерах домов на рынке недвижимости, попробуйте спрогнозировать их цену. Цена в зависимости от размера — это непрерывный результат, так что это проблема регрессии.
  • Мы могли бы также превратить этот пример в задачу классификации, чтобы прогнозировать о том, «продастся ли дом дороже или дешевле, чем запрашиваемая цена». Здесь мы рассортируем дома по цене на две разные категории.

Обратное распространение

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

Разве мы не учимся на ошибках?

Идея алгоритма обратного распространения ошибки состоит в том, чтобы на основе расчетной ошибки, полученной на выходном слое нейронной сети, пересчитать значение весов вектора W последнего слоя нейронов. Затем мы переходим к предыдущему слою и так далее, от конца к началу, то есть, он состоит из обновления всех весов W слоев, от последнего до достижения входного слоя сети путем обратного распространения ошибки, полученной сетью. Другими словами, ошибка вычисляется между тем, что предсказала сеть, и тем, что она была на самом деле (фактический 1, предсказанный 0; у нас есть ошибка!), поэтому мы пересчитываем значения всех весов, начиная с последнего слоя и переходя к первому, всегда обращая внимание на уменьшение этой ошибки.

Алгоритм обратного распространения ошибки состоит из двух этапов:

1. Прямой проход («forward pass»), при котором наши входы проходят через сеть и получают прогнозы выхода (этот шаг также известен как фаза распространения).

2. Обратный проход («backward pass»), при котором мы вычисляем градиент функции потерь на последнем слое (то есть слое прогнозирования) сети и используем этот градиент для рекурсивного применения цепного правила («chain rule») для обновления весов в нашей сети (также известного как стадия обновления веса или обратное распространение)

Рассмотрим сеть выше со слоем скрытых нейронов и выходным нейроном. Когда входной вектор распространяется по сети, для текущего набора весов существует выходной Pred(y). Цель обучения с учителем — настроить веса так, чтобы уменьшить разницу между Pred(y) сети и требуемым выходным Req(y). Для этого требуется алгоритм, который уменьшает абсолютную ошибку, что аналогично уменьшению квадратичной ошибки, где:

(1)

Сетевая ошибка = Pred — Req

      = E

Алгоритм должен регулировать веса, чтобы минимизировать E². Обратное распространение — это алгоритм, который выполняет минимизацию градиентного спуска E². Чтобы минимизировать E², необходимо рассчитать его чувствительность к каждому весу. Другими словами, нам нужно знать, какое влияние будет иметь изменение каждого веса на E². Если нам будет известно, веса можно будет отрегулировать в направлении, уменьшающем абсолютную ошибку. Последующее описание правила обратного распространения основано на такой диаграмме:

Пунктирная линия представляет нейрон B, который может быть скрытым или выходным нейроном. Выходы n нейронов (O 1 … O n) на предыдущем слое являются взодами для нейрона B. Если нейрон B находится в скрытом слое, он просто является входным вектором. Эти выходы умножаются на соответствующие веса (W1B … WnB), где WnB — вес, соединяющий нейрон n и нейрону B. Функция суммы складывает все эти произведения для получения входных данных, IB, который обрабатывается функцией триггера f(.) нейрона B. f (IB) это выход OB нейрона B. Рассмотрим пример. Назовем нейрон 1 нейроном A и рассмотрим вес WAB между двумя нейронами. Подход, используемый для изменения веса, определяется правилом дельты:

(2)

где — параметр скорости обучения, который определяет скорость обучения, а

является чувствительностью ошибки E² к весу WAB и определяет направление поиска в пространстве весов для нового веса WAB (новый), как изображено на рисунке ниже.

Чтобы минимизировать E², правило дельты обеспечивает необходимое направление изменения веса.

Ключевой концепцией приведенного выше уравнения является вычисление выражения ∂E² /∂WAB которое состоит в вычислении частных производных функции ошибок по отношению к каждому весу вектора W.

Дифференцирование сложной функции:

(3)

и

(4)

поскольку остальные входы нейрона B не зависят от веса WAB. Таким образом, исходя из уравнений (3) и (4), уравнение (2) становится

(5)

и изменение веса WAB зависит от чувствительности квадрата ошибки E² на входе IB, единицы B и входного сигнала OА.

Возможны две ситуации:

1. B — выходной нейрон;

2. B — скрытый нейрон.

Рассмотриваем первый случай:

Поскольку B является выходным нейроном, изменение квадрата ошибки из-за настроки WAB просто является изменением квадрата ошибки выходного сигнала B.

(6)

объединяя уравнение (5) и уравнение (6), получаем

(7)

Правило изменения весов, когда нейрон B является выходным нейроном, если выходная функция активации, f (.), является логистической функцией:

(8)

Дифференцируем уравнение (8) по аргументу x:

(9)

Но,

(10)

при вставке (10) в (9) получаем:

(11)

таким же образом для функции tanh

или для линейной функции (identity)

Так мы получаем:

Рассматривая второй случай:

B это скрытый нейрон

(12)

где O представляет выходной нейрон

(13)

где p это индекс, который охватывает все нейроны, включая нейрон B, который обеспечивает входные сигналы для выходного нейрона. Расширяем правую часть уравнения (13),

(14)

поскольку веса других нейронов WpO (p! = B) не имеют зависимости от OB.

При вставке (13) и (13) в (12):

(15)

Следовательно, теперь это выражается как функция от , вычисляемая, как описано в уравнении (6).

Полное правило изменения веса WAB между нейроном A, который посылает сигнал нейрону B, является таким:

(16)

где

где fo (.) и fh (.) это скрытые функции активации и выхода соответственно.

Пример

Выход из сети = [tanh(I T .WI)] . WO

HID = [Tanh(I T.WI)] T— выходы скрытых нейронов

ERROR = (выход из сети — нужный выход)

LR = коеффициент обучения

Обновления веса становятся

нейроном с линейным выходом

(17)

WO = WO — ( LR x ERROR x HID )

скрытым нейроном

(18)

WI = WI — { LR x [ERROR x WO x (1- HID 2)] . I T } T

Уравнения 17 и 18 показывают, что изменение веса — это входной сигнал, умноженный на локальный градиент. Это обеспечивает направление, величина которого также зависит от величины ошибки. Если берем направление без величины, все изменения будут одинакового размера, и это будет зависеть от темпа обучения. Вышеуказанный алгоритм является упрощенной версией, так как имеется только один выходной нейрон. В исходном алгоритме допускается более одного выхода, а уменьшение градиента минимизирует общую квадратную ошибку всех выходов. Есть много алгоритмов, которые произошли от исходного алгоритма для увеличения скорости обучения. Они кратко изложены в:

« Back Propagation family album» — Technical report C/TR96-05, Department of Computing, Macquarie University, NSW, Australia».

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

Применение модели MLP

Этот урок разделен на 5 частей:

1.       Инициализация сети.

2.       Прямое распространение (FeedForward).

3.       Обратное распространение.

4.       Обучение сети.

5.       Прогноз.

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

1. Инициализация сети

У каждого нейрона есть набор весов, которые необходимо поддерживать. Вес для каждого входного соединения и дополнительный вес для смещения.

Рекомендуем инициализировать веса сети для небольших случайных чисел. В этом случае мы будем использовать случайные числа в диапазоне от 0 до 1. Для этого мы создали функцию для генерации случайных чисел.

double random(void)
  {
   return ((double)rand())/(double)SHORT_MAX;
  }

Ниже представлена ​​функция под названием initialize_network(), которая создает веса нашей нейронной сети.

void forward_propagate(void)
  {


   int i = 0;
   for(i = 0; i<numHidden; i++)
     {
      hiddenVal[i] = 0.0;
      for(int j = 0; j<numInputs; j++)
        {
         hiddenVal[i] += (X[patNum][j] * weightsIH[j][i]);
        }
      hiddenVal[i] = tanh(hiddenVal[i]);
     }


   outPred = 0.0;
   for(i = 0; i<numHidden; i++)
     {
      outPred += hiddenVal[i] * weightsHO[i];
     }

   errThisPat = outPred - y[patNum];
  }

3. Обратное распространение

Алгоритм обратного распространения назван в честь способа обучения весов

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

Математика ошибки обратного распространения была объяснена выше.



void backward_propagate_error(void)
  {

   for(int k = 0; k<numHidden; k++)
     {
      double weightChange = LR_HO * errThisPat * hiddenVal[k];
      weightsHO[k] -= weightChange;
      
      regularisationWeights(weightsHO[k]);
     }

   for(int i = 0; i<numHidden; i++)
     {
      for(int k = 0; k<numInputs; k++)
        {
         double x = 1 - pow(hiddenVal[i],2);
         x = x * weightsHO[i] * errThisPat * LR_IH;
         x = x * X[patNum][k];
         double weightChange = x;
         weightsIH[k][i] -= weightChange;
        }
     }
  }

метод regularizationWeights был создан только для регуляризации весов в диапазоне от -5 до 5.

void regularisationWeights(double &weight)
  {
   weight<-5?weight=-5:weight>5?weight=5:weight=weight;
  }

4. Обучение сети

Сеть обучается методом стохастического градиентного спуска.

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

//# Train a network for a fixed number of epochs
void train(void)
  {
   for(int j = 0; j <= numEpochs; j++)
     {
      for(int i = 0; i<numPatterns; i++)
        {
         
         patNum = rand()%numPatterns;
         
         
         forward_propagate();
         backward_propagate_error();
        }
      
      
      calcOverallError();
      printf("epoch = %d RMS Error = %f",j,RMSerror);
     }
  }

5. Прогноз

Делать прогнозы с помощью обученной нейронной сети довольно просто.

Мы уже видели, как распространить паттерн входа для получения выходных данных. Это все, что нам нужно сделать, чтобы осуществить прогноз. Мы можем использовать выходные значения напрямую как вероятность принадлежности паттерна к каждому выходному классу.

void predict(void)
  {
   for(int i = 0; i<numPatterns; i++)
     {
      patNum = i;
      forward_propagate();
      printf("real = %d predict = %f",y[patNum],outPred);
     }
  }

Полный пример можно найти в файле MLP_Script.mq5.

Заключение

Мы занимались вычислениями, задействованными в процессе развития нейрона перцептрона, а также сети нейронов перцептрона, называемой «multi layer perceptron, MLP». В данном процессе мы поняли, как осуществляется обучение этого типа сетей с использованием обратного распространения ошибки и градиентного спуска.

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

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

Общее описание алгоритма обратного распространения ошибки

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

4-20219-e537a8.png

2-20219-7f9b72.png

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

3-20219-2ac7f4.png

Причём «альфа» здесь означает параметр наклона сигмоидальной функции. Меняя его, мы получаем возможность строить функции с разной крутизной.

Сигмоид может сужать диапазон изменения таким образом, чтобы значение OUT лежало между нулем и единицей. Нейронные многослойные сети характеризуются более высокой представляющей мощностью, если сравнивать их с однослойными, но это утверждение справедливо лишь в случае нелинейности. Нужную нелинейность и обеспечивает сжимающая функция. Но на практике существует много функций, которые можно использовать. Говоря о работе алгоритма обратного распространения ошибки, скажем, что для этого нужно лишь, чтобы функция была везде дифференцируема, а данному требованию как раз и удовлетворяет сигмоид. У него есть и дополнительное преимущество — автоматический контроль усиления. Если речь идёт о слабых сигналах (OUT близко к нулю), то кривая «вход-выход» характеризуется сильным наклоном, дающим большое усиление. При увеличении сигнала усиление падает. В результате большие сигналы будут восприниматься сетью без насыщения, а слабые сигналы будут проходить по сети без чрезмерного ослабления.

Цель обучения сети

Цель обучения нейросети при использовании алгоритма обратного распространения ошибки — это такая подстройка весов нейросети, которая позволит при приложении некоторого множества входов получить требуемое множество выходов нейронов (выходных нейронов). Можно назвать эти множества входов и выходов векторами. В процессе обучения предполагается, что для любого входного вектора существует целевой вектор, парный входному и задающий требуемый выход. Эту пару называют обучающей. Работая с нейросетями, мы обучаем их на многих парах.

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

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

Пошаговая реализация метода обратного распространения ошибки

Необходимо выполнить следующие действия:
1. Инициализировать синаптические веса случайными маленькими значениями.
2. Выбрать из обучающего множества очередную обучающую пару; подать на вход сети входной вектор.
3. Выполнить вычисление выходных значений нейронной сети.
4. Посчитать разность между выходом нейросети и требуемым выходом (речь идёт о целевом векторе обучающей пары).
5. Скорректировать веса сети в целях минимизации ошибки.
6. Повторять для каждого вектора обучающего множества шаги 2-5, пока ошибка обучения нейронной сети на всём множестве не достигнет уровня, который является приемлемым.

Виды обучения сети по методу обратного распространения

Сегодня существует много модификаций алгоритма обратного распространения ошибки. Возможно обучение не «по шагам» (выходная ошибка вычисляется, веса корректируются на каждом примере), а «по эпохам» в offline-режиме (изменения весовых коэффициентов происходит после подачи на вход нейросети всех примеров обучающего множества, а ошибка обучения neural сети усредняется по всем примерам).

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

Преимущества и недостатки метода

К плюсам можно отнести простоту в реализации и устойчивость к выбросам и аномалиям в данных, и это основные преимущества. Но есть и минусы:
• неопределенно долгий процесс обучения;
• вероятность «паралича сети» (при больших значениях рабочая точка функции активации попадает в область насыщения сигмоиды, а производная величина приближается к 0, в результате чего коррекции весов почти не происходят, а процесс обучения «замирает»;
• алгоритм уязвим к попаданию в локальные минимумы функции ошибки.

Значение метода обратного распространения

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

Источники:
— «Алгоритм обратного распространения ошибки»;
— «Back propagation algorithm».

распространения
ошибки.

Строгие математические
доказательства М. Минского и С. Пайперта
были неуязвимы. Всеобщий энтузиазм
сменился не менее всеобщим пессимизмом.
Правительство США прекратило финансирование
нейропроектов, и персептроны были
преданы забвению, длившемуся более 20
лет.

Тем не менее, работы
в области нейросетевых и нейрокомпьютерных
технологий продолжались отдельными
наиболее настойчивыми исследователями.
Многие понимали, что надо усложнять
структуру персептронов, т. е. продолжать
приближать компьютерную модель к
оригиналу — человеческому мозгу.
Оказалось, что проблему «Исключающее
ИЛИ» можно решить с помощью двухслойного
персептрона, изображенного на рис.3.26.

Рис.3.26. Двухслойный
персептрон, реализующий функцию

«Исключающее ИЛИ»

Работа этого
персептрона происходит по следующему
алгоритму.

Нейрон № 1: S1=0,5х1
+ (-0,5)х2;
y1=
1, если S1θ;
y1=
0, если S1<θ.

Нейрон № 2: S2
=(-0,5)x1
+0,5x2;
у2
= 1, если S2θ;
у2
= 0, если S2
<θ.

Нейрон
№ 3: S3=lxl+lx2;
y3
= 1, если
S3
θ;
y3=
0, если
S3
<θ.

С помощью этих
формул легко проверить таблицу истинности
персептрона, составленную при задании
порога θ= 0,5 (табл.3.9).

Таблица
3.9

Таблица
истинности двухслойного персептрона
(см. рис.3.26)

x1

x2

S1

S2

y1

y2

S3

y3

y

0

0

0

0

0

0

0

0

0

0

1

-0,5

0,5

0

1

1

1

1

1

0

0,5

-0,5

1

0

1

1

1

1

1

0

0

0

0

0

0

0

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

Многие исследователи
понимали, что объединение нейронов в
нейронные сети расширяет класс задач,
решаемых персептроном, но не представляли,
как такие сети обучать. Простые и изящные
правила Хебба и их обобщение —
дельта-правило — годились только для
корректировки синаптических весов
нейронов выходного слоя, тогда как
вопрос о настройке параметров внутренних
нейронных слоев оставался открытым.

Эффективный
алгоритм обучения многослойных
персептронов, открывший путь для их
широкого практического применения,
стал известен только в 1986 г., благодаря
работе Румельхарта, Хилтона и Вильямса.
Интересно, что данный фундаментальный
алгоритм, называемый алгоритмом
обратного распространения ошибки

(back propagation), был предложен на один год
ранее в работах Паркера и Ле-Кана,
изданных независимо одна от другой.
Более того, еще в 1974 г. этот простой и
изящный алгоритм обратного распространения
ошибки был защищен Вербосом в его
докторской диссертации. Однако тогда
он остался незамеченным и только спустя
более десяти лет был «переоткрыт» заново
и получил всеобщее признание и применение.

Рассмотрим идею
алгоритма обратного распространения
ошибки, попытавшись обобщить дельта-правило
для случая обучения двухслойного
персептрона, имеющего N
входов, I
выходов и скрытый слой из J
нейронов (рис.3.27). Алгоритм корректировки
синаптических весов нейронов выходного
слоя оставим таким же, как для однослойного
персептрона, заменив xj
на уj.

wij(t+1)
= wij(t)
+ Δwij;
(3.11)

Δwij=ηδiyj;
(3.12)

(3.13)

Рис.
3.27. Двухслойный персептрон с N
входами, I
выходами и скрытым слоем из J
нейронов

Синаптические
веса нейронов скрытого слоя попытаемся
корректировать с помощью тех же самых
формул, в которых индекс i
заменим на j, а индекс j — на n:

(3.14)

(3.15)

Понятно, что в
последнем выражении в качестве уn
следует использовать хn.
Однако неясным здесь остается вопрос
о вычислении нейронной ошибки (dj
— yj),
которая для скрытого слоя неизвестна.
Идея авторов рассматриваемого алгоритма
состояла в том, чтобы в качестве этой
ошибки использовать суммарные ошибки
с выходного слоя, помноженные на силы
соответствующих синаптических связей,
т.е.
(3.16)

Итак, для скрытого
слоя окончательно имеем:
(3.17)

(3.18)

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

(3.19)

Смещение wi0
задается так же, как и синаптические
веса wij,
т.е. датчиком случайных чисел. Ввод
смещения в формулу преобразования
нейрона можно интерпретировать как
добавление еще одного входного сигнала
x0,
который всегда равен единице. Поэтому,
чтобы не усложнять выкладки, сумму
(3.19) представим в более компактном виде
(приняв x0=
1):

(3.20)

Алгоритм обратного
распространения ошибки

распишем для многослойного персептрона,
имеющего входной слой k=
0, несколько скрытых слоев k=1,2,…,К-1
и выходной слой k=K
(рис.3.28). Нейроны входного слоя
математических преобразований не
выполняют, а лишь передают входные
сигналы нейронам первого слоя.

Рис.3.28.
Многослойный персептрон (MLP —
MultiLayerPerseptron)

Будем полагать,
что каждый k-й
слой содержит Hk
нейронов. Таким образом, персептрон
имеет N =H0
входов и М= HК
выходов. В алгоритме будем использовать
следующие обозначения: i
— порядковый номер нейрона k-го слоя; j
— порядковый номер нейрона (k-1)-го
слоя; l
— порядковый номер нейрона (k+1)-го
слоя.

Шаг 1. Инициализация
синаптических весов и смещений.

В циклах по
k=1,2,…,К;
i=1,2,…,Hk;
j =1,2,…,Нk-1
синаптическим весам и смещениям wij(k)
датчиком случайных чи­сел присваиваются
малые величины, например, из интервала
от -1 до 1.

Шаг 2. Представление
из обучающей выборки очередного входного
вектора Xq=(х12,…,xN)q
и соответствующего ему желаемого
выходного вектора Dq=(d1,d2,
…,dM)q,
где q — номер примера в обучающей выборке.

Шаг 3. Прямой проход.

В циклах по
k=1,2,…,К;
i=1,2,…,Нk
вычисляются выходные сигналы i-го
нейрона в k-м
слое

(3.21)

где yj(0)
=xj,
x0=1,
yj(k-1)
= 1 и выходные сигналы персептрона
yi=yi(K).

Шаг 4. Обратный
проход.

В циклах по k=
К,К-1,…,1; i=1,2,…,Hk;j=1,2,
…,Hk-1
вычисляются синаптические веса на новой
эпохе

(3.22)

где

(3.23)

причем для выходного
слоя k=
К согласно (3.13)

а для всех других
случаев согласно (3.18)

(3.24)

Шаг 5. Повторение
шагов 2 — 4 необходимое число раз.

Входные векторы
обучающих примеров Хq
и Dq
на втором шаге алгоритма обычно
представляются последовательно от
первого до последнего, т.е. q=1,2,…,Q, где
Q — общее число примеров. Например, в
случае распознавания букв русского
алфавита Q=33. После того как для каждого
обучающего примера будут скорректированы
весовые коэффициенты персептрона, т.е.
шаги 2-4 будут повторены 33 раза, на пятом
шаге алгоритма вычисляется среднеквадратичная
ошибка, усредненная по всем обучающим
примерам:

(3.25)

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

(3.26)

Итерационный
процесс заканчивается после того, как
погрешность ε, вычисляемая по формулам
(3.25) или (3.26), достигнет заданной величины,
либо при достижении предельного числа
эпох обучения. В результате персептрон
обучится выполнять нужное отображение
любого входного вектора Хq
на выходной вектор Yq,
отличающийся от желаемого вектора Dq
на некоторую малую величину.

Теперь представим
себе, что на входное табло фотоэлементов
попала карточка с какой-либо буквой,
выполненной другим шрифтом. Фотоэлементы
сформируют входной вектор X,
не совпадающий ни с одним из векторов
из использованной обучающей выборки.
Если шрифт, которым выполнена входная
буква не слишком отличается от шрифта
обучающей выборки, а персептрон хорошо
спроектирован и обучен, то он вычислит
вектор Y,
в котором выход нейрона, соответствующего
представленной на вход букве, будет
иметь максимальное значение. Таким
образом, персептрон, несмотря на помехи
и искажения входного образа, выдаст
правильное заключение о его принадлежности
к тому или иному классу. Свойство
персептрона правильно реагировать на
входные образы, которых не было в
обучающей выборке, называется свойством
обобщения
.

Соседние файлы в папке ОСИИ учебное пособие

  • #
  • #
  • #
  • #

Метод обратного распространения ошибки — метод обучения многослойного перцептрона. Впервые метод был описан в 1974 г. Полем Дж. Вербосом[1], а также независимо и одновременно А. И. Галушкиным[2]. Далее существенно развит в 1986 г. Дэвидом И. Румельхартом, Дж. Е. Хинтоном и Рональдом Дж. Вильямсом[3] и независимо и одновременно С. И. Барцевым и В. А. Охониным (Красноярская группа)[4]. Это итеративный градиентный алгоритм, который используется с целью минимизации ошибки работы многослойного перцептрона и получения желаемого выхода.

Основная идея этого метода состоит в распространении сигналов ошибки от выходов сети к её входам, в направлении, обратном прямому распространению сигналов в обычном режиме работы. Барцев и Охонин предложили сразу общий метод («принцип двойственности»), приложимый к более широкому классу систем, включая системы с запаздыванием, распределённые системы, и т. п.[5]

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

Cигмоидальные функции активации[]

Наиболее часто в качестве функций активации используются следующие виды сигмоид:

Функция Ферми (экспоненциальная сигмоида):
{displaystyle f(s)={frac {1}{1+e^{-2alpha s}}}}

Рациональная сигмоида:
{displaystyle f(s)={frac {s}{|s|+alpha }}}

Гиперболический тангенс:
{displaystyle f(s)=th{frac {s}{alpha }}={frac {e^{frac {s}{alpha }}-e^{-{frac {s}{alpha }}}}{e^{frac {s}{alpha }}+e^{-{frac {s}{alpha }}}}}}

где s — выход сумматора нейрона, {displaystyle alpha } — произвольная константа.

Менее всего, сравнительно с другими сигмоидами, процессорного времени требует расчет рациональной сигмоиды. Для вычисления гиперболического тангенса требуется больше всего тактов работы процессора. Если же сравнивать с пороговыми функциями активациями, то сигмоиды расчитываются очень медленно. Если после суммирования в пороговой функции сразу можно начинать сравнение с определенной величиной (порогом), то в случае сигмоидальной функции активации — нужно расчитать сигмоид (затратить время в лучшем случае на три операции: взятие модуля, сложение и деление), и только потом сравнивать с пороговой величиной (например, нулем). Если считать, что все простейшие операции расчитываются процессором за примерно одинаковое время, то работа сигмоидальной функции активации после произведенного суммирования (которое займет одинаковое время) будет медленее пороговой функции активации как 1:4.

Функция оценки работы сети[]

В тех случаях, когда удается оценить работу сети обучение нейронных сетей можно представить как задачу оптимизации. Оценить — означает указать количественно хорошо или плохо сеть решает поставленные ей задачи. Для этого строится функция оценки. Она, как правило, явно зависит от выходных сигналов сети и неявно (через функционирование) — от всех ее параметров. Простейший и самый распространенный пример оценки — сумма квадратов расстояний от выходных сигналов сети до их требуемых значений:
{displaystyle H={frac {1}{2}}sum _{tau in v_{out}}(Z(tau )-Z^{*}(tau ))^{2}},
где {displaystyle Z^{*}(tau )} — требуемое значение выходного сигнала.

Метод наименьших квадратов далеко не всегда является лучшим выбором оценки. Тщательное конструирование функции оценки позволяет на порядок поысить эффективность обучения сети, а также получать дополнительную информацию — «уровень уверенности» сети в даваемом ответе[6].

Описание алгоритма[]

Файл:Neuro.PNG

Архитектура многослойного перцептрона

Алгоритм обратного распространения ошибки применяется для многослойного перцептрона. У сети есть входы {displaystyle x_{1},...,x_{n}}, выходы Outputs и внутренние узлы. Перенумеруем все узлы (включая входы и выходы) числами от 1 до N. Обозначим через {displaystyle w_{i,j}} вес, стоящий на ребре, соединяющем i-ый и j-ый узлы, а через {displaystyle o_{i}} — выход i-го узла. Если у нас m тестовых примеров с целевыми значениями выходов {displaystyle {t_{k}^{d}}}, {displaystyle d=1..m,kin Outputs}, то функция ошибки, полученная по методу наименьших квадратов, выглядит так:

{displaystyle E({w_{i,j}})={cfrac {1}{2}}sum _{d=1}^{m}sum _{kin Outputs}(t_{k}^{d}-o_{k}(x_{1}^{d},...,x_{n}^{d}))^{2}}

Как модифицировать веса? Мы будем реализовывать стохастический градиентный спуск, то есть будем подправлять веса после каждого тестового примера. Нам нужно двигаться в сторону, противоположную градиенту, то есть добавлять к каждому весу {displaystyle w_{i,j}}

{displaystyle Delta w_{i,j}=-eta {frac {partial E^{d}}{partial w_{i,j}}}}

где

{displaystyle E^{d}({w_{i,j}})={cfrac {1}{2}}sum _{kin Outputs}(t_{k}^{d}-o_{k}^{d})^{2}}

Производная считается следующим образом. Пусть сначала {displaystyle jin Outputs}, то есть интересующий нас вес входит в перцептрон последнего уровня. Сначала отметим, что {displaystyle w_{i,j}} влияет на выход перцептрона только как часть суммы {displaystyle S_{j}=sum _{i}w_{i,j}x_{i,j}}, где сумма берется по входам j-го узла. Поэтому

{displaystyle {cfrac {partial E^{d}}{partial w_{i,j}}}={cfrac {partial E^{d}}{partial S_{j}}}{cfrac {partial S_{j}}{partial w_{i,j}}}=x_{i,j}{cfrac {partial E^{d}}{partial S_{j}}}}

Аналогично, {displaystyle S_{j}} влияет на общую ошибку только в рамках выхода j-го узла {displaystyle o_{j}} (напоминаем, что это выход всей сети). Поэтому

{displaystyle {cfrac {partial E^{d}}{partial S_{j}}}={cfrac {partial E^{d}}{partial o_{j}}}{cfrac {partial o_{j}}{partial S_{j}}}=left({cfrac {partial }{partial o_{j}}}{cfrac {1}{2}}sum _{kin Outputs}(t_{k}-o_{k})^{2}right)left({cfrac {partial sigma (S_{j})}{partial S_{j}}}right)=left({cfrac {1}{2}}{cfrac {partial }{partial o_{j}}}(t_{j}-o_{j})^{2}right)(o_{j}(1-o_{j}))=-o_{j}(1-o_{j})(t_{j}-o_{j}).}

Если же j-й узел — не на последнем уровне, то у него есть выходы; обозначим их через Children(j). В этом случае

{displaystyle {cfrac {partial E^{d}}{partial S_{j}}}=sum _{kin Children(j)}{cfrac {partial E^{d}}{partial S_{k}}}{cfrac {partial S_{k}}{partial S_{j}}}},

и

{displaystyle {cfrac {partial S_{k}}{partial S_{j}}}={cfrac {partial S_{k}}{partial o_{j}}}{cfrac {partial o_{j}}{partial S_{j}}}=w_{i,j}{cfrac {partial o_{j}}{partial S_{j}}}=w_{i,j}o_{j}(1-o_{j})}.

Ну а {displaystyle {cfrac {partial E^{d}}{partial S_{k}}}} — это в точности аналогичная поправка, но вычисленная для узла следующего уровня (будем обозначать ее через {displaystyle delta _{k}} — от {displaystyle Delta _{k}} она отличается отсутствием множителя {displaystyle (-eta x_{i,j})}. Поскольку мы научились вычислять поправку для узлов последнего уровня и выражать поправку для узла более низкого уровня через поправки более высокого, можно уже писать алгоритм. Именно из-за этой особенности вычисления
поправок алгоритм называется алгоритмом обратного распространения ошибки (backpropagation). Краткое резюме проделанной работы:

  • для узла последнего уровня

{displaystyle delta _{j}=-o_{j}(1-o_{j})(t_{j}-o_{j})}

  • для внутреннего узла сети

{displaystyle delta _{j}=-o_{j}(1-o_{j})sum _{kin Outputs(j)}delta _{k}w_{j,k}}

  • для всех узлов

{displaystyle Delta w_{i,j}=-eta delta _{j}x_{i,j}}

Получающийся алгоритм представлен ниже. На вход алгоритму, кроме указанных параметров, нужно также подавать в каком-нибудь формате структуру сети. На практике очень хорошие результаты показывают сети достаточно простой структуры, состоящие из двух уровней нейронов — скрытого уровня (hidden units) и нейронов-выходов (output units); каждый вход сети соединен со всеми скрытыми нейронами, а результат работы каждого скрытого нейрона подается на вход каждому из нейронов-выходов. В таком случае достаточно подавать на вход количество нейронов скрытого уровня.

Алгоритм[]

Алгоритм:
BackPropagation {displaystyle (eta ,{x_{i}^{d},t^{d}}_{i=1,d=1}^{n,m},NUMBER_OF_STEPS)}

  1. Инициализировать {displaystyle {w_{ij}}_{i,j}} маленькими случайными значениями.
  2. Повторить NUMBER_OF_STEPS раз:
    Для всех d от 1 до m:
    1. Подать {displaystyle {x_{i}^{d}}} на вход сети и подсчитать выходы {displaystyle o_{i}} каждого узла.
    2. Для всех {displaystyle kin Outputs}
      {displaystyle delta _{k}=o_{k}(1-o_{k})(t_{k}-o_{k})}.
    3. Для каждого уровня l, начиная с предпоследнего:
      Для каждого узла j уровня l вычислить
      {displaystyle delta _{j}=o_{j}(1-o_{j})sum _{kin Children(j)}delta _{k}w_{j,k}}.
    4. Для каждого ребра сети {i, j}
      {displaystyle w_{i,j}=w_{i,j}+eta delta _{j}x_{i,j}}.
  3. Выдать значения {displaystyle w_{ij}}.

Математическая интерпретация обучения нейронной сети[]

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

Обучение нейронной сети характеризуется четырьмя специфическими ограничениями, выделяющих обучение нейросетей из общих задач оптимизации: астрономическое число параметров, необходимость высокого параллелизма при обучении, многокритериальность решаемых задач, необходимость найти достаточно широкую область, в которой значения всех минимизируемых функций близки к минимальным. В остальном проблему обучения можно, как правило, сформулировать как задачу минимизации оценки. Осторожность предыдущей фразы («как правило») связана с тем, что на самом деле нам неизвестны и никогда не будут известны все возможные задачи для нейронных сетей, и, быть может, где-то в неизвестности есть задачи, которые несводимы к минимизации оценки. Минимизация оценки — сложная проблема: параметров астрономически много (для стандартных примеров, реализуемых на РС — от 100 до 1000000), адаптивный рельеф (график оценки как функции от подстраиваемых параметров) сложен, может содержать много локальных минимумов.

Недостатки алгоритма[]

Несмотря на многочисленные успешные применения обратного распространения, оно не является панацеей. Больше всего неприятностей приносит неопределенно долгий процесс обучения. В сложных задачах для обучения сети могут потребоваться дни или даже недели, она может и вообще не обучиться. Причиной может быть одна из описанных ниже.

Паралич сети[]

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

Локальные минимумы[]

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

Размер шага[]

Внимательный разбор доказательства сходимости[3] показывает, что коррекции весов предполагаются бесконечно малыми. Ясно, что это неосуществимо на практике, так как ведет к бесконечному времени обучения. Размер шага должен браться конечным, и в этом вопросе приходится опираться только на опыт. Если размер шага очень мал, то сходимость слишком медленная, если же очень велик, то может возникнуть паралич или постоянная неустойчивость. П. Д. Вассерман[7] описал адаптивный алгоритм выбора шага, автоматически корректирующий размер шага в процессе обучения. В книге А. Н. Горбаня[8] предложена разветвлённая технология оптимизации обучения.

См. также[]

  • Сигмоид
  • Многослойный перцептрон

Литература[]

  1. Уоссермен Ф. Нейрокомпьютерная техника: Теория и практика. — М.: «Мир», 1992.
  1. Хайкин С. Нейронные сети: Полный курс. Пер. с англ. Н. Н. Куссуль, А. Ю. Шелестова. 2-е изд., испр. — М.: Издательский дом Вильямс, 2008, 1103 с.

Внешние ссылки[]

  1. Копосов А.И., Щербаков И.Б., Кисленко Н.А., Кисленко О.П., Варивода Ю.В. и др. Отчет по научно-исследовательской работе «Создание аналитического обзора информационных источников по применению нейронных сетей для задач газовой технологии». — Москва: ВНИИГАЗ, 1995.
  1. Миркес Е. М., Нейроинформатика: Учеб. пособие для студентов с программами для выполнения лабораторных работ. Красноярск: ИПЦ КГТУ, 2002, 347 с. Рис. 58, табл. 59, библиогр. 379 наименований. ISBN 5-7636-0477-6

Примечания[]

  1. Werbos P. J., Beyond regression: New tools for prediction and analysis in the behavioral sciences. Ph.D. thesis, Harvard University, Cambridge, MA, 1974.
  2. Галушкин А. И. Синтез многослойных систем распознавания образов. — М.: «Энергия», 1974.
  3. 3,0 3,1 Rumelhart D.E., Hinton G.E., Williams R.J., Learning Internal Representations by Error Propagation. In: Parallel Distributed Processing, vol. 1, pp. 318—362. Cambridge, MA, MIT Press. 1986.
  4. Барцев С. И., Охонин В. А. Адаптивные сети обработки информации. Красноярск : Ин-т физики СО АН СССР, 1986. Препринт N 59Б. — 20 с.
  5. Барцев С. И., Гилев С. Е., Охонин В. А., Принцип двойственности в организации адаптивных сетей обработки информации, В кн.: Динамика химических и биологических систем. — Новосибирск: Наука, 1989. — С. 6-55.
  6. Миркес Е. М.,  — Новосибирск: Наука, Сибирская издательская фирма РАН, 1999. — 337 с. ISBN 5-02-031409-9 Другие копии онлайн: [1]
  7. Wasserman P. D. Experiments in translating Chinese characters using backpropagation. Proceedings of the Thirty-Third IEEE Computer Society International Conference.. — Washington: D. C.: Computer Society Press of the IEEE, 1988.
  8. Горбань А. Н. Обучение нейронных сетей.. — Москва: СП ПараГраф, 1990.

Многослойные перцептроны

Многослойные перцептроны

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

Пример двухслойного перцептрона с M входами и K выходами был ранее приведен на рис. 1. При необходимости использования сетей более сложной структуры добавляются новые скрытые слои или наращивается количество нейронов в скрытых слоях.

Рис. 1. Схема двухслойной искусственной нейронной сети

Количество весовых коэффициентов, настраиваемых в процессе обучения многослойного перцептрона с L скрытыми слоями по ml нейронов в каждом, рассчитывается следующим образом:

.

Для каждого нейрона сети помимо синаптических связей с элементами входного вектора настраивается связь с фиктивным единичным входом (коэффициент смещения).

Для большинства задач, решаемых с помощью многослойных перцептронов, выбор структуры нейронной сети должен осуществляться на основе следующего правила («Правила 2–5»): количество настраиваемых в процессе обучения весовых коэффициентов должно быть в 2–5 раз меньше, чем количество примеров обучающей выборки. Если это соотношение меньше 2, сеть теряет способность к обобщению обучающей информации, а при достижении 1 и меньше просто запоминает ответы для каждого обучающего примера. Если же количество обучающих примеров слишком велико для выбранной структуры сети, нейросетевая модель во многих случаях просто усредняет выходные значения для различных комбинаций входных векторов, теряя способность к корректному отклику в отдельных частных случаях и повышая величину максимальной выборочной ошибки.

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

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

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

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

Алгоритм метода обратного распространения ошибки включает следующие этапы.

1. Весовые коэффициенты многослойного перцептрона выбранной структуры инициализируются небольшими по абсолютной величине (не более M–1(L + 1)–1) случайными значениями, где L – количество скрытых слоев.

2. На входы нейронной сети подается входной вектор одного из примеров обучающей выборки. Производится прямое распространение сигналов по сети с расчетом значений выходных переменных

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

4. По полученным погрешностям рассчитываются невязки нейронов выходного слоя с учетом производных соответствующих активационных функций:

                                        (1)

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

5. В обратной последовательности (от последнего скрытого слоя к первому) рассчитываются невязки нейронов остальных слоев с учетом связывающих слои синаптических связей:

.                                 (2)

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

                                        (3)

                                     (4)

где ν – коэффициент скорости обучения.

Для первого скрытого слоя нейронов коррекция весовых коэффициентов происходит не по выходам предыдущего слоя, а по нормализованным значениям входных переменных нейронной сети:

                                        (5)

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

7. Цикл повторяется с шага 2 до выполнения одного или нескольких условий окончания:

– исчерпано заданное предельное количество эпох обучения;

– достигнут удовлетворительный уровень ошибки по всей обучающей выборке;

– не происходит уменьшения ошибки обучающей выборки на протяжении заданного предельного количества эпох обучения;

– исчерпано заданное предельное физическое время обучения.

На протяжении одной эпохи обучения последовательно или в случайном порядке предъявляются все примеры обучающей выборки, причем каждый пример должен быть предъявлен однократно.

Коэффициент скорости обучения задается положительной константой или переменной величиной (0 < v <= 1), постепенно уменьшающейся в процессе обучения нейронной сети.

Одна из особенностей метода обратного распространения ошибки заключается в том, что средние абсолютные значения невязок уменьшаются от последнего слоя нейронов к первому на порядки. Следствием этого становится практически незначительная величина изменения весовых коэффициентов первых скрытых слоев и, соответственно, требуется очень большое количество эпох обучения для значимой коррекции весов. Для устранения данного недостатка в многослойных перцептронах с более чем одним скрытым слоем можно использовать коэффициент скорости обучения, увеличивающийся от последнего скрытого слоя к первому в пределах одной эпохи обучения, в том числе, значения vl > 1./p>

Ошибки работы всей нейронной сети по обучающей и тестовой выборкам могут быть рассчитаны по соотношениям из предыдущей статьи.

Метод обратного распространения ошибки базовый для обучения многослойных перцептронов, но не единственно возможный. С одной стороны, поскольку задача обучения любых перцептронов, по сути своей, оптимизационная, с этой целью могут использоваться практически любые методы оптимизации многомерных функций. С другой стороны, оптимизируемая функция ошибки (соотношение 3) не просто многомерная, а в большинстве случаев имеет очень высокую размерность в несколько десятков или даже сотен переменных – синаптических коэффициентов, и, к тому же, может обладать очень сложным рельефом поверхности, что делает невозможным использование на практике большинства традиционных методов. В этой связи реальной заменой методов градиентного поиска, адаптированных для обучения нейронных сетей (например, метода обратного распространения ошибки или метода Левенберга–Марквардта), могут быть лишь эволюционные или многоагентные методы (генетические алгоритмы, искусственные иммунные системы и другие), относящиеся к группе методов стохастического поиска. Зачастую такие методы могут быть даже более полезны, поскольку позволяют на любой эпохе обучения оперировать значениями переменных из всей области их определения, а не останавливаются в локальных оптимумах функции ошибки как методы градиентного поиска.

Если сравнивать архитектуры многослойных и однослойных перцептронов, можно выделить несколько ее отличительных особенностей:

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

– многослойные перцептроны позволяют получить более корректное математическое описание многосвязных функциональных зависимостей с ярко выраженной нелинейностью;

– для обучения многослойных перцептронов требуется выбор более сложного алгоритма, чем для обучения однослойных перцептронов;

– обучение многослойных перцептронов занимает большее время и требует больший объем вычислительных ресурсов компьютера.

Рассмотрим пример решения задачи классификации образов с использованием двухслойного перцептрона. Пусть дана выборка данных (табл. 1), включающая 48 примеров. Используем первые 40 примеров для обучения перцептрона, а остальные 8 (выделены курсивом) – для тестирования обученной нейронной сети.

Таблица 1

Исходная выборка данных для обучения и практического
использования двухслойного перцептрона

x1

x2

x3

x4

x5

x6

y3

y4

1

–0,12

0,42

0,52

0,17

–0,64

–1,89

0

1

2

0,97

0,66

0,47

0,37

0,39

0,51

1

0

3

–2,60

–1,08

–0,24

–0,10

–0,65

–1,90

0

1

4

–1,45

–0,61

–0,41

–0,86

–1,96

–3,70

0

1

5

0,55

0,97

1,11

0,97

0,55

–0,15

0

1

6

0,54

0,53

0,57

0,64

0,75

0,90

1

0

7

0,93

0,93

1,11

1,47

2,00

2,72

1

0

8

–4,07

–2,36

–1,46

–1,36

–2,06

–3,56

0

1

9

3,66

2,25

1,73

2,08

3,31

5,42

1

0

10

4,87

2,25

0,29

–1,02

–1,67

–1,67

1

0

11

0,82

0,79

0,76

0,75

0,74

0,75

1

0

12

4,29

2,19

0,62

–0,41

–0,91

–0,88

1

0

13

–1,06

0,91

1,89

1,86

0,83

–1,20

0

1

14

–1,11

–0,49

–0,46

–1,03

–2,20

–3,97

0

1

15

0,71

–0,31

–0,85

–0,92

–0,51

0,37

1

0

16

–0,93

–0,63

–0,43

–0,35

–0,36

–0,48

0

1

17

–4,78

–2,71

–1,26

–0,46

–0,29

–0,75

0

1

18

–0,42

–0,41

–1,16

–2,67

–4,94

–7,97

0

1

x1

x2

x3

x4

x5

x6

y3

y4

19

3,25

2,21

1,60

1,42

1,67

2,35

1

0

20

–2,07

–1,40

–0,95

–0,72

–0,71

–0,92

0

1

21

4,35

1,59

–0,26

–1,20

–1,22

–0,32

1

0

22

0,68

0,13

0,04

0,42

1,27

2,58

1

0

23

–1,63

–1,58

–2,42

–4,16

–6,79

–10,31

0

1

24

0,97

0,42

0,07

–0,09

–0,05

0,18

1

0

25

–0,38

–0,47

–0,12

0,65

1,85

3,48

1

0

26

–2,19

–1,51

–1,44

–2,00

–3,16

–4,95

0

1

27

–1,16

–1,12

–1,16

–1,29

–1,49

–1,77

0

1

28

–0,80

–0,31

0,02

0,19

0,20

0,05

0

1

29

–1,97

–0,74

–0,04

0,13

–0,22

–1,10

0

1

30

1,67

1,86

1,74

1,31

0,58

–0,46

0

1

31

7,55

4,56

2,35

0,93

0,30

0,46

1

0

32

–0,79

–0,70

–0,69

–0,77

–0,93

–1,17

0

1

33

4,14

1,60

–0,24

–1,38

–1,83

–1,58

1

0

34

–0,91

–1,69

–1,64

–0,75

0,97

3,52

1

0

35

–4,79

–2,04

–0,08

1,09

1,48

1,07

0

1

36

–3,02

–2,26

–1,75

–1,51

–1,51

–1,77

0

1

37

4,36

2,67

1,82

1,82

2,66

4,35

1

0

38

2,23

1,91

2,14

2,92

4,25

6,13

1

0

39

2,47

0,50

–0,56

–0,70

0,06

1,73

1

0

40

0,36

–0,39

–0,59

–0,25

0,63

2,05

1

0

41

–2,04

–0,29

0,53

0,42

–0,61

–2,57

0

1

42

0,00

0,16

–0,13

–0,88

–2,09

–3,76

0

1

43

–2,75

–1,95

–1,40

–1,08

–0,99

–1,15

0

1

44

0,64

0,17

–0,03

0,04

0,37

0,97

1

0

45

–0,78

–1,06

–0,87

–0,22

0,89

2,48

1

0

46

–0,90

–1,00

–0,98

–0,82

–0,54

–0,13

1

0

47

0,33

1,14

1,60

1,71

1,46

0,86

0

1

48

2,20

1,84

1,98

2,62

3,75

5,37

1

0

Мин. зн.

–4,79

–2,71

–2,42

–4,16

–6,79

–10,31

0

0

Макс. зн.

7,55

4,56

2,35

2,92

4,25

6,13

1

1

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

Соответственно, рассматриваемая нейронная сеть должна иметь 6 входных переменных, кодирующих входную последовательность значений функции, и 2 выходные переменные, позволяющие идентифицировать класс оптимума (y3 – минимум, y4 – максимум): единица указывает на принадлежность классу, 0 – на ее отсутствие. При использовании «Правила 2–5» двухслойный перцептрон с указанным количеством входов и выходов, обучающийся на 40 примерах, может содержать один или два скрытых нейрона. Рассмотрим процедуру обучения нейронной сети с двумя нейронами в скрытом слое (рис. 2).

Рис. 2. Структура двухслойного перцептрона для решения задачи
классификации типа оптимального значения

Выполним линейную нормализацию входных и выходных данных исходной выборки в пределах [0, 1] с использованием соотношения 3 статьи «Способы нормализации переменных». Нормализованные значения, используемые далее для обучения и тестирования двухслойного перцептрона, представлены в табл. 2. Курсивом, как и раньше, выделены тестовые примеры.

Рис. 3. Примеры функций активации типа гистерезиса

Выходные значения в обучающей выборке имеют бинарную форму, поэтому в качестве активационной функции выходных нейронов может выступать как функция единичного скачка (рис. 3, а, б), так и сигмоидная логистическая функция (рис. 3, д) с достаточно большой величиной параметра α, приближающей ее к скачкообразной форме, как показано на рисунке из статьи «Способы нормализации переменных».

Таблица 2

Нормализованная исходная выборка данных для обучения
и практического использования двухслойного перцептрона

1

0,378

0,431

0,616

0,612

0,557

0,512

0

1

2

0,467

0,464

0,606

0,640

0,650

0,658

1

0

3

0,177

0,224

0,457

0,573

0,556

0,512

0

1

4

0,271

0,289

0,421

0,466

0,438

0,402

0

1

5

0,433

0,506

0,740

0,725

0,665

0,618

0

1

6

0,432

0,446

0,627

0,678

0,683

0,682

1

0

7

0,464

0,501

0,740

0,795

0,796

0,793

1

0

8

0,058

0,048

0,201

0,395

0,428

0,411

0

1

9

0,685

0,682

0,870

0,881

0,915

0,957

1

0

10

0,783

0,682

0,568

0,444

0,464

0,526

1

0

11

0,455

0,481

0,667

0,694

0,682

0,673

1

0

12

0,736

0,674

0,637

0,530

0,533

0,574

1

0

13

0,302

0,498

0,904

0,850

0,690

0,554

0

1

14

0,298

0,305

0,411

0,442

0,416

0,386

0

1

15

0,446

0,330

0,329

0,458

0,569

0,650

1

0

16

0,313

0,286

0,417

0,538

0,582

0,598

0

1

17

0,001

0,000

0,243

0,523

0,589

0,582

0

1

18

0,354

0,316

0,264

0,210

0,168

0,142

0

1

19

0,652

0,677

0,843

0,788

0,766

0,770

1

0

20

0,220

0,180

0,308

0,486

0,551

0,571

0

1

21

0,741

0,591

0,453

0,418

0,505

0,608

1

0

22

0,443

0,391

0,516

0,647

0,730

0,784

1

0

23

0,256

0,155

0,000

0,000

0,000

0,000

0

1

24

0,467

0,431

0,522

0,575

0,611

0,638

1

0

25

0,357

0,308

0,482

0,679

0,783

0,839

1

0

26

0,211

0,165

0,205

0,305

0,329

0,326

0

1

27

0,294

0,219

0,264

0,405

0,480

0,519

0

1

28

0,323

0,330

0,512

0,614

0,633

0,630

0

1

29

0,229

0,271

0,499

0,606

0,595

0,560

0

1

30

0,524

0,629

0,872

0,773

0,668

0,599

0

1

31

1,000

1,000

1,000

0,719

0,642

0,655

1

0

32

0,324

0,276

0,363

0,479

0,531

0,556

0

1

33

0,724

0,593

0,457

0,393

0,449

0,531

1

0

34

0,314

0,140

0,164

0,482

0,703

0,841

1

0

35

0,000

0,092

0,491

0,742

0,749

0,692

0

1

36

0,143

0,062

0,140

0,374

0,478

0,519

0

1

37

0,741

0,740

0,889

0,845

0,856

0,892

1

0

38

0,569

0,635

0,956

1,000

1,000

1,000

1

0

39

0,588

0,442

0,390

0,489

0,620

0,732

1

0

40

0,417

0,319

0,384

0,552

0,672

0,752

1

0

41

0,223

0,333

0,618

0,647

0,560

0,471

0

1

42

0,388

0,395

0,480

0,463

0,426

0,398

0

1

43

0,165

0,105

0,214

0,435

0,525

0,557

0

1

44

0,440

0,396

0,501

0,593

0,649

0,686

1

0

45

0,325

0,227

0,325

0,556

0,696

0,778

1

0

46

0,315

0,235

0,302

0,472

0,566

0,619

1

0

47

0,415

0,530

0,843

0,829

0,747

0,679

0

1

48

0,566

0,626

0,922

0,958

0,955

0,954

1

0

Для обучения двухслойного перцептрона выберем метод обратного распространения ошибки, требующий дифференцируемость активационных функций для всей области определения. Следовательно, остановим выбор активационной функции для всех нейронов, включая скрытый, на сигмоидной логистической функции с α = 2,0, а получаемый аналоговый результат расчета по нейронной сети будем округлять для корректного решения задачи классификации. Коэффициент скорости обучения примем равным 0,5.

В соответствии с алгоритмом метода обратного распространения ошибки зададимся следующими начальными значениями весовых коэффициентов:w01 = 0,03, w11 = –0,08, w21 = –0,06 w31 = 0,02, w41 = 0,02, w51 = –0,08, w61 = –0,07, w02 = 0,02, w12 = –0,05, w22 = –0,01, w32 = 0,05, w42 = –0,04, w52 = –0,01, w62 = 0,01, w03 = 0,04, w13 = 0,01, w23 = 0,04, w04 = 0,07, w14 = 0,02, w24 = 0,01.

Предъявим сети элементы нормализованного входного вектора первого обучающего примера из табл. 2. Расчет состояний и выходных значений нейронов производится с использованием выражений  и . В результате получим: s1 = –0,082, s2 = –0,0027,  = 0,459,  = 0,501,s3 = 0,065, s4 = 0,084,  = 0,532,  = 0,542.

С использованием выражения (8.1) получим погрешности выходных значений: Δ3 = –0,532, Δ4 = 0,458.

Зная выходы всех нейронов, вычислим производные активационной функции в точках, соответствующих состояниям каждого нейрона по соотношению :  y’1= 0,497, y’2 = 0,500, y’3 = 0,498, y’4 = 0,496.

Таблица 3

Изменение весовых коэффициентов двухслойного перцептрона

w01

w11

w21

w31

w41

w51

w61

w02

w12

w22

w32

w42

w52

w62

w03

w13

w23

w04

w14

w24

1

0,030

-0,080

-0,060

0,020

0,020

-0,080

-0,070

0,018

-0,051

-0,011

0,049

-0,041

-0,011

0,009

-0,093

-0,056

-0,026

0,184

0,076

0,067

2

0,021

-0,084

-0,064

0,015

0,014

-0,086

-0,076

0,011

-0,054

-0,014

0,045

-0,046

-0,016

0,005

0,046

0,013

0,043

0,037

0,004

-0,006

3

0,021

-0,084

-0,064

0,014

0,014

-0,086

-0,076

0,008

-0,054

-0,015

0,043

-0,047

-0,017

0,003

-0,087

-0,053

-0,024

0,158

0,064

0,054

4

0,026

-0,083

-0,063

0,017

0,017

-0,084

-0,074

0,012

-0,053

-0,014

0,045

-0,046

-0,016

0,004

-0,195

-0,107

-0,078

0,252

0,111

0,101

5

0,035

-0,079

-0,058

0,023

0,023

-0,078

-0,069

0,019

-0,050

-0,010

0,050

-0,041

-0,011

0,009

-0,279

-0,149

-0,120

0,326

0,147

0,138

6

0,013

-0,088

-0,068

0,010

0,008

-0,093

-0,083

0,000

-0,059

-0,019

0,038

-0,053

-0,024

-0,004

-0,132

-0,076

-0,046

0,180

0,075

0,065

7

0,003

-0,093

-0,073

0,002

0,000

-0,101

-0,092

-0,008

-0,062

-0,022

0,032

-0,060

-0,030

-0,010

0,011

-0,007

0,025

0,034

0,004

-0,008

8

0,004

-0,093

-0,073

0,002

0,000

-0,101

-0,091

-0,010

-0,062

-0,023

0,032

-0,061

-0,031

-0,011

-0,116

-0,070

-0,038

0,155

0,064

0,053

9

-0,005

-0,099

-0,079

-0,006

-0,008

-0,109

-0,100

-0,017

-0,067

-0,027

0,026

-0,066

-0,037

-0,017

0,025

-0,005

0,031

0,011

-0,002

-0,018

10

-0,005

-0,099

-0,079

-0,006

-0,008

-0,109

-0,100

-0,014

-0,064

-0,025

0,028

-0,065

-0,036

-0,016

0,145

0,052

0,090

-0,114

-0,061

-0,080

11

0,000

-0,097

-0,077

-0,002

-0,004

-0,105

-0,096

-0,005

-0,061

-0,021

0,033

-0,059

-0,030

-0,010

0,241

0,097

0,137

-0,215

-0,108

-0,129

12

0,007

-0,091

-0,072

0,002

0,000

-0,101

-0,092

0,005

-0,053

-0,014

0,040

-0,054

-0,025

-0,005

0,316

0,132

0,174

-0,294

-0,146

-0,168

13

-0,012

-0,097

-0,081

-0,015

-0,017

-0,115

-0,103

-0,020

-0,061

-0,027

0,017

-0,075

-0,042

-0,018

0,170

0,062

0,102

-0,147

-0,075

-0,095

14

-0,022

-0,100

-0,084

-0,019

-0,021

-0,119

-0,107

-0,034

-0,065

-0,031

0,011

-0,081

-0,048

-0,024

0,024

-0,009

0,029

-0,002

-0,004

-0,023

15

-0,022

-0,100

-0,085

-0,019

-0,021

-0,119

-0,107

-0,031

-0,064

-0,030

0,012

-0,080

-0,046

-0,022

0,145

0,048

0,088

-0,125

-0,062

-0,084

16

-0,030

-0,103

-0,087

-0,023

-0,025

-0,123

-0,111

-0,043

-0,067

-0,033

0,007

-0,086

-0,053

-0,029

0,001

-0,021

0,018

0,018

0,006

-0,013

17

-0,028

-0,103

-0,087

-0,022

-0,024

-0,122

-0,110

-0,045

-0,067

-0,033

0,007

-0,087

-0,054

-0,030

-0,124

-0,081

-0,044

0,141

0,065

0,047

18

-0,021

-0,100

-0,084

-0,020

-0,023

-0,121

-0,109

-0,041

-0,066

-0,032

0,008

-0,086

-0,053

-0,030

-0,224

-0,130

-0,093

0,239

0,113

0,095

19

-0,037

-0,111

-0,095

-0,034

-0,035

-0,133

-0,122

-0,054

-0,074

-0,041

-0,003

-0,097

-0,064

-0,040

-0,076

-0,065

-0,023

0,091

0,048

0,025

20

-0,031

-0,109

-0,094

-0,032

-0,033

-0,130

-0,118

-0,052

-0,074

-0,040

-0,002

-0,096

-0,062

-0,038

-0,186

-0,116

-0,076

0,199

0,099

0,078

21

-0,045

-0,120

-0,102

-0,038

-0,039

-0,137

-0,127

-0,062

-0,082

-0,047

-0,007

-0,100

-0,068

-0,045

-0,040

-0,051

-0,006

0,053

0,033

0,008

22

-0,050

-0,122

-0,104

-0,041

-0,042

-0,141

-0,131

-0,063

-0,082

-0,047

-0,008

-0,101

-0,068

-0,045

0,092

0,006

0,055

-0,080

-0,024

-0,054

23

-0,052

-0,122

-0,105

-0,041

-0,042

-0,141

-0,131

-0,071

-0,084

-0,048

-0,008

-0,101

-0,068

-0,045

-0,046

-0,062

-0,013

0,058

0,044

0,014

24

-0,058

-0,125

-0,107

-0,044

-0,045

-0,145

-0,135

-0,072

-0,085

-0,049

-0,008

-0,102

-0,069

-0,047

0,087

-0,004

0,049

-0,076

-0,015

-0,048

Итог

5,133

-6,131

-1,962

3,254

2,118

-2,005

-5,730

4,251

-5,088

-1,598

2,685

1,606

-1,733

-4,832

1,886

-2,721

-2,494

-1,886

2,712

2,506

По погрешностям и производным активационной функции нейронов выходного слоя рассчитаем их невязки по соотношению (1): δ3 = –0,265, δ4 = 0,227, а с учетом этих значений по соотношению (2) – невязки скрытых нейронов: δ1 = 0,0009, δ2 = –0,0042.

Зная все невязки, выполним коррекцию весовых коэффициентов выходных нейронов по соотношениям (3) и (4) и скрытых нейронов по соотношениям (3) и (5). Новые значения весов записаны в первой строке данных в табл. 3.

В целом, в табл. 3 показано изменение весовых коэффициентов в ходе их коррекции при последовательном предъявлении 24 обучающих примеров первой эпохи обучения. В последней строке показаны значения весовых коэффициентов по окончании 100-й эпохи обучения.

Для обученной нейронной сети проведено тестирование на обучающей и тестовой выборках. Из 40 примеров обучающей выборки правильно оказались распознаны 38 примеров, что соответствует 95 % случаев верной классификации. Ошибки классификации выявлены для примеров №№ 6 и 11. Анализ входных векторов этих примеров показывает, что оптимальное значение в них выражено крайне слабо (отличается на 0,01 от одной из соседних точек) и находится близко к левой или правой границам. Учитывая эти особенности примеров с ошибками, а также ограниченный объем использованной выборки и простоту структуры двухслойного перцептрона, следует признать полученный результат тестирования очень хорошим.

Для тестовой выборки получены правильные результаты классификации в 7 случаях из 8 (табл. 4), что составляет 87,5 %.

Таблица 4

Результаты классификации тестовых примеров


примера

Корректность
классификации

41

0

1

0

1

+

42

0

1

0

1

+

43

0

1

0

1

+

44

1

0

1

0

+

45

1

0

1

0

+

46

1

0

0

1

47

0

1

0

1

+

48

1

0

1

0

+

Единственная ошибка для примера № 46 не может объясняться теми же причинами, что для ошибок обучающей выборки. В данном случае очевидная причина – отсутствие примеров с близким характером и диапазоном изменения значений входных переменных в обучающей выборке. Будь обучающая выборка более объемной, этой ошибки, скорее всего, удалось бы избежать.


Если у вас есть статья, заметка или обзор, которыми вы хотите поделиться с аудиторией нашего сайта, присылайте информацию на: neuronus.com@yandex.ru.

Формулы обучения и обратное распространение для многослойных перцептронов

Добавлено 8 января 2020 в 18:22

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

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

Мы достигли того момента, когда нам нужно тщательно рассмотреть фундаментальную тему теории нейронных сетей: вычислительную процедуру, которая позволяет нам точно настроить веса многослойного перцептрона (MLP, multilayer perceptron), чтобы он мог точно классифицировать входные выборки. Это приведет нас к концепции «обратного распространения», которая также является важным аспектом проектирования нейронных сетей.

Обновление весов

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

Формулы, содержащиеся в этой статье, основаны на выводах и объяснениях, предоставленных доктором Дастином Стэнсбери в этом посте в блоге. Его объяснение – лучшее, что я нашел, и это отличное место для начала, если вы хотите углубиться в математические и базовые детали градиентного спуска и обратного распространения.

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

Рисунок 1 Архитектура рассматриваемой нейронной сети

Рисунок 1 – Архитектура рассматриваемой нейронной сети

Терминология

Эта тема быстро станет неуправляемой, если мы не будем придерживаться четкой терминологии. Я буду использовать следующие термины:

  • Преактивация (сокращенно (S_{preA})): Это относится к сигналу (на самом деле это просто число в контексте одной обучающей итерации), который служит входным для функции активации узла. Он рассчитывается путем выполнения скалярного произведения массива, содержащего веса, и массива, содержащего значения, исходящие из узлов в предыдущем слое. Скалярное произведение эквивалентно выполнению поэлементного умножения двух массивов и затем суммированию элементов массив, полученного в результате этого умножения.
  • Постактивация (сокращенно (S_{postA})): Это относится к сигналу (опять же, просто число в контексте отдельной итерации), который выходит из узла. Он создается путем применения функции активации к сигналу преактивации. Я предпочитаю обозначение функции активации (f_{A}()), это логистическая сигмоидная функция.
  • В коде на Python вы увидите весовые матрицы, помеченные как ItoH и HtoO. Я использую эти идентификаторы, потому что фраза «веса скрытого слоя» будет неоднозначной – это будут веса, которые применяются до или после скрытого слоя? В моей схеме ItoH указывает веса, которые применяются к значениям, передаваемым из входных узлов в скрытые узлы (ItoHInput toHidden), а HtoO определяет веса, которые применяются к значениям, передаваемым из скрытых узлов в выходной узел (HtoOHidden toOutput).
  • Правильное выходное значение для обучающей выборки называется целью и обозначается буквой T (Target).
  • Скорость обучения сокращенно обозначается как LR (Learning Rate).
  • Конечная ошибка (FEFinal Error) – это разница между сигналом постактивации от выходного узла ((S_{postA,O})) и целью, рассчитывается как (FE = S_{postA,O}-T).
  • Сигнал ошибки ((S_{ошибки})) – это последняя ошибка, распространяемая обратно к скрытому слою через функцию активации выходного узла.
  • Градиент представляет вклад заданного веса в сигнал ошибки. Мы изменяем веса, вычитая этот вклад (умноженный на скорость обучения, если необходимо).

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

Рисунок 2 Демонстрация терминов на диаграмме конфигурации нейросети

Рисунок 2 – Демонстрация терминов на диаграмме конфигурации нейросети

Формулы обновления весовых коэффициентов получаются путем взятия частной производной функции ошибки (мы используем среднюю квадратичную ошибку) относительно веса, который необходимо изменить. Если вы хотите посмотреть математику, обратитесь к посту доктора Стэнсбери; в данной статье мы перейдем непосредственно к результатам. Для весов от скрытых узлов к выходным узлам (HtoO) мы имеем следующее:

[S_{ошибки} = FE times {f_A}'(S_{preA,O})]

[градиент_{HtoO}= S_{ошибки}times S_{postA,H}]

[вес_{HtoO} = вес_{HtoO}- (LR times градиент_{HtoO})]

Мы рассчитываем сигнал ошибки путем умножения конечной ошибки на значение, которое получается, когда мы берем производную функции активации по сигналу преактивации, доставляемому на выходной узел (обратите внимание на штрих, который означает первую производную, в ({f_A}'(S_{preA,O}))). Затем вычисляется градиент путем умножения сигнала ошибки на сигнал постактивации из скрытого слоя. Наконец, мы обновляем вес, вычитая этот градиент из текущего значения веса, и, если мы хотим изменить размер шага, то можем умножить градиент на скорость обучения.

Для весов от входных узлов к скрытым узлам (ItoH) мы имеем следующее:

[градиент_{ItoH} = FE times {f_A}'(S_{preA,O})times вес_{HtoO} times {f_A}'(S_{preA,H}) times вход]

[Rightarrow градиент_{ItoH} = S_{ошибки} times вес_{HtoO} times {f_A}'(S_{preA,H})times вход]

[вес_{ItoH} = вес_{ItoH} — (LR times градиент_{ItoH})]

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

Обратное распространение

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

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

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

Заключение

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

Теги

MLP, Multilayer Perceptron / Многослойный перцептронИскусственный интеллект, ИИ / Artificial Intelligence, AIМашинное обучение / Machine LearningНейросеть / Нейронная сетьПерцептрон / PerceptronСкорость обучения

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

Алгоритм обратного распространения
ошибки

Эффективный алгоритм обучения
многослойных персептронов, открывший путь их
широкому практическому применению, стал
известен только в 1986 г. благодаря публикациям Д.Румельхарта,
Г.Хилтона
и Р.Вильямса. Идея этого
алгоритма заключается в том, что ошибки нейронов
выходного слоя используются для вычисления
ошибок нейронов, расположенных в скрытых слоях.
Значения ошибок как бы распространяются от
выходного слоя нейронов вовнутрь сети от
последующих нейронных слоев к предыдущим. Отсюда
название метода: алгоритм обратного
распространения ошибки
(back propagation).

Интересно отметить, что этот простой и
изящный алгоритм был предложен несколько ранее в
работах американских же ученых А.Паркера, А.Ле-Кана
и П.Вербоса, но тогда на него не
обратили внимания. Остались незамеченными и
работы советских ученых, еще раньше
разрабатывавших подобные алгоритмы в своих
засекреченных институтах и успешно применявших
их при построении систем управления объектами
военного назначения.

Рассмотрим идею алгоритма обратного
рас­пространения ошибки, попытавшись обобщить
дельта-правило на случай обучения двухслойного
персептрона, имеющего N входов, I выходов и
скрытый слой из J нейронов (рис. 9). Этот
персептрон на самом деле имеет три слоя, однако в
литературе его называют двухслойным, поскольку
нейроны входного слоя имеют всего один вход, не
имеют синаптических весов и не выполняют
суммирования входных сигналов, а лишь передают
один-единственный входной сигнал нейронам
следующего слоя.

Алгоритм корректировки синаптических
весов нейронов выходного слоя оставим таким же,
как для однослойного персептрона (см. обобщенное
дельта-правило: формулы (22)–(24), заменив xj
на yj ):

Рис. 9. Двухслойный персептрон с N
выходами,
I выходамии скрытым слоем из J нейронов

Синаптические веса нейронов скрытого
слоя попытаемся корректировать с помощью все тех
же формул (22)–(24), в которых индекс i заменим на
j, а индекс j заменим на индекс n:

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

Итак, для скрытого слоя окончательно
имеем

Используя эту идею, несложно расписать
алгоритм обратного распространения ошибки для
обучения персептрона, имеющего произвольное
количество скрытых слоев. Однако в краткой
газетной публикации мы воздержимся от этого,
отослав заинтересовавшегося читателя, например,
к книге Л.Н. Ясницкого “Введение в искусственный
интеллект”. М.: Академия, 2008.

Рекомендации по проведению урока

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

Нужно обязательно пообещать
школьникам, что они будут пользоваться
алгоритмом обратного распространения ошибки при
выполнении практически всех последующих
лабораторных работ. С помощью этого алгоритма
они обучат многослойный персептрон моделировать
все логические функции, в том числе и злополучную
функцию “Исключающее ИЛИ”. Они обучат
персептрон ставить медицинские диагнозы
некоторых заболеваний, таких, как грипп, ОРЗ и
пневмония. Они обучат персептрон таблицам
умножения и сложения, обучат прогнозировать
результаты президентских выборов и результаты
автомобильных гонок, предсказывать, каким завтра
и через неделю будет курс доллара и евро,
определять, каким клиентам банка можно выдавать
кредит, а каким нет, какая фирма является
надежной, а какая скоро обанкротится. Они обучат
персептроны решать множество проблем,
встречающихся в жизни, крупных и мелких,
житейских и связанных с их будущей работой и
карьерным ростом.

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

Вопросы и задания с ответами и
комментариями

1. Объясните, в чем состоит идея
алгоритма обратного распространения ошибки.
Отражает ли название алгоритма его идею?

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

2. Какую роль в методе обратного
распространения ошибки выполняет коэффициент
скорости обучения h?

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

3. Попробуйте запрограммировать
алгоритм обратного распространения ошибки на
каком-либо алгоритмическом языке.

Комментарий: Рекомендуется
использовать формулы алгоритма обратного
распространения ошибки (29)–(36).

4. Сколько алгоритмов обучения
нейронных сетей вам известно? Назовите их и
охарактеризуйте их возможности.

Ответ: Правила Хебба,
дельта-правило, обобщенное дельта-правило,
алгоритм обратного распространения ошибки —
всего четыре алгоритма. Первым алгоритмом,
который мы изучали, были правила Хебба,
предназначенные для обучения однослойного
персептрона с нейронами, имеющими ступенчатые
активационные функции. Затем было введено
понятие нейронной ошибки как разницы между
требуемым выходом нейрона di и его
реальным значением yi. В результате
правила Хебба были обобщены в виде алгоритма
дельта-правила. В итерационных формулах
алгоритма дельта-правила появился коэффициент
скорости обучения , позволяющий влиять на
величину итерационного шага. Затем была
предложена сигмоидная активационная функция и
было введено понятие квадратичной ошибки
обучения персептрона. В результате появилось
обобщенное дельта-правило, реализующее метод
наискорейшего спуска и позволяющее работать не
только с бинарными, но и с непрерывными
сигналами. Алгоритм обратного распространения
ошибки является следующим обобщением
обобщенного дельта-правила и позволяет обучать
не только однослойные, но и многослойные
персептроны.

Лабораторная работа № 5:
“Двухслойный персептрон”


Школьникам нужно напомнить о
лабораторной работе № 1, выполняя которую они
подбирали параметры однонейронного персептрона,
пытались моделировать логические функции “И”,
“ИЛИ” и “Исключающее ИЛИ”. Для первых двух
функций их опыт удался, а для третьей — нет.
Причина неудачи была выяснена на уроке,
содержание которого полезно напомнить. Следует
начертить на доске табл. 6 и нарисовать (или
попросить школьников нарисовать) графики рис.
6–7. То есть надо вспомнить геометрическую
интерпретацию работы нейрона.

После этого предложите школьникам еще
раз запустить и попытаться выполнить
лабораторную работу № 1, но теперь уже с
пониманием геометрических рисунков в правой
нижней части рабочего окна: “График выхода
нейрона”. Это и есть графики, которые вы только
что рисовали на доске, но они рисуются
компьютером, причем как в плоском (внизу справа),
так и в объемном (внизу по центру) видах, и каждое
изменение параметров нейрона немедленно
отражается на этих построениях: меняется
положение пороговой прямой — линии,
отделяющей возбужденное состояние нейрона от
невозбужденного. Области рисунков,
соответствующие возбужденному состоянию
нейрона, закрашены красным цветом, а области,
соответствующие невозбужденному состоянию, —
зеленым цветом.

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


Рис. 10. Рабочее окно 5-й лабораторной
работы

Как и прежние, эта лабораторная работа
построена в виде диалога компьютера с учеником и
практически не требует вмешательства
преподавателя или лаборанта. Надо только дать
команду, чтобы школьники запустили 5-ю
лабораторную работу и выполняли задания,
появляющиеся в окне “Протокол выполнения”.

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

План выполнения лабораторной работы
построен так, что школьники должны подобрать по
два удачных набора параметров персептрона для
каждой моделируемой функции: “И”, “ИЛИ”,
“Исключающее ИЛИ”. Кроме того, при
моделировании последней функции школьникам
дается задание проверить, получится ли решение
задачи в случае использования линейной функции
активации (ответ должен быть отрицательным),
функции-ступеньки (ответ положительный) и
сигмоиды (ответ положительный), а также в случае
применения однослойного персептрона (ответ
отрицательный). Школьникам также дается задание
исследовать влияние коэффициента скорости
обучения на сходимость процесса обучения. Для
каждой функции активации (ступеньки, сигмоиды)
они должны получить кривые сходимости при разных
коэффициентах h, каждую такую
кривую скопировать (путем нажатия клавиши ) и подготовить
отчетный документ, например, с помощью
текстового редактора Microsoft Word, выявив с помощью
этих кривых наилучшее для данной задачи значение
коэффициента скорости обучения h.

В ходе выполнения работы школьникам
полезно задать вопрос, почему один и тот же
персептрон при повторных запусках дает разные
результаты: процесс обучения за одно и то же
количество эпох в некоторых случаях приводит к
решению задачи, а в некоторых случаях — нет?

В ответ желательно услышать следующее.
При каждом новом запуске процесса обучения
персептрона значения его синаптических весов
присваиваются датчиком случайных чисел. Эти
значения могут случайно оказаться удачными, т.е.
располагаться вблизи минимума функции ошибки e = e(wij) (см. рис.
3), и тогда процесс обучения персептрона быстро
приведет к решению задачи. Если же начальные
значения синаптических весов находятся далеко
от глобального минимума функции ошибки, то
процесс обучения может застрять в каком-нибудь
локальном минимуме, не обеспечивающем решение
задачи.

Неудачи выполнения заданий
лабораторной работы могут быть вызваны и тем, что
школьники по своей инициативе увеличат скорость
обучения до слишком больших величин (значительно
больших изначально заданного значения 0,1), что
приведет к нарушению сходимости. Кроме того,
иногда просто может не хватить числа эпох
обучения, которое мы рекомендуем увеличить до 1000
и более.

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

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

— количества нейронов на скрытом слое,

— количество эпох обучения,

— коэффициента скорости обучения,

— вида активационных функций
нейронов.

ВОЗМОЖНОСТИ И СФЕРЫ ПРИМЕНЕНИЯ
ПЕРСЕПТРОНОВ

Новый способ построения математических
моделей

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

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

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

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

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

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

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

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

Создание космических ракет и сами
космические полеты были невозможны без
компьютерных экспериментов, выполняемых
методами математического моделирования.

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

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

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

Особенно эффективным этот новый
инструмент оказался при построении
математических моделей в плохо формализуемых
предметных областях, таких, к каким, например,
относится медицина.

Диагностика в медицине

В средствах информации и научной
литературе имеются сообщения об удачном опыте
применения нейронных сетей для медицинской
диагностики. Рассмотрим, как строятся и
обучаются такие сети.

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

Задавшись целью построить
нейросетевую математическую модель
врача-диагноста, мы прежде всего должны
определиться с входным вектором X и
выходным вектором D, задав их размерности,
и условиться о содержимом каждого компонента. В
векторе X логично предусмотреть
параметры, которые врач выясняет у больного.
Например, в качестве компоненты можно задать
дату рождения, в качестве — закодировать пол
(например, нулем или единицей), в качестве — вес
больного, — артериальное давление, —
температуру тела и т.д. Нелишне учесть также цвет
глаз, цвет волос, знак зодиака и другие данные,
определяющие особенности организма и,
следовательно, влияющие на вероятность
возникновения тех или иных заболеваний. В
выходном векторе D следует закодировать
все возможные диагнозы болезней, которые
способен обнаружить врач.

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

Таким образом, выходной вектор
персептрона D будет состоять из множества
нулей и одной или нескольких единиц (если
болезней несколько). Однако диагнозы болезней
лучше кодировать по пяти-, десяти- или
стобалльной шкале. Тогда на этапе подготовки
обучающего множества примеров с помощью баллов
можно будет учитывать степень уверенности врача
в правильности его диагноза или степень
развитости заболевания, а на этапе эксплуатации
— вероятность правильного ответа персептрона.
Например, если врач подозревает, что у больного
инфаркт миокарда, знает, что у больного нет
порока сердца и уверен, что больной страдает
ишемической болезнью сердца, то он может указать:
d1 = 20%, d2 = 0%, d3 = 100%.

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

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

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

В заключение еще раз укажем причины, на
основании которых можно ожидать, что
искусственный врач может превзойти
натурального.

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

Коротко о главном

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

Рекомендации по проведению урока

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

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

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

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

На примере решения этой задачи можно
проследить всю последовательность применения
метода математического моделирования.

1. Вводятся упрощающие гипотезы:
пренебрегается скоростью ветра, вращением земли,
высотой над уровнем моря и пр.

2. На основании законов природы
составляются уравнения, описывающие поведение
предметной области.

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

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

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

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

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

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

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

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

В заключение можно спросить
школьников, в каком виде персептрон хранит
медицинские знания в своей памяти. Ответ все тот
же — в виде сил синаптических связей.

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

Вопросы и задания с ответами и
комментариями

1. Когда возник метод математического
моделирования?

Ответ:Метод математического
моделирования возник одновременно с
математикой. Любая математическая формула — это
математическая модель какого-либо объекта,
процесса, явления, предназначенная для получения
полезной информации об этом объекте.

2. Приведите примеры применения метода
математического моделирования.

Ответ:

1) Формула площади круга является
математической моделью круга. С помощью нее
можно вычислить площадь круга, можно графически
построить зависимость площади круга от его
радиуса.

2) Наиболее ярким примером применения
метода математического моделирования является
открытие явления “ядерной зимы” — резкое
понижение температуры поверхности планеты в
случае произведения массовых ядерных взрывов.
Это явление еще никто никогда не наблюдал в
действительности, но его открытие повлияло на
политику великих держав, способствовало
прекращению гонки вооружений.

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

3. Чем методика построения
математических моделей на основе
нейротехнологий отличается от традиционной?

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

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

Ответ: См. материалы урока.

5. Сколько ваш персептрон должен иметь
входов и выходов?

Ответ: Количество входов
персептрона должно сов­падать с количеством
параметров и симптомов, которые использует врач
при постановке диагнозов заболеваний.
Количество выходов персептрона должно совпадать
с количеством диагнозов, которые может поставить
моделируемый вами врач.

6. Как быть, если врач-эксперт не совсем
уверен в правильности выставляемого им диагноза?

Ответ: Чтобы это учесть, надо
кодировать диагнозы заболеваний не в виде нулей
и единичек, а по 100-балльной шкале. Тогда с помощью
баллов можно учитывать степень уверенности
врача. Например, если врач подозревает, что у
больного инфаркт миокарда, знает, что у больного
нет порока сердца и уверен, что больной страдает
ишемической болезнью сердца, то он может указать:
d1 = 20%, d2 = 0%, d3 = 100%.

7. Почему искусственный нейросетевой
врач может превзойти обычного врача по качеству
постановки диагнозов заболеваний?

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

— Компьютерная диагностическая
система в отличие от врача-диагноста работает
всегда стабильно и не подвержена таким явлениям,
как усталость, плохое настроение, плохое
самочувствие, и другим субъективным факторам.

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

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

8. Откуда нейросетевой врач получает
медицинские знания и в каком виде он их хранит в
своей памяти?

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

Лабораторная работа № 6:
“Медицинская диагностика — один диагноз”.

Лабораторная работа № 7: “Медицинская
диагностика — несколько диагнозов”

Учащимся следует напомнить, что темой
последнего урока было моделирование работы
врача-кардиолога. Был рассмотрен вопрос о том,
как научить персептрон ставить диагнозы
сердечных заболеваний.

Теперь школьникам предоставляется
возможность обучить персептрон ставить диагнозы
простудных заболеваний. Сначала персептрон
должен научиться определять, болен или не болен
пациент только одним-единственным заболеванием
— гриппом (лабораторная работа № 6), а затем
обучить его ставить один из трех диагнозов:
“Пневмония”, “ОРЗ”, “Здоров” (лабораторная
работа № 7).

При выполнении обеих лабораторных
работ школьники сами выбирают несколько
симптомов, которые, по их мнению, следует
принимать во внимание при постановке диагноза.
Выбранные симптомы они отмечают галочками. При
этом автоматически проектируется нейронная сеть
— персептрон, имеющий ровно столько входов,
сколько симптомов выбрал школьник. Структура
сети показывается в правой нижней части рабочего
окна (рис. 11, 12). Затем школьники формируют
множество обучающих примеров, используя свои
немногие, но собственные медицинские знания.
Например, если они указывают, что у пациента
симптомы отсутствуют или проявлены в слабой
форме, то такому пациенту они ставят диагноз
“Здоров”. Пациенту, у которого высокая
температура, сильный насморк, головные боли,
болезненность горла и хрипы в легких, они ставят
диагноз “Пневмония” и т.д.

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

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

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

Сообщите школьникам, что элективным
курсом “Искусственный интеллект”
предусмат­ривается выполнение самостоятельных
(курсовых) работ, что темы курсовых работ
школьники могут выбирать сами, исходя из
собственных наклонностей, интересов,
возможностей.

Создание интеллектуальной системы медицинской
диагностики — это одна из таких тем, однако для
ее выполнения, для создания множества обучающих
примеров, школьникам необходим контакт с
профессиональными медиками. Если у кого-то из
школьников такой контакт есть, например, через
родителей-врачей, родственников и знакомых,
которые согласятся помочь и, возможно, сами
заинтересуются темой, то школьникам можно смело
браться за создание медицинской диагностической
системы. Инструмент для создания персептронов с
любым количеством входов (симптомов заболеваний)
и выходов (диагнозов заболеваний) школьники
получат при выполнении следующей лабораторной
работы № 8.

Рис. 11. Рабочее окно лабораторной
работы № 6

Рис. 12. Рабочее окно лабораторной
работы № 7


* Решение этой задачи методом
нейросетевого моделирования планируется дать в
последующем изложении.

Метод обратного распространения ошибок (англ. backpropagation) — метод вычисления градиента, который используется при обновлении весов в нейронной сети.

Содержание

  • 1 Обучение как задача оптимизации
  • 2 Дифференцирование для однослойной сети
    • 2.1 Находим производную ошибки
  • 3 Алгоритм
  • 4 Недостатки алгоритма
    • 4.1 Паралич сети
    • 4.2 Локальные минимумы
  • 5 Примечания
  • 6 См. также
  • 7 Источники информации

Обучение как задача оптимизации

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

Простая нейронная сеть с двумя входными вершинами и одной выходной

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

где ошибка.

В качестве примера, обучим сеть на объекте , таким образом, значения и равны 1, а равно 0. Построим график зависимости ошибки от действительного ответа , его результатом будет парабола. Минимум параболы соответствует ответу , минимизирующему . Если тренировочный объект один, минимум касается горизонтальной оси, следовательно ошибка будет нулевая и сеть может выдать ответ равный ожидаемому ответу . Следовательно, задача преобразования входных значений в выходные может быть сведена к задаче оптимизации, заключающейся в поиске функции, которая даст минимальную ошибку.

График ошибки для нейрона с линейной функцией активации и одним тренировочным объектом

В таком случае, выходное значение нейрона — взвешенная сумма всех его входных значений:

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

Дифференцирование для однослойной сети

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

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

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

Для каждого нейрона , его выходное значение определено как

Входные значения нейрона — это взвешенная сумма выходных значений предыдущих нейронов. Если нейрон в первом слое после входного, то входного слоя — это просто входные значения сети. Количество входных значений нейрона . Переменная обозначает вес на ребре между нейроном предыдущего слоя и нейроном текущего слоя.

Функция активации нелинейна и дифференцируема. Одна из распространенных функций активации — сигмоида:

у нее удобная производная:

Находим производную ошибки

Вычисление частной производной ошибки по весам выполняется с помощью цепного правила:

Только одно слагаемое в зависит от , так что

Если нейрон в первом слое после входного, то — это просто .

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

По этой причине данный метод требует дифференцируемой функции активации. (Тем не менее, функция ReLU стала достаточно популярной в последнее время, хоть и не дифференцируема в 0)

Первый множитель легко вычислим, если нейрон находится в выходном слое, ведь в таком случае и

Тем не менее, если произвольный внутренний слой сети, нахождение производной по менее очевидно.

Если рассмотреть как функцию, берущую на вход все нейроны получающие на вход значение нейрона ,

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

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

Если собрать все месте:

и

Чтобы обновить вес используя градиентный спуск, нужно выбрать скорость обучения, . Изменение в весах должно отражать влияние на увеличение или уменьшение в . Если , увеличение увеличивает ; наоборот, если , увеличение уменьшает . Новый добавлен к старым весам, и произведение скорости обучения на градиент, умноженный на , гарантирует, что изменения будут всегда уменьшать . Другими словами, в следующем уравнении, всегда изменяет в такую сторону, что уменьшается:

Алгоритм

  • — скорость обучения
  • — коэффициент инерциальности для сглаживания резких скачков при перемещении по поверхности целевой функции
  • — обучающее множество
  • — количество повторений
  • — функция, подающая x на вход сети и возвращающая выходные значения всех ее узлов
  • — количество слоев в сети
  • — множество нейронов в слое i
  • — множество нейронов в выходном слое
fun BackPropagation:
   init 
   repeat :
       for  =  to :
            =  
           for :
                = 
           for  =  to :
               for :
                    = 
           for :
                = 
                = 
   return 

Недостатки алгоритма

Несмотря на многочисленные успешные применения обратного распространения, оно не является универсальным решением. Больше всего неприятностей приносит неопределённо долгий процесс обучения. В сложных задачах для обучения сети могут потребоваться дни или даже недели, она может и вообще не обучиться. Причиной может быть одна из описанных ниже.

Градиентный спуск может найти локальный минимум вместо глобального

Паралич сети

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

Локальные минимумы

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

Примечания

  • Алгоритм обучения многослойной нейронной сети методом обратного распространения ошибки
  • Neural Nets
  • Understanding backpropagation

См. также

  • Нейронные сети, перцептрон
  • Стохастический градиентный спуск
  • Настройка глубокой сети
  • Практики реализации нейронных сетей

Источники информации

  • https://en.wikipedia.org/wiki/Backpropagation
  • https://ru.wikipedia.org/wiki/Метод_обратного_распространения_ошибки

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Алфавит документ каталог километр портфель языковая ошибка
  • Алгоритм обратного распределения ошибки