FC2ブログ

*All archives* |  *Admin*

<<09  2018/10  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 31  11>>
はじめてのpython&Tensorflowその2・keras導入
Tensorflowよりもkerasというのを使うとわかりやすいらしいという情報をいただきまして、
調べてみていろいろいじくってみたところ、
Tensorflow…ほぼ無理→keras…なんとかなりそう、
くらいに理解度が改善しました。

今日書いたコードはこちら↓。
180810-02.txt

やったのは、
・mnistのkeras版サンプルコードをコピペして理解する。
・2次元散布図の2値分類問題について、先のサンプルコードを応用しながら自分でプログラムを書いた。
・計算された重みパラメータを使ってテストデータで予測値を出してcsvに吐き出す。あとはエクセルでてきとうにグラフ化。
です。

割と勉強は進んで、簡単なニューラルネットなら自力で応用できるようになりました。

1個目は、
[-1,1]×[-1,1]の2次元の一様乱数を200個発生させて(前者がx、後者をyとする)、y>x^2なら正解ラベル1を、y<=x^2なら正解ラベル0をつけたものを訓練データ&テストデータとしてニューラルネットの計算をやりました。
ニューラルネットは真の境界線y=x^2は知りませんが、与えられた(x,y)の組に対して0か1のどちらかで予測します。

200個の点のうち、100個ずつ訓練用とテスト用に分けて、前半100個の訓練データで散布図を描いたものがこちら↓です。
181010-03.png

ニューラルネットの構造は
入力層:x,yの2個
隠れ層1:全結合でノード数10(活性化関数Relu)
隠れ層2:全結合でノード数10(活性化関数Relu)
出力層:0か1で2個(活性化関数ソフトマックス)

多層ニューラルネットの微分とか誤差逆伝搬を計算しなくてもよい喜びはひとしおです。

出力されたのは拡張子hdf5というファイル。この中にモデルの情報が全部詰まってるらしいです。

これを再度pythonで読み込みなおして、テストデータ100件から予測値(0か1)を出して散布図にしたのがこちら↓。
181010-04.png
100件中予測値と正解ラベルが違うのは4件(オレンジ色の点)。正解率96%でした。

y=x^2だと簡単すぎたかなーと思って、もうちょっと変態な関数でやってみようかなーと思いました。
こんどはy=2(x-1)x(x+1)と三次関数にしてみました。
さっきはデータがすかすかだったので、データ数を5倍の500件+500件に増やしてみました。

ニューラルネットの構造はさっきと同じとします。

↓訓練データ散布図
181010-05.png
↓テストデータによる予測の散布図
181010-06.png
予測が外れているのは500件中6件。正解率98.8%。
データ数が増えたためか、より正解率は増えてくれました。


とりあえずこれで自分でPythonを使って機械学習を応用できる目途がたちました。
麻雀のケースへの応用を考えることができるフェーズに入れそうです。

まずは最初なんでできるだけ簡単にするため、
入力情報を「自分の手牌構成」だけにしようと思っています。

そのために訓練データの取り方として、
全員副露もリーチもしていない状況、という条件下で、(赤ナシ換算の)手牌情報34種のマスに枚数だけの情報+正解ラベルは(赤ナシ換算の)実際に切られた牌、を牌譜解析から収集、csv化して、
そこからはpythonとkerasでのお仕事でモデルを組んで重みパラメータを出す、という流れを想定しています。

単純な全結合とか畳み込み計算とかではできなさそうなので、その辺のモデルの組み方は腕の見せ所になりそうですが、
ほぼ無理なレベルから、なんとかなりそうレベルまで持って行けたのは非常にでかいです。

とりあえず今日はこんなところで。
はじめてのpython&Tensorflowその1・mnistの畳み込みニューラルネット
より高度な機械学習をするため、というか手計算で微分とか誤差逆伝搬とかするのがしんどくなってきたので、新しくPythonとTensorflowを勉強してます。

環境構築はわりと手間取りましたが、なんとかできました。
pipがアップグレードできないとかでTensorflowをインストールできずに詰まるのは勘弁してほしかった。

Pythonの基本的文法はまぁVB.netと同様オブジェクト指向なので、なんとかなりそう。
変数の宣言とかで明示的に型を明記しないところが違うので、若干戸惑うところではありそう。

次に機械学習に必要なTensorflowを勉強している途中です。

なんですけど、すごく難しくて、わかるor応用できる気がまるでしないのが現状です。
テンソル?なにそれおいしいの?ベクトルのすごいバージョンみたいなものか?、という程度の認識しか持ってないので、非常に厳しい。

