記事についてのディスカッション

 

新しい記事「ニューラルネットワークが簡単に(第9部):作業の文書化」はパブリッシュされました:

長い道のりでした。ライブラリ内のコードはどんどん増えてきており、すべてのリンクと依存関係を追跡することが困難になっています。したがって、以前に作成したコードのドキュメントを作成し、新しい手順ごとに更新し続けることをお勧めします。適切に準備された文書化は、作業の整合性を確認するのに役立ちます。

プログラムが完了すると、すぐに使用できるドキュメントが届きます。いくつかのスクリーンショットを以下に示します。完全なドキュメントは添付ファイルに記載されています。



作者: Dmitriy Gizlyk

 

素晴らしく有用な記事資料

ありがとう!

 
クールだ!SBでできる。カーネルに LSTMをねじ込む必要がありますが、その予定はありますか?
 
Aleksey Mavrin:
クールだ!ドキュメントがあります。カーネルに LSTMをねじ込む必要がありますが、その予定はありますか?

はい、計画しています。)

 
Dmitriy Gizlyk:

はい、予定通りです)

ドミトリー、お願いだ。なぜサインとコサインが入力値に加えられるのか、最初はわからなかったんだ。

neuron.setOutputVal(inputVals.At(i)+(i%2==0 ? sin(i) : cos(i)) );

また、アドバイスが必要なのですが、私のタスクのために入力データを何らかの方法で正規化することを試みるべきでしょうか?

私の理解では、例題ではすべてが「そのまま」与えられています。しかし、フラクタルを使った例でも、0から1までのオシレーターがいくつかあり、価格は計器によっては1よりはるかに高くなることがあります。

正規化されていない入力で学習する場合、初期バイアスが生じませんか?

 
Aleksey Mavrin:

ドミトリー、なぜサインとコサインが入力値に加えられるのか教えてくれ。

また、アドバイスが必要なのですが、私のタスクのために入力データを何らかの方法で正規化することを試みるべきでしょうか?

私の理解では、例題ではすべてが「そのまま」与えられています。しかし、フラクタルを使った例でも、いくつかのオシレータは0から1まであり、価格は、楽器によっては1よりはるかに高くなることがあります。

正規化されていない入力で学習する場合、初期バイアスが生じませんか?

これは時間埋め込みのためです。詳しくは次の記事で説明します。
 
Dmitriy Gizlyk:
これは時間埋め込みのためだ。詳しくは次回に。

意味を理解するのに必死です)

入力値は、入力データの内容や絶対値に 関係なく、0から1までの一定の行列に算術的に調整される。

時系列に正弦波を重ねることで、過去のローソクの有意性が時間的に変動する。

どうやら、各バーの入力データの変動が異なる位相であることは問題ではないらしい。

しかし、正規化についての疑問は、より重要になる。例えば、EURUSDとSP500では、その意味が全く異なる。

そしてどうやらこの時間エンベッディングをバイブルからTrain関数に転送するのが正しいようです。

 
位置埋め込みについて読むのは興味深い。でも、それが本当に必要なのかどうかは疑問だ。ボラティリティを使うことはできます。しかし、これは時系列では よくあることだと思う。他にも何か「ノウハウ」が発明されているのかもしれない。
 

Dmitriy Gizlyk, ライブラリの勉強と作業中に疑問が生じました:

隠れ層の勾配を計算するメソッドでは、outputValを 追加しています。

を追加していますが、これは後でcalcOutputGradientsメソッドでその値を普遍性のために補正するためですよね?

また、勾配の正規化も 追加されていますね。

bool CNeuron::calcHiddenGradients(CLayer *&nextLayer)
  {
   double targetVal=sumDOW(nextLayer)+outputVal;
   return calcOutputGradients(targetVal);
  }
//+------------------------------------------------------------------+
bool CNeuron::calcOutputGradients(double targetVal)
  {
   double delta=(targetVal>1 ? 1 : targetVal<-1 ? -1 : targetVal)-outputVal;
   gradient=(delta!=0 ? delta*activationFunctionDerivative(outputVal) : 0);
   return true;
  }

問題は、このようにターゲットではなく最終的なデルタを正規化する方が正しいかどうかです

double delta=targetVal-outputVal;
delta=delta>1?1:delta<-1?-1:delta;

なぜですか?例:outputValが1に近く、次の層の加重勾配の合計も高くて正の場合、最終的なデルタはゼロに近くなりますが、これは間違っているように思えます。

結局のところ、勾配のデルタは次の層の誤差に比例するはずです。言い換えれば、ニューロンの有効重みが負の場合(そしておそらく他のいくつかの場合も)、そのニューロンは正の重みの場合よりも少ない誤差でペナルティを受けます。簡単な説明になってしまったかもしれませんが、この分野に詳しい方にはご理解いただけると思います :)もしかしたら、あなたはすでにこの点に気づいていて、そのような決定を下したのかもしれません。

また、OCLコードについても同じことが言えます。

__kernel void CalcHiddenGradient(__global double *matrix_w,
                                 __global double *matrix_g,
                                 __global double *matrix_o,
                                 __global double *matrix_ig,
                                 int outputs, int activation)
  {
..............   
switch(activation)
     {
      case 0:
        sum=clamp(sum+out,-1.0,1.0)-out;
        sum=sum*(1-pow(out==1 || out==-1 ? 0.99999999 : out,2));
 
Aleksey Mavrin:

ドミトリー・ギズリクさん、図書館で勉強しながら仕事をしているときに疑問がわいたんだ:

隠れ層の勾配計算のメソッドで、outputValを 追加しました。

を追加していますが、これはcalcOutputGradientsメソッドでその値をさらに補正して普遍性を持たせるためですよね?

また、勾配の正規化も 追加されています。

問題は、このようにターゲットではなく、最終的なデルタを正規化する方が正しいかどうかです

なぜですか?例:outputValが1に近く、次のレイヤーの加重勾配の合計も高くて正の場合、最終的なデルタはゼロに近くなります。

結局、勾配のデルタは次の層の誤差に比例するはずである。言い換えれば、ニューロンの有効重みが負の場合(そしておそらく他のいくつかの場合も)、そのニューロンは正の重みの場合よりも少ない誤差でペナルティを受ける。簡単な説明になってしまったかもしれませんが、この分野に詳しい方にはご理解いただけると思います :)もしかしたら、あなたはすでにこの点に気づいていて、そのような決定を下したのかもしれません。

また、OCLコードについても同じことが言えます。

そうではありません。隠れ層のように、outpuValを勾配に追加して目標値を取得し、その値をチェックします。ポイントは、シグモイドは結果の範囲が限られていることです。ロジスティック関数は0から1まで、tanhは-1から1までです。偏差に対してニューロンにペナルティを与え、重み係数を無制限に増加させると、重みのオーバーフローになります。結局のところ、ニューロンの値が1に等しくなったとき、後続の層がエラーを送信して、値を1.5に増やすべきだと言ったとする。そのため、ターゲットの値を活性化関数の許容値の範囲内に制限する。そして、その範囲外の調整は後続層の重みに委ねる。

 
Dmitriy Gizlyk:

そうではない。ちょうど隠れ層のように、outpuValを勾配に追加してターゲットを求め、その値をチェックします。ポイントは、シグモイドは結果の範囲が限られているということです。ロジスティック関数は0から1まで、tanhは-1から1までです。偏差に対してニューロンにペナルティを与え、重み付け係数を無制限に増やすと、重みがオーバーフローしてしまいます。結局のところ、ニューロンの値が1に等しくなったとき、後続の層がエラーを送信して、値を1.5に増やすべきだと言ったとする。そのため、ターゲットの値を活性化関数の許容値の範囲内に制限する。そして、その範囲外の調整は後続層の重みに委ねる。

うまくいったと思う。しかし、これが正しいアプローチなのかどうか、まだ疑問に思っている:

ネットワークが、本当は1なのに0を与えてミスをした場合。最後のレイヤーから、前のレイヤーで重み付けされた勾配が(私が理解する限り、おそらく)正になり、1以上になる可能性があります。

前の層に+0.6、つまり正しい値を出したニューロンがあったとしよう。そしてこの正規化によって、重みの変化をカットする。

結果はnorm(1,6)=1となる。1-0,6=0,4であり、私が提案したように正規化すれば1となる。この場合、正しいニューロンの増幅を抑制することになる。

どう思いますか?

重みの無限増加については、「悪い誤差関数」の場合、局所極小が多くて大域的な極小が表現されていない場合、関数が凸でない場合、そのような場合に起こると聞いたことがありますが、私は超専門家ではありません。

私は両方の変種をテストする実験を求めている。どのようにテストを定式化するか考えてみると、 )