English Русский Español Deutsch Português
preview
ニューラルネットワークの実践:割線

ニューラルネットワークの実践:割線

MetaTrader 5機械学習 | 30 8月 2024, 09:05
36 0
Daniel Jose
Daniel Jose

はじめに

親愛なる読者の皆さん、連載記事として扱われることのない話題へようこそ。

人工知能をテーマとした連載記事を発表したほうがいいのではと考える人も多いでしょうが、私にはその方法が想像できません。ほとんどの人は、ニューラルネットワークの真の目的、ひいてはいわゆる人工知能について知りません。

ここではこの話題について詳しくは触れません。その代わりに、他の側面に焦点を当てます。したがって、このトピックに関する私の記事をどのような順番で読んでも構わないし、自分に関係のある内容に集中しても構いません。ニューラルネットワークと人工知能のトピックをできるだけ広く考えます。主な目的は、市場や特定のタスクに向けたシステムを作成することではありません。ここでの目的は、メディアで紹介され、多くの人々を魅了し、ニューラルネットワークや人工知能が一定レベルの意識を持つことができると思わせるようなことを、コンピュータープログラムがどのように実行できるかを説明し、示すことです。

私はニューラルネットワークと人工知能には違いがあると思っていますが、もちろんこれは私の意見に過ぎません。これらの記事を読めば、人工知能やニューラルネットワークが特別なものではないことがわかるでしょう。それは単に、特定の目標を達成するために考え抜かれたプログラムです。ただし、まだ焦りは禁物です。まず、さまざまな段階を踏んで、すべての仕組みを理解しなければなりません。MQL5以外は使用しません。

これは私にとって個人的な挑戦となります。私はただ、正しい概念と物事が実際にどのように動くかを理解すれば、どんな言語でもこの記事で紹介するようなものを作成することができることを示したいだけです。これらの記事が読者にとって興味深いものであり、このトピックに関する知識を豊かにしてくれることを願っています。


線形回帰

理論的な部分ですでに説明したように、ニューラルネットワークを扱う場合、線形回帰と導関数を使用する必要があります。なぜでしょうか。その理由は、線形回帰は現存する最も単純な公式の1つだからです。実際、線形回帰は単なるアフィン関数です。しかし、ニューラルネットワークについて語るとき、私たちは直接線形回帰の効果には興味がありません。この直線を生み出す方程式に興味があるのです。興味があるのは、作成された線ではなく、計算式なのです。

これを理解するために、以下のコードに示すような小さな指標を作ってみましょう。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. #property indicator_chart_window
04. #property indicator_plots 0
05. //+------------------------------------------------------------------+
06. #include <Canvas\Canvas.mqh>
07. //+------------------------------------------------------------------+
08. CCanvas canvas;
09. //+------------------------------------------------------------------+
10. void Func_01(const int x, const int y)
11. {
12.     int A[] {
13.                 -100,  150,
14.                  -80,   50,
15.                   30,  -80,
16.                  100, -120
17.             };
18. 
19.     canvas.LineVertical(x, y - 200, y + 200, ColorToARGB(clrRoyalBlue, 255));
20.     canvas.LineHorizontal(x - 200, x + 200, y, ColorToARGB(clrRoyalBlue, 255));
21. 
22.     for (uint c0 = 0, c1 = 0; c1 < A.Size(); c0++)
23.         canvas.FillCircle(x + A[c1++], y + A[c1++], 5, ColorToARGB(clrRed, 255));
24. }
25. //+------------------------------------------------------------------+
26. int OnInit()
27. {    
28.     int px, py;
29.     
30.     px = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS, 0);
31.     py = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0);
32. 
33.     canvas.CreateBitmapLabel("BL", 0, 0, px, py, COLOR_FORMAT_ARGB_NORMALIZE);
34.     canvas.Erase(ColorToARGB(clrWhite, 255));
35.         
36.     Func_01(px / 2, py / 2);
37. 
38.     canvas.Update(true);
39.     
40.     return INIT_SUCCEEDED;
41. }
42. //+------------------------------------------------------------------+
43. int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
44. {
45.     return rates_total;
46. }
47. //+------------------------------------------------------------------+
48. void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
49. {
50. }
51. //+------------------------------------------------------------------+
52. void OnDeinit(const int reason)
53. {
54.     canvas.Destroy();
55. }
56. //+------------------------------------------------------------------+

このコードが実行されると、画面には次のように表示されます。


ここで、なぜニューラルネットワークを扱うときに線形回帰と導関数を使用するのかを理解し始める必要があります。赤い点はニューラルネットワーク内の情報を表します。つまり、AIは訓練されており、赤い点として表示される情報が含まれています。青い線は座標軸です。問題は、このデータセットを最もよく表す数式は何か、ということです。言い換えれば、上の図に描かれている概念を一般化するとしたら、この図を最もよく表す数式はどれでしょうか。点の分布を見れば、直線と言えます。そして、アフィン関数である線分方程式を考えることができます。この方程式を以下に示します。


つまり、この関数は直線を作成するために使用されます。さて、本題に戻りましょう。可能な限り最良の方法で直線を作成するには、AとBをどのような値にすればよいでしょうか。試行錯誤しながら探せばいいという人も多いかもしれませんが、物事を単純化しましょう。ここでは、Bはゼロに等しいと仮定します。つまり、直線は座標軸の原点を通ります。まず、ニューラルネットワークで使用される数学を理解するために、簡単に説明します。

この場合、定数Aの値を求めればいいのです。では、どうやってAの値を求めるのでしょうか。何を入れてもいいですが、使用される値によっては、数式は真の最適化にはなりません。ニューラルネットワークに蓄えられている知識はわずかなものであっても、それを失う価値はないでしょう。このため、私たちはいかなる意味も使いません(使えません)。Aが可能な限り最良の値となる値を見つける必要があります。

ここでマシンは学習を始めます。そこで、機械学習(ML)という言葉が登場します。多くの人がこの言葉の意味を理解せずに使用しています。それはまさに、ネットワーク内の知識点を最もよく表す数式を作成することです。これを手作業でおこなうのは最も難しい作業のひとつです。しかし、数学的操作を使用すれば、機械に方程式を作成させることができます。これが機械学習システムです。アイデアは、何らかの方法でコンピュータに数式を自動的に生成させることです。

これで、機械がどのように学習するかを理解し始めたでしょう。これは1つの方法ですが、他にも方法はあります。しかし、ここではこの特別な方法に焦点を当てます。私たちにはすでに達成すべき具体的な任務があります。上に示したアフィン方程式において、定数Aの最適値をどのように求めることができるかを計算しなければなりません。

与えられた範囲内のすべての値を反復するループを作ればいいと考えることもできます。これは実際に機能しますが、計算効率は良くありません。次のことを考えてみてください。この例では、定数Bの値が0に等しいと見なすため、必要な変数は定数Aの1つだけです。しかし実際には、定数Bはゼロにならないことがほとんどでしょう。したがって、値の範囲をトラバースするこの方法は、すべての状況で機能するわけではありません。たとえ定数Bの値を変えなければならないとしても、あらゆる状況に適応できるものを構築する必要があります。

では、どうすればこの問題を解決できるのでしょうか。物事を理解しやすくするために、使用される数学をよりよく視覚化するために、このアプローチを少し修正します。新しいコードは以下の通りです。

01. //+------------------------------------------------------------------+
02. #property copyright "Daniel Jose"
03. #property indicator_chart_window
04. #property indicator_plots 0
05. //+------------------------------------------------------------------+
06. #include <Canvas\Canvas.mqh>
07. //+------------------------------------------------------------------+
08. #define _ToRadians(A) (A * (M_PI / 180.0))
09. #define _SizeLine 200
10. //+------------------------------------------------------------------+
11. CCanvas canvas;
12. //+------------------------------------------------------------------+
13. struct st_00
14. {
15.     int     x,
16.             y;
17.     double  Angle;
18. }global;
19. //+------------------------------------------------------------------+
20. void Func_01(void)
21. {
22.     int A[] {
23.                   -100,  150,
24.                    -80,   50,
25.                     30,  -80,
26.                    100, -120
27.             };
28. 
29.     canvas.LineVertical(global.x, global.y - _SizeLine, global.y + _SizeLine, ColorToARGB(clrRoyalBlue, 255));
30.     canvas.LineHorizontal(global.x - _SizeLine, global.x + _SizeLine, global.y, ColorToARGB(clrRoyalBlue, 255));
31. 
32.     for (uint c0 = 0, c1 = 0; c1 < A.Size(); c0++)
33.         canvas.FillCircle(global.x + A[c1++], global.y + A[c1++], 5, ColorToARGB(clrRed, 255));
34. }
35. //+------------------------------------------------------------------+
36. void NewAngle(const char direct, const double step = 1)
37. {
38.     canvas.Erase(ColorToARGB(clrWhite, 255));
39.     Func_01();
40. 
41.     global.Angle = (MathAbs(global.Angle + (step * direct)) <= 90 ? global.Angle + (step * direct) : global.Angle);
42.     canvas.TextOut(global.x + 250, global.y, StringFormat("%.2f", global.Angle), ColorToARGB(clrBlack));
43.     canvas.Line(
44.                 global.x - (int)(_SizeLine * cos(_ToRadians(global.Angle))), 
45.                 global.y - (int)(_SizeLine * sin(_ToRadians(global.Angle))), 
46.                 global.x + (int)(_SizeLine * cos(_ToRadians(global.Angle))), 
47.                 global.y + (int)(_SizeLine * sin(_ToRadians(global.Angle))), 
48.                 ColorToARGB(clrForestGreen)
49.             );
50.     canvas.Update(true);
51. }
52. //+------------------------------------------------------------------+
53. int OnInit()
54. {    
55.     global.Angle = 0;
56.     global.x = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS, 0);
57.     global.y = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0);
58. 
59.     canvas.CreateBitmapLabel("BL", 0, 0, global.x, global.y, COLOR_FORMAT_ARGB_NORMALIZE);
60.     global.x /= 2;
61.     global.y /= 2;
62.         
63.     NewAngle(0);
64. 
65.     canvas.Update(true);
66.     
67.     return INIT_SUCCEEDED;
68. }
69. //+------------------------------------------------------------------+
70. int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
71. {
72.     return rates_total;
73. }
74. //+------------------------------------------------------------------+
75. void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
76. {
77.     switch (id)
78.     {
79.         case CHARTEVENT_KEYDOWN:
80.             if (TerminalInfoInteger(TERMINAL_KEYSTATE_LEFT))
81.                 NewAngle(-1);
82.             if (TerminalInfoInteger(TERMINAL_KEYSTATE_RIGHT))
83.                 NewAngle(1);
84.             break;
85.     }
86. }
87. //+------------------------------------------------------------------+
88. void OnDeinit(const int reason)
89. {
90.     canvas.Destroy();
91. }
92. //+------------------------------------------------------------------+

下の画像はその結果です。


つまり、定数Aの値を変更することで、既存の知識、つまり赤い点を維持しようとする線形回帰方程式を作成することができます。この場合、正しい方程式は以下のようになります。表示されている角度は、左または右の矢印を使用して得られた角度です。


そこで、必要な定数は角度の正弦であると仮定し、方程式を構成することができます。しかし、これはそうではありません。定数が角度と関係ないからではなく(実際、関係ある)、正弦か余弦を使用すると考えるからです。この方法は、アイデアを表現する一般的な方法としては最適ではありません。通常、アフィン方程式は三角関数では表現されません。これは間違ってはいません。今回は、この定数を求めるために角度がどのように使用されるかを見てみましょう。しかし、その前に説明しなければならないことがあります。下のコードのように、コードを少し変えてみると、アニメーションで示されている線の正しい方程式に近くなるのがわかるでしょう。なぜなら、定数は正しい用語を使用することを知っているからです。

35. //+------------------------------------------------------------------+
36. void NewAngle(const char direct, const double step = 1)
37. {
38.     canvas.Erase(ColorToARGB(clrWhite, 255));
39.     Func_01();
40. 
41.     global.Angle = (MathAbs(global.Angle + (step * direct)) < 90 ? global.Angle + (step * direct) : global.Angle);
42.     canvas.TextOut(global.x + _SizeLine + 50, global.y, StringFormat("%.2f", MathAbs(global.Angle)), ColorToARGB(clrBlack));
43.     canvas.TextOut(global.x, global.y + _SizeLine + 50, StringFormat("f(x) = %.2fx", -MathTan(_ToRadians(global.Angle))), ColorToARGB(clrBlack));
44.     canvas.Line(
45.                 global.x - (int)(_SizeLine * cos(_ToRadians(global.Angle))), 
46.                 global.y - (int)(_SizeLine * sin(_ToRadians(global.Angle))), 
47.                 global.x + (int)(_SizeLine * cos(_ToRadians(global.Angle))), 
48.                 global.y + (int)(_SizeLine * sin(_ToRadians(global.Angle))), 
49.                 ColorToARGB(clrForestGreen)
50.             );
51.     canvas.Update(true);
52. }
53. //+------------------------------------------------------------------+

コード実行の結果は以下のgif画像に示されています。


43行目のおかげで、直線の方程式に非常に近いものができたことに注目してください。式を作成するには、正弦や余弦ではなく、角度の正接を使用することがわかるでしょう。これは最も適切な価値を生み出すための試みに過ぎません。しかし、方程式を立てることはできても、直線の傾き、つまり系の角度の最適値を推測するのはそう簡単ではないことがわかります。手動でやってみることもできますが、非常に難しい作業です。線形回帰を生み出す方程式を構築することは複雑ですが、この時点では、このシステムで1つの変数だけを扱っていることを覚えておくことが重要です。上のアニメーションのように、これが求めるべき値です。

しかし、数学を正しく使用すれば、傾斜角の最も適切な値を見つけることができます。そのためには、導関数を使用する必要があります。また、なぜ接線が方程式で使用される定数を最もよく示す三角関数なのかを理解する必要があります。しかし、親愛なる読者の皆さん、これを理解しやすくするために、新しいトピックを始めましょう。


導関数の使用

ここで、多くの人にとって計算が少し混乱します。しかし、それは心に絶望や恐れ、苦悩をもたらすものではありません。角度の最適値を求める方法をコードに指示し、方程式がすでに知っている値にアクセスできるようにするか、可能な限りその値に近づける必要があります。従って、方程式は理想に非常に近い値の定数を持つことになります。これにより、グラフ上に存在する知識を方程式形式(この場合は線形方程式)で保存できるようになります。

線形回帰によく似た一次方程式を扱うのは、この種の方程式が必要な定数を計算するのに最も簡単だからです。これは、グラフ上で値を表現する方法として優れているからではなく、計算しやすいからです。ただし、場合によっては処理時間が大幅にかかることもありますが、それは別の問題です。

このような方程式を計算するには、いくつかの数学的リソースが必要です。アフィン関数は直線関数であり、微分を求めることができないからです。導関数とは、与えられた点を通る直線のことで、任意の方程式から求めることができます。このような説明で混乱する人が多いですが、実は導関数とは関数のある点での接線に過ぎません。接線は、通常グラフ上の曲線を作成する方程式に属する点に引かれます。アフィン関数は接線であるため、接線は未知部分に掛けられる定数の値を反映し、その特定の直線の方程式を提供します。このため、この元の方程式を使用して2つ目の接線を引くことはできません。これには別のものが必要です。したがって、導関数を求めるのにどの点を使用するかは問題ではありません。アフィン関数を微分することはできません

しかし、導関数を確実に作成する方法はあります。これこそが、今日私たちが勉強し始めることなのです。この方法を理解するためには、導関数とは何かを理解する必要があります。そして、この微分を求め、それに応じて最小理想線を記述するアフィン関数を作成するために使用される方法を理解する必要があります。そのために、微分を出力できる関数を使用します。最も単純なものは2次関数です。その計算式を以下に示します。


この式には2のべき乗があります。この事実だけで、システムに微分が存在することを説明することができますが、曲線を構成するためにはどんな関数でも使用することができます。対数関数かもしれません。しかし、次にやるべきことを考えれば、対数関数は意味をなしません。このような理由から、またプロセスをできるだけ単純にするために、2次方程式を使用することにします。従って、上記の式を使用すると、以下のグラフが得られます。


