GA将?開発日記~王理のその先へ~

ネタ勢最強を目指して絶賛開発中。

一度視点を変えてみようと思って

 

わかりやすいパターン認識

わかりやすいパターン認識

 ↑買ってみました。前から気になってなんですが、どうも最近行き詰まり気味なので、他分野に触れてみようと思いまして。

 でも、何か数式ばっかりでイメージと違う。特徴量の抽出方法とかが詳しく載ってるのを期待してたんですけどねぇ。

序盤だけ学習すると囲う現象

 「囲う」と言うか、単に王将周辺に駒を集めるだけなんですが、ようやく再現しました。

 今まで再現出来なかったのは単純な理由で、前は方策勾配の計算にバグがあるバージョンでこの現象が起きてて、バグを潰すと起きなくなってたみたいです。

 ちなみに設定はこんな感じ。

21:12:31 @ core::evl::ProgressCriteriaCalculator::ProgressCriteriaCalculator() > 進行度オンライン学習 : 無効
21:12:31 @ core::evl::ProgressCriteriaCalculator::ProgressCriteriaCalculator() > 自玉周辺の駒 : 有効(上位10個)
21:12:31 @ core::evl::ProgressCriteriaCalculator::ProgressCriteriaCalculator() > 敵の成り駒 : 有効
21:12:31 @ core::evl::ProgressCriteriaCalculator::ProgressCriteriaCalculator() > 敵の持ち駒 : 有効
21:12:31 @ core::evl::ProgressCriteriaCalculator::ProgressCriteriaCalculator() > 自玉周辺の利き : 有効(範囲:3)
21:12:31 @ core::evl::ProgressCriteriaCalculator::ProgressCriteriaCalculator() > 学習率 : 0.0001
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 学習率==1e-005
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 駒割 : 有効(差分計算)
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 筋・段個別の絶対位置 : 有効(差分計算)
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 駒の絶対位置 : 有効(差分計算)
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 二駒の相対位置関係 : 有効(差分計算)
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 飛び利きを遮る駒 : 無効
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 駒の自由度 : 有効
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 王将の移動可能範囲 : 有効(距離5まで)
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 歩のベースはありません。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 香のベースはありません。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 桂のベースはありません。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 銀のベースはありません。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 金のベースはありません。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 角のベースはありません。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 飛のベースはありません。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 王のベースはありません。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > とのベースは金です。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 杏のベースは金です。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 圭のベースは金です。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 全のベースは金です。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 馬のベースは角です。
21:12:31 @ core::evl::LinearEvaluator3::LinearEvaluator3() > 龍のベースは飛です。
21:12:31 @ core::evl::LinearEvaluator3::initParameters() > maxIndex==64517
21:12:31 @ core::evl::ProgressCriteriaCalculator::InputProcessor::InputProcessor() > Reading file...
21:12:31 @ core::evl::ProgressCriteriaCalculator::InputProcessor::InputProcessor() > コメント>date==2011/09/21 20:16:05
21:12:31 @ core::evl::ProgressCriteriaCalculator::InputProcessor::InputProcessor() > コメント>自玉周辺の駒 上位10個
21:12:31 @ core::evl::ProgressCriteriaCalculator::InputProcessor::InputProcessor() > コメント>敵の成り駒
21:12:31 @ core::evl::ProgressCriteriaCalculator::InputProcessor::InputProcessor() > コメント>敵の持ち駒
21:12:31 @ core::evl::ProgressCriteriaCalculator::InputProcessor::InputProcessor() > コメント>自玉周辺の利き 範囲3
21:12:31 @ core::evl::ProgressCriteriaCalculator::InputProcessor::InputProcessor() > Done.
21:12:31 @ core::evl::LinearEvaluator3::inputFromFile() > Can't open file "null"
21:12:31 @ wmain() > 評価関数のパラメータ数==32259
21:12:31 @ core::search::TranspositionTable::TranspositionTable() > sizeof(ENTRY)==24
21:12:31 @ core::search::TranspositionTable::TranspositionTable() > Called, sizeof(*this)==12MB
21:12:31 @ core::search::QuiescenceSearcher2::QuiescenceSearcher2() > 探索深さ==4
21:12:31 @ core::search::TranspositionTable::TranspositionTable() > sizeof(ENTRY)==32
21:12:31 @ core::search::TranspositionTable::TranspositionTable() > Called, sizeof(*this)==16MB
21:12:31 @ lib::util::MyMtRandom::MyMtRandom() > seed==1
21:12:31 @ core::search::AlphaBetaSearcher2::AlphaBetaSearcher2() > グローバル詰みテーブル:無効
21:12:31 @ core::search::AlphaBetaSearcher2::setRepetitionOfMovesScore() > called score==-900.000000
21:12:31 @ core::rl::SoftMaxPolicy::SoftMaxPolicy() > 目標探査率==0.200000
21:12:31 @ core::rl::SoftMaxPolicy::SoftMaxPolicy() > 初期温度==0.020000
21:12:31 @ core::rl::SoftMaxPolicy::SoftMaxPolicy() > ランダムオープニング長==2
21:12:31 @ core::rl::SoftMaxPolicy::SoftMaxPolicy() > 探索深さ==0
21:12:31 @ core::rl::PolicyGradientAgent::PolicyGradientAgent() > 割引率γ==1
21:12:31 @ core::rl::PolicyGradientAgent::PolicyGradientAgent() > サンプリング間隔==1
21:12:31 @ core::rl::PolicyGradientAgent::PolicyGradientAgent() > 最小分散ベースライン==無効
21:12:31 @ core::rl::PolicyGradientAgent::PolicyGradientAgent() > 温度学習==無効

 自己対戦での学習後はこんな感じの終局図になります。

