Tensorflowを動かしてみた

下のソースでリンクを貼ってるブログで紹介記事があったので、やってみたらディープラーニングの入門として良かったというだけの紹介話。

やり方としては

  1. Virtual Box上にLinuxをインストール
  2. Linux上でAnacondaをインストール
  3. Linux上でTensorFlowをインストール
  4. TensorFlowのサンプルプログラム「Fizz Buzz」を動かす

 

感想

  • Ubuntuはウィンドウマネージャーが使いにくいので、他のLinuxディストリビューションの方が良かったかも。
  • Virtual BoxがUbuntu用に8Gのハードディスクを割り当てるように言ってくるが、それで進めたらディスクが溢れたので要注意。ハードディスクに12Gを割り当てた。Anacondaをインストールしたらディスクの容量を食う。
  • Anacondaはサイズが大きく、ダウンロードするのにすごく時間がかかる。最新版をダウンロードしたらTensorFlowがインストールできなかったので、古いバージョンのAnaconda3-2.5.0-Linux-x86_64.shをダウンロードした。
  • Anacondaは時間がかかるので、NumPyなど必要なモジュールとPythonだけをインストールしたほうがいいかも。バージョンがずれてTensorFlowがインストール出来ない可能性が高いので、Anaconda3-2.5.0-Linux-x86_64.sh のバージョンを書き出しておく。
    (tensorenv)vbox:~$ python -V
    Python 3.4.4 :: Continuum Analytics, Inc.
    (tensorenv)vbox:~$ pip list
    numpy (1.11.0)
    pip (8.1.2)
    protobuf (3.0.0b2)
    scikit-learn (0.17.1)
    scipy (0.17.1)
    setuptools (22.0.0)
    six (1.10.0)
    skflow (0.1.0)
    sklearn (0.0)
    tensorflow (0.8.0rc0)
    wheel (0.29.0)
  • skflowはSegmentation fault (コアダンプ)と言われて動かなかったが、import skflowよりも前にimport numpy as npを置くと何故か動いた
  • Fizz Buzzの入力値に対して正解の出力値を、TensorFlowのニューラルネットワーク(=多層パーセプトロン)に繰り返し読み込ませて学習させることによって、ニューラルネットワークが正解を出す率が高まっていくことが分かった。Fizz Buzzが初めて読んだディープラーニングのプログラムだが、素人としては、これを基本形として、何に応用させるかと入出力のバイナリ表現を考えるだけで良いと思う。チュートリアルに単純なモデルの精度が92%となったのがかなり悪く、最高のモデルにすると99.7%まで精度が上がると書いてあるが、ディープラーニングの内部計算モデルをどのように工夫すれば精度が上がるかは専門家じゃないと無理。
  • サンプルプログラム「Fizz Buzz」は行数が少なくて分かりやすく、TensorFlowの入門として優れている。ブログのコメントによると、入力値が1つの数字でしかないということは、ニューラルネットワークが必要とする「特徴」が1つしかないということで、ニューラルネットワークが入力を区別するのに向いてない、とのこと。ディープラーニングに向いてる問題は、特徴がいっぱいあること。特徴がいっぱいあって、ディープラーニングに向いてる問題を思いついたら、入出力をバイナリ表現に落とす方法も考えれば、プログラム化にかなり近づく。
  • 例えば囲碁は19x19の碁盤で白と黒があるので、0が石がない、1が石があるとして、白と黒でそれぞれ361の長さがあって、合計722の長さのバイナリ表現が入力で、361の長さのバイナリ表現が出力になるのかな。想像だけど。361の長さの出力のうち1が複数あると困ると思っていたが、出力は重み付けの行列を掛けて足し込んだ小数の値になって、関数tf.argmaxで出力のうち最大値がある場所だけを有効、つまり1とするのがTensorFlowのやり方のようだ。2番目に最大になる値も囲碁の次の手として候補とできるかもしれない。想像だけど。
  • 囲碁と同じように将棋もディープラーニングさせようと考えたが、持ち駒をどのようなバイナリ表現にすればいいかや、出力の次の一手をどのようなバイナリ表現にすればいいかが難しい。持ち駒は18個の歩を2個持ってたら[1,1,0,0,...,0]のように表現するのかな。しかし、出力のバイナリ表現が思いつかない。ある位置に駒を動かすとして、持ち駒から移動させるのか、盤上のどの駒を移動させるのかが表現できない。つまり、将棋は向いてなくて、囲碁はディープラーニングに向いた問題だったということだと思う。
  • 将棋をディープラーニングに対応させるとしたら、持ち駒は考えないで、出力として盤面9x9が2ついるだろう。次に動かす駒の開始地点と動かす先の地点。出力の開始地点から入力を見てどの駒かを判定し、それによって動かす先を制限できるような内部計算モデルにしないといけない。無茶苦茶難しそう。
  • どんな問題に対しても、ディープラーニングを適用できるかどうかは疑わしい。ディープラーニングが何に向いてるかというと、分類分けだと思う。出力を[0,0,1,0,0,0,...,0]のようにして、3番目が1なら猫の画像とするとか、どの分類かを示すことができる。
  • 分類分けが得意そうだということから考えると、遺伝子情報から、向いてる職業や犯しやすい犯罪、罹りやすい病気を出力させるようなディープラーニングが作られると思う。
  • 株価や為替は一日前に比べて00:大きく下がった、01:下がった、10:上がった、11:大きく上がったとして過去365日分のバイナリ表現を作り、一日後、1か月後、1年後の価格が上がったか(100)下がったか(010)変わらなかったか(001)を出力するようなニューラルネットワークを作れるかもしれない。
  • 手相をディープラーニングして手相占いのように性格や年収などを算出する機械を作ったらヒットしそう。
  • サンプルプログラム「Fizz Buzz」はニュールラルネットワークの初期化状態から正解を覚えさせていっているが、学習済のニューラルネットワークを出力して再利用できる方法があるはず。
    → print (sess.run(w_h))やprint (sess.run(w_o))で重み付けの行列w_hやw_oを出力できたので、それを使えばいい。行列が2つあるのは、Fizz Buzzが入力層、中間層、出力層のモデルを使っているから。中間層=w_h*入力層、出力層=w_o*中間層のような感じ。
  • googleはWindows版のTensorFlowを公開していない。LinuxとMacでしか動かせないようにしているのは、WindowsをやめてLinuxやMac に行けということか・・・。
  • googleはWindows版のTensorFlowを公開していなかったが、2016/11/29に最新版v0.12で、Windows7/10などで利用可能な版を公開するようになった。
    (ttp://forest.watch.impress.co.jp/docs/news/1032486.html Google、オープンソースの機械学習ライブラリ「TensorFlow」のWindows版を公開 「PyPI」のパッケージとして配布 2016年11月30日)

 

インストールログ

1. Virtual BoxにLinuxをインストール

Virtual Boxをインストールして、UbuntuのISOイメージを取ってきて、Windows上にLinuxが動く仮想マシンを構築。

  • ttp://www.ubuntu.com/desktop : UbuntuのISOイメージ
  • メニューの「Devices」>「Insert Guest Additions CD Image」(もしくは、デバイス > Guest Additions のCDイメージを挿入)をクリックして、画面の解像度を上げる。
  • VirtualBoxメニューのデバイスの「クリップボードの共有」を双方向にしておくとWindowsのクリップボードを貼り付け出来たりして便利。

(ソース ttp://ottan.xyz/virtualbox-ubuntu-2418/ VirtualBoxにUbuntu 14.04.2 LTSをインストールする方法)

2. Linux上でAnacondaをインストール

  • pipのインストール。
    $ sudo apt-get install python-pip
  • ttps://www.continuum.io/downloads : Anacondaのダウンロード。
    Linuxの64ビット最新版が
    ttp://repo.continuum.io/archive/Anaconda3-4.0.0-Linux-x86_64.sh
    となってるが、Tensorflowがインストールできなかったので
    ttp://repo.continuum.io/archive/Anaconda3-2.5.0-Linux-x86_64.sh
    に修正してダウンロードして実行。
    $ bash Anaconda3-2.5.0-Linux-x86_64.sh
  • Anacondaは、、NumPy,SciPy,matplotlib、scikit-learn等のパッケージがまとめて入ったPython数値計算環境。
  • AnacondaのTensorflow用環境を作成。
    $ conda create --name=tensorenv python=3.4
  • 作成した環境を有効にする。
    $ source activate tensorenv
    これで先頭に「(tensorenv)」が付くようになる。

(ソース ttp://yaju3d.hatenablog.jp/entry/2016/03/27/022400 WindowsユーザーがTensorFlowをインストールしてみた)

3. Linux上でTensorFlowをインストール

  • TensorFlowをインストールしようとしたら、pipをアップグレードしろと言われるので、アップグレード。
    (tensorenv)$ pip install --upgrade pip
  • TensorFlowのインストール。
    (tensorenv)$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp34-none-linux_x86_64.whl
  • TensorFlowのインストールで、「Found existing installation: setuptools」というエラーが出るので、setuptoolsを削除。
    $ conda remove -n tensorenv setuptools
  • もう一度、TensorFlowのインストール。
    (tensorenv)$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp34-none-linux_x86_64.whl
  • TensorFlowの動作確認。
    (tensorenv)$python -c "import tensorflow; print(tensorflow.__version__);"

(ソース ttp://yaju3d.hatenablog.jp/entry/2016/03/27/022400 WindowsユーザーがTensorFlowをインストールしてみた)

4. TensorFlowのサンプルプログラム「Fizz Buzz」を動かす

ソースのリンク先のバラバラな「fizz buzz」プログラムを1つにしたもの。

import numpy as np
import tensorflow as tf

def binary_encode(i, num_digits):
    return np.array([i >> d & 1 for d in range(num_digits)])

def fizz_buzz_encode(i):
    if   i % 15 == 0: return np.array([0, 0, 0, 1])
    elif i % 5  == 0: return np.array([0, 0, 1, 0])
    elif i % 3  == 0: return np.array([0, 1, 0, 0])
    else:             return np.array([1, 0, 0, 0])

NUM_DIGITS = 10
trX = np.array([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)])
trY = np.array([fizz_buzz_encode(i)          for i in range(101, 2 ** NUM_DIGITS)])

NUM_HIDDEN = 100

X = tf.placeholder("float", [None, NUM_DIGITS])
Y = tf.placeholder("float", [None, 4])

def init_weights(shape):
    return tf.Variable(tf.random_normal(shape, stddev=0.01))

w_h = init_weights([NUM_DIGITS, NUM_HIDDEN])
w_o = init_weights([NUM_HIDDEN, 4])

def model(X, w_h, w_o):
    h = tf.nn.relu(tf.matmul(X, w_h))
    return tf.matmul(h, w_o)

py_x = model(X, w_h, w_o)

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(py_x, Y))
train_op = tf.train.GradientDescentOptimizer(0.05).minimize(cost)

predict_op = tf.argmax(py_x, 1)

def fizz_buzz(i, prediction):
    return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]

BATCH_SIZE = 128

with tf.Session() as sess:
    tf.initialize_all_variables().run()
    for epoch in range(10000):
        p = np.random.permutation(range(len(trX)))
        trX, trY = trX[p], trY[p]
        for start in range(0, len(trX), BATCH_SIZE):
            end = start + BATCH_SIZE
            sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end]})
        print(epoch, np.mean(np.argmax(trY, axis=1) ==
                             sess.run(predict_op, feed_dict={X: trX, Y: trY})))
    numbers = np.arange(1, 101)
    teX = np.transpose(binary_encode(numbers, NUM_DIGITS))
    teY = sess.run(predict_op, feed_dict={X: teX})
    output = np.vectorize(fizz_buzz)(numbers, teY)
    print(output)

