FC2ブログ

*All archives* |  *Admin*

<<05  2020/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開発その94・他家から切られる牌分布とニューラルネットその7
ひたすら計算機を回して機械学習をごりごり進めている途中です。

とりあえず対リーチにそれなりに対応してくれたら他の副露とかはなんとかなる!…はずです。
180828-01.png
180828-02.png
180828-03.png
180828-04.png

なんか色がついてる(=従前方式との齟齬が大きい)ところが多いです。
/(^o^)\ナンテコッタイ

全体的にニューラルネットの方が現物や筋の出る率が低めに見積もってるように見えます。

リーチ者ありの学習があまりよろしくないように見えます。
それに他家攻撃ごとに学習データを完全に分けてるのがあまり理論的に美しくないです。
計算時間が各場合ごとに半日以上かかるのもめんどくさいし。

今までのニューラルネットがこんな感じ↓。いたって教科書通りのふつうのニューラルネット。
180828-05.png

今考えてるのはこんな感じの設計にしようかなーとか思ってます。
180828-06.png
狙いとしては、
・3層から4層へと階層を深くする。
・入力層から中間層1については、各プレイヤーごとに別個に考える。4人に対してノード10個を出力する。(どうせ他者との相互依存関係は限定的だろうという希望的観測のもと。)
・他家3人情報についての重みパラメータはCNNっぽくして同じ重みパラメータを使い回す。
・中間層1で4人×各10個のノードを入力値として、改めて普通の3層ニューラルネットを組んで最終的な「ある牌が切られる確率」を出力する。(2層パーセプトロンでなく、3層ニューラルネットにしたのは4者の相互依存関係を多少いれるために必要だろうと思ったから。)

問題になるのは全体が3層から4層になるので、複雑さが増して私のプログラムや計算式の組み立て能力が追い付くかどうか、というところです。
後は多層になると、勾配消失とかの問題が起こり得る…らしい。そのへん、まだあまり勉強してないのでよくわからないですが。

うまくいけばデータの場合分けとかなくて、理論的に美しいのであるが…。
スポンサーサイト



コメントの投稿

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

コメント

DNNのアーキテクチャと特徴量
昔nishiさんの記事を毎日楽しみに天鳳をしていた者です.
「切られる牌分布とニューラルネット」の記事全体に関していくつか質問させてください.

1.現状のNNのアーキテクチャは隠れ層が1つのニューラルネットということで認識はあっているでしょうか?
2.図にあるNNのアーキテクチャだと出力層のユニット数が1になっています.この場合だと各牌が切られる確率を出力できない(各牌が切られる確率を出力するためには牌の種類分のユニットが存在して,ソフトマックス関数を適用した値が確率になると理解しています)のではないでしょうか?
3.特徴ベクトルの各特徴量はどのようにして作成なさってますか?離散型の変数と連続型の変数が混在しているのでしょうか?
Re: DNNのアーキテクチャと特徴量
> 1.現状のNNのアーキテクチャは隠れ層が1つのニューラルネットということで認識はあっているでしょうか?

そうですね。入力層-隠れ層-出力層の計3層で隠れ層は1層だけです。


> 2.図にあるNNのアーキテクチャだと出力層のユニット数が1になっています.この場合だと各牌が切られる確率を出力できない(各牌が切られる確率を出力するためには牌の種類分のユニットが存在して,ソフトマックス関数を適用した値が確率になると理解しています)のではないでしょうか?

一度出力層ユニットを37(牌の種類)でソフトマックス関数で活性化させるのをやってみたのですが、その時は入力情報が複雑すぎたためか、学習がうまくいかなかったため、より簡単ですでにやったことがあった2値分類の問題(ある特定の牌が切られる確率、シグモイド関数で活性化)に変えた経緯があります。
2値分類の出力値(切られる確率っぽいもの)37種から合計確率を1にする調整はニューラルネットの外で計算でなんとかするような方針です。
ただ、失敗時からプログラム上でミスが見つかったので、今やったらうまくいく可能性はあります。


> 3.特徴ベクトルの各特徴量はどのようにして作成なさってますか?離散型の変数と連続型の変数が混在しているのでしょうか?