Tensorflowの入門サイト(https://deepinsider.jp/tutor/introtensorflow/buildcnn)を見て、サンプルコード(mnistのCNN計算)をコピペしてプログラムを動かしてみたのはいいけれど、わからないところが多すぎます。

↓は上記サイトのリスト6のコードで、自分がわからんところをコメントアウト(#?~?の間)で列挙して書き加えたものです。
180808-02.txt

半分以上わからん。
いちおう、出力はちゃんとされてるみたい。↓
181008-01.png

やっぱり無料のサイトを見て回るだけではきついのか…。ちゃんとした入門書を買わないといけないのかなー。
Python自体全然コードが慣れてないので、図書館の返却期限の2週間後にはPythonの入門書を返さなきゃいけないので、日程的な焦りもある。

サルでもわかるとまでは言わない、理系一般人にわかるTensorflow入門のサイトか本をだれか教えてくれたら非常にうれしいです。


エディタはVisual Studioがそのまま使えてるので、いいですけど、Tensorflowの関数打ち込んだときの関数の説明書きが全部英語なのもけっこうつらい。
パッと見でどういう関数なのかがつかめない。
日本語で勉強できるTensorflowのサイトor本がいいんですけど、高望みしすぎでしょうか。
麻雀AI開発その97・次の予定
今日は特に成果物があるわけではないですが、麻雀AIの話です。

この前のPCデータ吹っ飛び事件を受けて、
全く同じことをやり直すというモチベーションが著しく下がっている今日この頃。
染め手対応とかできてないことへの対応はしたいところなのですが、そういう気分ではないです。

そこで、どうせなら別アプローチで麻雀AI開発をしたいなーと思うようになりました。
従前のモンテカルロシミュレーションをベースにしてちまちま牌譜解析でパラメータ取りとか部分的なニューラルネットで部品作りだけするのが邪魔くさいと。

参考にしたいと思ってるのが、「アルファ碁」の事例です。
(人から薦めてもらった「最強AIアルファ碁解体新書」を読みながら。)

まずアルファ碁でやってるのは教師付き学習のニューラルネット(SLポリシーネットワークと書かれている)で、各候補手が打たれる確率を算出しているのをやっているようです。
具体的には13層の畳み込みニューラルネット(CNN)のようです。石の配置等を画像分析のように2次元の情報ととらえて多層の畳み込み計算をすると。

では、麻雀の場合はというと、自分の手の形については1次元(もしくは枚数も含めれば2次元データとも見れる)の情報としてとらえて畳み込み計算はできなくはなさそう。
アルファ碁のSLポリシーネットワークでは入力層の情報を48チャンネルとして持っているようなので、麻雀についても手の形以外の情報、例えば捨て牌とか牌種類とかを同じように複数チャンネルで処理していくみたいな構想です。

アルファ碁ではSLポリシーネットワークの後、それをベースとして、強化学習でRLポリシーネットワークというものを作って、より強いAIにしていくという方法をとっているようです。
今の私の手持ちのAIだとちゃんとしたニューラルネットになってなくて、パラメータをちょこちょこ変えつつの強化学習がかなり困難なので、強化学習でよりAIを進化させることができる可能性がある、という点で将来性があっていいかなーと思っています。


と、ここまでは気前よく願望を含みの将来像を書いてきましたが、実際に私の実力的に可能かどうかは相当あやしいです。
なんかありきたりな発想なので、ほかの人も通った道なのかもしれませんし。

とりあえずこういう文章だけ書いてみて決意表明だけはして、思い描いている構想を前に進める努力はするけども、「やっぱりできませんでしたー」になる可能性も相当高いです。


ところで、今まで私が使っているプログラミング言語はVB.netなのですが、Pythonという言語だと、なんか機械学習関連のフレームワーク(?)とやらが充実していていいらしいという話をちょこちょこ目にします。
多層のニューラルネットになるといちいち微分を自分で計算してうんぬんとかが非常に困難なことも予想されるので、そのへんが自動でやってくれるものがあるのなら非常に魅力的ではあります。

なんで、私にとって新しい言語であるPythonの習得から入るという序の口から入らないといけないので、道のりは険しいですが、一から麻雀AIを組むなら既存プログラムとの噛み合わせの問題もほぼないと思われるので、勉強するコストを払うには見合うかなーと思っています。

まぁ、PCデータ吹っ飛び事件をきっかけに踏ん切りがついたと思えれば、ちょっとでも前向きな方向でいいのかなーとか。
西家スタートの不利は何点相当か
前回(段位別牌譜解析・他家段位と順位の関係)に関連して。

西家だけ試合開始時の収支がマイナスなので、点棒で言ったら何点相当の不利益に相当するのかを調べてみました。

調査方法は、
・試合終了時の持ち点に西家にだけ(卓外から)n点加算したと仮定した場合の、西家の最終順位をカウントする。
です。

囲碁だったら後攻である白石に6目半のコミが与えられるので、それと同じ発想で一番不利な西家にハンデをあげようと。

結果はこちら↓。
180930-01.png
七段相当段位ptでは100点のハンデではやや不足で、200点のハンデでは過大であると。

現実的なルール変更的には西家の試合開始時点棒を25100点にする、みたいなのは、
「なんで西家だけ100点多いんだ」みたいな文句を言う人も多いと思われ、
多くの人には受け入れられないと思うので困難だと思います。

より現実味のあるプランとしては、同点席順を起家からの上家取りの順番にするのではなく、
西家を最優先にする(西家以外の優先度はまぁとりあえず置いとく)だけでも、ある程度公平性の面からは(ハンデとしては不足気味ではあるが)まずまず有効なのかな、とか思ったりしてます。

まぁ他のゲーム、例えば野球とかサッカーのPK戦の先攻後攻や将棋の先手後手とかでは公平性うんぬんとかいう議論はそんなにないと思うので、
より運ゲーの要素が強い麻雀ではなおさら席順の公平性みたいなのはそんなに議論になるようなテーマではないのかなとも思います。
無駄にルールが複雑になってもあれですし。
一研究者の戯言と流していただけるとよいかと。

プロフィール

nisi5028

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

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

この人とブロともになる

QRコード
QRコード