1.はじめに
RamseyG はJAVAで温暖化対策統合評価モデルを作成するための中間生成物である。この手の最適成長モデルをJAVAという環境で動かすことができるのか、その評価のための試作品だと考えていただきたい。
数百、あるいは千を超える変数を持った非線形モデルの最適解を出すというのは、とても精密なプログラミングが必要なだけではなく、コンピュータの性能をぎりぎり酷使するものとなる。JAVAでそもそも、大規模な最適モデルの解を求めることができるのか、これが求める答えだったが、RamseyEまでの段階では、使用に耐えるものであることがわかった。
標準で添付されているモデルは、すべて、Gでほぼ同じ結果になることを確認している。
2.使い方
(1) RamseyG.jar ファイルをダウンロードし、クリックすれば起動する。クリックして起動しない場合、あるいは、別のアプリケーションが起動してしまう場合は、右クリックして、メニューの「プログラムから開く」から「JAVA]を選択して開く。当然ながら、JAVAが動かせるようになっていなければならない。古いJAVAだと動かないかもしれない。
(2)デフォルトで、5期間モデルを動かせるようになっている。「実行」→「スタート」で、そのまま最適解を求める。※一つのシミュレーションが終わるまで、次のシミュレーションを実行していはいけません。
(3)モデルのパラメータを変更するときは、「設定」→「モデル設定」ウィンドウを開いて、必要な設定変更を行う。「モデル設定」で、「デフォルト値に戻す」をクリックすると、もともとの5期間モデルに戻る。OKボタンで確定する。キャンセルボタンは、いかなる変更も破棄する。

(4)最適化は、準ニュートン法と、Armijoの1次元最適化を結合して行っているが、それに関する各種パラメータの設定は、「設定」→「最適化設定」ウィンドウで、必要な変更ができる。「デフォルトに戻す」でプログラムのスタート時点の値に戻る。OKで確定、キャンセルで変更が無効になる。

(5)あらかじめ作成しておいた、設定ファイル(モデルと呼ぶ)を入力するためには、「ファイル」→「モデルを開く」をクリックする。ファイル選択ウィンドウが開くので、ファイルを選ぶ。モデル設定だけではなく、最適化設定も記述された内容で変更される。モデルの記述が、一部のパラメータにとどまっている場合は、それだけが変更される。
(6)現在の、モデルと最適化に関する設定を保存するためには、「ファイル」→「モデルの保存」を選択し、ファイルに書き込む。ファイル名は自由。※上書きの警告はしません。
(7)コンソールの内容を、ファイルに保存するためには、「ファイル」→「出力の保存」を選択する。ファイル名は自由。※上書きの警告はしません。
(8)実行を中断するためには、「実行」→「実行中止」を選択する。実際に実行が止まるまでに、若干の遅れが生じる。また、実行中止は、プログラム上少し無理がかかる作業であるから、一部のパラメータの事後処理ができない場合も生じる。とくに、「乗数倍数初期値」の値が影響を受けやすいので、中止をしあたとは、設定でそれらのパラメータに異常がないかを確認すること。
(9)グラフを表示するときは、「表示」→「グラフ」から、さらに表示したい変数を選択する。その時に保存されている、データを表示する。最適解を得た後では、最適解をもたらした変数が表示されるが、それ以外の場合は、その時の状況で保存されているデータが表示される。

(10)ラグランジュ乗数、Gradientの表示ができます。やや、理論的に難しいので、説明を省略します。
(11)コンソールは、デフォルトで編集をできませんが、「編集」→「出力の編集」にチェックを入れると、編集できるようになります。チェックを外すと元に戻ります。
3.コンソール
実行経過やメッセージは、コンソールウィンドウに表示される。
コンソールは、最下段に来る前に、自動的にスクロールされ、スクロールバーがつけられる。

4.実行経過の見方
(1)実行経過は、たとえば、次のように表示される。
実行開始
No. 0 Diff = 0.190234 (QN:254)
No. 1 Diff = 0.000472 (QN: 42)
No. 2 Diff = 0.000314 (QN: 51)
No. 3 Diff = 0.000209 (QN: 49)
No. 4 Diff = 0.000141 (QN: 85)
No. 5 Diff = 0.000092 (QN: 48)
No. 6 Diff = 0.000060 (QN:154)
(2)二重ループ
RamseyG は制約条件付きの準ニュートン法で問題を解いている。まず、制約条件に対して、一定の大きさのラグランジュ乗数をかけたものの和を、もともとの目的関数に加えた関数(ラグランジュ関数のようなもの)を最小にするために、最適化のループが起動される。このループのことを第1ループと呼ぼう。これでラグランジュ関数が最小化されたのちに、今度は、先に与えられたラグランジュ乗数を一定倍だけさせて、再び、第1ループを繰り返すという、第2ループが存在する。すなわち、第2ループの中に第1ループが組み込まれているのである。
上記の出力を見ていただくと、左端のNo.1, No.2が第2ループの繰り返しステップを表わしている。そして、右端のQNの次に書かれた数字が、第2ループの各ステップで、ラグランジュ関数を最小化するために、繰り返された第1ループのステップ数を表わしている。
(3)Diffについて
Diffは第2ループの各ステップで、第1ループで求められた最適な各変数が、ひとつ前のステップの値と比べて、変化がどれほどの大きさだったかを示している。したがって、この数字が大きいと、変数が大きく変わっていることを示している。したがって、上記のような場合、変数の変化がだんだん小さくなっていること、すなわち、第1ループの最適解が、だんだん収束していることを示している。すなわち、最適化の変数を、現在のステップのものがx1、x2、・・・・xNとし、ひとつ前のステップの変数をそれぞれ二プライムをつけたものとすると、diffは次の値を示している。

(4)収束の判定
Diffが十分小さな値になっていけば、第2ループは収束したと判定できる。では、どのくらいの値とすべきかという問題がある。これは、設定の中にある、主ループ収束判定値をいかなるものにするかということになるだろう。
私の経験では、0.0001以下になれば、最適解に近いと判定できる。これは、GAMSとの解を比べたりするなどした結果であり、理論的な裏付けがあるわけではない。
このDiffはいったん最小になった後、ふたたび増加する場合がある。その場合は、最小になった時点の値が0.0001以下であれば、その時点の解が最適解だと判断できる。RamseyGは、収束傾向を失って増大になる前の解を、出力し終了するという設定パラメータを持っている。
5.最適解の見方
(1)最適解の結果は例えば、次のように出力される。
最適解:主ループ回数 = 7
目的関数値(乗数付き) = -0.3231
最終 準ニュートン回数 = 154
----------------
0期:C: 0.9500 I: 0.0500 K: 3.0000
1期:C: 0.9358 I: 0.0909 K: 3.0500
2期:C: 0.9638 I: 0.0936 K: 3.1409
3期:C: 0.9927 I: 0.0964 K: 3.2345
4期:C: 1.0220 I: 0.0998 K: 3.3309
(2)最適化変数
最下段のC,I,Kが各期の消費、投資、資本の水準を表している。当然、各期のC+Iが生産水準である。初期の投資と資本はそれぞれ、与えられている。一方、最終期は、投資と資本の関係についての制約が置かれている。
(3)最適解以外の場合
それぞれの場合について、最終結果は一応出力する。問題が何かは、コンソールに出力されるメッセージを参照していただきたい。
6.パラメータの設定
RamseyGの設定
(1)Ramseyモデルの設定
eta 0.25 生産関数弾力性
grate 0.03 労働力成長率
rho 0.95 効用割引ファクター= 1/(1+割引率)
iini 0.05 初期投資
cini 0.95 初期消費
kini 3 初期資本
tt 20 シミュレーション期間 初期化の前に設定する
initbase 1.0 初期化ベース値
initstep 0.0 初期化ステップ
(2)メインループに関する設定
rmepsi 0.00004 メインループ収束判定条件
rmiter 50 メインループ最大繰り返し数
contstop 0 収束性喪失時 継続:1 中断:0
(3)準ニュートン法に関する設定
epsilon 1e-10 準ニュートン法収束誤差
pdiff 1e-7 偏微分幅
maxiter 10000 準ニュートン法最大繰り返し数
gamma 1000 乗数更新倍数初期値
(4)1次元最適化関係パラメータ
xi 0.3 Armijo法緩和係数
tau 0.5 Armijo法緩和係数乗数
maxlsiter 5000 1次元最適化繰り返し数 共通
(1)のモデルの設定は、特に説明のしようがない。GAMSライブラリにあるramsey.gmsと同じパラメータ値、初期値を用いている。
(2)および(3)がチューニングの対象となるものであり、(4)は、基本的にさわらなくてよいが、どのようあ場合に変更が必要になるか、のちに若干の説明を加える。
(2)について
rmepsiは、モデルの変数が、収束に向かっているかどうかを判断するものであり、なんらかの誤差の基準ではない。このモデルでは、経験的に、変数が収束に向かっているときはよいが、それが失われると、適正な解が求められなく場合がほとんどである。コンソールには、収束傾向を示す値が表示されるので、それが小さくなっていったのが、大きくなりはじめたら、解は壊れつつあると考えてよい。収束傾向が一番小さくなるあたりで、終わらせるために、この値を調整するわけである。
rmiter はメインループの最大繰り返し数である。だいたい20期モデルの場合10回の繰り返しもしないで解を出す。
contstop は、収束傾向が失われた時に、そのあとまで、実行を続けるかどうかの設定をする。0にすると、その時点で実行をやめて、直前のもっともよく収束した値を出力する。これが最大実現可能な解であることがしばしばである。1にすれば、無理やり最後まで実行する。
(3)について
ここから、さらに制約条件付き準ニュートン法の奥深くに入り込む。
epsilon は、準ニュートン法の収束判定値である。10e-10から10e-20くらいの範囲で変えてもよいだろう。
pdiff は数値微分のための幅を与える。微分法は、中心差分公式を用いている。
maxiter は準ニュートン法の最大繰り返し数を与える。この数字の回数以内に、準ニュートン法が収束しなかったら、失敗のメッセージを出して終了する。
gamma これが最も厄介なパラメータだった。制約条件付き準ニュートン法で、ラグランジュ乗数の増加させるパラメータの初期値なのだ。最初は、いろいろ調べても初期値についての説明がなかったので、1と置いていた。そのころは、計算時間がかかって仕方がなかった。むりやり、この値を10000というべらぼうな数字に変更したら、とたんに、小さなモデルだと、さくさくと解くようになった。この値は、大きな値にすると、一挙に最適解に近づくという傾向を生み出す。しかし、最初の解を出すのに時間がかかる。小さな値にすると、最初の解を出すのには早いが、その後の繰り返しが長くなる。大きなモデルだと、 1000くらいが妥当かな、という感じで、これこそ、この準ニュートン法の性格を規定するパラメータであり、辛抱強く付き合わなければならない。
一次元最適化のパラメータは、基本的にさわらなくてよいのだが、もし、1次元最適化に失敗した場合、maxlsiterを10000くらいに増やすとよい。しかし、それをこころみてだめだったら、もとの5000くらいの値に戻しておくこと。
以上
|