特徴量は関係ありそうな項目を手作業で入れています。

多くは離散型変数です。
・各プレイヤーの位置
・巡目
・各プレイヤーの攻撃度(非リーチ門前・リーチ・リーチ宣言・副露(役牌・タンヤオ・その他の3種))
・各プレイヤーの副露数
・各プレイヤーの副露で見えてる部分の確定役牌数+ドラ数
・(リーチ者ありの時)切り者以外プレイヤーの切ってる無筋現物数
・該当牌の見えてる&手持ち枚数(赤ナシ換算)
・該当牌の牌種類
・該当牌がドラか
・(黒5牌時)赤5牌がまだ見えていないか
・該当牌が現物か筋か無筋か
・該当牌が晒し部分の中にあるか
・(該当プレイヤーリーチ時)該当牌の外側牌の見え方
・該当牌が序盤(3巡目までと6巡目までで区分)外側&5切りか
・各プレイヤーの2巡前までに切られた牌かどうか。

例えば
「切り者」・「3巡目」・「切り者非リーチ門前」・…などであれば
中間層ノード=活性化関数(
+omomi_nyu(0) ←プレイヤー位置による定数項
+omomi_nyu(6) ←3巡目(巡目は4~21に対応、3巡目は「6」)
+omomi_nyu(22) ←非リーチ門前(攻撃度合は22~26に対応、非リーチ門前は「22」)
+…

のように、条件に合致するベクトルの番地を加算していく形式がメインです。

例外的に次の項目は連続型変数になっています。
・各プレイヤーの染め率
(関連・「該当牌が染め色か非染め色か字牌か」、「染め色をすでに切っているか」)

染め率(以前作った染め率ニューラルネットで算出)が10%以上ある場合に限り
染め率×入力層重みベクトルの番地を加算しています。
ReRe: DNNのアーキテクチャと特徴量
ご回答ありがとうございます.

>2値分類の出力値(切られる確率っぽいもの)37種から合計確率を1にする調整はニューラルネットの外で計算でなんとかするような方針です。

この部分についてあまり理解できていないのですが,もし各分類機で確率の値を出力する必要が無いのであれば,xgboostのほうが手軽で良い精度が出る気がします.
隠れそう1層のNNはさして強力な分類方法というわけではないので.
また,離散型変数と連続型変数の混在に対してもNNよりも決定木ベースの方法のほうがロバストらしいので,その点でもxgboostのほうが精度は出そうな気がします.

ただ,nishiさんの目的が「牌が切られる確率分布」なので,その点を考えるとxgboostは使えないかもしれませんが…
Re: ReRe: DNNのアーキテクチャと特徴量
決定木とかxgboostというのは初耳なので、勉強になります。

私の場合機械学習は独学で、いつも使ってるvb.netでニューラルネットの構造とか重みの偏微分とか誤差逆伝搬とかをなにもライブラリとかがない状態から一から書いてる分、割とミスが発生しやすくてそれでうまくできなくて匙を投げちゃうケースが多いです。


「牌が切られる確率分布」をやってるのは副次的な目的であり、本論はモンテカルロシミュレーションで局収支とかアガリ率とか試合単位収支とかを算出するのが一番で、モンテカルロの中で使う「牌が切られる確率分布」の部分をちょっと改善したくて(従前だと牌譜解析の実測値からなるパラメータで特徴量間の相互依存関係をだいぶ端折ってパラメータの掛け算だけで対処してるのがちょっと気に食わなかった)いろいろと手を出している現状です。
Re: Re: ReRe: DNNのアーキテクチャと特徴量
>いつも使ってるvb.netでニューラルネットの構造とか重みの偏微分とか誤差逆伝搬とかをなにもライブラリとかがない状態から一から書いてる分

すごいですね…

もし何か機械学習等のデータ分析周りで力になれそうな事があれば仰ってください.Twitter (setten_QB) でDMかメンション頂ければ反応しますので.
「DNNのプログラム組んで学習させて」みたいな事でもリソースが空いてれば協力出来ますので.
プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード