Main Content

traingda

適応学習率を使用した勾配降下法による逆伝播

説明

net.trainFcn = 'traingda' は、ネットワークの trainFcn プロパティを設定します。

[trainedNet,tr] = train(net,...) は、traingda を使用してネットワークに学習させます。

traingda は、適応学習率を使用した勾配降下法に従って重みとバイアスの値を更新するネットワーク学習関数です。

学習は traingda の学習パラメーターに従って行われます。以下に、学習パラメーターをその既定値と共に示します。

  • net.trainParam.epochs — 学習の最大エポック数。既定値は 1000 です。

  • net.trainParam.goal — 性能目標。既定値は 0 です。

  • net.trainParam.lr — 学習率。既定値は 0.01 です。

  • net.trainParam.lr_inc — 学習率を増加させる比率。既定値は 1.05 です。

  • net.trainParam.lr_dec — 学習率を減少させる比率。既定値は 0.7 です。

  • net.trainParam.max_fail — 検証エラーの最大回数。既定値は 6 です。

  • net.trainParam.max_perf_inc — 性能の最大増加量。既定値は 1.04 です。

  • net.trainParam.min_grad — 性能の勾配の最小値。既定値は 1e-5 です。

  • net.trainParam.show — 表示間のエポック数 (表示なしは NaN)。既定値は 25 です。

  • net.trainParam.showCommandLine — コマンド ライン出力の生成。既定値は false です。

  • net.trainParam.showWindow — 学習 GUI の表示。既定値は true です。

  • net.trainParam.time — 最大学習時間 (秒単位)。既定値は inf です。

入力引数

すべて折りたたむ

入力ネットワーク。ネットワーク オブジェクトとして指定します。ネットワーク オブジェクトを作成するには、feedforwardnetnarxnet などを使用します。

出力引数

すべて折りたたむ

学習済みネットワーク。network オブジェクトとして返されます。

学習記録 (epoch および perf)。フィールドがネットワーク学習関数 (net.NET.trainFcn) によって異なる構造体として返されます。含まれるフィールドには以下のものがあります。

  • 学習、データ分割、性能の関数およびパラメーター

  • 学習セット、検証セット、およびテスト セットのデータ分割インデックス

  • 学習セット、検証セット、およびテスト セットのデータ分割マスク

  • エポックの数 (num_epochs) および最適なエポック (best_epoch)

  • 学習の状態名の一覧 (states)

  • 学習全体を通じて値を記録する各状態名のフィールド

  • 最適なネットワーク性能 (best_perfbest_vperfbest_tperf)

詳細

すべて折りたたむ

ネットワークの利用

traingdafeedforwardnet または cascadeforwardnet を使用する標準的なネットワークを作成できます。traingda を使用して学習が行われるようにカスタム ネットワークを準備するには、以下のようにします。

  1. net.trainFcn'traingda' に設定します。これにより、net.trainParamtraingda の既定のパラメーターに設定されます。

  2. net.trainParam プロパティを目的の値に設定します。

どちらの場合も、結果として得られるネットワークで train を呼び出すことによって、traingda を使用してネットワークの学習を行います。

例については、help feedforwardnet および help cascadeforwardnet を参照してください。

適応学習率を使用した勾配降下法による逆伝播

標準の最急降下法では、学習率が学習全体を通じて一定に保持されます。アルゴリズムの性能は、学習率が適切に設定されているかどうかに大きく左右されます。学習率が高すぎる場合、アルゴリズムが振動して不安定になることがあります。学習率が小さすぎる場合、アルゴリズムの収束に時間がかかります。学習前に学習率の最適な設定を決定するのは現実的ではありません。実際、アルゴリズムは性能曲面全体を移動するため、最適な学習率は学習プロセス中に変化します。

学習プロセス中に学習率を変更できるようにすると、最急降下法アルゴリズムの性能を改善できます。適応学習率は、学習を安定させたままで、学習ステップ サイズをできるだけ大きく維持しようとします。学習率は、局所的な誤差曲面の複雑度に応答するようになっています。

適応学習率を使用する場合、traingd によって使用される学習手順にいくつかの変更が必要です。まず、ネットワークの初期の出力と誤差が計算されます。エポックごとに、現在の学習率を使用して新しい重みとバイアスが計算されます。その後、新しい出力と誤差が計算されます。

モーメンタムと同様に、古い誤差に対する新しい誤差の超過率が事前定義された比率 max_perf_inc (通常は 1.04) を上回る場合、新しい重みとバイアスは破棄されます。さらに、(通常は、lr_dec = 0.7 で乗算することによって) 学習率が減少します。そうでない場合、新しい重みなどが維持されます。新しい誤差が古い誤差を下回る場合、(通常は、lr_inc = 1.05 で乗算することによって) 学習率が増加します。

この手順では、誤差を大幅に増加させることなくネットワークに学習させることができる範囲に限り、学習率が増加します。そのため、局所的な曲面形状に対して最適に近い学習率が得られます。学習率を大きくしても学習が安定している可能性がある場合には、学習率が増加します。学習率が大きすぎて誤差の減少が保証されない場合には、学習が再度安定するまで学習率が低下します。

適応学習率を使用した逆伝播学習は、関数 traingda に実装されています。この関数は、追加の学習パラメーター max_perf_inclr_dec、および lr_inc があることを除き、traingd と同様に呼び出されます。これを呼び出して前の 2 層ネットワークに学習させる方法は以下のとおりです。

p = [-1 -1 2 2; 0 5 0 5];
t = [-1 -1 1 1];
net = feedforwardnet(3,'traingda');
net.trainParam.lr = 0.05;
net.trainParam.lr_inc = 1.05;
net = train(net,p,t);
y = net(p)

アルゴリズム

traingda は、重み関数、正味入力関数、および伝達関数に導関数がある限り、任意のネットワークの学習を行うことができます。

重みとバイアスの変数 X に対する性能 dperf の微分の計算には、逆伝播が使用されます。各変数は、勾配降下法に従って調整されます。

dX = lr*dperf/dX

エポックごとに、性能が目標に向かって減少する場合、学習率が係数 lr_inc で増加します。係数 max_perf_inc を超えて性能が増加する場合、係数 lr_dec で学習率が調整され、性能が増加する変更は行われません。

次のいずれかの条件が発生すると、学習が停止します。

  • epochs (反復回数) の最大数に達する。

  • time の最大値を超える。

  • 性能が goal に最小化される。

  • 性能の勾配が min_grad より小さくなる。

  • 検証性能 (検証誤差) が、最後の低下以降、max_fail 回を超えて増加する (検証の使用時)。

バージョン履歴

R2006a より前に導入