Обсуждение статьи "Нейронные сети - от теории к практике" - страница 6

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

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

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

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

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

Спасибо. 

Хотелось бы, чтобы на пальцах был расписан градиентный метод обучения.
 
Yedelkin:

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

Как подгонку не называй, она от этого подгонкой быть не перестанет.

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

 
Reshetov:

Как подгонку не называй, она от этого подгонкой быть не перестанет.

Переобучение определяется элементарно. Так что на зеркало пенять нечего.
 
Yedelkin:

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

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

 
Парни, подскажите! Я верно понял, что нормализацию входных данных нужно делать на всем периоде обучения сети? В смысле максимальное и минимальное значения хi брать со всего этого периода?
 
net:
Парни, подскажите! Я верно понял, что нормализацию входных данных нужно делать на всем периоде обучения сети? В смысле максимальное и минимальное значения хi брать со всего этого периода?
Нужно на всей обучающей выборке.
 
//+------------------------------------------------------------------+
//|                                           macd-neuro-example.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

#define SIZE 1000

#include <Trade\Trade.mqh>        //подключаем библиотеку для совершения торговых операций
#include <Trade\PositionInfo.mqh> //подключаем библиотеку для получения информации о позициях
#include <Indicators/TimeSeries.mqh>

//--- значения весовых коэффициентов                                                                    
input double w0=0.5;
input double w1=0.5;
input double w2=0.5;
input double w3=0.5;
input double w4=0.5;
input double w5=0.5;
input double w6=0.5;
input double w7=0.5;
input double w8=0.5;
input double w9=0.5;
input double w10=0.5;
input double w11=0.5;
input double w12=0.5;

string            my_symbol;         // переменная для хранения символа
double            inputsH[13];        // массив для хранения входных сигналов
double            inputsL[13];        // массив для хранения входных сигналов
int               periods[13]={2,3,5,8,13,21,34,55,89,144,233,377,610};
int B,Ba;
double            weight[13];        // массив для хранения весовых коэффициентов
double High[SIZE],Low[SIZE];

CTrade            m_Trade;           // объект для выполнения торговых операций
CPositionInfo     m_Position;        // объект для получения информации о позициях
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

   weight[0]=w0;
   weight[1]=w1;
   weight[2]=w2;
   weight[3]=w3;
   weight[4]=w4;
   weight[5]=w5;
   weight[6]=w6;
   weight[7]=w7;
   weight[8]=w8;
   weight[9]=w9;
   weight[10]=w10;
   weight[11]=w11;
   weight[12]=w12;

   my_symbol=Symbol();
   B=Bars(my_symbol,0);

//--- возвращаем 0, инициализация завершена
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);                   // лучшее предложение на покупку
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);                   // лучшее предложение на продажу

   B=Bars(my_symbol,0);
   if(B!=Ba)
     {
      CiHigh hi;
      CiLow li;
      hi.Create(_Symbol,_Period);
      li.Create(_Symbol,_Period);
      hi.GetData(0,SIZE,High);
      li.GetData(0,SIZE,Low);
     }
   Ba=B;

     {
      for(int i=0; i<13; i++)
        {
         int HB = ArrayMaximum(High,SIZE-periods[i],periods[i]);
         int LB = ArrayMinimum(Low, SIZE-periods[i],periods[i]);
         if(Bid>=High[HB]) inputsH[i] =1;
         else inputsH[i]=0;
         if(Bid<=Low[LB]) inputsL[i]=1;
         else inputsL[i]=0;
        }

      double outH=CalculateNeuron(inputsH,weight);
      double outL=CalculateNeuron(inputsL,weight);

      //--- если значение выхода нейрона меньше 0
      if(outL>0)
        {
         //--- если уже существует позиция по этому символу
         if(m_Position.Select(my_symbol))
           {
            //--- и тип этой позиции Sell, то закрываем ее
            if(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);
            //--- а если тип этой позиции Buy, то выходим
            if(m_Position.PositionType()==POSITION_TYPE_BUY) return;
           }
         //--- если дошли сюда, значит позиции нет, открываем ее
         m_Trade.Buy(0.1,my_symbol);
        }
      //--- если значение выхода нейрона больше или равно 0
      if(outH>0)
        {
         //--- если уже существует позиция по этому символу
         if(m_Position.Select(my_symbol))
           {
            //--- и тип этой позиции Buy, то закрываем ее
            if(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);
            //--- а если тип этой позиции Sell, то выходим
            if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
           }
         //--- если дошли сюда, значит позиции нет, открываем ее
         m_Trade.Sell(0.1,my_symbol);
        }

      if(outH>0.0 || outL>0) Print(outH,"    ",outL);
     }

  }
//+------------------------------------------------------------------+
//|   Функция вычисления нейрона                                     |
//+------------------------------------------------------------------+
double CalculateNeuron(double &inputs[],double &w[])
  {
//--- переменная для хранения средневзвешенной суммы входных сигналов
   double NET=0.0;
//--- в цикле по количеству входов получаем средневзвешенную сумму входов
   for(int n=0;n<ArraySize(inputs);n++)
     {
      NET+=inputs[n]*w[n];
     }
//--- умножаем средневзвешенную сумму входов на добавочный коэффициент
   return(ActivateNeuron(NET));
  }
//+------------------------------------------------------------------+
//|   Функция активации нейрона                                      |
//+------------------------------------------------------------------+
double ActivateNeuron(double x)
  {
//--- переменная для хранения результата функции активации
   double Out;
//--- функция гиперболического тангенса
   Out=(exp(x)-exp(-x))/(exp(x)+exp(-x));
//--- возвращаем значение функции активации
   return(Out);
  }
//+------------------------------------------------------------------+

вот написал такого сова. Можно ли сказать что это нейросеть, а то у меня есть сомнения. 

Сова для торговли в канале. 

Алгоритм следующий: берутся экстремумы за кол-во баров по Фибо (2,3,5,8,13....). Для каждого нейрона на покупку, к примеру - если Цена ниже или равна цене экстремума LOW для одного периода то возвращаем 1  иначе - 0. дальше, как в примере c NeuronMACD. На продажу - зеркально наоборот.

 Жду критики кода и алгоритма. 

 
dimeon:

вот написал такого сова. Можно ли сказать что это нейросеть, а то у меня есть сомнения. 

Сова для торговли в канале. 

Алгоритм следующий: берутся экстремумы за кол-во баров по Фибо (2,3,5,8,13....). Для каждого нейрона на покупку, к примеру - если Цена ниже или равна цене экстремума LOW для одного периода то возвращаем 1  иначе - 0. дальше, как в примере c NeuronMACD. На продажу - зеркально наоборот.

 Жду критики кода и алгоритма. 

В вашем случае Функцию активации нейрона можно выкинуть, лишний тормоз.  
return(NET);
Это не нейросеть, это просто перцептрон. Для сети надо хотя бы парочку перцептронов.
 
her.human:
В вашем случае Функцию активации нейрона можно выкинуть, лишний тормоз.  
return(NET);
Это не нейросеть, это просто перцептрон. Для сети надо хотя бы парочку перцептронов.
а можно пример. ну там добавить МА или другой индикатор или что-то еще, и как это все завязать в сеть? 
Причина обращения: