English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
preview
MQL5에서 행렬 및 벡터: 활성화 함수

MQL5에서 행렬 및 벡터: 활성화 함수

MetaTrader 5 | 30 1월 2024, 17:13
146 0
MetaQuotes
MetaQuotes

소개

이미 신경망 훈련에 관한 수많은 책과 기사가 출판되었습니다. MQL5.com 회원들 또한 여러 시리즈 기사를 포함하여 많은 자료를 게시했습니다.

여기서는 머신 러닝의 한 가지 측면인 활성화 함수에 대해서만 설명하겠습니다. 우리는 이 프로세스의 내부의 작동 방식에 대해 자세히 살펴볼 것입니다.


간략한 개요

인공 신경망에서 뉴런 활성화 함수는 입력 신호 또는 입력 신호 세트의 값을 기반으로 출력 신호의 값을 계산합니다. 활성화 함수는 전체 값 집합에 대해 차별화 될 수 있어야 합니다. 이 조건은 신경망을 훈련할 때 오류 역전파의 가능성을 제공합니다. 오류를 역전파 하기 위해서는 입력 신호 벡터의 각 값에 대한 활성화 함수의 부분 도함수 벡터인 활성화 함수의 기울기를 계산해야 합니다. 보통은 비선형 활성화 함수가 훈련에 더 좋다는 것이 통설입니다. 반면에 완전 선형 ReLU 함수는 많은 모델에서 그 효과를 입증했습니다.


일러스트레이션

활성화 함수와 그 도함수의 그래프는 그림과 같이 -5에서 5까지 단조롭게 증가하는 순서로 준비되었습니다. 가격 차트에 함수 그래프를 표시하는 스크립트도 개발되었습니다. Page Down 키를 누르면 저장된 이미지의 이름을 지정할 수 있는 파일 열기 대화 상자가 표시됩니다.

png 파일 저장하기


ESC 키는 스크립트를 종료합니다. 스크립트는 아래에 첨부되어 있습니다. 비슷한 스크립트는 MQL5 행렬을 사용한 역전파 신경망이라는 글의 작성자가 작성한 것입니다. 우리는 그 글의 작성자의 아이디어를 사용하여 활성화 함수 자체의 그래프와 함께 해당 활성화 함수 미분 값의 그래프를 표시했습니다.

모든 활성화 기능이 포함된 데모 스크립트

활성화 함수는 파란색으로 표시되고 함수 파생물은 빨간색으로 표시됩니다.



지수 선형 단위(ELU) 활성화 함수

함수 계산

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

도함수 계산

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

이 함수는 추가 '알파' 매개변수를 받습니다. 지정하지 않으면 기본값은 1입니다.

   vector_a.Activation(vector_c,AF_ELU);      // call with the default parameter

ELU 활성화 함수

   vector_a.Activation(vector_c,AF_ELU,3.0);  // call with alpha=3.0

알파=3.0 파라미터를 사용한 ELU 활성화 함수


지수 활성화 기능

함수 계산

   f = exp(x);

동일한 exp 함수가 exp 함수의 파생 함수의 역할을 합니다.

계산 방정식에서 볼 수 있듯이 지수 활성화 함수에는 추가 매개 변수가 없습니다.

vector_a.Activation(vector_c,AF_EXP);

지수 활성화 함수


가우시안 에러 선형 단위(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 활성화 함수


하드 시그모이드 활성화 함수

함수 계산

   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);

하드 시그모이드 활성화 함수


선형 활성화 함수

함수 계산

   f = alpha*x + beta

도함수 계산

   d = alpha

추가 매개변수 알파 = 1.0 및 베타 = 0.0

vector_a.Activation(vector_c,AF_LINEAR);         // call with default parameters

선형 활성화 함수

vector_a.Activation(vector_c,AF_LINEAR,2.0,5.0);  // call with alpha=2.0 and beta=5.0

선형 활성화 함수, 알파=2, 베타=5


누설 정류 선형 장치(LReLU) 활성화 함수

함수 계산

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

도함수 계산

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

이 함수는 추가 '알파' 매개변수를 받습니다. 지정하지 않으면 기본값은 0.3입니다.

   vector_a.Activation(vector_c,AF_LRELU);      // call with the default parameter

LReLU 활성화 함수

vector_a.Activation(vector_c,AF_LRELU,0.1);  // call with alpha=0.1

알파=0.1의 LReLU 활성화 함수


정류된 선형 장치(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);         // call with default parameters

ReLU 활성화 기능

vector_a.Activation(vector_c,AF_RELU,2.0,0.5);      // call with alpha=2.0 and max_value=0.5

ReLU 활성화 함수, alpha=2, max_value=0.5

vector_a.Activation(vector_c,AF_RELU,2.0,0.5,1.0);  // call with alpha=2.0, max_value=0.5 and treshold=1.0

ReLU 활성화 함수, alpha=2, max_value=0.5, treshold=1


