素晴らしく有用な記事資料
ありがとう!
はい、予定通りです)
ドミトリー、お願いだ。なぜサインとコサインが入力値に加えられるのか、最初はわからなかったんだ。
neuron.setOutputVal(inputVals.At(i)+(i%2==0 ? sin(i) : cos(i)) );
また、アドバイスが必要なのですが、私のタスクのために入力データを何らかの方法で正規化することを試みるべきでしょうか?
私の理解では、例題ではすべてが「そのまま」与えられています。しかし、フラクタルを使った例でも、0から1までのオシレーターがいくつかあり、価格は計器によっては1よりはるかに高くなることがあります。
正規化されていない入力で学習する場合、初期バイアスが生じませんか?
ドミトリー、なぜサインとコサインが入力値に加えられるのか教えてくれ。
また、アドバイスが必要なのですが、私のタスクのために入力データを何らかの方法で正規化することを試みるべきでしょうか?
私の理解では、例題ではすべてが「そのまま」与えられています。しかし、フラクタルを使った例でも、いくつかのオシレータは0から1まであり、価格は、楽器によっては1よりはるかに高くなることがあります。
正規化されていない入力で学習する場合、初期バイアスが生じませんか?
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));
ドミトリー・ギズリクさん、図書館で勉強しながら仕事をしているときに疑問がわいたんだ:
隠れ層の勾配計算のメソッドで、outputValを 追加しました。
を追加していますが、これはcalcOutputGradientsメソッドでその値をさらに補正して普遍性を持たせるためですよね?
また、勾配の正規化も 追加されています。
問題は、このようにターゲットではなく、最終的なデルタを正規化する方が正しいかどうかです。
なぜですか?例:outputValが1に近く、次のレイヤーの加重勾配の合計も高くて正の場合、最終的なデルタはゼロに近くなります。
結局、勾配のデルタは次の層の誤差に比例するはずである。言い換えれば、ニューロンの有効重みが負の場合(そしておそらく他のいくつかの場合も)、そのニューロンは正の重みの場合よりも少ない誤差でペナルティを受ける。簡単な説明になってしまったかもしれませんが、この分野に詳しい方にはご理解いただけると思います :)もしかしたら、あなたはすでにこの点に気づいていて、そのような決定を下したのかもしれません。
また、OCLコードについても同じことが言えます。
そうではありません。隠れ層のように、outpuValを勾配に追加して目標値を取得し、その値をチェックします。ポイントは、シグモイドは結果の範囲が限られていることです。ロジスティック関数は0から1まで、tanhは-1から1までです。偏差に対してニューロンにペナルティを与え、重み係数を無制限に増加させると、重みのオーバーフローになります。結局のところ、ニューロンの値が1に等しくなったとき、後続の層がエラーを送信して、値を1.5に増やすべきだと言ったとする。そのため、ターゲットの値を活性化関数の許容値の範囲内に制限する。そして、その範囲外の調整は後続層の重みに委ねる。
そうではない。ちょうど隠れ層のように、outpuValを勾配に追加してターゲットを求め、その値をチェックします。ポイントは、シグモイドは結果の範囲が限られているということです。ロジスティック関数は0から1まで、tanhは-1から1までです。偏差に対してニューロンにペナルティを与え、重み付け係数を無制限に増やすと、重みがオーバーフローしてしまいます。結局のところ、ニューロンの値が1に等しくなったとき、後続の層がエラーを送信して、値を1.5に増やすべきだと言ったとする。そのため、ターゲットの値を活性化関数の許容値の範囲内に制限する。そして、その範囲外の調整は後続層の重みに委ねる。
うまくいったと思う。しかし、これが正しいアプローチなのかどうか、まだ疑問に思っている:
ネットワークが、本当は1なのに0を与えてミスをした場合。最後のレイヤーから、前のレイヤーで重み付けされた勾配が(私が理解する限り、おそらく)正になり、1以上になる可能性があります。
前の層に+0.6、つまり正しい値を出したニューロンがあったとしよう。そしてこの正規化によって、重みの変化をカットする。
結果はnorm(1,6)=1となる。1-0,6=0,4であり、私が提案したように正規化すれば1となる。この場合、正しいニューロンの増幅を抑制することになる。
どう思いますか?
重みの無限増加については、「悪い誤差関数」の場合、局所極小が多くて大域的な極小が表現されていない場合、関数が凸でない場合、そのような場合に起こると聞いたことがありますが、私は超専門家ではありません。
私は両方の変種をテストする実験を求めている。どのようにテストを定式化するか考えてみると、 )
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事「ニューラルネットワークが簡単に(第9部):作業の文書化」はパブリッシュされました:
長い道のりでした。ライブラリ内のコードはどんどん増えてきており、すべてのリンクと依存関係を追跡することが困難になっています。したがって、以前に作成したコードのドキュメントを作成し、新しい手順ごとに更新し続けることをお勧めします。適切に準備された文書化は、作業の整合性を確認するのに役立ちます。
プログラムが完了すると、すぐに使用できるドキュメントが届きます。いくつかのスクリーンショットを以下に示します。完全なドキュメントは添付ファイルに記載されています。
作者: Dmitriy Gizlyk