Быстрая альтернатива степени числа - страница 3

 
joo:

Ну вот гляди. Если сумма произведений нейронов предыдущего слоя и их весов выходит за диапазон [-1;1], то он обрезается до -1 или 1. Таким образом, нейрон нечувствителен вне диапазона.

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

Кем обрезается? фукцией активации но аргументом функции может быть любое число а не только от -1 до 1, вот я и предлагаю тебе посмотреть что выдаст функция активации если аргумент будет -20 или 20

ЗЫ Просто посмотри что выдают твои функции в большем диапазоне параметров.

 


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

красная сигмоида (приведена к диапазону -1:1)

зелёная это вот эта формула :

double SigmaAbs(double d,double A){return( (1.+A)*d/(1.+MathAbs(A*d)));}

синяя эта:

double SigmaNew(double d,double A){return( 3.*d/(1.0+MathAbs(d)+d*d) );}
 
joo:

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


Я уверен Вы в курсе такой штуки как CUDA https://ru.wikipedia.org/wiki/CUDA

И наверняка читали вот этот документ - http://www.computeroptics.smr.ru/KO/PDF/KO34-2/12.pdf

Почему Вам не подходит такой подход к реализации нейросети?

 
Urain:

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

красная сигмоида (приведена к диапазону -1:1)

зелёная это вот эта формула :

синяя эта:

Николай, ну ты чего? Я почему думаешь показывал код:

if (x>-1.0 && x<1.0)
    HiddenLayer1[i]=3.0*x/(1.0+MathAbs(x)+x*x);
else
{
    if (x>1.0)
        HiddenLayer1[i]=1.0;
    if (x<-1.0)
        HiddenLayer1[i]=-1.0;
}

Как раз для того, что бы обрезать. Я же говорил, что функция активации нечувствительна вне диапазона. Я прекрасно знаю, как выглядит график вне [-1;1] аргументов.

Вот, попробуй запустить этот скрипт, единственное, допустил ошибку, и нужно было if(x>=-1.0 && x <=1)  вместо if(x>-1.0 && x <1) :

input double   Input1=-20.0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double x=Input1;
   double Neuron=0.0;

   if(x>=-1.0 && x<=1.0)
      Neuron=3.0*x/(1.0+MathAbs(x)+x*x);
   else
     {
      if(x>1.0)
         Neuron=1.0;
      if(x<-1.0)
         Neuron=-1.0;
     }
   Comment(Neuron);
  }
//+------------------------------------------------------------------+

Вот тестовый пример использования нейронной сети со старой функцией:

//+------------------------------------------------------------------+
//|                                                    Tests MLP.mq5 |
//|                                      Copyright 2010, JQS aka Joo |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, JQS aka Joo"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property script_show_inputs


//--- input parameters
input int      N1count_P=2;
input int      N2count_P=2;
input int      N3count_P=2;
input int      N4count_P=2;

input int      CNT_P    =1;


int    AllNeurons;    //Всего нейронов
double HiddenLayer1[];//Нейроны первого скрытого слоя
double HiddenLayer2[];//Нейроны второго скрытого слоя
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  double N1[],N4[];
  double weight[];
  ArrayResize(N1,N1count_P);ArrayInitialize(N1,0.0);
  ArrayResize(N4,N4count_P);ArrayInitialize(N1,0.0);

  int weightCount= N1count_P*N2count_P+N2count_P+
                   N2count_P*N3count_P+N3count_P+
                   N3count_P*N4count_P+N4count_P;
  ArrayResize(weight,weightCount);


  //Настроим сеть

  //Подадим данные в сеть
  N1[0]=-0.98;
  N1[1]=-0.3;

  //Веса
  weight[0]=-0.2;
  weight[1]=-0.3;
  weight[2]= 0.5;
  weight[3]= 0.6;
  //Смещения
  weight[4]= 0.7;
  weight[5]=-0.3;

  //Веса
  weight[6]= 0.4;
  weight[7]= 0.3;
  weight[8]= 0.2;
  weight[9]= 0.4;
  //Смещения
  weight[10]= 0.5;
  weight[11]= 0.9;

  //Веса
  weight[12]= 0.4;
  weight[13]=-0.3;
  weight[14]= 0.2;
  weight[15]=-0.5;
  //Смещения
  weight[16]= 0.26;
  weight[17]= 0.45;


  //Счетчики
  AllNeurons =N1count_P*N2count_P+N2count_P+
              N2count_P*N3count_P+N3count_P+
              N3count_P*N4count_P+N4count_P;

  ArrayResize    (HiddenLayer1,N2count_P);
  ArrayInitialize(HiddenLayer1,0.0);

  ArrayResize    (HiddenLayer2,N3count_P);
  ArrayInitialize(HiddenLayer2,0.0);


  //------------Засечём время--------------
  int time_start=(int)GetTickCount(),time_end=0;
  //---------------------------------------

  for (int i=0;i<CNT_P;i++)
  {
    //Вычислим сеть
    MLP2HL(N1count_P,N2count_P,N3count_P,N4count_P,N1,weight,N4);
  }

  //------------------------
  time_end=(int)GetTickCount();
  Print(time_end-time_start," мс - Время исполнения"); 
}
//+------------------------------------------------------------------+



