ラベル AI の投稿を表示しています。 すべての投稿を表示
ラベル AI の投稿を表示しています。 すべての投稿を表示

2016年2月3日水曜日

HerokuでChainerを動かそうとして成功したときのメモ

ChainerをHerokuで動かして成功したのでそのメモ。


Google App Engineでは、GAEにプリインストールされているnumpyのバージョンや.soファイルを利用したpythonライブラリのデプロイ制限などのために上手く動かなかったが、Herokuでは無事に動いた。

1. Chainerのバージョンは1.5.1以降で

Herokuでは基本的にpipでインストールできるものは、何でも利用できるようでGoogle App Engineよりも自由度が高い。

ただし、Herokuの環境ではlibhdf5-devなどのh5pyのインストールに必要な開発モジュールが入ってないようで、h5pyだけはインストールできなかった。

幸運なことにChainer 1.5.1からはh5pyがオプショナルになっていたようで、これは大きな問題にならなかった。

githubを見ても特に変更の理由はわからないが、もしこのような事態を想定して変更してたのならば、開発者たちの慧眼は賞賛ものである。


2. その他の環境

下記のバージョンを利用。

Flask==0.10.1

numpy==1.9.2

six ==1.9.0

chainer==1.6.0


またデフォルトでは2系のpythonを3系に変更するためにruntime.txtに下記のように書く。なお、Chainerは2.7にも対応しているので、2系のままでもたぶん動くが未検証。

python-3.4.0

3. ソースコード



2016年1月24日日曜日

Google App EngineでChainerを動かそうとして諦めた時のメモ

表題どおり、Google App EngineでChainerを動かしてみようと思ったが、上手くいかなかった。
そのときのメモを書いておく。


1. numpyのバージョン

GAEはデフォルトでnumpyが用意されているが、これのバージョンは1.6.1
しかしChainerでは1.9,1.10が前提のようなので、これは使えない。

実際に、1.6.1のまま動かそうとすると、numpyのfull関数がないとかでエラーが出た。
githubのソースを見る限り、1.6.1では確かにfullはない様子。

そのため、自前のライブラリとしてnumpyの1.10を用意し、GAEにデプロイする。

2. 自前ライブラリのデプロイ


デプロイ対象のアプリケーションのルート直下にlibという名称のファイルを用意する。
そのlib以下にnumpyをインストールする。

$ pip install -t lib numpy

chainerとchinerが必要とするh5pyもついでにインストールする

$ pip install -t lib h5py


$ pip install -t lib chainer



そして、同じくルート直下にappengine_config.pyという名称のファイルを作成し、下記の内容を記載する。

from google.appengine.ext import vendor
# Add any libraries installed in the "lib" folder.
vendor.add('lib')

3. SDKで実行
SDKで実行したところ、下記のエラーが出た。


  File "<app path>\lib\numpy\core\__init__.py", line 14, in <module>
    from . import multiarray
ImportError: cannot import name multiarray

multiarrayというモジュールがないとのこと。
ディレクトリを見てみるとmultiarrayはsoファイルでできたモジュールだった。

Google App EngineのドキュメントにははっきりとC extensionがだめと書いてあるので、おそらくこいつは動かないのだろう。

You can add any third-party library to your application, as long as it is implemented in "pure Python" (no C extensions) and otherwise functions in the App Engine runtime environment. The easiest way to manage this is with a ./lib directory.

ということでここで諦めた。
pythonのバージョンも2.7だし、やっぱグーグルさん的にはもうGoogle App Engineに力入れる気ないのかなあ。

2015年12月27日日曜日

SVN(Support Vector Machine)を調べたときに役立ったサイトメモ

Support Vector Machineの原理を調べてるときに役立ったサイトを張っておく。

一昔前に一世を風靡した手法だが、まじめにロジックを追うと数学的な知見が結構使用されていた。

どれか一個を見れば、完璧!見たいのは残念ながらなかったが私の場合は下記のサイトをいったりきたりしながら読み込んでいったら大体理解できた。

もちろん、これ以外のサイトも多数見たが、よくわからなかったり、明らかに間違ってたりといった質的にいまいちなサイトも多くあったことを記しておく。


名古屋大学の人が書いた説明
短くまとめられているので、全体像を把握するのに役立った。
付録として掲載されているKKT法の例も有益。

静岡理工大の人が書いた資料
一般的なSVNでは多次元を前提として説明されているので、数式が若干追いづらい。
このサイトでは、入力が2次元であることを前提に説明しているので、論理展開がわかりやすい。
数学的厳密性は気にしてなかったので非常に重宝した。

個人的には、2次元で説明しているために、マージンの距離の求め方が、単に点と直線の距離の距離の公式を使って求めているに過ぎないことがわかり、これのおかげでつまづきが解消された。マージンの距離については、必ずしもそういう説明をしてくれないサイトも多かったんだよね。

産業技術総合研究所の人が書いた資料
一番教科書的に使える資料。ただし、式の展開などはわかっていることが前提でさっくり飛ばしているので、初学には向かない。俗に言うインデックスとして資料するのにお薦めな資料。

海洋大学の人の書いた資料
KKT方について調べるのに役立った。

2015年12月23日水曜日

Deep Learning用のモデルを簡単に作成できるLabellioを使ってみた

本記事は Deep Learning Advent Calendar 2015 22日目の記事です。
AlpacaがリリースしているDeep LeaningのWebサービスにLabellioというのがあります。これを使うと、画像データを与えるだけで、自動的にDeep Learningで学習を行いモデルを作成することができます。モデルはもちろんエクスポート可能であり、著名なDeep LearningフレームワークのひとつであるCaffeに対応した形式でエクスポートすることができます。

学習はすべてLabellioの用意するリソース上で行われるので、自前で用意するのは訓練用の画像データとそのラベルだけでよいという優れものです。
訓練データは自前で用意したものをUploadすることもできますし、とりあえず試したいのであればLabellioが提供するAPIを利用してFlickr/Bingから訓練データを自動的に取得させることもできます。

今回は、Flickrから取得したデータを使ってみました。例としてフルーツの画像分類器を作成してみます。

まずモデル名として"Fruits"と指定します。
そして訓練データをFlickr上から取得するように指定します。

SourceとしてFlickrを指定。
LabelにOrange, Apple, Bananaを入力する。



ラベルの入力が終わったらAddを押す。





ここでNextを押すと学習用の処理がLabellioにenqueueされる。



後はTrainingが終わるのを待つ。
今回の場合は150個程度の訓練データしか使ってないようなので、数分程度で学習が終了した。


学習が終わった後、適当にGoogleで見つけたバナナの画像をこの分類器に与えてみる。




結果が出るまで少し待つ




それ程時間がかからずに結果が出る。
バナナな確率0.6。思ってたより数値が良くないのは訓練データが少ないせいだろうか。
そういえば訓練結果のAccuracyも0.57だった。

もう少しいろいろデータを用意して試してみたいところだ。

使ってみた感触


もはや画像データを渡せばいいだけなので、Deep Learningが何なのかといった知識がまったく不要である。また学習のリソースごと提供してくれているのが非常にポイントが高い。フレームワークはオープンソースで無料なのがいくつも存在するが、学習用のリソースはそうはいかない。

営利目的でしっかりとしたものを作るのならともかく、単に学習を目的としていたり、趣味でちょこっと作りたいときなど、学習リソースの調達はネックになることが多いであろう。

そのなかで学習環境もセットで提供されているLabellioは非常に存在価値が高いといえる。


2015年12月20日日曜日

Courseraの講義資料をダウンロードする方法

Couseraで人気のAndrew Ng氏によるMachine Learningの講義資料をダウンロードする方法のメモ。

なお、このスクリプトはCousera全般に対応しているので基本的にはどれも落とせる様子(未検証)

前提条件

講義資料への正しいアクセス権を持っていること。
つまり、普通にブラウザ経由で講義を見れている人が、オフラインで見たいなどのケースを想定。アカウント持ってないけど、資料を見たいという人は、無料なのでまずアカウントを作ってください。

準備

cousera-dlをインストール。
%> pip3 install coursera
詳細はcousera-dlを見てください。

ダウンロード

%> cousera-dl -u <username> -p <password>  ml-005

usernameとpasswordは、couseraにログインするときに使う、メールアドレスとパスワード。
ml-005はAndrew Ng氏のMachine Learningの識別子。

後はスクリプトが終わるまで待つ。
私の環境では10-20分程度は時間がかかった。

2015年10月9日金曜日

Define-by-RunとDefine-and-Run

Neural Networkの設計思想を表す用語のようだ。

The "Design-by-Run" scheme is also an important design decision to neuron that has both pros and cons. Most existing neural network library today follows "Design-and-Run" scheme or a declarative approach that first compile a pre-determined network structure and then train against a dataset. In such way, one can pre-allocate any necessary cache space to ensure that there are minimal memory reallocations in training, thus minimize the memory footprint whenever possible and have substantially optimized performance. Meanwhile, such a declarative approach also makes the underlying neural network static during the lifetime of training. The "Design-by-Run" scheme instead treats the neural networks morphologically, i.e. they are composed and (can) deform on-the-fly. At a cost, it will ask for onsite memory allocation whenever needed
簡単に日本語でまとめると

