Ponanzaにおける強化学習とA/Bテスト運用

山本一成氏(以下、山本):山本一成と申します。よろしくお願いします。

ありがとうございます。ここからはややガチめなエンジニアの話です。まず確認したいんですが、エンジニアとかプログラマーって人はどれくらいいるんですかね?

(会場挙手)

あ、けっこういるのか! 安心した(笑)。

私、10年くらい将棋のプログラムを作ってきて、最初はまったくのど素人から始めたんですけど、いろいろやっていく中で、現代にも通じるようなさまざまな運用とかが出てきたんですね。そのへんをみなさんと共有できればと思っています。

まず最初のスライド、さっそく手書きでやる気がない感じですが(笑)。将棋のプログラムってどんなもの? という話です。将棋も囲碁も、大雑把にいうと、2つの要素があります。1つは探索です。つまり、先を読むということですね。

先を読むと強いです。みなさんもそんな気がするでしょ。具体的にはdepth-first search、深さ優先探索でやってます。

もう1個は、評価関数というものです。読んでも、読んだ結果が良かったのか悪かったのかわからないと意味ないじゃないですか。だから、良かったのか悪かったのか結果を予想するものがあります。勝率みたいなものを返してもらうんですね。

どういうふうにやっているかというと、技術的にはLogistic Regressionとか、あとでちょっと出てきますがディープラーニングとかを使ってます。昔はこれらの評価関数は全て人手で書いていました。本当、辛い作業なんです。何やってるかわかんないけどこういうことやったらうまくいったとか。

例えば王様の横に金という守備の駒があるんですが「この金があったらプラス50点するといいかな」みたいな、謎の直感によってプログラムを書いてた。でも、正直なかなかそこまで強くならないです。

評価関数をずっと強くしたいという要求がありました。といっても、評価関数の機械学習を始めたのは、ちょうど10年くらい前にBonanzaっていうすごく強い(将棋の)プログラムがありまして、そのプログラムを始めたんですね。

Ponanzaの仕組み

私のプログラムの名前はPonanzaといって、Pから始まるんですけど。なんでかというと、最初に作ったプログラムがあまりに弱くて、Bonanzaめっちゃ強いからPonanzaくらいでいっか! みたいな軽い気持ちで付けてしまったんです。後悔してます(笑)。

(会場笑)

結局、最初は将棋のプロの人たちから学習していきました。将棋のプロの人たちがこういう手を指した。Aという手を指したんだから、きっとそれにはAを指した局面がいいんだろうという、けっこう大胆な仮定なんですけど、そういう仮定に基づいて、評価関数をずっと学習してきました。専門的には、これは教師あり学習といいますが。これがずっと続いたんですね。

でも、私、思ったんです。いくら将棋のプロや囲碁のプロが強いっていっても、将棋とか囲碁ってめちゃめちゃ難しいんですよ。人間の脳でわかるのか? ということはずっと思ってました。

わからないということが、気持ちとしては私の前提だったんです。プロ棋士はすごい。とはいえ人間だから、必ずそれを超えるような存在はあるはずだと思ってます。それがコンピュータで実現できるかは置いておいて、人間をはるかに上回るパフォーマンスのものは存在するだろうと思ったんですね。

そこで、ちょっと話が戻るんですが、強化学習をしようとずっと思っていました。強化学習とはどんなものかというと、いろんな流派があるんですけど、将棋に関していえば、まだ人類が見たことがないような局面を調べて、そのフィードバックからどんどん賢くなろうみたいな戦略です。

(スライドを指して)ここで、私が書いたすごい図があります。強化学習がすぐわかるという完璧な図です。

(会場笑)

そんな写メ撮っても(笑)。これはすごい神の図ですけど、概念はめちゃめちゃ簡単です。ある局面がありました。Ponanzaの場合、いろいろあったんですけど、8,000億局面くらい用意しました。けっこう多めです。

それで、Ponanza同士で対戦するわけです。そうすると(結果が)思いのほか良かったり、思いのほか悪かったりするじゃないですか。ということで結果が、下に数式を書いたんですけど、ちょっとずつ未来を減衰させながら、正しい未来のフィードバックを得ていきました。これちょっと違うな。まあいいや(笑)。けっこう適当な図なんですけど(笑)。

(会場笑)

とにかく、Ponanzaが指して思いのほか良かった、あるいは思いのほか悪かった局面をいっぱい集めてきて、それをどんどん修正していくという作業を延々やってました。そうしたら何が起こったかというと、めちゃめちゃ強くなった。

まず結果だけいうと、人間を上回るパフォーマンスを出し始めて、驚くべきことに、先ほどあったAlphaGoでもそうでしたが、まだ人間が見たことないような指し回しや打ち回しがたくさん現れてきたんですね。

少なくとも将棋に関しては確実に言えるんですが、まだ人間が見たことがないような戦法がこんなに湯水のように生まれるのか、という現実がありました。(大橋拓文氏に向かって)たぶん、囲碁のほうでもそうだったよね? 

強化学習の真髄は「電気」

ただ、これには欠点があります。先ほど、エネルギーを食うと言ったじゃないですか。どんな感じかというと、お家の電気代が4万円を超えたんです。さっき大橋君もアンペアの話をしてましたが、うちもよく、嫁がドライヤーをかけるとブレーカーが落ちる。けっこう辛い感じになってきまして(笑)。

当時はXeonが何個かお家にあって、AWSはぜんぜん使ってなかったんですね。本当に電気が辛い! そして家が暑い! まったく楽しくない状況になりました。

さらに、強化学習は4万円を超えたからといって満足しないんです。ちょっと難しい話ですが、先ほど言ったように深く読めば読むほど正確な結果になる前提で動くと、たくさん電気をかければかけるほど正しい結果になるという感じになって、指数関数的に電気が必要になる。

強化学習の真髄は電気という事実がありました。今日これだけはみなさんに覚えてもらいたい。

(会場笑)

もうめちゃめちゃ辛くて。当時マジで貧乏で。嫁が「何してんの、こいつ!?」みたいな顔で見るわけです。俺も、何してるんだろうと思いながらやってた。めちゃめちゃ生活を壊しながらやってました。

あまりに苦しかったので、内緒の話なんですけど(小声で)さくらインターネットさんという会社があるんですね。AWSさんの競合他社なんですけど。

(会場笑)

さくらインターネットさんに「お家が暑いし、電気代が無理!」って泣きつきまして、マシンをお借りしました。さくらインターネットの田中さんという方が、意外と気さくな方で「あ、いいよ~」みたいな感じで、突然めちゃめちゃたくさんマシンが入りました。

たくさんあるマシンで効率的に強化学習をしようっていう要求があったんですね。ちなみに、強化学習やってる人いますか?

(会場挙手)

あ、2、3人いますね。少なめですね(笑)。

強化学習で辛かった話

強化学習の辛い話をしていきます。だいたい複数のマシンで強化学習をすると、こんな辛さが出てきます。たくさんのマシン、だいたいCPU200~300個くらいで、ずっと自己対戦をしているんですね。データを集めてきて、その結果から新しい評価関数を作ろうということをずっとやっていました。

(ちなみに)このマシンは、全部TCP/IPでネットワークを介してつながってますが、いろいろなパターンを試したいという目的があります。当時は、例えばChainerとかいうものはなかった。そういう、複数マシンの分散されたもので最適化するものもなかったですし。

ちょっと専門的な話ですが、将棋の学習は、いわゆる簡単な線形学習機がそのまま使えるような条件ではない、マニアックな学習だったんですね。

いろいろなパターンを試したいと思って、最初はデータをファイルやフォルダで管理してたんですが、そのうちデータベースで管理したほうが絶対いいなと思うようになったんです。そこで、データベースで管理するにはどうすればいいかなと考えた。

もう1個、機械学習をしていくときの前提として、シャッフルした結果をどんどんアップデートする側に流してほしいんですね。

これは要求なんですけど、今ある試合だけを覚えてしまうと、偏った存在になっちゃうんです。今この瞬間も、いろんな試合からちょっとずつデータを回収する必要があるわけです。

そうやってデータをシャッフルしたり、あるいは、このときの学習データは何だったかという値付けをちゃんとやりたかった。一般に、そういうものの高速化は難しいんです。

よく、ちょっとマニアックですがLevelDBとかいうやつを使う人が多いんですけど。運用が面倒だったためこれも諦めて(さくらインターネットさんに)泣きついたんです。Redisってあるじゃないですか。めちゃめちゃ速いけど、マシンの要求性能がめちゃめちゃ辛いやつです。

結局、さくらインターネットさんに1テラバイトのメモリのマシンを借りました。これ、めっちゃ笑うとこです(笑)。AWSでも1テラは、ギリギリあるって感じくらいですか? もうありますか。失礼しました(笑)。

5年前は、1テラってけっこうすごかったですよね? けっこう高かったはずなんです。金額を考えると怖いですけど。いくらくらいですかね? 1,000万いってる? 2,000?(笑)。

つまり強化学習の真髄の、さらに本質に近づいたんです。可能な限りお金で解決しようということですね。私の予想だと、Ponanzaは、最終的にたぶん年間2〜3,000万くらいかかってると思うんです。これ、すごい額かと思いきや、実はエンジニア数人分。マシンで解決できるならマシンで解決したほうがいいということがあります。

マシンの獲得をためらうな

プログラマーの人たちってついプログラミングで解決しようとするけど、必ずしもそうでないのが大事だと思ってます、逆にプログラマーじゃない人がちょっとプログラミングを覚えると、かなりいろんなことがブーストされると思うんですけど、プログラマーはお金を持っている人に、媚びる(笑)。

(会場笑)

お金を持っている人に媚びて、強いAWSマシンでもいいですし、スポットインスタンスで安くするとか結局オンデマンドのほうが楽だよねとか言いつつでもいいんですけど、とにかくお金を持っている人からいかにお金を取るかがけっこう大事だと思います。これは強化学習の真髄でしたね(笑)。

これは本当に大事です。2,000万、3,000万と聞くとすごそうだけど、たかだかエンジニア数人分、100万円って、例えば人月でいうと数ヶ月分なんですよね。人によってはひょっとしたら1ヶ月切るかもしれない。そういうことを考えると、プログラマーはマシンの獲得をためらわないほうがいいということが、1個シェアしたかった話です。

6時間に1つアイデアを考える

もう1個は、A/Bテストです。A/Bテストっていろんな文脈で使われますけど、例えばWeb系の人なら、いろんな施策を試してみて、Aがいいのか、あるいはBのほうがいいのかってやる。お客さんの反応から「今回はBがいいな」「今回はAがいいな」って試行するんですね。

Ponanzaも実は、ずっとA/Bテストをやってます。なんでやるかというと、当たり前ですけど、私が見ても強くなったかどうかわからないんですよ。「うん、強くなった」……嘘ですよね(笑)。わかるわけがないので、(スライドを指して)こういうふうにしました。

統計的な話なんですけど、簡単です。5,000試合して勝率が52パーセントちょっとなら、確率99パーセントで強いということになるわけです。これ、難しいことですけど、要は5,000試合毎回チェックしてたんですね。これも非常に電気がかかる。

(スライドを指して)また私のスーパー図が出るんですけど、こんな感じです。あるbranchを作ります。これ、GitじゃなくてBitbucketかな? Gitにコミットして、次にテストが走ります。ここまではよくあるシステムインテグレーションだと思います。

そのあと、試合をします。Masterもビルドして、ぐるぐる回転して、5,000試合します。結果を自分たちで作ったWebViewで出すんですね。この結果が52パーセントちょこちょこで良かったなってなったら、このブランチをMasterにマージしようということをやってたんです。

5,000試合といっても、CPUはいつも強化学習してるわけじゃないので、2、300CPUあるとこのサイクルはなんと6時間で回ります。すばらしいですよね。

6時間に1個、新しい挑戦ができる。うわ~強くなると思いますよね。よく考えてほしいんですけど、6時間に1回新しいbranchを作らないといけないわけです。誰が作るの? 私が作らなきゃいけない。

これよく考えるとけっこうしんどくて、1日4本以上新しいアイデアを出して、branchを作らなきゃいけないわけです。当然ながら、10年くらいやってると、もうアイデアなんてないんですよね(笑)。アイデアがなかったらどうするかというと、歩く。Ponanzaの開発は最終的に、私はもはやそのへんを深夜徘徊してるしかなかった。

(会場笑)

徘徊して、「あ~なんかないかな?」みたいなことをずっと考えてたんですね。ひたすら徘徊、徘徊、そして徘徊みたいになってた。かなりヤバイ人でした。たぶん近所の人が見たら「こいつやべー」みたいに思われたはずです。

もう、なんかおかしいんですよね。当時のTwitter見返すと、俺変なこと言ってるんですよ(笑)。カフェイン飲みすぎてうまく寝られなかったり、ちょっとやばい時期もありました。辛かった!

辛い人工知能をしてない人たちは「人工知能がうまい感じでよしなにやってくれるんだろう」みたいな感じですけど。実際に、今はSageMakerとかありますし、ほどほどの結果を素早く高速で出すことは本当に楽になりました。

でも最高のギリギリの結果を出そうとすると、人と機械が一体となってがんばるしかない。徘徊するしかない、みたいな。これに対する結論は1個だけです。やっていくしかない(笑)。やっていこうな! 

機械学習を、あるいは人工知能をがんばってやるんなら、やっていくしかないという悲しい結論になりました。今日はこのへんもシェアできたらと思ってます。

結果を出しやすいのはCNN

ここも大事なことです。補題なんですけど。ディープラーニングと将棋というのがあります。CNNというものがあるんですよ。知ってる人、手を上げてくれたらうれしいです。

(会場挙手)

すごい。だいたい……半分切ってるかな(笑)。

CNNというのは……今会場にいるみなさんはディープラーニングを知ってることにしましょう。ディープラーニングというやつがすごいんです。ディープラーニングはなんでもやってくれるらしいです。ちょっとオーバーですけど。

ディープラーニングの中でもとりあえず安定的に、あるいは素人がやっても結果が出しやすいものは、CNNだと思ってます。CNNをどうしてるかというと、とくに画像を扱うものです。画像というのは、例えばFacebookとかだと、普通に写真を撮ったら「誰々さんが写ってますよ」みたいなことを言ってきてちょっと引きますよね。あんな感じです。

画像をどうやって処理するかは、RGBが多いかな。RED、GREEN、BLUEという色の3原則ですね。ここに分解して置きます。

囲碁の場合はちょっと違うんですね。AlphaGo、あるいはほかのプログラムも、私の認識では全部CNNのある種の派生なんですけど。色の代わりに黒と白を使っています。置かれるところが黒の映像で、白の置かれるところが1って書いてあるような映像です。このへんはいろいろ派生があるんですけど、大雑把にはこうです。

何段か、段数少ないけど何層もあって、手と評価を返します。手は、これも19×19の画像の人が多いんじゃないかな。ちょっと抽象的ですけど、19×19のどこかが光ってる画像とでもいうんですか。そうすると、確率が高い手を出してくれます。評価は、この局面の勝率がどれくらいかを出してくれます。

ルールは教えずに局面ごとの指し手を教える

AlphaGoの初登場がちょうど3年前でしたっけ。その将棋版があるといいんじゃないかなと思って、将棋もやろうと思いたったんですが、私、こういうふわっとした人間なので(笑)。思ったはいいけど「あれ、むずくない!?」ってなったんです。だって、黒と白とかじゃないし。困った。

でもこんな感じにすりゃいいかという案がありまして。駒の種類って、たかだか28種類なんですね。持ち駒とかも含めてだいたい70個くらいの色、専門的にはチャネルっていうんですが、それがあればとりあえず将棋の表現は可能なんです。

なにが言いたいかというと、CNNという枠組みがすごく強くて、囲碁の場合は比較的自然に、将棋の場合もちょっと頭をひねって強引にCNNの枠組みに落としたんですね。そうすると、9層くらいでしたね。将棋は端から端までで9なので、とりあえず9でいいかという感じで9になりました。手と評価があります。ここの局面はこういう手がいいとか、この局面の勝率はこれくらいだという評価があります。

ちなみに私、手もけっこうびっくりしたんです。囲碁って、今日は囲碁の専門家が多いですけど、大雑把にいうと囲碁って、穴ぼこに置いときゃ正解じゃないですか(笑)。本当は違うということは知ってますよ(笑)。まあでもだいたいそうです。穴ぼこに置いときゃとりあえずオッケーなんです。

ところが、将棋の手ってけっこう複雑なんですよね。どうしようかと思って。私がどうしたかというと、ルールを教えることは諦めて、とりあえずある局面だったらCPUで考えたほうが(いいと思って)、「1秒くらい考えたらこの手を指した」というデータを5億ペアくらい用意したんですけど、ルールは教えずに、この局面ではこの手、この局面ではこの手というかたちで教えたら、ぜんぜん知らない局面でも、この局面はこれがいい手だよ、しかもこの勝率はこれくらいってちゃんと出すようになったんですね。これ、かなり驚きの存在で、私は相当びっくりしました。

真似して強くなる

ただ、人間の子どもって、けっこうそういう子が多くないですか。囲碁とか将棋とか、こいつ言葉わかってんのかな? って感じだけど、なんかめっちゃうまい。しかも(大人が)負けるような子、いるでしょ。とくに囲碁では顕著だと思います。

そういう強い子は、必ずしも明文化されたルールを読んで強くなったんじゃなくて、人間の大人の親たちを真似して強くなったんですよね。そういうものと合致させることが科学的にいいかどうかはわからないですけど、私には、ディープラーニングもそういう側面があるんだなと思えました。

言い方を変えると、将棋の世界、囲碁の世界の、ある種の物理法則を発見したのかなと思ってます。なんでそう思うかというと、ほかのディープラーニングも、例えばある画像を撮って1秒後を予想しろというディープラーニングがあります。波打際を撮ったら、波打際の1秒後の画像を吐いてくれるというものです。

波の動きってけっこう複雑な物理法則が絡んでて、我々もまったくそういうものは理解してないけど、1秒後の波の画像はなんとなく想像できるじゃないですか。そういうものをどういうふうに捉えているかはわからないけど、ある種の世界の捉え方として理解してるんだなと思いました。

既存のPonanzaが、ちょうど名人と戦って終わったんですね。最後に新しく作ったディープラーニングをくっつけて、最強のPonanzaを作って引退しようと思ったんです。

あらゆるフラグを立てて、実際CPUもGPUもめちゃくちゃな制限にいきました。CPU1024コア、GPU128機という、さすがにAWSで借りてもなかなかのお値段がするような構成。

これで絶対に勝って伝説になろうとしたら、コンピュータ同士で対戦が半年に1回あるんですけど、負けちゃって(笑)。かなり恥ずかしい状況になった。そこ、写真いっぱい撮るんですね。

(会場笑)

まあ、しょうがないところもあります。実際の対戦って、1回とか2回しか対戦しないので、必ずしも強いものが勝つわけでもないですし。elmo、あるいはほかのコンピュータ将棋のプログラムは、Ponanzaに追いつけ追い越せでめちゃめちゃ強くなっていて、レベルがすごく上がってたんですね。そういう意味で、負けもしょうがないかなと思った。ここまではオッケーだったんです。

ところがその数ヶ月後、elmoがAlpha Zeroという、AlphaGoの将棋バージョンに完敗した。あー、こういうことか、と。

Alpha Zeroは、完全にディープラーニングドリブンというか。Ponanzaはまだ、既存のものとディープラーニングを組み合わせた感じだったんですけど、Alpha Zeroは完全にディープラーニングオンリーでやってます。

Deep Mind社がすごかった3つのこと

彼ら、Google関連会社のDeep Mind社は、3つすごかったなと思ってます。1つは、強化学習に関しての、膨大かつ世界で最高クラスの人。それと、膨大なお金。

Ponanzaはさっき年間2,000万、3,000万って言いました。彼らがいくら使ったのかはわからないんですけど、たぶん何百億とか、そういう値段なんじゃないでしょうかね。わからないですけど、少なくとも桁が何個か違うだろうなとは思ってます。もちろん来る人も最高の人たちばかりですね。世界からいっぱい来ます。

もう1個、すごいなと思ったことが、彼らはすごく……言い方があれですが、やる気がないプログラムだったんです。どういうことかというと、すごくプレーンな状態だったんですね。

とくに、Ponanzaって、めちゃめちゃいっぱい細かく書いてるんですよ。もちろん評価の部分では書いてないですけど、こういうときはこうしたほうがいいとか。すごく細かい細かい職人が、いっぱいいっぱい書いたものがあるんですね。

A/Bテストで月に一番がんばったときは200本くらい改良していて。その200本の改良って、もう論理的じゃないんですよね。そのなかで、うまくいったものを採用してるって感じで、自分も説明できないような感じだった。Alpha Zeroは、そういうものは全部すっ飛ばして、私たちはすごい計算量で押し切りました、みたいな顔をしてる。これがすごいところです。

そしてもう1個、彼らはすごく宣伝がうまいんです。AlphaGoのときもそうだったんですけど、Alpha Zeroのときもしれーっとやって来て、スーっと取っていった。3つすごかったなと思いました。

新しいものを絶えず肯定すること

めっちゃ悔しかったです。10年いろいろやってきて、がんばってきたんですね。とくに細かいところをがんばってきて「新しいCPU命令こんなのあるんだ。うふふ、こうしたら速くなるね」とか「ビット演算楽しい」みたいな。ちょっとキモい感じですね(笑)。そういう細かいことをやってたんですけど、(彼らは)ある種の職人的な技能がほぼいらなくなったというふうに言ってて、けっこう衝撃でした。

ただ、これってすごく大事なことなんです。プログラマーとして、常に新しい技術をキャッチアップしていく。例えば、ここにいるみなさんは多くの人がわかると思いますけど、AWSによってインフラエンジニアがどこに行ったか。

あるいは、DB職人っていましたよね。master-slave replicationみたいな人がいたはずです。わかる人はわかってくれていいんですけど。最近はマネージドDBというものが出てきたことで、そういう存在はどこに行ったんだみたいな。

結局、新しいものを絶えず肯定していく、新しい力を借りていくということがすごく大事だと思います。最近、AmazonのLambdaとか触って、これ本当に楽だなと思ってて。そういった新しい技術をどんどん追っていくのが、新しいプログラマーの在り方だと思います。

発表は以上です。ありがとうございました!

(会場拍手)