//------------------
void MLP2HL(
           int    InNCount,     //Количество нейронов во входном слое
           int    Hidden1NCount,//Количество нейронов в первом скрытом слое
           int    Hidden2NCount,//Количество нейронов во втором скрытом слое
           int    OutNCount,    //Количество нейронов в выходном слое

           double &InLayer [],   //Нейроны входного слоя
           double &Weight  [],   //Веса нейронов сети
           double &OutLayer[]   //Нейроны выходного слоя
           )
{
  int i=0, u=0, cnt_W=0;
//---------------Обработаем первый скрытый слой---------------------------
  //Сумма произведений нейронов предыдущего слоя и их весов: (+w1*x1+...+wn*xn) для каждого нейрона
  for (u=0;u<Hidden1NCount;u++)
  {
    for (i=0;i<InNCount;i++)
    {
      HiddenLayer1[u]+=InLayer[i]*Weight[cnt_W];
      //Print(InLayer[i],"*",Weight[cnt_W],"=",InLayer[i]*Weight[cnt_W]);
      cnt_W++;
    }
    //Print("HiddenLayer1[",u,"]=",HiddenLayer1[u]);
  }

  //Добавим смещение точек насыщения нейрона: (+b)
  for (i=0;i<Hidden1NCount;i++)
  {
    HiddenLayer1[i]+=Weight[cnt_W];
    cnt_W++;
    //Print("Со см HiddenLayer1[",i,"]=",HiddenLayer1[i]);
  }

  //Посчитаем функцию активации для каждого скрытого нейрона
  for (i=0;i<Hidden1NCount;i++)
  {
    HiddenLayer1[i]=(2.0/(1.0+MathPow(2.0,-HiddenLayer1[i]*10.0)))-1.0;
    //Print("FF HiddenLayer1[",i,"]=",HiddenLayer1[i]);
  }
//************************************************************************
//---------------Обработаем второй скрытый слой---------------------------
  //Сумма произведений нейронов предыдущего слоя и их весов: (+w1*x1+...+wn*xn) для каждого нейрона
  for (u=0;u<Hidden2NCount;u++)
  {
    for (i=0;i<Hidden1NCount;i++)
    {
      HiddenLayer2[u]+=HiddenLayer1[i]*Weight[cnt_W];
      //Print(HiddenLayer1[i],"*",Weight[cnt_W],"=",HiddenLayer1[i]*Weight[cnt_W]);
      cnt_W++;
    }
    //Print("HiddenLayer2[",u,"]=",HiddenLayer2[u]);
  }

  //Добавим смещение точек насыщения нейрона: (+b)
  for (i=0;i<Hidden2NCount;i++)
  {
    HiddenLayer2[i]+=Weight[cnt_W];
    cnt_W++;
    //Print("Со см HiddenLayer2[",i,"]=",HiddenLayer2[i]);
  }

  //Посчитаем функцию активации для каждого скрытого нейрона
  for (i=0;i<Hidden2NCount;i++)
  {
    HiddenLayer2[i]=(2.0/(1.0+MathPow(2.0,-HiddenLayer2[i]*10.0)))-1.0;
    //Print("FF HiddenLayer2[",i,"]=",HiddenLayer2[i]);
  }

//************************************************************************
//---------------Обработаем выходной слой---------------------------
  //Сумма произведений нейронов предыдущего слоя и их весов: (+w1*x1+...+wn*xn) для каждого нейрона
  for (u=0;u<OutNCount;u++)
  {
    for (i=0;i<Hidden2NCount;i++)
    {
      OutLayer[u]+=HiddenLayer2[i]*Weight[cnt_W];
      //Print(HiddenLayer2[i],"*",Weight[cnt_W],"=",HiddenLayer2[i]*Weight[cnt_W]);
      cnt_W++;
    }
    //Print("OutLayer[",u,"]=",OutLayer[u]);
  }

  //Присваивание ячейкам массива сумм значений точек насыщения нейрона: (+b)
  for (i=0;i<OutNCount;i++)
  {
    OutLayer[i]+=Weight[cnt_W];
    cnt_W++;
    //Print("Со см OutLayer[",i,"]=",OutLayer[i]);
  }

  //Посчитаем функцию активации для каждого скрытого нейрона
  for (i=0;i<OutNCount;i++)
  {
    OutLayer[i]=(2.0/(1.0+MathPow(2.0,-OutLayer[i]*10.0)))-1.0;
    //Print("FF OutLayer[",i,"]=",OutLayer[i]);
  }
}
//==============================

