Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

trainbfg

BFGS 準ニュートン法逆伝播

説明

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

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

trainbfg は、BFGS 準ニュートン法に従って重みとバイアスの値を更新するネットワーク学習関数です。

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

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

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

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

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

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

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

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

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

  • net.trainParam.searchFcn — 使用する直線探索ルーチンの名前。既定値は 'srchbac' です。

直線探索法に関連するパラメーター (メソッドによっては使用されない場合がある):

  • net.trainParam.scal_tol — delta に分割して、直線探索の許容誤差を決定する。既定値は 20 です。

  • net.trainParam.alpha — perf が十分に低下しているかを決定するスケール係数。既定値は 0.001 です。

  • net.trainParam.beta — ステップ サイズが十分に大きいかを決定するスケール係数。既定値は 0.1 です。

  • net.trainParam.delta — 区間位置のステップにおける初期ステップ サイズ。既定値は 0.01 です。

  • net.trainParam.gamma — 性能のわずかな低下を回避するパラメーターで、通常は 0.1 に設定 (srch_cha を参照)。既定値は 0.1 です。

  • net.trainParam.low_lim — ステップ サイズの変更の下限。既定値は 0.1 です。

  • net.trainParam.up_lim — ステップ サイズの変更の上限。既定値は 0.5 です。

  • net.trainParam.maxstep — 最大ステップ長。既定値は 100 です。

  • net.trainParam.minstep — 最小ステップ長。既定値は 1.0e-6 です。

  • net.trainParam.bmax — 最大ステップ サイズ。既定値は 26 です。

  • net.trainParam.batch_frag — 複数のバッチがある場合、それらのバッチが独立していると見なす。非ゼロ値がある場合、断片化されたバッチがあることを意味するため、前の学習済みエポックの最後の層の条件が、次のエポックの初期条件として使用されます。既定値は 0 です。

すべて折りたたむ

この例では、学習関数 trainbfg を使用してニューラル ネットワークの学習を行う方法を説明します。

以下では、体脂肪率を予測するように、ニューラル ネットワークに学習させます。

[x, t] = bodyfat_dataset;
net = feedforwardnet(10, 'trainbfg');
net = train(net, x, t);

Figure Neural Network Training (27-Jul-2023 15:34:48) contains an object of type uigridlayout.

y = net(x);

入力引数

すべて折りたたむ

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

出力引数

すべて折りたたむ

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

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

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

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

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

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

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

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

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

詳細

すべて折りたたむ

ネットワークの利用

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

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

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

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

BFGS 準ニュートン法逆伝播

ニュートン法は共役勾配法に代わるもので、高速に最適化できます。ニュートン法の基本的なステップは、次のとおりです。

xk+1=xkAk1gk

ここで、Ak1 は、重みとバイアスの現在の値での性能インデックスのヘッセ行列 (2 階微分) です。ニュートン法は、多くの場合、共役勾配法より高速に収束します。残念ながら、フィードフォワード ニューラル ネットワークのヘッセ行列の計算は複雑で時間がかかります。そこで、ニュートン法に基づきながら 2 階微分の計算が不要なクラスのアルゴリズムを使用します。これは準ニュートン (または割線) 法と呼ばれます。アルゴリズムの反復のたびに近似ヘッセ行列が更新されます。更新は、勾配の関数として計算されます。発表されている研究で最も成功を収めている準ニュートン法は、Broyden、Fletcher、Goldfarb、および Shanno (BFGS) による更新方法です。このアルゴリズムは、trainbfg ルーチンに実装されています。

BFGS アルゴリズムは、[DeSc83] で説明されています。このアルゴリズムは、通常、共役勾配法より少ない反復回数で収束しますが、各反復でより多くの計算量とストレージを必要とします。近似ヘッセ行列は保存しなければならず、その次元は n x n です。ここで、n はネットワークの重みとバイアスの数です。非常に大規模なネットワークの場合、Rprop またはいずれかの共役勾配法アルゴリズムを使用する方がよい場合もあります。ただし、小規模なネットワークの場合には、効率的な学習関数として trainbfg を使用できる可能性があります。

アルゴリズム

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

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

X = X + a*dX;

ここで、dX は探索方向です。パラメーター a は、探索方向に沿って性能を最小化するように選択されます。直線探索関数 searchFcn は、最小点を特定するために使用されます。最初の探索方向は、性能の負の勾配になります。後続の反復では、次の式に従って探索方向が計算されます。

dX = -H\gX;

ここで、gX は勾配であり、H は近似ヘッセ行列です。BFGS 準ニュートン法の詳細は、Gill、Murray、および Wright (Practical Optimization, 1981) の 119 ページを参照してください。

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

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

  • time の最大値を超える。

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

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

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

参照

[1] Gill, Murray, & Wright, Practical Optimization, 1981

バージョン履歴

R2006a より前に導入