Обсуждение статьи "Нейросети — это просто (Часть 7): Адаптивные методы оптимизации"

 

Опубликована статья Нейросети — это просто (Часть 7): Адаптивные методы оптимизации:

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

Тестирование оптимизации методом Adam осуществлялось в тех же условиях, что и все предыдущие тестирования: инструмент EURUSD, таймфрейм H1, на вход подаются данные за 20 последовательных свечей, обучение проводится на истории за 2 последних года. Для тестирования был создан советник Fractal_OCL_Adam. Данный советник был создан из советника Fractal_OCL путем указания метода оптимизации Adam при описании нейронной сети в функции OnInit основной программы.

      desc.count=(int)HistoryBars*12;
      desc.type=defNeuron;
      desc.optimization=ADAM;

Количество слоев и нейронов осталось не изменным.

Советник был инициализирован случайными весами в диапазоне от -1 до 1, исключая нулевые значения. В ходе тестирования буквально после 2-й эпохи обучения ошибка нейронной сети стабилизировалась в районе 30%. Напомню, что при обучении методом стохастического градиентного спуска ошибка стабилизировалась в районе 42% после 5-й эпохи обучения.


График пропущенных фракталов демонстрирует плавный рост показателя в ходе всего обучения. При этом после 12 эпох обучения наблюдается постепенное снижение темпов роста показателя. После 14-й эпохи обучения значение данного показателя составила 72,5%. Для сравнения, при обучении аналогичной нейронной сети методом стохастического градиентного спуска  после 10 эпох обучения доля пропущенных фракталов составляла 97-100% при различных коэффициентах обучения.


Автор: Dmitriy Gizlyk

 

+

Это для MLP пример? с Адамом обучение быстрее стало? Помню, эпохи очень долго учились в прошлый раз

Стохастический градиент работает очень долго, конечно

 

Спасибо за статью.

Планируется ли организовать другие методы расчета функции потерь при обучении?

 

Dmitriy Gizlyk - у вас кроме голой теории практика предвидится или вы вечный "учитель"?

практика - это когда с помощью ваших методов получается успешная торговля?

Dmitriy Gizlyk
Dmitriy Gizlyk
  • www.mql5.com
Опубликовал статью Нейросети — это просто (Часть 7): Адаптивные методы оптимизации В предыдущих статьях для обучения нейронной сети использовался метод стохастического градиентного спуска с применением единого коэффициента обучения для всех нейронов в сети. В данной статье предлагаю посмотреть в сторону адаптивных методов обучения, которые...
 
Boris Egorov:

Dmitriy Gizlyk - у вас кроме голой теории практика предвидится или вы вечный "учитель"?

практика - это когда с помощью ваших методов получается успешная торговля?

Вы хотите, что б в статье выложили машинку для печатания денег?

Человек рассказывает об архитектуре сетей и вариациях её организации, что интересно, а что подавать в сеть - дело уже пользователя.

 

Вопрос. Для каких целей создаются перечисление

enum ENUM_BUFFERS
  {
   WEIGHTS,
   DELTA_WEIGHTS,
   OUTPUT,
   GRADIENT,
   FIRST_MOMENTUM,
   SECOND_MOMENTUM
  };

и переменные в классе CLayer?

class CLayer: public CArrayObj
  {
private:
...
   int               hWeights;
   int               hDeltaWeights;
   int               hOutput;
   int               hGradient;
...   
  };

Не могу найти их применение в коде.

 
Aleksei Lesnikov:

Вопрос. Для каких целей создаются перечисление

и переменные в классе CLayer?

Не могу найти их применение в коде.

Спасибо, что обратил внимание. Можно удалить, остались от черновых разработок.

 

Всем привет . кто  сталкивался с такой ошибкой при попытке чтения файла ? 

 OnInit - 198 -> Error of read AUDNZD.......

 
Borys Ivanov #:

Всем привет . кто  сталкивался с такой ошибкой при попытке чтения файла ? 

 OnInit - 198 -> Error of read AUDNZD.......

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

К сожалению, вы не указали код ошибки, чтобы можно было сказать больше.
 
Dmitriy Gizlyk #:

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

К сожалению, вы не указали код ошибки, чтобы можно было сказать больше.


Здравствуйте.

Расскажу подробнее.

при запуске эксперта в первый раз. С такими модификациями в коде: 

 dError=Net.getRecentAverageError();
         if(add_loop)
           {
            Net.Save(FileName+".nnw",dError,dUndefine,dForecast,dtStudied,false);
            printf("Era %d -> error %.2f %% forecast %.2f",count,dError,dForecast);
           }
         ChartScreenShot(0,FileName+IntegerToString(count)+".png",750,400);
         int h=FileOpen(CSV,FILE_READ|FILE_WRITE|FILE_CSV);
         if(h!=INVALID_HANDLE)
           {
            FileSeek(h,0,SEEK_END);
            FileWrite(h,eta,count,dError,dUndefine,dForecast);
            FileFlush(h);
            FileClose(h);
            Print("Файл должен быть создан ChartScreenShot ");
           }
          else Print("Операция FileOpen ChartScreenShot неудачна, ошибка ",GetLastError()); 
        }
     }

в журнеле пишется это :

KO 0 18:49:15.205 Core 1 NZDUSD: load 27 bytes of history data to synchronize in 0:00:00.001

FI 0 18:49:15.205 Core 1 NZDUSD: history synchronized from 2016.01.04 to 2022.06.28

FF 0 18:49:15.205 Core 1 2019.01.01 00:00:00   OnInit - 202 -> Error of read AUDNZD_PERIOD_D1_ 20Fractal_OCL_Adam 1.nnw prev Net 0

CH 0 18:49:15.205 Core 1 2019.01.01 00:00:00   OpenCL: GPU device 'gfx902' selected

KN 0 18:49:15.205 Core 1 2019.01.01 00:00:00   Era 1 -> error 0.01 % forecast 0.01

QK 0 18:49:15.205 Core 1 2019.01.01 00:00:00   Файл должен быть создан ChartScreenShot 

HH 0 18:49:15.205 Core 1 2019.01.01 00:00:00   Era 2 -> error 0.01 % forecast 0.01

CP 0 18:49:15.205 Core 1 2019.01.01 00:00:00   Файл должен быть создан ChartScreenShot 

PS 2 18:49:19.829 Core 1 disconnected

OL 0 18:49:19.829 Core 1 connection closed

NF 3 18:49:19.829 Tester stopped by user


И в директории "C:\Users\Borys\AppData\Roaming\MetaQuotes\Tester\BA9DEC643240F2BF3709AAEF5784CBBC\Agent-127.0.0.1-3000\MQL5\Files"

создаеться этот файл :

Fractal_10000000.csv

#define FileName        Symb.Name()+"_"+EnumToString((ENUM_TIMEFRAMES)Period())+"_"+IntegerToString(HistoryBars,3)+StringSubstr(__FILE__,0,StringFind(__FILE__,".",0))
#define CSV             "Fractal_"+StringSubstr(DoubleToString(eta),2)+".csv"

с таким содержимым :

0.1 1 0.006391065067727753 0.30606698779533065 0.009849141883310947
0.1 2 0.01416031275898674 0.320172057079727 0.009671500063084178
0.1 1 0.021322935369592233 0.4824709164481285 0.009510368103745911
0.1 2 0.03047882579179044 0.4736268224037817 0.009336035129387396
0.1 1 0.04096262961921367 0.4747386346906194 0.009164897823757697
0.1 2 0.04745129346676422 0.9935630387598718 0.1983981648307233

и так далее...

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

Тойсть Эксперет всегда находиться в обучении потому-что не находит файл.

И второй вопрос .  подскажите код (для считывания данных из выходного нейрона ) для открытия ордеров buy sell уже при обученной сети .  