//Результат для сети 2-2-2-2 
//0.83995777
//0.48176542

А вот с новой функцией:

//+------------------------------------------------------------------+
//|                                                    Tests MLP.mq5 |
//|                                      Copyright 2010, JQS aka Joo |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, JQS aka Joo"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property script_show_inputs


//--- input parameters
input int      N1count_P=2;
input int      N2count_P=2;
input int      N3count_P=2;
input int      N4count_P=2;

input int      CNT_P    =1;


double HiddenLayer1[];//Нейроны первого скрытого слоя
double HiddenLayer2[];//Нейроны второго скрытого слоя
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  double N1[],N4[];
  double weight[];
  ArrayResize(N1,N1count_P);ArrayInitialize(N1,0.0);
  ArrayResize(N4,N4count_P);ArrayInitialize(N1,0.0);

  int weightCount= N1count_P*N2count_P+N2count_P+
                   N2count_P*N3count_P+N3count_P+
                   N3count_P*N4count_P+N4count_P;
  ArrayResize(weight,weightCount);


  //Настроим сеть

  //Подадим данные в сеть
  N1[0]=-0.98;
  N1[1]=-0.3;

  //Веса
  weight[0]=-0.2;
  weight[1]=-0.3;
  weight[2]= 0.5;
  weight[3]= 0.6;
  //Смещения
  weight[4]= 0.7;
  weight[5]=-0.3;

  //Веса
  weight[6]= 0.4;
  weight[7]= 0.3;
  weight[8]= 0.2;
  weight[9]= 0.4;
  //Смещения
  weight[10]= 0.5;
  weight[11]= 0.9;

  //Веса
  weight[12]= 0.4;
  weight[13]=-0.3;
  weight[14]= 0.2;
  weight[15]=-0.5;
  //Смещения
  weight[16]= 0.26;
  weight[17]= 0.45;


  ArrayResize    (HiddenLayer1,N2count_P);
  ArrayInitialize(HiddenLayer1,0.0);

  ArrayResize    (HiddenLayer2,N3count_P);
  ArrayInitialize(HiddenLayer2,0.0);


  //------------Засечём время--------------
  int time_start=(int)GetTickCount(),time_end=0;
  //---------------------------------------

  for (int i=0;i<CNT_P;i++)
  {
    //Вычислим сеть
    MLP2HL(N1count_P,N2count_P,N3count_P,N4count_P,N1,weight,N4);
  }

  //------------------------
  time_end=(int)GetTickCount();
  Print(time_end-time_start," мс - Время исполнения"); 
}
//+------------------------------------------------------------------+