Neural Networkの設計にはDesign-and-RunとDesign-by-Runという二つの設計思想がある。


Design-and-run


  • 今日の一般的なスキーマで宣言的なアプローチに分類される
  • 宣言的なアプローチとは事前に決定されたネットワーク構造を利用し、トレーニングを行うもの。
  • キャッシュスペースが事前に割り当てられるので、メモリの使用を最小化し、性能を最適化することができる。しかしトレーニングの間にネットワーク構造を変更できないという欠点がある。


Design-by-run


  • ニューラルネットワークを形態学的に(morphologically)扱うことができる。
  • ネットワークの構造変更が容易にできるが、メモリの割り当てなどは最適化できない。




https://github.com/bobye/neuron/wiki/Basics#design-rationale


2015年9月18日金曜日

MNISTの解凍済みデータ

ディープラーニングとかで話題のニューラルネットワーク。
このニューラルネットワークの代表的な応用例として、手書き文字の認識というのがあります。

これはその名のとおり、お絵かきツールなどでフリーハンドで書いた数字が、0から9のどれにあたるのかを判定するものです。


ニューラルネットの練習としてこの手書き文字(数字)認識を実装してみようとすると、訓練データが必要となります。この訓練データはまじめに用意しようとすると大変なんですが、幸いなことにMNISTにデータが公開されています。

ただし、このデータはIDX file formatというフォーマットで圧縮されているために、そのままでは利用できません。

その場合は、下記のような方法でデータを利用することができます。

Nodejs

mnistというnodejsのアプリを使うと、json形式の訓練データとテストデータを取得することができます。取得自体にはnodejsが必要ですが、テキスト形式で取得できるので、その後どんな言語にでも利用することができます。jsonで取得できるのはうれしいですが、nodejsの環境が手元にないと使えないところが少々不便。

Python

deeplearning.netにPickle形式のデータが公開されています。pythonでサンプルを書こうと思ってる方はこちらのほうが手っ取り早いでしょう。


しかし、IDXフォーマットとか非常に面倒ですね。データ圧縮率とか優れているのかも知れませんが、普通にzipとかにしてもいまどき大して困らなかった気がするんですが。理論上の性能を追い求めるあまり、利便性を犠牲にしている気がします。



2015年3月13日金曜日

CFR(Counterfactual regret minimization)で三目並べ(Tic Tac Toe)

CFRの習い作として三目並べ(Tic Tac Toe)のAIを書いてみた。

が、書き始めて気づいたのだが、三目並べは完全情報ゲームであり、探索空間も狭いため、1回の試行で全部の戦略を探索できてしまう。
正直、CFRの例としてあまり意味をなしてないが、まあCFRとはなんぞやというのを理解する目的は果たせてると思うので、一応公開することとした。



CFR for Tic Tac Toe


Counterfactual regret minimization(CFR)

概要

ポーカーとかのAIで有名なcounterfactual regret minimization(CFR)。

ひとことで言うと、近似ナッシュ均衡を求めるための手法。

Regret Minimization

まず、CFRの元となったRegret Minimizationの説明から。
Regret Minimizationとは、その名の通り、過去の学習データから、regret(後悔)が最も小さくなる(minimization)手を選択する手法。

じゃんけんの例

例として、二人でじゃんけんを繰り返し行う場合を考える。
この時、勝つと1点、負けると-1点、引き分けると0点もらえるとし、これを繰り返し試行する仮定する。


まず1回目としてプレイヤーAがグー、プレイヤーBがパーを出したとする。
そしてプレイヤーAは負けたので-1点となる。

ここでプレイヤーAはパーを出してれば引き分けで0点、チョキを出していれば勝利で1点もらえる。

つまりプレイヤーAは1回目の戦略に対して、下記のように後悔の値を定量化することが出来る。この定量化した値をregretと呼ぶ。



  • 戦略パー       0 - (-1) = 1
  • 戦略チョキ   1-  (-1) = 2


CFRでは、2回目の戦略を決めるにあたって、regretに比例した確率で戦略を決定する。
つまり、2回目にチョキを選ぶ確率は2/3、パーを選ぶ確率は1/3、グーを選ぶ確率は0である。