Спасибо за статью и за ответ.

 
Borys Ivanov #:


Здравствуйте.

Расскажу подробнее.

при запуске эксперта в первый раз. С такими модификациями в коде: 

в журнеле пишется это :

KO 0 18:49:15.205 Core 1 NZDUSD: load 27 bytes of history data to synchronize in 0:00:00.001

FI 0 18:49:15.205 Core 1 NZDUSD: history synchronized from 2016.01.04 to 2022.06.28

FF 0 18:49:15.205 Core 1 2019.01.01 00:00:00   OnInit - 202 -> Error of read AUDNZD_PERIOD_D1_ 20Fractal_OCL_Adam 1.nnw prev Net 0

CH 0 18:49:15.205 Core 1 2019.01.01 00:00:00   OpenCL: GPU device 'gfx902' selected

KN 0 18:49:15.205 Core 1 2019.01.01 00:00:00   Era 1 -> error 0.01 % forecast 0.01

QK 0 18:49:15.205 Core 1 2019.01.01 00:00:00   Файл должен быть создан ChartScreenShot 

HH 0 18:49:15.205 Core 1 2019.01.01 00:00:00   Era 2 -> error 0.01 % forecast 0.01

CP 0 18:49:15.205 Core 1 2019.01.01 00:00:00   Файл должен быть создан ChartScreenShot 

PS 2 18:49:19.829 Core 1 disconnected

OL 0 18:49:19.829 Core 1 connection closed

NF 3 18:49:19.829 Tester stopped by user


И в директории "C:\Users\Borys\AppData\Roaming\MetaQuotes\Tester\BA9DEC643240F2BF3709AAEF5784CBBC\Agent-127.0.0.1-3000\MQL5\Files"

создаеться этот файл :

Fractal_10000000.csv

с таким содержимым :

0.1 1 0.006391065067727753 0.30606698779533065 0.009849141883310947
0.1 2 0.01416031275898674 0.320172057079727 0.009671500063084178
0.1 1 0.021322935369592233 0.4824709164481285 0.009510368103745911
0.1 2 0.03047882579179044 0.4736268224037817 0.009336035129387396
0.1 1 0.04096262961921367 0.4747386346906194 0.009164897823757697
0.1 2 0.04745129346676422 0.9935630387598718 0.1983981648307233

и так далее...

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

Тойсть Эксперет всегда находиться в обучении потому-что не находит файл.

И второй вопрос .  подскажите код (для считывания данных из выходного нейрона ) для открытия ордеров buy sell уже при обученной сети .  


Спасибо за статью и за ответ.

Добрый вечер, Борис.
Вы пытаетесь обучить нейронную сеть в тестере стратегий. Я не рекомендую это делать. Я, конечно, не знаю какие вы вносили изменения в логику обучения. В статье было организовано обучение модели в цикле. И итерации цикла повторялись до полного обучения модели или остановки советника. А исторические данные сразу загружались в динамические массивы в полном объеме. Такой подход я использовал для запуска советника в реальном времени. Период обучения устанавливался внешним параметром.

При запуске советника в тестере стратегий период обучения, указанный в параметрах, сдвигается в глубину истории от начала периода тестирования. К тому же, каждый агент в тестере стратегий MT5 работает в своей "песочнице" и сохраняет файлы в ней. Поэтому, при повторном запуске советника в тестере стратегий он не находит файл ранее обученной модели.

Попробуйте запустить советник в режиме реального времени и проверьте создание файла с расширением nnw после прекращения работы советника. Именно в этот файл записывается Ваша обученная модель.

По поводу использования модели в реальной торговле, Вам нужно передать текущую рыночную ситуацию в параметры метода Net.FeedForward. А затем получить результаты работы модели с помощью метода Net.GetResult. В результате работы последнего метода в буфере будут содержаться результаты работы модели.

Причина обращения: