記事「ニューラルネットワークが簡単に(第50回):Soft Actor-Critic(モデルの最適化)」についてのディスカッション - ページ 2

 
Viktor Kudriavtsev #:

等々。理解できただろうか?私を混乱させるのは、テストがしばしば-7000、あるいは-9000と非常に大きなマイナスパスを出すことです。そしてベースにはそれがたくさんある。ネットワークは意図的にマイナスの取引をするように訓練されているのではないですか?

あまり数学に深入りせずに、学習プロセスを見てみよう。古典的な強化学習では、各行動は環境から報酬を与えられたときに評価される。この報酬を目標成果としてモデルに与える。したがって、モデルを訓練して行動を選択させるのではなく、行動に対する期待報酬(Q関数)を予測させ、予測された報酬から行動を実行するための最大報酬を選択させるのである。すぐに断っておくが、すべての行動が採算に合わない場合、「何もしない」という選択肢は通らない。

連続行動空間では、行動の報酬を直接指定することはできない。結局のところ、モデルは報酬ではなく影響のレベル(取引量、SLレベルなど)を返さなければならない。そこで、クリティックを使ってアクションを評価する。例データベースの状態とアクションをクリティックの入力に送り、予測された報酬を返します。これをモデルの報酬と比較し、アクションを正しく評価できるようにCriticを訓練する。その結果、Criticは状態と行動が予想報酬に与える影響について抽象的な考えを形成する。例えば、強気トレンドの場合、買い数量が増えれば収益が増加し、売り数 量が減れば損失が減少する。

次に、アクターを訓練する。別の状態をアクターの入力に与える。アクターは何らかのアクションを生成する。このアクションと環境の初期状態を入力し、Actorのアクションを評価します。そして、結果を改善する必要があることをCriticに伝えます(受け取った結果よりも高い目標結果を指定します)。それに対して、CriticはActorにどのように行動を変える必要があるかを伝えます(誤差勾配を送信します)。

だから理論的には、ネガティブなパスでもポジティブな結果を得ることができる。しかし問題は、アクションに対する収入依存の関数が線形ではないということだ。そして、行動をより正しく評価するためには、より良いパスが必要なのである。

さて、アクターの直接作業とトレーニングについてである。初期段階では、モデルをランダムなパラメータで初期化する。そしてアクターのアクションも同様にランダムである。トレーニングの過程で、たとえば評論家は1ロットのポジションを建てる必要があると言います。しかし、低い学習率でモデルをトレーニングする。そして次の反復で、アクターは0.01ロットのポジションを建てる。明らかに、望ましい結果を得るためには、このような学習を100回繰り返す必要がある。

なぜ壁に頭を打ちつけるのだろうか?学習係数を1に上げて、得られた経験を一度に記憶してしまおう。しかし、コインには別の側面もある。この場合、モデルは蓄積された経験をすぐに忘れてしまい、汎化など問題外になってしまう。

だからこそ、私たちは単純な真理を学ぶまで、壁に頭を打ち付け続けるのである。そして、モデルトレーニングの全過程は、試行錯誤によるパラメーターの選択なのである。

 
Dmitriy Gizlyk #:

いわば指先の数学に深入りすることなく、学習プロセスを見てみよう。古典的な強化学習では、各行動は環境から報酬を与えられたときに評価される。この報酬を目標成果としてモデルに与える。したがって、モデルを訓練して行動を選択させるのではなく、行動に対する期待報酬(Q関数)を予測させ、予測された報酬から行動を実行するための最大報酬を選択させるのである。すぐに言っておくが、すべての行動が採算に合わない場合、何もしないという選択肢は機能しない。なぜなら、我々は「何もしない」ことを別の行動として評価し、それにも独自の報酬レベルがあるからである。

連続行動空間では、行動の報酬を直接指定することはできない。結局のところ、モデルは報酬ではなく、影響のレベル(取引量、SLレベルなど)を返す必要があります。そこで、クリティックを使ってアクションを評価する。例データベースの状態とアクションをクリティックの入力に送り、予測された報酬を返します。これをモデルの報酬と比較し、アクションを正しく評価できるようにCriticを訓練する。その結果、Criticは状態と行動が予想報酬に与える影響について抽象的な考えを形成する。例えば、強気トレンドの場合、買い数量が増加すれば報酬は増加し、売り数 量が減少すれば損失は減少する。

次に、アクターを訓練する。別の状態をアクターの入力に与える。アクターは何らかのアクションを生成する。このアクションと環境の初期状態を入力し、アクターのアクションを評価します。そして、結果を改善する必要があることをCriticに伝えます(受け取った結果よりも高い目標結果を指定します)。それに対してCriticはActorにアクションの変更方法を伝えます(エラー勾配を送信します)。

だから理論的には、ネガティブなパスでもポジティブな結果を得ることができる。しかし問題は、アクションに対する収入依存の関数が線形ではないということだ。そして、アクションをより正しく評価するためには、より良いパスが必要である。

さて、アクターの直接作業とトレーニングについてである。初期段階では、モデルをランダムなパラメータで初期化する。そしてアクターのアクションも同様にランダムである。トレーニングの過程で、たとえば評論家は、1ロットのポジションを建てる必要があると言います。しかし、低い学習率でモデルをトレーニングする。そして次の反復で、アクターは0.01ロットのポジションを建てる。明らかに、望ましい結果を得るためには、このような学習を100回繰り返す必要があります。

なぜ壁に頭を打ちつけるのだろうか?学習係数を1に上げて、得られた経験を一度に記憶してしまおう。しかし、コインにはもう一つの側面がある。この場合、モデルは蓄積された経験をすぐに忘れてしまい、汎化は問題外になってしまう。

だからこそ、私たちは単純な真理を学ぶまで、壁に頭を打ち付け続けるのである。そして、モデルトレーニングの全過程は、試行錯誤によるパラメーターの選択なのである。

なるほど。わかりやすい説明をありがとうございます。

では、なぜ100,000回の反復でモデルを訓練し、200の軌跡のベースを持って、常に新しい例を収集するプロセスを繰り返すのかという疑問が生じます。なぜエキスパート・アドバイザーは、例えば1000の軌跡のベースを作成し、10,000,000反復をトレーニングに入れ、一晩、一日、一週間そこで学習させることができないのでしょうか?なぜ常にベースを補充し、少ない反復を教える必要があるのでしょうか?

 
Viktor Kudriavtsev #:

なるほど。分かりやすい説明をありがとうございました。

では、なぜモデルを100,000回反復訓練し、200の軌跡をベースにして、常に新しい例を収集するプロセスを繰り返さなければならないのでしょうか?なぜエキスパート・アドバイザーは、例えば1000の軌跡のベースを作成し、10,000,000の反復をトレーニングに入れ、一晩、一日、一週間そこで学習させることができないのでしょうか?なぜ常にベースを補充し、少ない反復回数を教える必要があるのでしょうか?

理論的には可能だが、すべてはリソースの問題だ。例えば、TAのサイズが1000点だとする。連続的なアクションスペースの概念では、これは1000の選択肢です。それを10刻みにしても100のバリエーションになる。SLを同じ数、あるいはその半分(50バリエーション)とする。取引量の少なくとも5つのバリエーションを加えると、100 * 50 * 5 = 25000のバリエーションになります。2(買い/売り)で乗算 - 1ろうそくのための50 000のバリアント。軌跡の長さを掛けると、すべての可能な空間を完全にカバーする軌跡の数が得られます。

ステップバイステップ学習では、現在のアクターのアクションのすぐ近くの軌道をサンプリングします。こうして学習範囲を絞り込む。そして、すべての可能な変種を研究するのではなく、現在の戦略を改善するための変種を探しながら、小さな領域だけを研究する。現在の戦略を少し「チューニング」した後、その改善が導いた領域で新たなデータを収集し、さらなる動きのベクトルを決定する。

これは、未知の迷路で出口を見つけることを連想させるかもしれない。あるいは、観光客が道を歩きながら通行人に道を尋ねるような道筋だ。

 
Dmitriy Gizlyk #:

理論的には可能だが、すべてはリソース次第だ。例えば、我々は1000点のTPサイズについて話している。連続的なアクションスペースの概念では、これは1000のバリエーションです。10点刻みでも100種類です。SLを同じ数、あるいはその半分(50バリエーション)とします。取引量の少なくとも5つのバリエーションを加えると、100 * 50 * 5 = 25000のバリエーションになります。2(買い/売り)で乗算 - 1ろうそくのための50 000のバリアント。軌道の長さを掛けると、あなたは完全にすべての可能なスペースをカバーするために軌道の数を得る。

ステップバイステップ学習では、現在のアクターのアクションのすぐ近くの軌道をサンプリングします。こうして学習範囲を絞り込む。そして、すべての可能な変種を研究するのではなく、現在の戦略を改善するための変種を探しながら、小さな領域だけを研究する。現在の戦略を少し「チューニング」した後、これらの改善によって導かれた領域で新たなデータを収集し、さらなる動きのベクトルを決定する。

これは、未知の迷路で出口を見つけることを連想させるかもしれない。あるいは、観光客が道を歩きながら通行人に道を尋ねるような道だ。

なるほど。ありがとうございます。

今気づいたのですが、Research.mqhの コレクションを行うと、結果は何となくグループで形成され、グループ内の最終的なバランスは非常に近いですね。そして、Research.mqhでは何らかの進歩があるように思えます(ポジティブな結果のグループがより頻繁に現れるようになったとか)。しかし、Test.mqhではまったく進歩がないようだ。ランダム性があり、一般的にマイナスで終了することが多い。上昇してから下降することもあれば、そのまま下降して失速することもある。また、最後にエントリーする量を増やしているようだ。マイナスではなく、ゼロ近辺でトレードすることもある。また、彼は取引回数を変えていることにも気づきました。5ヶ月間は150回、ある人は500回(およそ)取引しています。これはすべて正常なことなのでしょうか?

 
Viktor Kudriavtsev #:

なるほど。ありがとう。

Research.mqhの コレクションをやっていて気づいたのですが、最終的なバランスが非常に近いグループで結果が形成されています。そして、Research.mqhでは何らかの進歩があるように思えます(ポジティブな結果のグループがより頻繁に現れるようになったとか)。しかし、Test.mqhではまったく進歩がないようだ。ランダム性があり、一般的にマイナスで終了することが多い。上昇してから下降することもあれば、そのまま下降して失速することもある。また、最後にエントリーする量を増やしているようだ。マイナスではなく、ゼロ近辺でトレードすることもある。また、彼は取引回数を変えていることにも気づきました。5ヶ月間は150回、ある人は500回(およそ)取引しています。これはすべて正常なことなのでしょうか?

ランダム性はアクターの確率性の結果です。あなたが学ぶにつれて、それは少なくなります。完全にはなくならないかもしれませんが、結果は近いものになるでしょう。

 
neuronkaは奇妙に取引を開始し(あるローソク足でオープンし、次のローソク足でクローズする)、なぜかバランスとエクイティが変化しません。チャートに直線が引かれるだけ です。そして、0を通過した結果の残高の変化。しかも、これはTest.mqhと Research.mqhの 両方で起こる。そして、ベース全体がそのようなパスで埋め尽くされています。これは正常なのだろうか?どうすればいいのでしょうか - ティーチングを続けるか、あるいは、ベースとトレーニング済みモデルを一時的にフォルダから別のフォルダに移動するために取り壊して、ランダムなモデルで新しいベースを作り、それからモデルを戻してティーチングを続けるというアイデアがあります。どうにかして一直線から抜け出させるために。
 
Viktor Kudriavtsev 線が引かれるだけ です。そして、0を通過した結果の残高の変化。しかも、これはTest.mqhと Research.mqhの 両方で起こる。そして、ベース全体がそのようなパスで埋め尽くされています。これは正常なのだろうか?どうしたらいいのでしょうか - ティーチングを続けるか、あるいは、ベースとトレーニング済みモデルを一時的にフォルダから別のフォルダに移動するために取り壊して、ランダムなモデルで新しいベースを作り、それからモデルを戻してティーチングを続けるというアイデアがあります。どうにかして一直線から抜け出させるために。

ディールのないパスによって、例のデータベースが「詰まる」ことはない。Research.mq5にはチェック機能があり、そのようなパスは保存されない。しかし、Test.mq5から そのようなパスが保存されるのは良いことだ。報酬を生成する際に、ディールがないことに対するペナルティがある。そして、モデルがそのような状況から抜け出すのを助けるはずである。

 

ドミトリー 私は90以上のサイクル(データベースのトレーニング-テスト-コレクション)を行い、私はまだモデルがランダムを与える持っている。Test.mqh 7の10回の実行のうち、2-3回が0になり、1-2回が約4-5サイクルでプラスになりました。記事の中で、15サイクルでプラスの結果が出たとありましたが、これはどういうことですか?システムには多くのランダム性があることは理解していますが、なぜこのような違いがあるのか理解できません。私のモデルが30サイクル後にプラスの結果を出したのならわかりますが、例えば50サイクルだとすると、すでに90サイクルで、あまり進歩が見られないのでは......。

本当に自分でトレーニングしたコードをそのまま掲載しているのですか?もしかしたら、テストのために何かを修正したのをうっかり忘れて、間違ったバージョンを投稿してしまったとか......?

また、例えばトレーニング係数を1ランク上げれば、学習が早くなるのでは?

何か理解できないのですが......。