共有メモリ型並列計算機上での強化学習
共有メモリ型並列計算機上での強化学習(2003/6/18)で1エージェントの収束に比べて、2エージェントの収束がやけに早いことが疑問だったが原因がわかった。
各エージェントはスレッドで同じ関数を実行していたのだけど、エージェント1のスレッドだけに画面への表示とファイルへの結果の書き込みを受け持たせていた。すると、エージェント1が画面とファイルに表示・書き込みしている間にエージェント2のスレッドがどんどん学習を進めてしまうことになる(大体エージェント1が1回学習して画面に結果を表示している間に、表示処理がいらないエージェント2は10回学習が終わっている)。あの学習曲線はエージェント1の結果を表示したものなので、エージェント1はほとんど学習をせずともエージェント2のせいで早々に収束してしまうというわけだった。
非同期で各スレッドを動かしていたからこういう結果になってしまった。今度は同期を取ってエージェント1のスレッドがファイルに書き込みしている間はエージェント2は待機するようにした方がよい。つまり、エピソードごとに同期をとらせてみようと思う。セマフォというのを使うらしい。
また今まではスレッドが簡単に使えるJavaを使っていたが、これからはCでpthreadを使ってみようと思う。