//------------------
void MLP2HL(
           int    InNCount,     //Количество нейронов во входном слое
           int    Hidden1NCount,//Количество нейронов в первом скрытом слое
           int    Hidden2NCount,//Количество нейронов во втором скрытом слое
           int    OutNCount,    //Количество нейронов в выходном слое

           double &InLayer [],   //Нейроны входного слоя
           double &Weight  [],   //Веса нейронов сети
           double &OutLayer[]   //Нейроны выходного слоя
           )
{
  int i=0, u=0, cnt_W=0;
  double x=0.0;
//---------------Обработаем первый скрытый слой---------------------------
  //Сумма произведений нейронов предыдущего слоя и их весов: (+w1*x1+...+wn*xn) для каждого нейрона
  for (u=0;u<Hidden1NCount;u++)
  {
    for (i=0;i<InNCount;i++)
    {
      HiddenLayer1[u]+=InLayer[i]*Weight[cnt_W];
      //Print(InLayer[i],"*",Weight[cnt_W],"=",InLayer[i]*Weight[cnt_W]);
      cnt_W++;
    }
    //Print("HiddenLayer1[",u,"]=",HiddenLayer1[u]);
  }

  //Добавим смещение точек насыщения нейрона: (+b)
  for (i=0;i<Hidden1NCount;i++)
  {
    HiddenLayer1[i]+=Weight[cnt_W];
    cnt_W++;
    //Print("Со см HiddenLayer1[",i,"]=",HiddenLayer1[i]);
  }

  //Посчитаем функцию активации для каждого скрытого нейрона
  for (i=0;i<Hidden1NCount;i++)
  {
    x=HiddenLayer1[i];
    if (x>=-1.0 && x<=1.0)
      HiddenLayer1[i]=3.0*x/(1.0+MathAbs(x)+x*x);
    else
    {
      if (x>1.0)
        HiddenLayer1[i]=1.0;
      if (x<-1.0)
        HiddenLayer1[i]=-1.0;
    }
    //Print("FF HiddenLayer1[",i,"]=",HiddenLayer1[i]);
  }
//************************************************************************
//---------------Обработаем второй скрытый слой---------------------------
  //Сумма произведений нейронов предыдущего слоя и их весов: (+w1*x1+...+wn*xn) для каждого нейрона
  for (u=0;u<Hidden2NCount;u++)
  {
    for (i=0;i<Hidden1NCount;i++)
    {
      HiddenLayer2[u]+=HiddenLayer1[i]*Weight[cnt_W];
      //Print(HiddenLayer1[i],"*",Weight[cnt_W],"=",HiddenLayer1[i]*Weight[cnt_W]);
      cnt_W++;
    }
    //Print("HiddenLayer2[",u,"]=",HiddenLayer2[u]);
  }

  //Добавим смещение точек насыщения нейрона: (+b)
  for (i=0;i<Hidden2NCount;i++)
  {
    HiddenLayer2[i]+=Weight[cnt_W];
    cnt_W++;
    //Print("Со см HiddenLayer2[",i,"]=",HiddenLayer2[i]);
  }

  //Посчитаем функцию активации для каждого скрытого нейрона
  for (i=0;i<Hidden2NCount;i++)
  {
    x=HiddenLayer2[i];
    if (x>=-1.0 && x<=1.0)
      HiddenLayer2[i]=3.0*x/(1.0+MathAbs(x)+x*x);
    else
    {
      if (x>1.0)
        HiddenLayer2[i]=1.0;
      if (x<-1.0)
        HiddenLayer2[i]=-1.0;
    }
    //Print("FF HiddenLayer2[",i,"]=",HiddenLayer2[i]);
  }

//************************************************************************
//---------------Обработаем выходной слой---------------------------
  //Сумма произведений нейронов предыдущего слоя и их весов: (+w1*x1+...+wn*xn) для каждого нейрона
  for (u=0;u<OutNCount;u++)
  {
    for (i=0;i<Hidden2NCount;i++)
    {
      OutLayer[u]+=HiddenLayer2[i]*Weight[cnt_W];
      //Print(HiddenLayer2[i],"*",Weight[cnt_W],"=",HiddenLayer2[i]*Weight[cnt_W]);
      cnt_W++;
    }
    //Print("OutLayer[",u,"]=",OutLayer[u]);
  }

  //Присваивание ячейкам массива сумм значений точек насыщения нейрона: (+b)
  for (i=0;i<OutNCount;i++)
  {
    OutLayer[i]+=Weight[cnt_W];
    cnt_W++;
    //Print("Со см OutLayer[",i,"]=",OutLayer[i]);
  }

  //Посчитаем функцию активации для каждого скрытого нейрона
  for (i=0;i<OutNCount;i++)
  {
    x=OutLayer[i];
    if (x>=-1.0 && x<=1.0)
      OutLayer[i]=3.0*x/(1.0+MathAbs(x)+x*x);
    else
    {
      if (x>1.0)
        OutLayer[i]=1.0;
      if (x<-1.0)
        OutLayer[i]=-1.0;
    }
    //Print("FF OutLayer[",i,"]=",OutLayer[i]);
  }
}
//==============================

//Результат для сети 2-2-2-2 
// 0,70033902
// 0,39272895

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

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

 
Academic:

Я уверен Вы в курсе такой штуки как CUDA https://ru.wikipedia.org/wiki/CUDA

И наверняка читали вот этот документ - http://www.computeroptics.smr.ru/KO/PDF/KO34-2/12.pdf

Почему Вам не подходит такой подход к реализации нейросети?

Спасибо, я читал эти документы. Тему CUDA изучаю.
 
joo:

Николай, ну ты чего? Я почему думаешь показывал код:

Как раз для того, что бы обрезать. Я же говорил, что функция активации нечувствительна вне диапазона. Я прекрасно знаю, как выглядит график вне [-1;1] аргументов.