(ソース ttp://blog.amedama.jp/entry/2016/06/01/233355 Python: skflow を使ってディープラーニングで FizzBuzz 問題を解いてみる
ttp://joelgrus.com/2016/05/23/fizz-buzz-in-tensorflow/ Fizz Buzz in Tensorflow)

(動作結果)

(tensorenv)vbox$ python fizzbuzz.py
0 0.533044420368
1 0.533044420368
2 0.534127843987
...
9997 1.0
9998 1.0 ←ループを1万回回して学習が進むに連れて精度が上昇し、1(正答率100%)に近づいていることが分かる。
9999 0.998916576381
['1' 'fizz' 'fizz' '4' 'buzz' 'fizz' '7' '8' 'fizz' 'buzz' '11' 'fizz' '13'
 '14' 'fizzbuzz' '16' '17' 'fizz' '19' 'buzz' 'fizz' '22' '23' 'fizz'
 'buzz' '26' 'fizz' '28' '29' 'fizzbuzz' '31' '32' 'fizz' 'fizz' 'buzz'
 'fizz' '37' '38' 'fizz' 'buzz' '41' 'fizz' '43' '44' 'fizzbuzz' '46' '47'
 'fizz' '49' 'buzz' 'fizz' '52' '53' 'fizz' 'buzz' '56' 'fizz' '58' '59'
 'fizzbuzz' '61' '62' 'fizz' '64' '65' 'fizz' '67' '68' 'fizz' 'buzz' '71'
 '72' '73' '74' 'fizzbuzz' '76' '77' 'fizz' '79' 'buzz' 'fizz' '82' '83'
 '84' 'buzz' '86' 'fizz' '88' '89' 'fizzbuzz' '91' '92' '93' '94' 'buzz'
 'fizz' '97' '98' 'fizz' 'fizz'] ←学習させたニューラルネットワークからの出力。2番目が3で割り切れないので不正解。

(補足結果)

ニューラルネットワークへの入力trXと出力(正解)trYがバイナリ表現になっていて

sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end]})

で入力と正解を学習させているようだ。

入力値のtrXは101から1023までの数値のバイナリ表現
trX= [[1 0 1 ..., 0 0 0] <<101の2進数(0001100101) [0 1 1 ..., 0 0 0] <<102の2進数(0001100110) [1 1 1 ..., 0 0 0] <<103の2進数(0001100111) ..., [1 0 1 ..., 1 1 1] [0 1 1 ..., 1 1 1] [1 1 1 ..., 1 1 1]] <<1023の2進数((1111111111))


正解値のtrYは101から1023までのfizzbuzz値のバイナリ表現
trY= [[1 0 0 0] <<101:5でも3でも割り切れない [0 1 0 0] <<102:3で割り切れる [1 0 0 0] ..., [1 0 0 0] [1 0 0 0] [0 1 0 0]] <<1023:3で割り切れる 15で割り切れる時、fizzbuzz値=[0, 0, 0, 1] 5で割り切れる時、fizzbuzz値=[0, 0, 1, 0] 3で割り切れる時、fizzbuzz値=[0, 1, 0, 0] 5でも3でも割り切れない時、fizzbuzz値=[1, 0, 0, 0]

学習用データに1から100までの数値を使うことは不正行為だとブログで書いていて、101から1023までのデータで学習したニューラルネットワークに対して、1から100までの答えの予測を出力するプログラムになっているようだ。動作結果の正答率を調べたら93%(fizz:89%,buzz:86%,fizzbuzz:100%)と弱かった。学習用データに1から100までの数値(正解)を含めてやってみたら正答率100%になった。

 

