自作AIの会

職業柄この時期多忙で少々報告遅れな感がありますが

1月20日に自作AIの会ってのをやってました。

ai-okayama.connpass.com

 

機械学習とかディープラーニングとか人工知能とか色々用語があるんですが,正直入門1年未満で言葉の定義も怪しい者が主催するのでハードルの低い感じの看板にしたかった。(それと金の匂いをさせないように心掛けてます)

 

で,不思議なことに60名近い登録者(ドタキャン数名居られたみたいですが)で,直前になって但馬先生が「どうせ半分くらいですよね」と確認に来られる程度。

私も年末からチェックしてなかったので2,30人がいいところだろうと思ってたので驚きました。「まぁ,東京は半分しか来ないですが岡山は8割以上来ますよ」との予想は合ってエントリー数くらいは居るに見えました。

 

どんだけすごいって?

sakura.doorkeeper.jp

さくらインターネットの大阪本社で行われた機械学習ナイトより多いんですよ(笑)

(これに行ったのに自分のイベントを宣伝忘れる始末でしたが)

 

で,岡山のイベントでは二人で4時間弱話ました。(休憩特に多めで) 

歴史の話や技術デモなど二人で準備した割には幅広いネタになったのではないかと思っています。コンピュータ将棋の話もしたのですが,背景が無い人ではついて来れないだろうなぁと流し気味になりました。職を奪うAIの話では以下のようなことを話題に出しました。

 その昔,炊飯は専門職だった。マイコン炊飯器(おそらく当時4ビットマイコン)が家庭の主婦の仕事も奪い,飲食店から炊飯専門職を奪い多くの仕事が奪われたであろうこと。マイコン炊飯器の人工知能とは温度(の時間履歴)管理程度であるが,それですら多くの仕事を奪ってきている。監視カメラが警備員の仕事を奪ってる。自動改札が駅員の切符切りの仕事を奪ってる。

 それから炊飯器は多種の炊飯メニューに対応し,監視カメラは動態検知に対応し,自動改札がICカードに対応し,どんどん職が奪われております。人類の危機ですねぇ。

 

 ということで,次回は少々枠を減らしてもくもく会を開催します。

是非ご参加下さい。

ai-okayama.connpass.com

 

 

 

 

 

 

GAの例題

 色々自主的に機械学習を遊んでると模範解答が溢れている入門課題から実践課題への間くらいの丁度いい例題が必要だとわかる。必要なステップ数は個人差があるがゼロというわけにはいかないだろう。

 ところで、先月こういう話があった。

 

 

 ということで、例題

・相手の駒20枚を自由に並び替えて、局面評価値が最も高くなるものを求めよ。

という辺りで自主課題を設定してみた。

 

itertools.permutationsをやったらフリーズした。

そうよね。 20! / 9! /2 /2 /2 /2 位の数になるもんね。

ってことで、これはGAの課題だろうってことでGAで取り組みました。

試行錯誤の結果、組み換えはorder-based two-point crossover(日本語で何て言うか知らん)、突然変異体はチャンピオンデータのランダム二点入れ替え(正式に何て名前なんだろう?)が比較的うまく動いた。

選択は乱暴だがsubprocessで動かしたやねうら王(Apery SDT5評価関数)のノード数100万制限での評価値でソートした。

ノード数制限にした理由は計算時間が予測しやすいから程度の理由で、実は同じ局面でも値が変動するのでよくない部分もある。

 

 で、ryzenで数十分程度GAさせて作ったのが以下の局面。初手16歩で玉頭致命的である。

興味ある人コピペ用→sfen psgnnplbp/1g5l1/rppppsppk/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1

f:id:the48:20180202203616p:plain

  この局面で一応私が手動で作ったものより優秀な数値は出た。しかしながら、上記の回答に対してネット上でもっと良い数値を出している方もいるので、まだまだかなぁという感じ。今のところこの程度のGA力です。

 

 

 

i9ってやつ

導入してたけど更新してなかったので正月休みにうp。

 

i3, i5, i7は買ったことあるけど

i9はお初。せっかくなので金色のやつにしてみた。

案外小さい箱。

f:id:the48:20180103135411p:plain

ソケットはちょいと大きいし,ピンの数も多め。

押さえの金具もちょっと豪華。

それでもちょっとだけ,そんなに特別感はない。

f:id:the48:20180103135448p:plain

押さえ金具が上下にある。

f:id:the48:20180103135505p:plain

業者さんに適当に見繕ってもらったヒートシンクは過去最大サイズ。

200Wくらいまでいけるらしい。

f:id:the48:20180103135529p:plain

まぁ,難なく動いたので記念画像はこれだろうな。

とくに苦も無く3.7GHzくらいで動くので割といいんじゃないかなぁ。

待つ

待つのも待たせるのも苦手である。

待ち合わせは書店やコンビニ等の待ち時間が潰せるところにしている。

 

www.shogi.or.jp

人間の手番待ちの姿勢は重要だなぁと学びがある。

 

つい先日,近頃の学生って自分が質問に来たのに,こちらが資料探している間スマホのゲームをするんですよって偉い先生が言ってた。特に罪悪感や悪意はないらしい。

もしかしたら私より忍耐力がないのかもしれない。私は飲食店での待ち時間が嫌いだ。

 

携帯電話がなかった頃,待ち合わせの時間ロスは膨大だったと思う。帯ドラマのエンディングが留守電やポケベルの音が定番だった時代もあったよね。思えば何して待ってたんだろう。

 

文庫本を読んで時間が潰せるようになったのは海外出張が増えてからだし,仕事を選り好みして少々資金が減った今は将棋の棋譜で時間が潰せるようになった。順位戦レベルの棋譜だと一局2,3時間はいける。

 

そう言えば非同期の仕組みが普及してサーバの利用効率も劇的に伸びているらしい。数十万人ユーザのサービスを数台で捌くとかそういう話も聞く。awaitである。

python code for yaselmo

少しくらいpython書くの上達した証拠を見せてみよう。(承認欲求)

elmoと野生の読み太(7月3日版)から通称yaselmoを作成するスクリプトである。

短くすっきり書けるようになったでしょ。

where句はC++との整数演算の差を埋めてみる試みで,これでも配布物とちょっとズレてるみたい。

どうしたんだろう?

 

import numpy as np
import os

def kpp_load(evaldir):
kk = np.fromfile(os.path.join(evaldir, 'KK_synthesized.bin'), dtype='int32').reshape(81, 81, 2)
kkp = np.fromfile(os.path.join(evaldir, 'KKP_synthesized.bin'), dtype='int32').reshape(81, 81, 1548, 2)
kpp = np.fromfile(os.path.join(evaldir, 'KPP_synthesized.bin'), dtype='int16').reshape(81, 1548, 1548, 2)
return kk, kkp, kpp

def kpp_save(evaldir, kk, kkp, kpp):
kk.tofile(os.path.join(evaldir, 'KK_synthesized.bin'))
kkp.tofile(os.path.join(evaldir, 'KKP_synthesized.bin'))
kpp.tofile(os.path.join(evaldir, 'KPP_synthesized.bin'))
return

kk1, kkp1, kpp1 = kpp_load('elmo')
kk2, kkp2, kpp2 = kpp_load('yy0703')

kk3 = np.where(kk1 + kk2 > 0, (kk1 + kk2)//2, (kk1 + kk2 + 1)//2)
kkp3 = np.where(kkp1 + kkp2 > 0, (kkp1 + kkp2)//2, (kkp1 + kkp2 + 1)//2)
kpp3 = np.where(kpp1 + kpp2 > 0, (kpp1 + kpp2)//2, (kpp1 + kpp2 + 1)//2)

kpp_save('yaselmo', kk3, kkp3, kpp3)

ショットガンフォーメーション

shotgunの命名についてPR文を読まれてないんだなぁと思う。

まぁ,ビールでも飲みながら書いた気もするのでホント適当なのは事実だが

あれはアメリカンフットボールのショットガンフォーメーションが由来なのです。

興味ある人は大変面白い競技なので動画でも探して見てください。少しでも分かる人に解説してもらうとなお楽しいものになると思います。

で,ショットガンフォーメーションってのが要となるQBのポジションから,複数の先行したWRのひとりにパスを送ることで成立します。優秀なQBが居れば戦力の総和が負けていても拮抗した試合ができることとパスが通りさえすれば圧倒的な勝利が得られることから本件の命名に至るわけです。

で,QBは当初ディープラーニングでしたが後に技巧に代わり,WRはやねうら王とそういうことです。

(140文字を超えたのでtwitterから転記)

第5回電王トーナメント感想戦

第5回電王トーナメント
感想戦

 

初戦,Novice
相手の不具合なのでパス

二戦,メカ女子
メカ女子なのでパス

三戦,なのは
後手番だがこちらは52手まで定跡テーブル
抜けた段階で若干有利な局面と評価されている
特別大きな悪手は見られないが長手数をじりじりと差をつけての勝利
評価関数カーブを見るにわずかだがこちらの方が探索深さが勝ったのかもしれない

四戦,Ponanza
27手まで定跡の矢倉戦
80手付近まで評価関数均衡,持ち時間優位の作戦通りだが
盤面は相手の馬が玉の近くにあり,人間視点で怖い。
コンピュータ将棋的には馬を消しに行った手が敗着に近いのかもしれないが
探索の浅さが目立って評価値急落
実力差ということかな

五戦,やねうら王
51手まで定跡の横歩取り青野流
ツボにドはまりしたのに171手までの長期戦
定跡にはまらなければ負けてるだろう

六戦,Yorkie
こちら後手の青野流
余裕があれば避ける定跡を作ろうと思っていたところ
定跡抜けたところで分が悪い上に
どうやら探索速度も完敗の様子
開発者コメントを話している間に切れ負けていた
この辺は新参っぽい感じでやね師匠に遅延大き目にしとかんと危ないよとのアドバイスを頂く

七戦,わっふる
ここは振り飛車なのは分かってた
後手番8手で定跡を抜ける
うちの定跡はfloodgate依存の部分が多分あるので振り飛車対策は弱い
異例だが評価関数の中で対振り飛車勝率の高いものをここだけ投入
序盤策で築いた若干の時間的優位も中盤のねじり合いで失う
251手の長手数で負け。途中引き分けを祈った。

八戦,TMOQ
先手63手まで青野流横歩定跡
相手も定跡に乗っていたようであっという間の中盤戦
そのまま一気に押し切る


五勝三敗で予選通過
ギリギリ決勝に残したが強豪感負けてるし,注目株ではないつもり


決勝R1,Selene
振り駒で先手をとったが手順前後で横歩に行かず矢倉模様
定跡を9手で抜ける
60手近くまで大きな差がない評価だが消費時間に30分差をつける
相手の時間が無くなるのに対し徐々に押していく
139手にて勝利,結局の消費時間が14分24秒

決勝R2,Yorkie
振り駒で先手を取り55手まで横歩青野流定跡。
ほぼ勝ちを確信するレベルなんだが,ここからねじり合い。
一時は+400の評価値も均衡に
敢えて言うなら93手目88歩を27龍とすべきだったか。

ここの解説は西尾先生がコメントしてた。

 

準決勝,読み太
まふ定跡との対決ですねと事前に挨拶してたのだが
何かを感じたのか定跡を外して対戦されたようだ
自分で精査してないので大一番を任せられないとのこと
確かにうちとの戦いで定跡だけで差がつく勝負になるのを嫌がるのは分かる
対戦棋譜は見ていてためになるレベル
ゆるゆると差をつけて勝てた

 

決勝,ぽんぽこ
なぜか決勝まで来てしまったのでしかたない
3戦並行で後手2つなので終わってる感がある

先手横歩とった棋譜だけ精査する
やはり定跡抜けの61手目の52角成が強引すぎたようだ
16角ならそれほど過激でない
それと75手目の53成桂のところを68金打とするのでもまだよかったはず

これを解説の西尾先生は一目でコメントしてたので
プロの感覚って恐ろしいなぁと感じた