麻雀AI開発その69・染め手率と機械学習その3
2017-09-26(Tue)
前回(麻雀AI開発その68・染め手率と機械学習その2)の続きです。
続きなんですけど、染め手率の予測関数を作るのがかなり難航しています。
パラメータらしいものは取れるんですけども、なかなか実際の感覚と適合してくれない状況です。
例その1

役牌ポンで3巡目発以外は全部ピンズの捨て牌。
まだマンズかソーズかは分からないですけど、この局面のマンズ染め手率とソーズ染め手率の予測値として、
0.75%という結果を返してきます。両方合わせて1.5%。
いくらなんでもそれは低すぎじゃないですかね?
副露手のうち染め手に向かっている割合は1割前後なので、役牌ポンで初手が端牌であることを考慮したとしてももうちょい高いのを出してほしいところですが。体感的には少なくともこの手の染め手率5%くらいはあると思うんですけど、どうでしょう。
例その2

ピンズ端の仕掛けで、4m2mの切り出し。
この情報でピンズ染め手率56.6%というのはまぁいいとしましょう。

ここから白ポンして打東で、染め手率が一気に10.7%まで低下。
確かにホンイツ以外に役ができたとはいえ、そういうもんですかね…。
課題
・入力情報として副露の情報が「その他仕掛け」「タンヤオ仕掛け」「役牌仕掛け」の3パターン+副露数のみで、かなりお粗末なのが原因か。→仕掛けのパターン(ポンカンが役牌・オタ風・染め色19・28・37・46・5、チーが123・234・345・456で計11パターン)ごとに重みパラメータを変える。
・染め手に向かった割合が全データのうちの1割くらいしかないので、多数派の染め手に向かってないデータのかたまりにパラメータが引っ張られる傾向があるかもしれない。(この前の鳴き判断のときみたいにほぼ全部スルーと答える、みたいな事態に近いことが発生している可能性がある。)→データ数をそろえるために、染め手に向かったデータの総数よりも多い非染め手のデータをカットする。
今すぐ関係ある話ではないですけども、機械学習についての情報収集をしていたところ、パラメータ選定の手法として、確率的最急降下法という方法があるらしいです。
なんでも、学習データ1件ごとの勾配を使ってパラメータの修正を図っていく的なものらしいです。
(この前東京行ったときに聞いた話はこれかー、と遅ればせながら納得しました。)
これだと、全データについて毎回目的関数を計算しなくていいから楽そうな感じに見えました。それと全データについてメモリを確保しなくて済むのもかなりのメリットっぽいです。
ただ、今だと微分を使わないごりごり脳筋の遺伝アルゴリズムでやってるので、新たに微分を計算しないといけないようです。
全部の重みパラメータについて、ニューラルネットで合成関数の偏微分するって…。
活性化関数も途中で噛むから3つくらいの合成関数の微分の積になるからぷにゃーってなりそう。
計算時間が超長くて耐えられなかったり、入力情報が多くてメモリが足りないという事態になったらそれを検討しましょうか。
新しくコード書いたり手計算したりするのがめんどうなものぐさモードです。
続きなんですけど、染め手率の予測関数を作るのがかなり難航しています。
パラメータらしいものは取れるんですけども、なかなか実際の感覚と適合してくれない状況です。
例その1

役牌ポンで3巡目発以外は全部ピンズの捨て牌。
まだマンズかソーズかは分からないですけど、この局面のマンズ染め手率とソーズ染め手率の予測値として、
0.75%という結果を返してきます。両方合わせて1.5%。
いくらなんでもそれは低すぎじゃないですかね?
副露手のうち染め手に向かっている割合は1割前後なので、役牌ポンで初手が端牌であることを考慮したとしてももうちょい高いのを出してほしいところですが。体感的には少なくともこの手の染め手率5%くらいはあると思うんですけど、どうでしょう。
例その2

ピンズ端の仕掛けで、4m2mの切り出し。
この情報でピンズ染め手率56.6%というのはまぁいいとしましょう。

ここから白ポンして打東で、染め手率が一気に10.7%まで低下。
確かにホンイツ以外に役ができたとはいえ、そういうもんですかね…。
課題
・入力情報として副露の情報が「その他仕掛け」「タンヤオ仕掛け」「役牌仕掛け」の3パターン+副露数のみで、かなりお粗末なのが原因か。→仕掛けのパターン(ポンカンが役牌・オタ風・染め色19・28・37・46・5、チーが123・234・345・456で計11パターン)ごとに重みパラメータを変える。
・染め手に向かった割合が全データのうちの1割くらいしかないので、多数派の染め手に向かってないデータのかたまりにパラメータが引っ張られる傾向があるかもしれない。(この前の鳴き判断のときみたいにほぼ全部スルーと答える、みたいな事態に近いことが発生している可能性がある。)→データ数をそろえるために、染め手に向かったデータの総数よりも多い非染め手のデータをカットする。
今すぐ関係ある話ではないですけども、機械学習についての情報収集をしていたところ、パラメータ選定の手法として、確率的最急降下法という方法があるらしいです。
なんでも、学習データ1件ごとの勾配を使ってパラメータの修正を図っていく的なものらしいです。
(この前東京行ったときに聞いた話はこれかー、と遅ればせながら納得しました。)
これだと、全データについて毎回目的関数を計算しなくていいから楽そうな感じに見えました。それと全データについてメモリを確保しなくて済むのもかなりのメリットっぽいです。
ただ、今だと微分を使わないごりごり脳筋の遺伝アルゴリズムでやってるので、新たに微分を計算しないといけないようです。
全部の重みパラメータについて、ニューラルネットで合成関数の偏微分するって…。
活性化関数も途中で噛むから3つくらいの合成関数の微分の積になるからぷにゃーってなりそう。
計算時間が超長くて耐えられなかったり、入力情報が多くてメモリが足りないという事態になったらそれを検討しましょうか。
新しくコード書いたり手計算したりするのがめんどうなものぐさモードです。
スポンサーサイト