ディープラーニングとは何かを考えてみた

 

この図のb=Wx(Wは行列)を解く問題がディープラーニングの原型。話は続く。

だが連立方程式を解くだけならエクセルのソルバーでもできたはずだ。では、何故ディープラーニングとして騒がれるようになったのか?素人が誤解を恐れずに言ってみると、ディープラーニングは、層を増やすとかReLUやsoftmaxを使うとか、効果的に学習できるようにこの原型を発展させたもの。(さらに、データフローが一方向に流れるだけという制限を取り払って、ループするようなフローも入れて、時系列で過去の入力を覚えておいて利用するという発展型もディープで深く複雑だ。)

Fizz Buzzの例では、[入力x]→[隠れ層(中間層)]→[出力b]のように中間層を入れて、中間層にReLUで0未満の値を0にする変換を入れている。

次に問題なのがsoftmax_cross_entropy_with_logitsだ。softmaxはbを確率に変換させるようなもので、累乗を取って負の数を正の数に変換して、全体の和が1になるようにしている。yがsoftmaxで確率に変換された値、y_seikaiが学習に使ったyの正解値として、cross_entropyは-sum(y_seikai * log(y))のこと。logitsはlogit(p)=log(p/(1-p))=log(p)-log(1-p)のこと。それじゃあsoftmax_cross_entropy_with_logitsは全体としてどういう計算をしているのかという話になるが、  TensorFlowのオンラインマニュアルに書かれていない。googleは計算式を書くべきだ。しかし、学習が効果的に進むようにbをとにかく変換させるという観点から考えると、うまく行ったからそれを使ってるだけで、それをどうして使ったかなんてことはどうでもいいのだとも言える。

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))
cross_entropy_logit =-sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output)) ???
(ソース ttp://datascience.stackexchange.com/questions/9850/neural-networks-which-cost-function-to-use Neural networks: which cost function to use?)

 

TensorFlow以外のディープラーニングのライブラリ

TensorFlow : 2015年11月に発表された、Google製の機械学習ライブラリ。簡単にいうと使っていることを明記さえしておけば、商用利用も可能な Apache 2.0ライセンス。googleがオープン化した理由は、お金ではなく、この分野の研究を加速させたいからだという。現在(2015/11/12)はC++/Pythonのみ。

Chainer : 2015年6月公開された、Preferred Networks社が開発したニューラルネットワークを実装するためのPython のライブラリ。
東京大学出身の西川氏や岡野原大輔氏が2006年に設立したプリファードインフラストラクチャー(PFI)は、外部からの出資を受けない方針だったが、方針を転換して別会社としてPreferred Networks社を設立。NTTが出資しトヨタと共同研究もしている。

Caffe : C++で実装されたディープラーニングのオープンソースライブラリ。カリフォルニア大学バークレー校の研究センターBVLCが中心となって開発、C++・Python・MATLABで利用可能。

(ソース ttp://d.hatena.ne.jp/shu223/20160105/1451952796 ディープラーニングの有名ライブラリ5種を最短距離で試す半日コース(TensorFlow, Chainer, Caffe, DeepDream, 画風変換)Add StarjmworkskosekiAnatomia
ttp://itpro.nikkeibp.co.jp/atcl/news/14/100101159/  PFIが深層学習専業の「Preferred Networks」を設立、NTTが出資しトヨタと共同研究も  2014/10/01)

 

googleのTensorflowチュートリアル

ttps://www.tensorflow.org/versions/r0.8/tutorials/index.html に英語でチュートリアルが置いてある。

ここを日本語化してるページを見つけた。

  • ttp://qiita.com/KojiOhki/items/ff6ae04d6cf02f1b6edf : MNIST For ML Beginners
  • ttp://qiita.com/KojiOhki/items/64a2ee54214b01a411c7 : Deep MNIST for Experts
  • ttp://qiita.com/KojiOhki/items/0640d01029371d6ae092 : TensorFlow Mechanics 101
  • ttp://tensorflow.classcat.com/2016/02/19/tensorflow-tutorials-recurrent-neural-networks/
    TensorFlow : Tutorials : RNN リカレント・ニューラルネットワーク
  • ttp://qiita.com/KojiOhki/items/45df6a18b08dfb63d4f9 : Sequence-to-Sequence Models
  • ttp://qiita.com/KojiOhki/items/dab6922b6cd7b990c002 : Image Recognition

MNIST For ML Beginnersは内部モデルの理解が進んだのでおすすめ。上にも書いたが、内部モデルにある重み行列のWなどはprint (sess.run(w))という風にすれば表示することができる。

役に立ちそうな用語:

ReLU(ランプ関数)

  • 隠れ層の活性化関数として max(0, x) で計算。
  • つまり、中間層で0未満の値を0にするいうことで、これによりモデルの精度が上がるらしい。
  • Yann LeCunらの論文では、2015年5月現在これが最善であるとしている。

(ソース ttps://ja.wikipedia.org/wiki/活性化関数)

バックプロパゲーション

  • 誤差逆伝播法。
  • エラーおよび学習は出力ノードから後方のノードへと伝播する。
  • ほとんどの場合、誤差を最小にする単純なアルゴリズムである確率的最急降下法で使われる。確率的最急降下法は、多分tf.train.GradientDescentOptimizer(0.05).minimize(cost)のこと。
  • バックプロパゲーションを行う場合、ネットワークは少なくとも三層以上(入力層、中間層、出力層)でなければならない。

(ソース ttps://ja.wikipedia.org/wiki/バックプロパゲーション)

 

ディープラーニングの発展

シーケンスモデルというのがあるらしい。エンコーダーの入力に、[彼][は][走る]の3つの単語を順番に入力していったら、デコーダーが[he][runs][END]と2つの単語と終端記号を順番に出力するという信じられないようなモデルで、LTSMというRNN(再帰的)な構造を持たせることによって過去に入力した単語を覚えていて利用することができるという。そんなモデルを学習できるはずがないと思うが、試してないが、できてるみたいで恐ろしい。

  • TensorFlowで使うモデルは、大きく分けて「Dtataflow Graph(データフローグラフ)」と「Sequence Model(シーケンスモデル)」の2種類。
  • Sequence Modelは、時系列に音が並んだ音声、文字が一列に並んだテキストなどを扱うモデル。音声に適用して音声認識、テキストに適用して機械翻訳といったことに応用可能。

[ttp://japan.cnet.com/news/service/35076183/ グーグルのオープンソース機械学習システム「TensorFlow」--開発者が現状を報告 2016/01/14]

を読んで、ディープラーニングの理解が誤ってるような気になってきた。さらに

  • ttp://qiita.com/KojiOhki/items/89cd7b69a8a6239d67ca Understanding-LSTMsの日本語訳
  • ttp://qiita.com/t_Signull/items/21b82be280b46f467d1b わかるLSTM 〜 最近の動向と共に
  • ttp://qiita.com/odashi_t/items/a1be7c4964fbea6a116e ChainerとRNNと機械翻訳
  • ttp://qiita.com/KojiOhki/items/45df6a18b08dfb63d4f9 TensorFlowチュートリアル - シーケンス変換モデル(翻訳)

あたりを読んでいくと

  • リカレントニューラルネットワーク(RNN) : 人間はゼロから思考していない。前の単語を覚えていて、そこから次の単語を連想させている。つまり、自身の出力を自身に入力させてループさせている。
  • LSTM(Long Short Term Memory) : RNNの長期の依存性の問題を回避して、前の単語を覚えておいて、学習もうまくさせることができて、よく使われているモデル。一連の方程式として書かれると、LSTMはかなり威圧的に見える。
  • Sequence-to-Sequence モデル :  LSTMセルをくっつけたモデル。入力を扱うエンコーダと出力を生成する デコーダから成る。LSTMを多段に積み上げている。最高性能の翻訳結果を出した。

ニューラルネットワークの応用は分類分けだけじゃないってことらしい・・・。この辺りまで来ると素人が簡単に手出しできるようなものに見えない。

 

AlphaGo

Google DeepMind

  • Google DeepMindはイギリスの人工知能企業。
  • 2014年にGoogleによって買収された。
  • Google DeepMindが開発したプログラムAlphaGoが、2016年3月に韓国のプロ棋士イ・セドルと対局し、4勝1敗で勝ち越した。

(ttps://ja.wikipedia.org/wiki/Google_DeepMind)

デミス・ハサビスが天才すぎる

  • デミス・ハサビスはGoogle DeepMind創業者。
  • ロンドンにておもちゃ屋の息子として生まれる。父親はキプロス出身のシンガーソングライター、母親は中国系シンガポール人でデパートに勤めている。
  • 史上最も優秀なチェスプレイヤー」と評されるほどチェスプレイヤーとして頭角を現した。
  • 11才のときにオセロを行う人工知能のプログラムを書き、弟を負かせる。
  • 17歳のハサビス氏は「Theme Park」というシミュレーションゲームを開発。 「人工知能はこれから劇的に進化する」という考えを強めていった。
  • 2年飛び級でケンブリッジ大学を卒業してコンピュータサイエンスの学位を取得。
  • 1998年にはゲーム会社、Elixir Studios社を設立して一定の成功を収めた。
  • 2005年にはケンブリッジ大学の博士課程へ進学して脳神経科学の研究をスタート。
    (人工知能の最先端を行く人は脳の研究をしてる人だと思う。
  • 論文が科学誌ScienceのBreakthrough of the Yearにも選ばれ、脳神経科学の分野でも高い評価を受けた。
  • 2011年に人工知能を研究・開発するべくベンチャー企業DeepMind Technologiesを創設。
  • 2014年1月にGoogleに500億円超という巨額で買収された。
  • 「人生のなかで、グーグル級の会社をつくることと、究極の人工知能を開発することの両方を行う十分な時間はない、とわかったんです。数十億ドルのビジネスをつくりあげることと、知性を解明すること。将来振り返ってみたときに、どちらがより幸せだったと思えるのだろう?それは簡単な選択でした。」
  • 人工知能開発の究極の目標は、機械に知性をもたせることです」

(ttp://gigazine.net/news/20141203-deepmind-demis-hassabis/ Googleの人工知能開発をリードするDeepMindの天才デミス・ハサビス氏とはどんな人物なのか? 2014年12月03日
ttp://qiita.com/yaju/items/8268f8b3a7d31ed5c499 AlphaGoを作った天才デミス・ハサビスの経歴
ttp://matome.naver.jp/odai/2145938914584506101 750億円で買収された超天才プログラマー「デミスハサビス」の経歴まとめ)

AlphaGoの仕組み

  • AlphaGoのPlay= 50GPUを4週間使って学習した評価関数 + モンテカルロ木探索(MCTS)
  • 学習しておく関数:
      ポリシー関数 P(a|s) 盤面sで場所aにうつべき確率
      バリュー関数 vθ(s) 盤面sの評価値
  • ポリシーネットワーク 入力層:(19x19x48)の盤面sの特徴量、12の隠れ層、出力層
    バリューネットワーク 入力層:(19x19x49)の盤面sの特徴量、14の隠れ層、出力層
    (入力はx2でいいと思ってたが、x48ってどういうこと?)

(ttp://www.slideshare.net/yuk1yoshida/alphago-61311712 AlphaGoの仕組み Apr 25, 2016)

  • 2015年10月のFan Hui氏との対戦の時、システムは1202CPUと176GPUと書かれているがCPUはコア数で数えているのではないかと思われる。
  • AlphaGoでは、盤上の石の配置と次の指し手を入力として、その手の良し悪しを評価する「ポリシーネットワーク」と、石の配置だけから勝ち負けを評価する「バリューネットワーク」という2種類のニューラルネットワークを使っている。ポリシーネットワークは、精度の高いネットワークと、精度は劣るが計算時間の短いネットワークという2つのネットワークがある。
  • ゲームソフトの基本的なアルゴリズムは「Monte Carlo Tree Search(MCTS)」で、2種類のネットワークを使って勝率の高そうな手を選んでいく。しかし、同程度に良い手がある場合は、それらの複数の手の先をそれぞれ探索するので評価するケースが増加して行く。
  • AlphaGoは、1つの手を評価するには、高速のポリシーネットワークを使って勝敗が決するまでプレイを進めて(Rollout)勝敗を求める。そして、最初の手から広がったツリーの末端での勝ちが多い手に高い評価を与える
  • AlphaGoは、このRolloutの結果、バリューネットワークの結果、高精度のポリシーネットワークの結果を総合して、次の手を決めている。

(ttp://news.mynavi.jp/articles/2016/03/25/alphago/ 世界最強の囲碁棋士にも勝ち越し - 半年足らずで劇的に強くなったAlphaGo 2016/03/25)

  • Demis Hassabisが公式ブログ(ttps://googleblog.blogspot.com/2016/01/alphago-machine-learning-game-go.html)でAlphaGoの概要を説明しているほか、27日発行の科学雑誌NetureにAlphaGoに関する論文が掲載された。

(ttp://news.mynavi.jp/news/2016/01/28/159/ AIが初めて囲碁のプロ棋士に勝利、機械学習で進化したGoogleの「AlphaGo」 2016/01/28)

  • AlphaGoを構成するのは打ち手を探索する「Policy Network」と局面を評価する「Value Network」という2つの深層ニューラルネットワーク。
  • 入力として19×19の盤面全体に対して、白、黒、それ以外という3つの状態をそのまま入力した場合だけでも、予測的中率55.7%、それ以外の盤面に関わる情報、何手目か、アタっている石はどれか、などより詳細な情報を加えて学習させると、予測的中率が57%になった。 (19x19の各場所に対して、00:白、01:黒、10:それ以外、11:未使用のように記号化してるっぽい
  • ソースコードを読んでないので想像で補うしかありませんが、盤面からの入力に対してPolicy Networkで「次はこんな感じの手を打ったらいいんじゃないか」という確率を出し、出された確率のうち、上位数十から数百手に対して、次のValue Networkでその手を選択した場合の勝率はどのくらいかということを評価し、最も高い勝率が出せそうな手を選択するという二段構えの手法。

(ttps://wirelesswire.jp/2016/03/51084/ 知性とは何か AlphaGoの初戦で感じたこと 2016.03.10)

AlphaGoその他

  • ttps://github.com/Rochester-NRT/RocAlphaGo/wiki  AlphaGoのクローン。Alphagoの解説やpythonのソースがある。
  • ttp://qiita.com/RyuKahou/items/1812102ed05b2fdf7ffc Google DeepMindの人工知能(AI)「AlphaGo」を頑張って理解する。RocAlphaGoやデルタ碁へのリンクをここから入手した。
  • ttp://home.q00.itscom.net/otsuki/delta.html デルタ碁。実行バイナリとソースが置いてある。AlphaGoのSL-Policy Networkをほぼ忠実に再現。一回しか戦ってないけど棋力は2級くらいか。

AlphaGo対イ・セドル

  • 韓国のプロ囲碁棋士イ・セドルとAlphaGoとの間の囲碁五番勝負。
  • 勝者は100万米ドルの賞金を得る。 ←賞金の額がすごい!
  • 賞金に加えて、イ・セドルは全5戦の対局料として15万米ドル、1勝につき2万米ドルを得る。
  • イ・セドル九段は2007年から2011年まで囲碁のレーティングで世界ランキング1位を維持し、その後も毎年トップ5には入ってくるという正真正銘のトップ棋士。アルファ碁と対局した際の世界ランキングは4位。

(ttps://ja.wikipedia.org/wiki/AlphaGo対李世ドル
ttp://gigazine.net/news/20160607-alphago-vs-ke-jie/ 「アルファ碁はイ・セドルに勝てても私には勝てない」とコメントした世界ランクトップのカー・ジエ九段がAlphaGoと対局 2016年06月07日)

AlphaGo対カー・ジエ

  • ここ数年の間、囲碁の世界ランキングで1位を死守しているのが18歳の中国人棋士カー・ジエ九段。
  • 2016年度末にジエ九段とアルファ碁が対局する。

(ttp://gigazine.net/news/20160607-alphago-vs-ke-jie/ 「アルファ碁はイ・セドルに勝てても私には勝てない」とコメントした世界ランクトップのカー・ジエ九段がAlphaGoと対局 2016年06月07日)

AlphaGo、柯潔(カー・ジエ)に3戦全勝

  • 初戦は、序盤から果敢に攻めた柯九段にアルファ碁が完璧に対応し、終始勝負をリードしたが、結果は半目の僅差だった。第2局もぎりぎりのせめぎ合いになるかと思われたが、アルファ碁は柯九段の激しい攻めを寄せ付けず、AIの圧倒的な強さを見せつける形で勝負を決めた。(←半目の僅差は勝ち確後の舐めプ。AIは1目半で勝つように調整されてる。ヨセになるとどんどん詰まっていくけど逆転はしないのがアルファ碁
  • 今回のAlphaGoは、年次開発者会議「Google I/O 2017」で発表された新世代の「TPU(Tensor Processing Unit)」を1台使用する構成で挑んだという。(←これまで何百台も使用していたのが一台というのが相当すごい

(ttp://www.jiji.com/jc/article?k=2017052500862 囲碁AI、最強棋士に勝ち越す=中国・柯潔九段との第2局:時事ドットコム 2017/05/25
ttp://www.itmedia.co.jp/news/articles/1705/27/news038.html 最強囲碁AI「AlphaGo」全勝 世界最強棋士も敵わず - ITmedia NEWS )

イ・セドルを倒したことでコンピューターが囲碁の分野で人間を超えたと言っていい。コンピューター碁が強くなる速度が人間が棋力で強くなる速度を遥かに超えているからだ。アルファ碁以外の囲碁ソフトが先にランキングトップのカー・ジエを倒すとアルファ碁の名に傷がついてしまう、ということだろう。

ところで、日本のコンピューター将棋対対羽生善治ってどうなってんだ?グーグルでも1億なのに、羽生との対局料7億800万円はふざけている。韓国人のイ・セドルや中国人のカー・ジエが、コンピューター対人間という歴史的イベントに立ち向かっているのに、日本人の羽生との対局が実現しないのは実に滑稽である。

羽生が逃げ回っているというより、5000万円ほどを出す日本の大企業がいなかったということだろう。日本の大企業は人工知能に興味がなかったのだろう。ITの分野で日本に大企業がいたら実現したかもしれないが、ITの分野で日本に大企業が存在しない。だから今ごろ(2016年06月07日のニュース)になって日本の大企業のトヨタなどが慌てて東大に9億円寄付ということになった。

(ttp://blog.livedoor.jp/nwknews/archives/4862318.html 羽生のコンピュータとの対局料は7億800万円 2015年04月25日
ttp://www.itmedia.co.jp/news/articles/1606/07/news096.html 「日本を人工知能研究の先進国に」――東大に研究者育成講座 ドワンゴ、トヨタなどが9億円寄付 2016年06月07日)

 

井山裕太がDeepZenGoに敗れた

  • 2017年3月23日、井山裕太六冠(27)は日本最強のAI「DeepZenGo」に敗れ、3連敗となった。
  • DeepZenGoは、中国と韓国の棋士に敗れ、井山裕太に勝った。
  • DeepZenGoは、日本最強の囲碁ソフト。

(ttp://www.asahi.com/articles/ASK3R5CVSK3RUCVL00T.html 囲碁世界戦、朴廷桓九段が優勝 井山六冠はAIに敗退:朝日新聞デジタル 2017年3月23日
ttp://www3.nhk.or.jp/news/html/20170323/k10010922001000.html 日本で開発の囲碁AI 世界大会で井山九段破る | NHKニュース)

 

コンピュータ将棋の状況(調査日:2016/11/26)

2chのスレでコンピュータ将棋ではスマホが人間より強いと言われてたので調査のうえ書き出す。

  • (AlphaGoがCPU 1202個x32コアと想定して)将棋は4コアだぞww
  • 4コアどころか、今話題の三浦九段はスマホにインストールしたソフトのカンニングを疑われている
  • スマホでトッププロより余裕で強いとかw
  • 将棋ソフトをスマホで動かすとデスクトップで動かした場合と比べR400程の差があると開発者が言っている。そして今の強豪ソフト群はR3800前後だから人間トップ(R3200)より単純計算で強い。
  • 終盤になると、当然、持ち時間は少なくなり、勝負の行方を決する重要な局面でもあることから、棋士はほとんど休憩を取らなくなる。ところが、三浦九段は終盤でも一手ごとに対局室から出て行ったりしていた。連盟が調査をすると、“控室で寝転がりながらスマホの操作をしているのを目撃した”などと証言する棋士も現れた。三浦九段が使っていたと見られる将棋ソフトは、『技巧』という将棋ソフトで、終盤における棋譜と93%という一致率だった。(←三浦九段は限りなくクロだと思っていたが、冤罪だった。ビックリの事実)
  • 三浦九段本人の反論。プロ棋士同士の対局であれば、勝った対局というのはどうしてもソフトとの一致率が高くなる傾向はある。(勝った将棋だけを)都合の良いように将棋ソフトとの一致率とかを抜き出して疑われた。(←将棋ソフトは最適解に近い手を打っていると考えられる

(ttp://tamae.2ch.net/test/read.cgi/gamestones/1479573367/641,644,647,652,653 コンピューター囲碁ソフトについて語るスレ45 2016/11/25
ttp://www.itmedia.co.jp/news/articles/1603/24/news058.html AlphaGoの運用料金は30億円以上? 2016年03月24日
ttp://zasshi.news.yahoo.co.jp/article?a=20161027-00513969-shincho-soci スマホ使用疑惑の三浦九段、将棋ソフト「技巧」との一致率は93% 2016/10/27
ttp://ironna.jp/article/5686 「どうしても言いたいことがある」 三浦九段が初めて語った騒動の内幕 2017.02.07))

いつの間にかコンピュータ将棋が人間を超えてしまっていたと言っていいんじゃね。コンピュータ囲碁よりコンピュータ将棋の方が先に人間を超えるのは探索空間の手順数(チェスは10の120乗、将棋は10の220乗、囲碁は10の360乗)から明らか。コンピュータ将棋が人間をいつ抜いたかが重要な訳で、ディープ・ブルー対ガルリ・カスパロフやAlphaGo対李世ドルのような対戦を将棋もやらなければいけなかったのだが、臆病者の羽生が逃げまわってるせいでその機会を永遠に逃してしまった。羽生がAIについて語っている記事をよく見かけるが、その度にお前が語るな(笑)とツッコミを入れている。

 

関連記事

posted at 2016年06月04日 02:08 | Comment(0) | IT
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。