forked from rinkugohil30897/NeuroBook
156 lines
13 KiB
MQL5
156 lines
13 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| activations.mqh |
| |
//| Copyright 2021, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
#property copyright "Copyright 2021, MetaQuotes Ltd."
| |
#property link "https://www.mql5.com"
| |
//---
| |
const double theta = 0;
| |
const double a = 1.0;
| |
const double b = 0.0;
| |
//+------------------------------------------------------------------+
| |
/// Threshold activation function
| |
/// Constant 'theta' determines neuron activation function.
| |
/// Parameter 'x' receives weighted sum of raw data.
| |
//+------------------------------------------------------------------+
| |
double ActStep(double x)
| |
{
| |
return (x >= theta ? 1 : 0);
| |
}
| |
//+------------------------------------------------------------------+
| |
/// Linear activation function
| |
/// Constant 'a' defines the angle of inclination of line
| |
/// Constant 'b' defines line offset from the origin
| |
/// Parameter 'x' receives weighted sum of raw data.
| |
//+------------------------------------------------------------------+
| |
double ActLinear(double x)
| |
{
| |
return (a * x + b);
| |
}
| |
//+------------------------------------------------------------------+
| |
/// Derivative of linear activation function
| |
/// Constant 'a' defines the angle of inclination of line
| |
/// Parameter 'y' last state of the activation function (result of the feed-forward)
| |
/// Here the parameter is added to unify the function form with similar ones for other activation functions.
| |
//+------------------------------------------------------------------+
| |
double ActLinearDerivative(double y)
| |
{
| |
return a;
| |
}
| |
//+------------------------------------------------------------------+
| |
/// Logistic activation function (Sigmoid)
| |
/// Constant 'a' defines the range of function values from '0' to 'a'
| |
/// Constant 'b' defines line offset from the origin
| |
/// Parameter 'x' receives weighted sum of raw data.
| |
//+------------------------------------------------------------------+
| |
double ActSigmoid(double x)
| |
{
| |
return (a / (1 + exp(-x)) - b);
| |
}
| |
//+------------------------------------------------------------------+
| |
/// Derivative of logistic function
| |
/// Constant 'a' defines the range of function values from '0' to 'a'
| |
/// Constant 'b' defines line offset from the origin
| |
/// Parameter 'y' last state of the activation function (result of the feed-forward)
| |
//+------------------------------------------------------------------+
| |
double ActSigmoidDerivative(double y)
| |
{
| |
y = MathMax(MathMin(y + b, a), 0.0);
| |
return (y * (1 - y / a));
| |
}
| |
//+------------------------------------------------------------------+
| |
/// Hyperbolic tangent
| |
/// Parameter 'x' receives weighted sum of raw data.
| |
//+------------------------------------------------------------------+
| |
double ActTanh(double x)
| |
{
| |
return tanh(x);
| |
}
| |
//+------------------------------------------------------------------+
| |
/// Derivative of the hyperbolic tangent
| |
/// Parameter 'y' last state of the activation function (result of the feed-forward)
| |
//+------------------------------------------------------------------+
| |
double ActTanhDerivative(double y)
| |
{
| |
y = MathMax(MathMin(y, 1.0), -1.0);
| |
return (1 - pow(y, 2));
| |
}
| |
//+------------------------------------------------------------------+
| |
/// PReLU activation function
| |
/// Constant 'a' defines leakage coefficient (skipping negative values)
| |
/// Parameter 'x' receives weighted sum of raw data.
| |
//+------------------------------------------------------------------+
| |
double ActPReLU(double x)
| |
{
| |
return (x >= 0 ? x : a * x);
| |
}
| |
//+------------------------------------------------------------------+
| |
/// Derivative of PReLU
| |
/// Constant 'a' defines leakage coefficient (skipping negative values)
| |
/// Parameter 'y' last state of the activation function (result of the feed-forward)
| |
/// Here the parameter is added to unify the function form with similar ones for other activation functions.
| |
//+------------------------------------------------------------------+
| |
double ActPReLUDerivative(double y)
| |
{
| |
return (y >= 0 ? 1 : a);
| |
}
| |
//+------------------------------------------------------------------+
| |
/// Swish activation function
| |
/// Constant 'b' defines function nonlinearity.
| |
/// Parameter 'x' receives weighted sum of raw data.
| |
//+------------------------------------------------------------------+
| |
double ActSwish(double x)
| |
{
| |
return (x / (1 + exp(-b * x)));
| |
}
| |
//+------------------------------------------------------------------+
| |
/// Derivative of Swish
| |
/// Constant 'b' defines function nonlinearity.
| |
/// Parameter 'x' receives weighted sum of raw data.
| |
/// Parameter 'y' last state of the activation function (result of the feed-forward)
| |
//+------------------------------------------------------------------+
| |
double ActSwishDerivative(double x, double y)
| |
{
| |
if(x == 0)
| |
return 0.5;
| |
double by = b * y;
| |
return (by + (y * (1 - by)) / x);
| |
}
| |
//+------------------------------------------------------------------+
| |
/// SoftMax activation function
| |
/// Parameter 'X' gets array of weighted sums of raw data.
| |
//+------------------------------------------------------------------+
| |
bool SoftMax(vector& X, vector& Y)
| |
{
| |
ulong total = X.Size();
| |
if(total == 0)
| |
return false;
| |
//--- Calculate exponent for each array element
| |
Y = MathExp(X);
| |
//--- Normalize data in the array
| |
Y /= Y.Sum();
| |
//---
| |
return true;
| |
}
| |
//+------------------------------------------------------------------+
| |
/// Derivative of SoftMax
| |
/// Parameter 'Y' last state of the activation function (result of the feed-forward)
| |
/// Parameter 'G' error gradient received from the subsequent layer
| |
/// Function returns vector of adjusted gradients of error 'D'
| |
//+------------------------------------------------------------------+
| |
bool ActSoftMaxDerivative(vector& Y, vector& G, vector& D)
| |
{
| |
ulong total = Y.Size();
| |
if(total == 0)
| |
return false;
| |
//---
| |
matrix e=matrix::Identity(total,total);
| |
for(ulong r = 0; r < total; r++)
| |
if(!e.Row(e.Row(r) - Y, r))
| |
return false;
| |
D = (Y * G).MatMul(e);
| |
//---
| |
return true;
| |
}
| |
//+------------------------------------------------------------------+
|