21:15:19 @ core::rl::GameAggregator::aggregate() > 90局終了
21:15:19 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
21:15:19 @ core::rl::GameAggregator::aggregate() > |   |   |   |   |v銀|   |   |   |v王|
21:15:19 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
21:15:19 @ core::rl::GameAggregator::aggregate() > |   |   |   |   |v金|v銀|v飛|   |v香|
21:15:19 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
21:15:19 @ core::rl::GameAggregator::aggregate() > |^杏|   |   |   |   |   |v歩|v歩|v歩|
21:15:19 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
21:15:19 @ core::rl::GameAggregator::aggregate() > |   |   |   |   |   |^歩|   |   |   |
21:15:19 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
21:15:19 @ core::rl::GameAggregator::aggregate() > |   |   |   |   |   |   |   |   |   |
21:15:19 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
21:15:19 @ core::rl::GameAggregator::aggregate() > |   |   |   |   |   |^と|   |   |   |
21:15:19 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
21:15:19 @ core::rl::GameAggregator::aggregate() > |   |^歩|^歩|^歩|^歩|^金|^歩|^歩|^歩|
21:15:19 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
21:15:19 @ core::rl::GameAggregator::aggregate() > |   |^角|^金|^銀|^香|^金|^銀|^飛|^香|
21:15:19 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
21:15:19 @ core::rl::GameAggregator::aggregate() > |^歩|^桂|^角|   |^桂|^桂|^王|^桂|   |
21:15:19 @ core::rl::GameAggregator::aggregate() > +---+---+---+---+---+---+---+---+---+
21:15:19 @ core::rl::GameAggregator::aggregate() > 歩,香,桂,銀,金,角,飛
21:15:19 @ core::rl::GameAggregator::aggregate() >  5, 0, 0, 0, 0, 0, 0,
21:15:19 @ core::rl::GameAggregator::aggregate() >  0, 0, 0, 0, 0, 0, 0,
21:15:19 @ core::rl::GameAggregator::aggregate() > 手番:先手
21:15:19 @ core::rl::GameAggregator::aggregate() > 手数:1024
21:15:19 @ core::rl::GameAggregator::aggregate() > 経過時間 : 2m48sec

進行度周りを修正

 オプション設定で進行度の有無を設定出来る様にして、それに関連して不要なコードを整理したりちょっと追加したり。今日はコンパイルエラーと戦ってるだけでした。

 んで、今週末はパラメータ数を最小限に絞って自然方策勾配を実装してみようと思います。必要なクラスはほとんど揃ってるので、後は教科書通りの計算を実装するだけの簡単なお仕事…のはず。多分。