Вот, попробуй запустить этот скрипт, единственное, допустил ошибку, и нужно было if(x>=-1.0 && x <=1)  вместо if(x>-1.0 && x <1) :

Вот тестовый пример использования нейронной сети со старой функцией:

А вот с новой функцией:

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

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

Сори за невнимательность. ты прав.

Но ты ведь делаешь обрезку, а в експоненте идёт не обрезка а стремнение к 1

2011.02.04 17:26:14     Листок5 (EURUSD,H1)     sigma 40=1
2011.02.04 17:26:14     Листок5 (EURUSD,H1)     sigma 36=0.9999999999999998
2011.02.04 17:26:14     Листок5 (EURUSD,H1)     sigma 32=0.9999999999999873
2011.02.04 17:26:14     Листок5 (EURUSD,H1)     sigma 28=0.9999999999993086
2011.02.04 17:26:14     Листок5 (EURUSD,H1)     sigma 24=0.9999999999622486
2011.02.04 17:26:14     Листок5 (EURUSD,H1)     sigma 20=0.9999999979388463
2011.02.04 17:26:14     Листок5 (EURUSD,H1)     sigma 16=0.9999998874648379
2011.02.04 17:26:14     Листок5 (EURUSD,H1)     sigma 12=0.9999938558253978
2011.02.04 17:26:14     Листок5 (EURUSD,H1)     sigma 8=0.9996646498695336
2011.02.04 17:26:14     Листок5 (EURUSD,H1)     sigma 4=0.9820137900379085
2011.02.04 17:26:14     Листок5 (EURUSD,H1)     sigma 0=0.5

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

 
joo:
Спасибо, я читал эти документы. Тему CUDA изучаю.

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

Вот готовые библиотеки - http://leenissen.dk/fann/html_latest/files2/gpu-txt.html

Вот еще один по моему уже правда заброшенный проект - http://www.codeproject.com/KB/graphics/GPUNN.aspx

Вот тут есть даже плагины для матлаб, http://www.nvidia.com/object/cuda_learn_stage.html

Как у Вас с английским?

Neural Networks on the GPU - Fast Artificial Neural Network Library (FANN)
  • leenissen.dk
This section describes the implementation of the current state of the neural networks on the gpu using GLSL project.  It includes both a shader code example and a small network implementation example.  The code is still expremental and is not included in the FANN library but is available for the user to try out if he wishes. To exploit the...
 

Urain:

Сори за невнимательность. ты прав.

Ничего страшного. Вот теперь только дай мне повод, и я с тобой поквитаюсь. :D

Но ты ведь делаешь обрезку, а в експоненте идёт не обрезка а стремнение к 1

Да, обрезка. Но это не важно - поясню ниже.

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

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

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

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

Вот, от руки изобразил зоны чувствительности нейрона. Зеленым показаны зоны нормальной работы нейрона, красным - нечувствительные зоны.


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

хотя наверное для однослойно сетки точно разницы нет.

У меня не однослойная сеть.

 
Academic:

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

Вот готовые библиотеки - http://leenissen.dk/fann/html_latest/files2/gpu-txt.html

Вот еще один помоему уже правда заброшенный проект - http://www.codeproject.com/KB/graphics/GPUNN.aspx

Вот тут есть даже плагины для матлаб, http://www.nvidia.com/object/cuda_learn_stage.html

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

Как у Вас с английским?

Могу читать технические тексты. Но говорю плохо, на слух понимаю чуть получше.
 
joo:

Ничего страшного. Вот теперь только дай мне повод, и я с тобой поквитаюсь. :D

Да, обрезка. Но это не важно - поясню ниже.

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

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

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

Вот, от руки изобразил зоны чувствительности нейрона. Зеленым показаны зоны нормальной работы нейрона, красным - нечувствительные зоны.


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

У меня не однослойная сеть.

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

Если рассмотреть геперболу то видно что перелом шага (те нелинейность) происходит в точке сечения гиперболы линией 45 градусов. y=x

Для сигмоиды это будет обратная ей 45 град линия те y=1/x. и эта линия сечёт сигмоид в районе  0.7853981633974483

это соответствует аргументу сигмоиды ~1.3

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

PS

//2011.02.04 18:09:24    Листок5 (EURUSD,H1)    M_PI_4=                             0.7853981633974483
//2011.02.04 18:09:24    Листок5 (EURUSD,H1)    sigma(1.297406418800268)=0.7853981639887803


Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Математические константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Математические константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Математические константы - Документация по MQL5
Причина обращения: