*All archives* |  *Admin*

<<05  2018/06  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  07>>
麻雀AI開発その63・ニューラルネット導入
前回に引き続き、評価関数作りの話です。

パラメータの付け方をいままでは手作業でちょっとずつ入れたり消したりしてましたが、どうにもうまいこといかず、らちが明かなくなってきたので、ついに重い腰を上げてニューラルネットを頑張って習得しようとしました。

ニューラルネット?なにそれ、おいしいの?みたいな全くゼロの状態からのスタートでしたが、
いろいろなサイトを読み漁った結果、↓のサイトが一番わかりやすくて理解しやすかったです。
http://s0sem0y.hatenablog.com/entry/2016/05/22/014656

それで、こんな感じでニューラルネットを組んでみました。
○大分類
・他家最大攻撃
・巡目区分(1~3巡目、4~6巡目、…、16巡目~の6分類)
○入力層
・手牌価値指数
・危険度指数
・自分が親か
・字牌枚数
・定数項
○隠れ層
1層のみ・ノード数10、活性化関数max(0,|x|)
○出力層
1個の浮動小数点型数値を出力。活性化関数恒等関数。
○目的関数
選択された打牌の出力-選択されなかった打牌の出力をシグモイド関数にかけたものを目的関数とし、最小化する。
○重みパラメータの選出方法
遺伝的アルゴリズム(微分情報がいらない、という性質がとても輝く!すばらしい!)

それで一応、パラメータっぽいのは出てきました。
ニューラルネットのダメなところとして、隠れ層なる、人間(わたし)にはよくわからないものを経由するので入力パラメータと出力結果との間にどのような関係があるか(線形の相関関係とか2乗とか指数とか)すぐにつかめない、というのがあります。
完全に中身はブラックボックス状態になっているので、どうしてそのような出力値や重みパラメータが出るのかがわからず、メンテナンス方法もよくわからないです。
逆にいいところはベクトルの内積と簡単な活性化関数の計算の組み合わせだけで、ノード数が十分(何をもって十分とするかは今のところよくわからない。あまりに多すぎても過学習という問題が発生するらしい。)なら複雑な関数でもある程度近似が可能(らしい)ところです。

出てきた重みパラメータを見つめても何が起こってるのかはよくわからんので、さっそく実戦譜で当てはめてチェックしてみます。
例の対1副露序盤の問題について。
170831-01.png
まだ孤立字牌切り推奨になってくれていないが、8m9p切りとの差は詰まっています。
ニューラルネットをやり始めたばかりだが、うまくいく可能性はなんとなく感じますね。

改善点とすると、
・巡目域について。今のままだと巡目域をまたぐ(例えば3巡目と4巡目の間など)と完全に別個のデータになるので、パラメータがかなり非連続ぽくなるのがあまりよくない。なので、巡目域は大分類から外して、入力パラメータの中に入れる。
・字牌の扱いについて。上の例みたいな切れない字牌を抱えると数牌と違って使いようがなくてほぼ降りになってしまうので、切る牌が字牌かどうか、というのを入力層に追加する。
・隠れ層のノード数を調整する。とりあえず今は10から20に増やしてやってみている。(その分、重みパラメータ選出に時間がかかりそう。)
・隠れ層の層の数を増やす?(ノード数が十分なら1層だけでもなんとかなるらしいが、多層にすればより適合の度合いが増すという情報もある。)

・打牌選択がうまくいきそうなら鳴き判断もニューラルネットにしてみる、とか。
スポンサーサイト

コメントの投稿

Secret
(非公開コメント受付中)

コメント

プロフィール

nisi5028

Author:nisi5028
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
フリーエリア
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード