文章 "神经网络变得轻松(第七部分):自适应优化方法"

 

新文章 神经网络变得轻松(第七部分):自适应优化方法已发布:

在之前的文章中,我们利用随机梯度下降法针对网络中的所有神经元按照相同的学习率训练神经网络。 在本文中,我提议着眼于自适应学习方法,该方法能够改变每个神经元的学习率。 我们还将研究这种方法的利弊。

经由 Adam 方法进行的优化测试,其所依据条件与早期测试中使用的相同:品种 EURUSD,时间帧 H1,20 根连续烛条的数据馈入网络,并根据最近两年的历史进行训练。 已为测试创建了 Fractal_OCL_Adam 智能交易系统。 该智能交易系统的创建,则是基于 Fractal_OCL EA,在主程序的 OnInit 函数中描述神经网络时,指定 Adam 优化方法。

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

层和神经元的数量没有变化。

智能交易系统初始化时的随机权重为 -1 到 1,不包括零值。 在测试期间,在第二个训练迭代之后,神经网络误差稳定在 30% 左右。 您可能还记得,采用随机梯度下降法学习时,在第 5 个训练迭代之后,误差稳定在 42% 左右


缺失的分形图形展示出数值递增贯穿于整个训练过程。 不过,经过 12 个训练迭代之后,数值递增率逐渐降低。 第 14 个迭代后,该值等于 72.5%。 当训练相似的神经网络时采用随机梯度下降方法,则在不同学习率的情况下,经过 10 个迭代后分形缺失率为 97-100%


作者:Dmitriy Gizlyk

 

+

这是 MLP 的例子吗? 亚当的学习速度变快了吗?我记得上一次学习需要花费很长的时间。

随机梯度肯定需要很长时间才能发挥作用

 

感谢您的文章。

是否有计划组织其他计算学习损失函数的方法?

 

Dmitriy Gizlyk- 除了理论之外,您还有实践吗?

实践 - 是指在您的方法的帮助下,您的交易取得成功吗?

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

德米特里-吉兹列克- 除了理论之外,您还有实践经验吗?

实践 - 是指在您的方法的帮助下,您的交易取得成功吗?

您希望文章包含印钞机吗?

他谈到了网络结构及其组织的变化,什么是有趣的,什么是馈入网络是由用户决定的。

 

问题在 CLayer 类中创建枚举和变量的目的是什么?

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

和变量的目的是什么?

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

我在代码中找不到它们的用途。

 
Aleksei Lesnikov:

问题设立转账的目的是什么?

和 CLayer 类中的变量?

我在代码中找不到它们的用途。

谢谢你的指出。你可以删除它们,它们是草稿中留下的。

 

大家好。谁在尝试读取文件时遇到过这种错误?

OnInit - 198 -> Error of readingAUDNZD.......

 
Borys Ivanov #:

大家好,谁在尝试读取文件时遇到过这种错误?

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

这条信息只是通知您预训练网络尚未加载。如果您是第一次运行 EA,这很正常,不必理会这条信息。如果您已经训练了神经网络,并希望继续训练,则应检查从文件中读取数据的错误发生在哪里。

遗憾的是,您没有说明错误代码,因此我们无法提供更多信息。
 
Dmitriy Gizlyk #:

此消息仅告知您尚未加载预训练网络。如果您是第一次运行 EA,这很正常,不必理会这条信息。如果您已经训练了神经网络,并希望继续训练,则应检查从文件中读取数据的错误发生在哪里。

遗憾的是,您没有说明错误代码,因此我们无法提供更多信息。


您好。

我会告诉你更多。

第一次启动智能交易系统时。修改代码后

 dError=Net.getRecentAverageError();
         if(add_loop)
           {
            Net.Save(FileName+".nnw",dError,dUndefine,dForecast,dtStudied,false);
            printf("Era %d -> error %.2 f %% forecast %.2 f",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 synchronise at 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 reading 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 设备 'gfx902' 已选定

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 核心 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 核心 1 2019.01.01 00:00:00 要创建的文件 ChartScreenShot

PS 2 18:49:19.829 核心 1 已断开连接

OL 0 18:49:19.829 核心 1 连接已关闭

NF 3 18:49:19.829 测试仪 被用户停止


И в директории "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 文件被覆盖

也就是说,专家一直处于训练状态,因为它找不到文件。

第二个问题,请提供代码(从输出神经元读取数据),以便在网络训练时打开买入卖出订单。


感谢您的文章和解答。

 
Borys Ivanov #:


你好

我会告诉你更多的。

在第一次启动智能交易系统时。修改代码后

日志中写道

KO 0 18:49:15.205 Core 1 NZDUSD: load 27 bytes of history data to synchronise at 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 reading 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 设备 'gfx902' 已选择

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 核心 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 核心 1 2019.01.01 00:00:00 必须创建一个文件 ChartScreenShot

PS 2 18:49:19.829 Core 1 断开连接

OL 0 18:49:19.829 Core 1 连接已关闭

NF 3 18:49:19.829 测试仪 被用户停止


И в директории "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 文件被覆盖

也就是说,由于找不到文件,Expert Advisor 一直处于学习状态。

第二个问题:请提供代码(用于从输出神经元读取数据),以便在网络训练完成后打开买入卖出订单。


感谢您的文章和解答。

晚上好,鲍里斯。
您正试图在策略测试器中训练神经网络。我不建议你这样做。我当然不知道你对训练逻辑做了什么改动。在文章中,模型的训练是在一个循环中进行的。循环反复,直到模型完全训练完成或 EA 停止。历史数据会立即全部加载到动态数组中。我使用这种方法实时运行智能交易系统。训练期由外部参数设置。

当在策略测试器中启动 Expert Advisor 时,参数中指定的学习期将从测试期开始移至历史深度。此外,MT5 策略测试器中的每个代理都在自己的 "沙箱 "中工作并保存文件。因此,当您在策略测试器中重新运行 Expert Advisor 时,它找不到之前训练过的模型文件。

尝试在实时模式下运行智能交易系统,并在 EA 停止工作后检查是否创建了扩展名为 nnw 的文件。这就是写入训练好的模型的文件。

至于在实际交易中使用模型,您需要在 Net.FeedForward 方法的参数中传递当前的市场情况。然后使用 Net.GetResult 方法获取模型的结果。使用后一种方法后,缓冲区将包含模型的工作结果。