PRMLの第5章のニューラルネットワークの例題説明に良く出てくる「スケール共役勾配法」 Scaled Conjugate Gradientsという名前が出てきますが、Googleで検索しても 日本語のアルゴリズム説明が見当たらないので、オリジナルの論文を基にsageを使って 実装してみました。
スケール共役勾配法は、ヘッセ行列を計算することなく、共役勾配を求めることができる 貴重な手法です。
スケール共役勾配法の論文は、Moller, M (1993), "A Scaled Conjugate Gradient Algorithm for Fast Supervised Learning" に紹介されています。
論文の終わりのアルゴリズム説明を書くと、
スケール共役勾配法のテストは、図5.9
|
ニューラルネットワークの設定は、逐次的勾配降下法とスケール共役勾配法の比較では
|
スケール共役勾配法では、何度もwの設定を変えたり、勾配を求めたりするため、 ニューラルネットワークをクラス化する方が便利です。
以下の様にニューラルネットワーク用のクラスを定義します。
|
比較のために、逐次的勾配降下法をニューラルネットワークのクラスを使って 実装します。
|
スケール共役勾配法の学習アルゴリズムを実装します。
|
|
|
比較のために、逐次的勾配降下法での学習結果をプロットします。
500回の学習回数では、sin曲線に近づけません。
|
スケール共役勾配法の学習結果をプロットします。
少ない学習回数でもかなり良くフィットしています。
|
図5.9と同じようにMを1, 3, 10に変えた結果をプロットします。
M=10のような過学習の結果にはなりません、この辺は重みwの初期値の 分布を変えると変化することが分かりましたが、処理時間の関係で詳しくは調べていません。
|
|
|
|