コンピュータ将棋にみる人間とコンピュータの今と未来
お久しぶりです。
最近、TwitterをみていたらPonanzaの山本さんの呟きに色々考えさせられました。
そのTweetがこちら
人工知能に仕事が奪われるといいながら、『仕事したいのですか?』と聞くと皆一様に押し黙る謎み。
— 山本一成@Ponanza (@issei_y) 2018年2月22日
AI(という呼び方は嫌いなのですが)によって失業者が増えるという話は最近色々なところで聞きますね。
でもこれ、今に始まったことなのでしょうか。
コンピュータ将棋の界隈ではよく、人間が走っても車に勝てない(から棋士がコンピュータに負けるのは仕方ない)という話がされます。
現代っ子な私たちは車に負けるのは当たり前と受け入れていますが、
車が開発された当時は現代と同様に受け入れられていたのでしょうか?
人の職業が機械にとって変わられるというのは今に始まったことではありません。
歴史を見ると近代化によって失職する、あるいは雇用条件が悪化するということは200年以上前から起きています。
現代にとって当たり前に受け入れている便利なものは、それが出てきた当時の人にとっては失業を引き起こす原因であったわけです。
しかし、これらは受け入れられ現代に至っているわけです。
なぜか?
私は価値の変化によるものではないかなと思っています。
将棋界では昨年、Ponanzaが佐藤天彦名人に勝つことでコンピュータ将棋が人間を越えました。(実際はもっと前からではとかは今は触れません)
ではそれによりプロ棋士という職業はなくなった、あるいは価値が下がったでしょうか。
羽生さんや、藤井聡太六段の活躍によってより一層、人気が出ているのではないでしょうか。
これが価値の変化だと私は考えています。
今までは将棋が強いということに棋士の価値があったものが、より強いコンピュータ将棋の登場によって棋士本人の人間性やキャラクター、
指す将棋の芸術性に価値が置かれるようになったと考えています。
つまり、コンピュータが人間を越えた時点でそのことにおける人間の価値は減ると考えます。
一方で、コンピュータに出来ることが増えるということは、人間にしかできないことにはこれまで以上に価値が出るのではないかなと思っています。
今後はもっと演劇とか音楽とか文化的なことに需要が増えて、それにお金を払う人も増えて、それを職業にする人も増えていったらいいなぁと思います。
ではこの辺で。
バズワードから考えるAIってなんやねん
SFC-RG Advent Calendar 12/20分の記事です(1日遅れ)
www.adventar.org
最近、AIって言葉流行ってますよね。
人工知能搭載の髭剃りなんてものもあるようです。
AIってなんなんでしょう?
近年、Ponanzaを代表とする将棋プログラムは人間との勝負で対等以上の結果を出しています。
これらのプログラムは将棋AIと呼ばれるようになりました。
これを事例を考えるとAIとは「思考を行っているように見える機械」と定義できるのでしょうか。
しかし、おそらく「将棋AI」と呼ぶ人たちにファミコンの将棋ソフトを渡してこれはAIですと言っても違うと言われるような気がします。
最近の流行りの言葉には「機械学習」があります。
ここで、AIの定義を「機械学習を行っている機械」にしてみます。
では、機械学習とはなんなんでしょう。
本当に簡単なものでは、スマホなどの予測変換なども機械学習の一つであると言えるでしょう。
では、スマホのキーボードは「AI」と言えるのでしょうか。
これもまた違うと言われそうです。
さて、ここでまた流行りの言葉を一つ。「ディープラーニング」です。
これを用いて「ディープラーニングを行っている機械」を「AI」としてみます。
ここまで狭めれば確かに「AI」になるのかもしれません。
ですが、この定義では大半のAIと呼ばれる将棋プログラムはここから漏れます。
そもそも、2016年現在でも「ディープラーニング」で成果を上げてる例なんて身近なことにはほとんどないと思います。
さて、結論としては身の回りに溢れかえってる「AI」は結局何かよくわかりません。
AI搭載の髭剃りって本当になんなんでしょうか。
僕の手には余る内容でしたね。
世の中のすごい人たちがきっとディープラーニングで機械学習して人工知能作ってくれるんでしょう。
ではこの辺で。
コンピュータ将棋実装の話
「コンピュータ将棋 Advent Calendar 2016」の二番手の熊谷です。よろしくお願いします!
「コンピュータ将棋 Advent Calendar 2016へのリンクはこちら。
http://www.adventar.org/calendars/1457
何を書こうか未だに悩んでいるのですが、昨日カツ丼将棋さんからリクエストされたNoviceが動くまでの話とコンピュータ将棋の実装周りの話を少し書こうかなと思います。
・Noviceが動くまで
僕はコンピュータ将棋のためだけにプログラミングを始めたのですが、それが去年の3月のこと。
最初は1手先だけ読んで動かせるプログラムを作ろうと思ったのですが、それすらもままならず。
ネットで最初に読むべきソースコードはれさぴょんという話を見て、れさぴょんを読もうとするも全く理解できずに挫折。
まあ今考えればプログラミングを始めたばかりの素人がれさぴょんのソースコードを読めるはずもないわけですがw
結局、全て我流で2ヶ月作ったらなんとか動くものが出来ました。
このときの実装は本当にひどいもので、当時の僕は関数の再帰呼び出しができることを知らず読む深さ分だけ関数を増やすという実装でしたw
まあでも、初めて動いたときの喜びは未だに忘れられないものになっています。
この喜びがNoviceを作り続けることへのきっかけになったと思います。
・コンピュータ将棋実装周りの話
コンピュータ将棋の実装って大変じゃないかと色んなひとに聞かれるのですが、
動かすまでならそんなに難しくないというのが僕の考えです。
段階を踏んで少しずつ実装を行っていけばいいんじゃないかなと思います。
ここでは、その段階の話を書きます。
STEP1 将棋盤で初期局面を表示する
ボードゲームは配列を使って表現するのに非常に分かりやすいものです。
例えば将棋なら9✕9の計81マスの盤を Board[9][9] などで表現すればいいわけです。
マスにある駒の表現は数字を使います。
空きマスなら0、先手の歩なら1、後手の歩なら16みたいなかんじです。
初期局面を表示するならBoard[0][0] = 17(後手の香) みたいに一つずつ配列に入れていき、
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
printf("[%d]",Board[i][j]);
}
printf("\n");
}
のように表示すれば良いわけです。
ただし、このままだと数字でしか表示されないです。
これを文字で表示するところは考えてみてください。
STEP2 手の入力を可能にする。
STEP1のままだと、初期局面を表示するだけになってしまいます。
これを、駒をうごかせる将棋盤にしてみます。
実装は簡単で、scanfでfromの段、筋、toの段、筋を入力してもらい
Board[to段][to筋] = Board[from段][from筋];
Board[from段][from筋] = 0;
として、局面を再度表示すれば将棋盤が出来ます。
ただし、これだけでは成りの処理などが出来ないので別途その処理も追加する必要があります。
ここではヒントだけ示しておきます。
先手の歩の番号は1、先手のとの番号は9であることを考えてみてください。
STEP3 内部の思考エンジンをつくる
いよいよ思考エンジンを作る所ですが、ここについての記事を以前書いたのでそれを共有し説明とさせて頂きます(ごめんなさい)
STEP4 様々なサイトを参考に作りこんでいく
いくつかお世話になったサイトを紹介させて頂きます。
うさぴょん作者の池さんのサイトです。
非常にシンプルな実装になっている解説です。(一番のおすすめです)
将棋プログラムの作り方
れさぴょんの解説が載っています。
コンピュータ将棋のアルゴリズム
YSSの山下さんのサイトです。
YSS 7.0ÌZpðà
クマ将棋さんのサイトです。主にソースコードが参考になります。
http://suzumer.web.fc2.com/simk.htm
STEP5 大会に出る
世界コンピュータ将棋選手権
コンピュータ将棋協会
電王トーナメント
denou.jp
以前、強くならないと大会に出ても.....みたいなお話をされている方にお会いしましたが、
コンピュータ将棋界にはネタ勢という概念があります。弱いからこそ面白い将棋を指すソフトたちです。
実は現在最強の呼び声高いPonanzaも元々はBonanzaを文字ったネタ勢だったのです。
なので、ソフトが少しでも動くなら積極的に大会に出るといいと思います。
コンピュータ将棋界の人たちは非常に良い人、面白い人が多いです。絶対、良い経験になると思います。
STEP6 時には休む
休憩しましょう。
いかがだったでしょうか?
この記事がコンピュータ将棋を始められる方々のきっかけになれば幸いです。
では、wcsc27でお会いいたしましょう。
第4回電王トーナメント ソフト紹介
第4回電王トーナメントの開催まで1ヶ月切りましたね......
denou.jp
今回もNoviceは参加します。(全然強くなってないですが....)
きふわらべさんがトーナメントの順位予想していたので僕もやってみます。
ついでに各ソフトに一言ずつ書こうかなと思います。
順位予想は A B1 B2 C1 C2 に分けつついきますね。
電王
・Ponanza
対プロ棋士戦無敗の電王のタイトルを持つプログラム
今年も優勝をするのだろうか。
開発者は山本一成さんと下山晃さん。
※既婚者・彼女持ちを「山本組」と呼ぶ。
A級
・技巧
第26回世界コンピュータ将棋選手権(以下Wcsc26)では唯一Ponanzaに黒星を付けたプログラム。
ソースコード・バイナリも公開されている。
開発者の出村洋介さんは法律関係の仕事が忙しいようで参加が危ぶまれていたが、
参加のようでお会いできることをとても楽しみにしている。
・浮かむ瀬(Apery)
Wcsc24で優勝経験ありで、Wcscや電王トーナメントでも何度も入賞しているプログラム。
電王戦FINAL後、ソースコードを公開。ライブラリとしても使用可能で、多くの強豪ソフトのベースとされている。
開発者は平岡拓也さんと大阪市立大学の杉田歩先生、白岩大地さん、加藤 秀介さん。
平岡さんの顔文字は(´・_・`)で有名(?)
※Aperyをベースとした派生ソフトを「Aperyチルドレン」と呼ぶ。
※未婚者・彼女無しの人を「山本組」に対し「平岡組」と呼ぶ。
・真やねうら王
「伝説のプログラマー」の名を持つ「天才」磯崎元洋さん(通称やねさん)が開発したプログラム。
「1年に2週間しかやる気が出ない」状態で過去の電王トーナメントでは複数回入賞し、プロ棋士を撃破している。
今年はオープンソースプロジェクトとして数カ月開発を行っていたので大きく期待できるだろう。
「やねさんならやってくれるやろ」という期待の持ち方が主流(?)
評価関数からソースコードまで余すところなくライブラリとして公開されているので、やねうらおうをベースとする強豪ソフトも多い。
※やねうらおうをベースとした派生ソフトを「やねうらおうチルドレン」と呼ぶ。
・大将軍
KPPPの四駒関係を使用していたことで有名な強豪プログラム。
電王トーナメントではメモリの上限により四駒関係は使われていない(はず)
今回は、プログラムのベースに「やねうらおう」を用いるとのこと。
開発者は横内健一さん。会場では横内さんのお父上もよくお見かけします。
・読み太
Wcsc26でノートパソコン1台で決勝リーグへ進出した強豪プログラム。
Wcsc26ではやねうらおうの評価関数を使用していたが、今回からは自力で学習から行っている。
Wcsc26ではハードウェアの差がやはり大きな差へと繋がっていたことは間違いないだろうから、今回ハード統一状態でどこまで上に行けるか注目されているプログラム。
開発者の塚本隆三さんは元奨励会員で定跡などは一部を自身で確認して取捨している模様。
※読み太の定跡戦略を「読み太沼」と呼ぶ。
B1
・うさぴょん2
”れさぴょん””コンピュータ将棋の作り方”などでコンピュータ将棋の新規参入への手助けを長年されてきた池泰弘さんが開発したオープンソースのプログラム。
うさぴょん2からはnanoha miniをベースにStockFish7やAperyの技術を取り入れ開発が行われている。
Wcsc26では決勝リーグに進出。
れさぴょんを使って開発、大会参加を行っていた経歴のある人々を「うさぴょん一門」と呼ぶとか呼ばないとか。
・†白美神†(tanuki-)
第三回電王トーナメントで初参加にも関わらず決勝進出を果たしたプログラム。
開発者は野田久順さん、岡部淳さん、鈴木崇啓さん、日高雅俊さん。開発者代表の野田さんは競技プログラム出身の方で、第三回電王トーナメントではベースとしたAperyを高速化し元の1.5倍もの探索速度に仕上げた。
今回の大会ではベースをやねうらおうにしたようなのでどのように仕上がっているのか楽しみである。
・nozomi
第三回電王トーナメントで決勝まで進みPonanzaと熱戦を繰り広げたプログラム。
Wcscではソルコフに泣かされる結果になってしまったが、今回のトーナメントでは上位に入るだろうと予想される。
去年の電王トーナメントで開発者の大森悠平さんには技術等色々教えて頂きました。
・Qhapaq
Wcsc26で初参加にして二次予選に進出したプログラム。
Aperyをベースに評価関数の学習法に物理学を取り入れ棋力向上を図っている。
Wcsc26では256手ちょうどで詰まされるという劇的な対局を披露した。
今回は、やねさんからPCを購入し調整を行っている模様。
開発者はSawada Ryotoさん。和服が印象的で陽気な方です。
//書き疲れたのでとりあえずここまで
第26回 世界コンピュータ将棋選手権 参戦記 ~大会前日~

第26回 世界コンピュータ選手権大会 バイナリ公開
CODE VS 5.0 Ubuntuで参加
いろいろ見ていたらCODE VS 5.0 が面白そうだと思い、
エンジョイ勢で参加しようと思い立ってからの環境つくりのメモ。
参加するのに必要なのはコンパイラ環境と.jnlpが動かせる環境。
Ubuntu(14.04LTS)で動くかなーと思い色々調べていると、なんとなく動くっぽい。
とりあえずJava7突っ込んで起動.....と思ったら、起動しないorz
どうやらJava8が必要らしい....
こちらのサイトを参考にJava8を入れる。
そんで、codevs5.jnlpが有るフォルダで
javaws codevs5.jnlp
と打ち込むと起動するはず.....
この画面が表示されれば起動成功です。
とりあえずサンプルコードを動かしてみたい場合は、
サンプルコードをコンパイル(gccだと通りません g++だと通ります)して、コマンドの所に起動用のコマンドを書いておけば実行出来ます。
動いてますね......(Core2Duo 2.8GHz)だともっさりしてますけど...汗