확장 지수 선형 단위(SELU) 활성화 함수

함수 계산

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

where 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 활성화 함수


시그모이드 활성화 함수

함수 계산

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

도함수 계산

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

추가 매개변수가 없습니다.

vector_a.Activation(vector_c,AF_SIGMOID);

시그모이드 활성화 함수



소프트플러스 활성화 함수

함수 계산

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

도함수 계산

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

추가 매개변수가 없습니다.

vector_a.Activation(vector_c,AF_SOFTPLUS);

소프트플러스 활성화 함수


소프트사인 활성화 함수

함수 계산

   f = x / (|x| + 1)

도함수 계산

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

추가 매개변수가 없습니다.

vector_a.Activation(vector_c,AF_SOFTSIGN);

소프트사인 활성화 함수


스와이시 활성화 함수

함수 계산

   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);         // call with the default parameter

스위시 활성화 함수

vector_a.Activation(vector_c,AF_SWISH,2.0);     // call with beta = 2.0

스위시 활성화 함수, beta=2

vector_a.Activation(vector_c,AF_SWISH,0.5);   // call with beta=0.5

스위시 활성화 함수, beta=0.5


쌍곡탄젠트(TanH) 활성화 함수

함수 계산

   f = tanh(x);

도함수 계산

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

추가 매개변수가 없습니다.

vector_a.Activation(vector_c,AF_TANH);

TanH 활성화 함수


임계값 정류 선형 장치(TReLU) 활성화 함수

함수 계산

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

도함수 계산

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

추가 파라미터 세타 = 1

vector_a.Activation(vector_c,AF_TRELU);         // call with default parameter

TReLU 활성화 함수

vector_a.Activation(vector_c,AF_TRELU,0.0);     // call with theta = 0.0

TReLU 활성화 함수, 세타=0

vector_a.Activation(vector_c,AF_TRELU,2.0);      // call with theta = 2.0

TReLU 활성화 함수, theta=2


파라메트릭 정류 선형 유닛(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];

추가 매개변수 - '알파' 계수 벡터.

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

PReLU 활성화 함수


특별한 소프트맥스 함수

소프트맥스 활성화 함수를 계산한 결과는 특정 값 뿐만 아니라 모든 벡터 값에 따라 달라집니다.

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

도함수 계산

   d = f*(1 - f)

따라서 활성화된 모든 벡터 값의 합은 1입니다. 따라서 소프트맥스 활성화 함수는 분류 모델의 마지막 계층에 자주 사용됩니다.

5에서 5까지의 값을 가진 벡터 활성화 함수 그래프

소프트맥스 활성화 함수

-1에서 1까지의 값을 가진 벡터 활성화 함수 그래프

소프트맥스 활성화 함수


활성화 함수가 없는 경우(AF_NONE)

활성화 함수가 없는 경우에 입력 벡터의 값은 아무런 변환 없이 출력 벡터로 전송됩니다. 실제로 이것은 알파 = 1, 베타 = 0인 선형 활성화 함수입니다.


결론

아래 첨부된 ActivationFunction.mqh 파일을 통해 활성화 함수 및 파생 함수의 소스 코드를 숙지하시기 바랍니다.


MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/12627

MQL5에서 ONNX 모델을 앙상블하는 방법의 예시 MQL5에서 ONNX 모델을 앙상블하는 방법의 예시
ONNX(Open Neural Network eXchange)는 신경망을 위해 만들어진 개방형 형식입니다. 이 글에서는 하나의 Expert Advisor에서 두 개의 ONNX 모델을 동시에 사용하는 방법을 소개하겠습니다.
Expert Advisor 개발 기초부터(24부): 시스템 견고성(I) Expert Advisor 개발 기초부터(24부): 시스템 견고성(I)
이 글에서 우리는 시스템을 더욱 안정적으로 만들고 강력하고 안전하게 사용할 수 있도록 하겠습니다. 이러한 견고성을 달성하는 방법 중 하나는 코드를 가능한 한 많이 재사용하여 다양한 경우에 지속적으로 테스트하는 것입니다. 하지만 이것은 여러 방법 중 하나일 뿐입니다. 또 다른 하나는 OOP를 사용하는 것입니다.
회귀 메트릭을 사용하여 ONNX 모델 평가하기 회귀 메트릭을 사용하여 ONNX 모델 평가하기
회귀는 레이블이 지정되지 않은 예제에서 실제의 값을 예측하는 작업입니다. 회귀 메트릭은 회귀 모델 예측의 정확도를 평가하는 데 사용됩니다.
앨리게이터로 트레이딩 시스템 설계 방법 알아보기 앨리게이터로 트레이딩 시스템 설계 방법 알아보기
이번 글이 가장 인기 있는 보조지표를 기반으로 트레이딩 시스템을 설계하는 방법에 대한 시리즈의 마지막 기사입니다. 우리는 앨리게이터 지표를 기반으로 트레이딩 시스템을 만드는 방법을 배워볼 것입니다.