2015年3月24日火曜日

classloaderとstatic変数

classloaderとstatic変数の関係を調査してみた。

基本的にはclassloaderが異なると、static変数の値も異なるというのが仕様のようだ。
ただし、classloaderのhierarchyで同じparentを共有していると、static変数は共有される。

詳細はstackoverflowで。

Multiple instances of static variables


ちなみに下記の日本語ブログでも、static変数はクラスローダごとに別になるとの情報があるが、ブログに載ってるサンプルコードを実行したところ、2つのクラスローダでstatic変数は共有されているようだった。

[Java]別々の ClassLoader にロードされたクラスのフィールドは別になる


URLClassLoaderとPluginClassLoaderが階層的にどういう関係にあるのか調べてないけど、親をどっかで共有してたりするのだろうか。または、2006年の情報なのでjavaのバージョンが関係して足りすのだろうか。


2015年3月19日木曜日

pipでプロキシを設定する方法

環境変数に設定する。

%> export https_proxy="http://<proxy.server>:<port>"
%> pip install <xxxxx>


参考文献
http://stackoverflow.com/questions/19080352/how-to-get-pip-to-work-behind-a-proxy-server

 

RHELでCentOSのレポジトリを使用する方法まとめ

RHELは標準構成ではほとんどソフトウェアがインストールされていないので、いろいろ開発していると追加でインストールする必要が出てくる。 RHELにソフトウェアをインストールする方法は大きく2つ。
  1. rpmをどっかから持ってきてインストール
  2. yumを使う
ただし、yumを利用する場合RedHatの契約が必要になる。 正式運用環境ならともかく、単なる開発環境ではそんなもの用意してられないので、こういう時はCentOSのレポジトリにつないでインストールするといい。 ここではそのための設定をまとめる。

レポジトリの設定

下記のパスのファイルを新規作成し、下記の内容を記述する。
/etc/yum.repos.d/CentOS-Base.repo


プロキシの設定

プロキシを使っていない場合は、この設定は不要。
下記のファイルに
/etc/yum.conf

下記の設定を行う
proxy=<url>:<port>

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が重宝されている。

参考文献