2

フィードフォワード ネットワークを使用して予測アプリケーションを開発しています。私が抱えている問題は、予測したいデータがほとんどトレンドになっていることです。Therfore、私が開発しようとしているモデルは次のとおりです。

y_model = f(x) + g(t)

ここで、x は入力ベクトル、f(x) はニューラル ネットワーク、g(t) は時間に応じたトレンド関数 (線形、指数) です。

これを行う最も簡単な方法は、エラー関数を変更することです。これにより、傾向が含まれます。

E=1/2 * sum(y_ideal - y_model)^2 = 1/2 * sum(y_ideal - f(x) - g(t))^2

私が理解しているように、ソリューションは理論的には非常に単純です。モデル パラメーター (ニューラル ネット ウェイト + トレンド モデル パラメーター) に応じた勾配は次のように計算できるからです。

grad E = - sum[(y_ideal-y_model)*(grad f + grad g)]

ニューラル ネットワークの最適化手法を使用してトレンドと共に NN を検索し、ニューラルの重みが更新されているのと同じ方法でトレンド モデルのパラメーターを更新することは、理論的な問題はないと思います。

問題は、Encog でこれを行う方法を管理できなかったことです。学習ルールは、可能な限り高速になるように書かれているため、理解するのが非常に困難です。また、Encog のニューラル ネットワーク構造は固定されているため、パラメーターのベクトルを拡張して誤差関数と勾配式を書き換えるだけでは簡単ではないと思います。

4

1 に答える 1

1

そのためには、Encog でカスタム エラー関数を作成する必要があると思います。すべての伝播トレーナーがこれをサポートしています (つまり、rprop、backrpop、quick、および scg)。これは、個々の出力ニューロンでエラーがどのように計算されるかを定義します。ニューラル ネットワークがトレーニング セット全体にどの程度適合しているかを示す全体的なエラー計算と混同しないでください。

Propagation.ErrorFunction プロパティを使用して、新しいエラー関数を定義できます。すべての伝播トレーナーは Propagation から拡張されています。新しいクラスは IErrorFunction インターフェイスを実装する必要があります。デフォルトでは線形誤差関数が使用され、次のように単純に実装されます。

    /// <inheritdoc/>
    public void CalculateError(IMLData ideal, double[] actual, double[] error)
    {
        for (int i = 0; i < actual.Length; i++)
        {
            error[i] = ideal[i] - actual[i];
        }

    }

これは、予想から実際を差し引いたものです。この誤差は好きなように定義でき、勾配を使用してこの値を最小化します。

于 2014-08-23T21:53:30.033 に答える