このグラフは、Aの値を1に、BとCの値をゼロに設定することで実現します。しかし、私たちにとって本当に重要なのは、グラフで見ることができる曲線です。

この説明は、必要な方程式を求めるためにプログラムで何を実装するかを理解するために重要です。

上のグラフから、いくつかの仮定を立てることになるが、それを理解することが重要です。Xが4となる点での導関数の値を知りたいのです。そのためには、Xが4となる点を正確に通る接線を引く必要があります。一見すると、これは簡単です。定規で4等分した座標上に点Xを印します。そして、曲線上のある点に接する直線を作ろうとします。しかし、これで実際に接線を引くことができるのでしょうか。これはあり得ません。

接線にならない線を作成する可能性の方がはるかに高いです。このため、いくつかの計算をする必要があります。ここからがややこしくなります。しかし、無意味に状況を複雑にしないために、この段階では計算そのものの詳細には触れないことにします。読者が二次方程式の微分の公式を知っていると仮定します。ご存じない方のために、この公式を得る方法を後で説明しましょう。今重要なのは、微分方程式の求め方です。最終的な結果はそれほど重要ではありませんが、微分から得られる公式は重要です。では、続けましょう。

二次方程式の導関数は次の式で求めることができます。


次に、最も一般的な表記を2つ紹介しましょう。右でも左でも構いません。ここで、私たちが興味を持っているのは式自体です。これは、Xの2倍に等しくなります。この式は8という値を与えます。これは、この例では、Xが4である点における接線の値です。値8が何を意味するかがわかっていれば、Xが4に等しい点に接線を引くことができます。しかし、この値が何を意味するのかわからない場合は、接線をプロットするために2つ目の公式が必要になります。 

なぜこの値が8なのか理解できない場合は、Xに関する導関数が4であることを望む下の図を見てください。そのために、以下のようにその位置での値を計算します。


しかし、他の計算に移る前に、この8という値が何を意味するのかを考えてみましょう。つまり、X軸の位置を1つ動かすと、Y軸の位置を8つ動かす必要があります。これで接線を引くことができます。現実に起こってみるまでは信じられないかもしれません。このような場合、接線の方程式を書ける公式があります。この方程式はこうです。


ちょっと怖いですが、案外簡単なことです。とはいえ、この式はかなり特別なものであることは間違いません。微分は最終的に接線になりますが、微分に対する接線の方程式を作成することができます。しかし、これは興味深い事実として述べたに過ぎず、心配するようなことではありません。つまり、すでにほとんどの値がわかっているのだから、適切な代入をして接線の方程式の公式を求めることができます。この瞬間は以下で見ることができます。


ここが複雑なところなのですが、これらの値がどこから来るのかを考えてみましょう。値16は元の方程式の結果です。つまり、微分で使用するXの値、つまり「4」を二次方程式に代入したのです。値8は関数の微分を計算した結果として得られます。ここでもXは4に等しく、これは関数の微分にも当てはまります。ここで見る値4は、他のすべての方程式で使用するXの初期値です。計算の結果、接線の公式は以下のようになります。


素晴らしい、これで上の方程式に基づいて接線を引くことができます。引かれた線は下の画像で見ることができ、赤くハイライトされています。


このグラフはSCILABプログラムを使用して作成しました。もっと詳しく見たい人のために、SCILABで生成に使用したコードを以下に示します。

x = [-10:.2:10];
y = x ^ 2;

plot(x, y, 'b-');
plot(4, 16, 'ro');

x = [2:.2:10];
y = 8 * x - 16;

plot(x, y, 'r-');

これは、単にあれやこれやのプログラムの使い方を学べばいいというものではないことを理解してもらうために付け加えたものです。特定の言語に堪能であることは、本当の資格を与えるものではありません。状況を正確に分析するためには、さまざまなプログラムに頼らざるを得ないことも多いです。このため、さらなる教育は非常に重要です。そして、自分がどんなに優れていると思っていても、ある分野では常に自分より経験豊富な人がいるものです。だから、常に学ぶのです。

さて、必要な知識はすべて得ましたが、この接線は何を意味するのでしょうか。そして、ニューラルネットワークを扱う人々にとって、なぜそれがそれほど重要なのでしょうか。なぜなら、この線は私たちが動くべき場所を示しているからです。より正確には、線形回帰式を作成するためにプログラムが動くべき場所ですが、

それだけではありません。この行では、偏差の計算方法を説明しています。ニューラルネットワークの「魔法」はこの計算にあります。おわかりですか。おそらく、どうしてこんなことが可能なのか理解できないでしょう。これを理解するためには、微分計算の原動力を理解する必要があります。最後に接線を使用しても、接線から計算が生じるわけではありません。これらは別の三角関数から生じます。ここにシステムの魔法があります。この「魔法」によって、あらゆる可能性と許容可能なケースに対する一般的な解決策を生み出すことができ、それがニューラルシステムを機能させるのです。それは別のトピックに譲ることにしましょう。


割線

ニューラルネットワークについて語るとき、誰もが微分のことばかりを口にしますが、秘密は微分や接線にあるのではありません。その秘密は別の直線にあります。そしてこれは割線です。だからこそ、ニューラルネットワークの話題について書くことには、ある種の抵抗感がありました。実際、このトピックを取り上げてほしいと言われることもありました。実際のところ、ニューラルネットワークについて語る人は多いですが、実際に数学的な観点からその仕組みを理解している人はほとんどいません。プログラミングは簡単ですが、難しいのは数学です。多くの人は、あれやこれやのライブラリ、これやこれやのプログラミング言語を使用するべきだと信じています。しかし実際には、その数学的要素の仕組みを理解すれば、どんな言語でも使用することができます。誰かのことを否定的に言うつもりはないし、誰かの説明が間違っていると言いたいわけでもありません。誰もが自分の望む方法ですべてを理解する権利があります。しかし、私の望みは、すべてがどのように機能するかを本当に説明することです。言語やライブラリの奴隷になってほしくありません。内部からすべての仕組みを理解してください。このトピックについて連載を書くことにしたのはこのためです。

微分の考え方は、接線の値を求めることです。これは接線が関数の傾きを示しているからです。言い換えれば、ニューラルネットワークで使用した場合の線形回帰の誤差です。したがって、接線の角度が0度になり始めると、誤差はゼロに近づきます。言い換えれば、データベースにすでに存在する値に対して線形回帰を生成する方程式は、理想的な値に近づきます。これは、この特定のケースと特定の値で起こることです。

しかし、計算をおこなう際には接線は使用しません。実際には割線を使用します。ニューラルネットワークの種類は問いません。計算がある場合は、接線ではなく、割線が使用されます。これはもっと複雑だと思うかもしれませんが、そう思うのであれば、微分の接線が実際にどのように得られるかを知らないことになります。あるいはさらに悪いことに、微分の公式がどのようにして得られるかを知らないことになります。公式を暗記することに特に意味はありません。一番良いのは、なぜその公式がこの形式であり、他の形式ではないのかを理解することです。前回のトピックで説明した計算を覚えているでしょうか。どこから来たのか知っていますか。知らなければ、下のグラフを見てみましょう。


このグラフの赤い線は割線です。ここまで注意深く見てきてくれたなら、これからは注意力を倍にしてください。このことは、ニューラルネットワークについて読んだり聞いたりする他のどんなことよりも重要でしょう。

ここでは、前のトピックと同じXポイントを使用し、それは4に等しいです。私が説明していることをよりよく理解してもらうためです。

どう考えても、どう想像しても、接線を生成することは不可能であることに注意してください。グラフ上の曲線から接線を生成することは不可能です。しかし、割線を使用すれば、接線を得ることができます。やり方は、とてもシンプルです。f(x+h)はf(x)を距離hだけシフトしたものです。hがゼロに近づけば、割線は接線に変わります。そして、hがちょうどゼロのとき、図に示す割線は接線と正確に一致します。つまり、この点で、接線は与えられた点での関数の導関数の傾きを与えてくれます。でも、まだ理解できないかもしれません。上記の内容をもっと分かりやすい形にまとめると、状況が明確になるかもしれません。


上の画像は前の画像と同じです。これで、割線を使用する考え方がより明確になると思います。そして、ニューラルネットワークを使用するときに接線や導関数を使用するという主張とは異なり、コンピュータが正しい方程式を生成できるように、実際には割線を使用するのはなぜでしょうか。

hの値を小さくするとf(x)に近づき始めますが、このhがゼロに等しくなることはありません。ここでニューラルネットワークを使用します。これは非常に小さい値である可能性があります。この値がどのくらい小さいかは、後で説明する1つの要素に依存します。この瞬間は、ニューラルネットワークの狂気として知られています。この値hが小さければ小さいほど、ニューラルネットワークの狂うは少なくなり、大きければ大きいほど狂うことになります。なぜでしょうか。理由は収束です。後ほど検討する計算では、この収束が値hに向かう傾向があることに気づくことができるでしょう。この結果、最後に得られる方程式は、この収束の範囲内で変化する傾向があります。このため、hは非常に重要です。説明は複雑に見えますが、実際にはすべてがもっと単純であることがわかるでしょう。しかし、まだ見せたいところまでは到達していません。上の画像から、以下の式が得られます。


この計算式は、正対線が接線からどれだけ離れているかを示しています。ただし、実際に使用される計算は下図のものです。


この方程式は、ニューラルネットワークについて知っておくべきことをすべて説明しています。これが、ニューラルネットワークが導関数を使用すると言われる理由です。多くの人が単純に暗記している微分方程式という計算を生み出すのは、この方程式なのです。それだけです。これ以上、説明することも議論することもありません。必要なのは上の式だけです。これで記事を閉じて、静かに自分の人生を生きることができます。


最後に

でも、ちょっと待ってください。この割線方程式をどう使用するのか、なぜそれがすべてを説明するのかを説明していません。「説明していない」とはどういう意味でしょうか。冗談ですか。読者の皆さん、実は、私はこのトピックを紹介し始めたばかりなのです。まずは落ち着いてこの資料を勉強してください。ニューラルネットワークに関する次回の記事では、ここで紹介した知識を使用して正しい方程式を立てる方法を見ていきます。


MetaQuotes Ltdによりポルトガル語から翻訳されました。
元の記事: https://www.mql5.com/pt/articles/13656

添付されたファイル |
Anexo_01.mq5 (3.49 KB)
母集団最適化アルゴリズム:群鳥アルゴリズム(BSA) 母集団最適化アルゴリズム:群鳥アルゴリズム(BSA)
本稿では、自然界における鳥の群れの集団的な相互作用に着想を得た、鳥の群れに基づくアルゴリズム(BSA)を探求します。飛行、警戒、採餌行動の切り替えなど、BSAの個体にはさまざまな探索戦略があるため、このアルゴリズムは多面的なものとなっています。鳥の群れ、コミュニケーション、適応性、先導と追随の原理を利用し、効率的に最適解を見つけます。
データサイエンスと機械学習(第25回):回帰型ニューラルネットワーク(RNN)を用いたFX時系列予測 データサイエンスと機械学習(第25回):回帰型ニューラルネットワーク(RNN)を用いたFX時系列予測
回帰型ニューラルネットワーク(Recurrent Neural Network: RNN)は、過去の情報を活用して将来の出来事を予測することに優れています。その驚くべき予測能力は、さまざまな領域で応用され、大きな成功を収めています。この記事では、外為市場のトレンドを予測するためにRNNモデルを導入し、外為取引における予測精度を高める可能性を示します。
非定常過程と偽回帰 非定常過程と偽回帰
この記事では、モンテカルロシミュレーションを用いて非定常過程に回帰分析を適用しようとすると、偽回帰が発生することを示しています。
PatchTST機械学習アルゴリズムによる24時間の値動きの予測 PatchTST機械学習アルゴリズムによる24時間の値動きの予測
この記事では、PatchTSTと呼ばれる2023年にリリースされた比較的複雑なニューラルネットワークアルゴリズムを適用し、今後24時間の値動きを予測します。公式リポジトリを使用し、若干の修正を加え、EURUSDのモデルを訓練し、PythonとMQL5の両方で将来の予測をおこなうために適用します。