English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
preview
Матрицы и векторы в MQL5: функции активации

Матрицы и векторы в MQL5: функции активации

MetaTrader 5Примеры | 1 июня 2023, 13:28
1 354 1
MetaQuotes
MetaQuotes

Введение

На тему обучения нейронных сетей уже опубликовано огромное количество книг и статей. И на нашем ресурсе MQL5.com участники сообщества также опубликовали множество материалов, в том числе несколько серий статей.

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


Коротко

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


Иллюстрации

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

Сохранение png-файла


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

Демо-скрипт со всеми функциями активации

График функции активации отрисовывается линией синего цвета, график производных функции - красного.



Функция активации Exponential Linear Unit (ELU)

Вычисление функции

   if(x >= 0)
      f = x;
   else
      f = alpha*(exp(x) - 1);

Вычисление производной

   if(x >= 0)
      d = 1;
   else
      d = alpha*exp(x);

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

   vector_a.Activation(vector_c,AF_ELU);      // вызов с умолчательным параметром

Функция активации ELU

   vector_a.Activation(vector_c,AF_ELU,3.0);  // вызов с параметром alpha=3.0

Функция активации ELU с параметром alpha=3.0


Функция активации Exponential

Вычисление функции

   f = exp(x);

Производной функции exp является эта же функция exp.

Как видно из формулы вычисления, у функции активации Exponential нет дополнительных параметров

vector_a.Activation(vector_c,AF_EXP);

Функция активации Exponential


Функция активации Gaussian Error Linear Unit (GELU)

Вычисление функции

   f = 0.5*x*(1 + tanh(sqrt(M_2_PI)*(x+0.044715*pow(x,3)));

Вычисление производной

   double x_3 = pow(x,3);
   double tmp = cosh(0.0356074*x + 0.797885*x);
   d = 0.5*tanh(0.0356774*x_3 + 0.398942*x)+(0.535161*x_3 + 0.398942*x)/(tmp*tmp) + 0.5;

Дополнительных параметров нет.

vector_a.Activation(vector_c,AF_GELU);

Функция активации GELU


Функция активации Hard Sigmoid

Вычисление функции

   if(x < -2.5)
      f = 0;
   else
     {
      if(x > 2.5)
         f = 1;
      else
         f = 0.2*x + 0.5;
     }

Вычисление производной

   if(x < -2.5)
      d = 0;
   else
     {
      if(x > 2.5)
         d = 0;
      else
         d = 0.2;
     }

Дополнительных парметров нет.

vector_a.Activation(vector_c,AF_HARD_SIGMOID);

Функция активации Hard Sigmoid


Функция активации Linear

Вычисление функции

   f = alpha*x + beta

Вычисление производной

   d = alpha

Дополнительные параметры alpha = 1.0 и beta = 0.0

vector_a.Activation(vector_c,AF_LINEAR);         // вызов с умолчательными параметрами

Функция активации Linear

vector_a.Activation(vector_c,AF_LINEAR,2.0,5.0);  // вызов с параметрами alpha=2.0 и beta=5.0

Функция активации Linear, alpha=2, beta=5


Функция активации Leaky Rectified Linear Unit (LReLU)

Вычисление функции

   if(x >= 0)
      f = x;
   else
      f = alpha * x;

Вычисление производной

   if(x >= 0)
      d = 1;
   else
      d = alpha;

Эта функция предполагает дополнительный параметр alpha. Если он не указан, то его значение по умолчанию равно 0. 3

   vector_a.Activation(vector_c,AF_LRELU);      // вызов с умолчательным параметром

Функция активации LReLU

vector_a.Activation(vector_c,AF_LRELU,0.1);  // вызов с параметром alpha=0.1

Функция активации LReLU с параметром alpha=0.1


Функция активации Rectified Linear Unit (ReLU)

Вычисление функции

   if(alpha==0)
     {
      if(x > 0)
         f = x;
      else
         f = 0;
     }
   else
     {
      if(x >= max_value)
         f = x;
      else
         f = alpha * (x - treshold);
     }

Вычисление производной

   if(alpha==0)
     {
      if(x > 0)
         d = 1;
      else
         d = 0;
     }
   else
     {
      if(x >= max_value)
         d = 1;
      else
         d = alpha;
     }

Дополнительные параметры alpha=0, max_value=0 и treshold=0.

vector_a.Activation(vector_c,AF_RELU);         // вызов с умолчательными параметрами

Функция активации ReLU

vector_a.Activation(vector_c,AF_RELU,2.0,0.5);      // вызов с параметрами alpha=2.0 и max_value=0.5

Функция активации ReLU, alpha=2, max_value=0.5

vector_a.Activation(vector_c,AF_RELU,2.0,0.5,1.0);  // вызов с параметрами alpha=2.0, max_value=0.5 и treshold=1.0

Функция активации ReLU, alpha=2, max_value=0.5, treshold=1


Функция активации Scaled Exponential Linear Unit (SELU)

Вычисление функции

   if(x >= 0)
      f = scale * x;
   else
      f = scale * alpha * (exp(x) - 1);

где scale = 1.05070098, alpha = 1.67326324

Вычисление производной

   if(x >= 0)
      d = scale;
   else
      d = scale * alpha * exp(x);

Дополнительных параметров нет.

vector_a.Activation(vector_c,AF_SELU);

Функция активации SELU


Функция активации Sigmoid

Вычисление функции

   f = 1 / (1 + exp(-x));

Вычисление производной

   d = exp(x) / pow(exp(x) + 1, 2);

Дополнительных параметров нет.

vector_a.Activation(vector_c,AF_SIGMOID);

Функция активации Sigmoid



Функция активации Softplus

Вычисление функции

   f = log(exp(x) + 1);

Вычисление производной

   d = exp(x) / (exp(x) + 1);

Дополнительных параметров нет.

vector_a.Activation(vector_c,AF_SOFTPLUS);

Функция активации Softplus


Функция активации Softsign

Вычисление функции

   f = x / (|x| + 1)

Вычисление производной

   d = 1 / (|x| + 1)^2

Дополнительных параметров нет.

vector_a.Activation(vector_c,AF_SOFTSIGN);

Функция активации Softsign


Функция активации Swish

Вычисление функции

   f = x / (1 + exp(-x*beta));

Вычисление призводной

   double tmp = exp(beta*x);
   d = tmp*(beta*x + tmp + 1) / pow(tmp+1, 2);

Дополнительный параметр beta = 1

vector_a.Activation(vector_c,AF_SWISH);         // вызов с умолчательным параметром

Функция активации Swish

vector_a.Activation(vector_c,AF_SWISH,2.0);     // вызов с параметром beta = 2.0

Функция активации Swish, beta=2

vector_a.Activation(vector_c,AF_SWISH,0.5);   // вызов с параметром beta=0.5

Функция активации Swish, beta=0.5


Функция активации Hyperbolic Tangent (TanH)

Вычисление функции

   f = tanh(x);

Вычисление производной

   d = 1 / pow(cosh(x),2);

Дополнительных параметров нет.

vector_a.Activation(vector_c,AF_TANH);

Функция активации TanH


Функция активации Thresholded Rectifiedl Linear Unit (TReLU)

Вычисление функции

   if(x > theta)
      f = x;
   else
      f = 0;

Вычисление производной

   if(x > theta)
      d = 1;
   else
      d = 0;

Дополнительный параметр theta = 1

vector_a.Activation(vector_c,AF_TRELU);         // вызов с умолчательным параметром

Функция активации TReLU

vector_a.Activation(vector_c,AF_TRELU,0.0);     // вызов с параметром theta = 0.0

Функция активации TReLU, theta=0

vector_a.Activation(vector_c,AF_TRELU,2.0);      // вызов с параметром theta = 2.0

Функция активации TReLU, theta=2


Функция активации Parametric Rectifiedl Linear Unit (PReLU)

Вычисление функции

   if(x[i] >= 0)
      f[i] = x[i];
   else
      f[i] = alpha[i]*x[i];

Вычисление производной

   if(x[i] >= 0)
      d[i] = 1;
   else
      d[i] = alpha[i];

Дополнительный параметр - вектор коэффициентов alpha.

vector alpha=vector::Full(vector_a.Size(),0.1);
vector_a.Activation(vector_c,AF_PRELU,alpha);

Функция активации PReLU


Особая функция Softmax

Результат расчёта функции активации Softmax зависит не только от конкретного значения, но и от всех значений в векторе.

   sum_exp = Sum(exp(vector_a))
   f = exp(x) / sum_exp

Вычисление производной

   d = f*(1 - f)

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

График функции активации вектора со значениями от -5 до 5

Функция активации Softmax

График функции активации вектора со значениями от -1 до 1

Функция активации Softmax


Если функция активации отсутствует (AF_NONE)

Если функция активации отсутствует, то значения из входного вектора передаются в выходной вектор без каких-либо преобразований. Фактически. это - функция активации Linear с параметрами alpha = 1 и beta = 0.


Заключение

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


Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (1)
Renat Akhtyamov
Renat Akhtyamov | 2 июн. 2023 в 05:29

круто

спасибо за статью!

Нейросети — это просто (Часть 44): Изучение навыков с учетом динамики Нейросети — это просто (Часть 44): Изучение навыков с учетом динамики
В предыдущей статье мы познакомились с методом DIAYN, который предлагает алгоритм изучения разнообразных навыков. Использование полученных навыкает может быть использовано различных задач. Но подобные навыки могут быть довольно непредсказуемы, что может осложнить из использование. В данной статье мы рассмотрим алгоритм обучения предсказуемых навыков.
Алгоритм докупки: симуляция мультивалютной торговли Алгоритм докупки: симуляция мультивалютной торговли
В данной статье мы создадим математическую модель для симуляции мультивалютного ценообразования и завершим исследование принципа диверсификации в рамках поиска механизмов увеличения эффективности торговли, которое я начал в предыдущей статье с теоретических выкладок.
Теория категорий в MQL5 (Часть 7): Мульти-, относительные и индексированные домены Теория категорий в MQL5 (Часть 7): Мульти-, относительные и индексированные домены
Теория категорий представляет собой разнообразный и расширяющийся раздел математики, который лишь недавно начал освещаться в MQL5-сообществе. Эта серия статей призвана рассмотреть некоторые из ее концепций для создания открытой библиотеки и дальнейшему использованию этого замечательного раздела в создании торговых стратегий.
Учимся у проп-трейдинговых компаний (Часть 1) — Введение Учимся у проп-трейдинговых компаний (Часть 1) — Введение
В этой вводной статье я расскажу о нескольких уроках, которые можно извлечь из испытаний, которые применяют проп-трейдинговые компании. Это особенно актуально для новичков и тех, кто изо всех сил пытается найти свое место в мире трейдинга. В следующей статье будет рассмотрена реализация кода.