ここで2回目の試行としてプレイヤーAがチョキ、プレイヤーBがグーを出したとする。
2回目の試行もプレイヤーAの負けなので、-1点となる。regretはそれぞれ次のようになる。


  • 戦略パー    1 - (-1) = 2
  • 戦略グー   0 - (-1) = 1


3回目の試行では、1,2回目を通したregretの値を利用する。


  • 戦略パー     1 + 2 = 3
  • 戦略チョキ 2 + 0 = 2
  • 戦略グー  0 + 1 = 1


よって、3回目の試行でそれぞれの戦略が選ばれる確率は、パーが3/6=1/2、チョキが2/6=1/3、グーが1/6である。

これがRegret Minimization。
ここで非常に重要なのが、Regret Minimizationにおいて、プレイヤーの平均的なregretがe未満であるとき、その時の戦略は近似ナッシュ均衡戦略であるといえる、という定理があること。


つまり、言い換えるとRegret Minimizationは近似ナッシュ均衡戦略を求める手法であるということが出来る。

Counterfactual Regret Minimization

そしてようやく出てきてCFR。
これのコンセプト自体を直感的に説明するのは少々難しいので別の機会に譲る。

ただ、これがなぜ重要なのかだけをメモしておく。

まず、CFRで提案されている概念のRegret(Immediate counterfactual regret) は必ず、Regret Minimizationのregret以上の値になる。つまり、Immediate counterfactual regretを最小化することは、Regretを最小化することにつながる。仮にImmediate counterfactual regretがaと求められたのならば、少なくともその時の戦略はa以下の近似ナッシュ均衡戦略であると言えるわけだ。

なぜ、こんなめんどくさいことが重要かといえば、解を解くときの計算量の関係。
ナッシュ均衡はとてもじゃないけど求められないし、近似ナッシュ均衡戦略を求めるregret minimizationもまだ十分に計算量が多い。そこで計算量が小さいCFRが重宝されている。

参考文献

2013年11月10日日曜日

第一回AI麻雀大会開催しました

先日公開したAI麻雀サーバを利用して第一回AI麻雀大会を開きました。

第一回ということでとりあえず都合のついた二人だけで対戦しました。

まずユーザのプロフィール紹介。

ユーザ名 戦略の概要
developing 喰いタンのみ、役牌のみなどを狙い誰よりも早く上がることを目指す
shizimily7 シャンテン数が一番小さくなるものを計算して捨て牌を選択。役があるかは考慮せず リーチを掛けることによって最低限の役を確保する戦略

そして結果の概要。

ユーザ名 勝利回数
developing 5
shizimily7 93
*引き分け 2回


100回行った対戦の平均点数は次のようになりました。
ユーザ名 平均点数
developing 22942
shizimily7 30638
sampleAI1 22368
sampleAI2 22056


結果としてはshizimily7の圧勝。結果を解析すると、上がり回数、平均上がり得点ともにdevelopingより優秀。特に普通に 七対子や大三元を上がるなどソツのない優秀なAIに仕上がる。developingは鳴きを駆使して早上がりを目指す戦略にであったが上がり回数でも shizimily7を下回っていることを考えると、もう少しプログラムの作り込みに期待したいところ。      

2013年11月1日金曜日

麻雀のAIサーバ作りました

麻雀のAI(Artificial intelligence)サーバを作りました。

https://github.com/kentan/SmartBird

最近では電王戦と称した将棋のAIが話題ですが、
麻雀のAIを作っていろいろ遊んでみたくしてみたくなり、このたびAIサーバを作成してみました。

将棋・チェス・碁などはいわゆる「二人ゼロ和有限確定完全情報ゲーム」と呼ばれるもので、

簡単にいうと、下記のようなゲームのことを意味します。


  • 一方の負け点数が他方の勝ち点数になる(二人ゼロ和)
  • 戦略の数が有限(有限)
  • サイコロをふるなどの運要素がない(確定)
  • 戦略を判断するための情報を全部知ることが出来る(完全情報)



有限で完全情報であるゲームは基本的にコンピュータのリソースをふんだんに使うと強くなります。
10年ほど前にはプロの相手にならなかった将棋のAIがちらほら勝てるようになったのもそのためです。

それに対し、麻雀は


  • 4人ゲーム(Not 二人ゼロ和)
  • 次に選択できる手が(ツモる牌)が確定的でない(Not 確定)
  • 戦略を決定するための情報のほとんどを知ることが出来ない(Not 完全情報)


といった特徴があり、将棋や碁よりもAIの難易度が高いといえます。