読者です 読者をやめる 読者になる 読者になる

7rpn’s blog: うわああああな日常

好きなことをつらつらと。

Googleが出した囲碁ソフト「AlphaGo」の論文を翻訳して解説してみる。

DeepLearning 機械学習 囲碁

就活も無事終わったので,一番やりたかったAlphaGoの論文を翻訳しました。
ご存知の通り,長らく世界最強だった囲碁棋士イ・セドル九段を破ったGoogle囲碁プログラムです。

論文の内容に触れつつ何となく解説入れていきたいと思います。なるべく囲碁やDeepLearningを知らない初心者の人とかでも仕組みを理解できるように分かりやすく書いていければいいなと思います。

原題は"Mastering the game of Go with deep neural networks and tree search"。

とりあえず最初の要約の訳から。
謎の単語とかは後から説明入れるので,さらっと流し読みしていただければ。

囲碁はこれまでAIにとってとても難しいゲームだとみなされてきた。それは探索範囲がとても広いことと,盤面の評価が難しいため。
この論文では,コンピュータを用いた囲碁の新しいアプローチを紹介する。 このアプローチは,盤面の評価のためのvalue networkと,手を選ぶためのpolicy networkを用いる。
これらDeep Neural Networkは,人間の打ち手を用いた教師付き学習と,自分どうしの対戦による強化学習をうまく組み合わせたもの。 このneural networkは,先読みの探索を行わずとも,最先端の他のモンテカルロ木探索を用いた囲碁ソフト(こいつらは自分自身と戦うことで何千もの先読みを行う)に匹敵した能力を持つ。
同様に,モンテカルロ木探索とvalueおよびpolicy netwrokを組み合わせた新しい探索方法を提案する。 このアルゴリズムを使うことによって,AlphaGoはほかの囲碁のプログラムに99.8%勝利できるようになった。そしてヨーロッパチャンピオンに5戦5勝をおさめた。 19路の囲碁においてコンピュータプログラムが人間のプロを負かすという,これまで何十年もかかると言われて来た,偉業を達成できたのはこれが初めて。

要約でいい感じに論文がまとまっていますね。
ここで重要なのは,先読み無しで最先端の囲碁ソフトに匹敵って部分なのではないでしょうか。

従来の囲碁プログラムは,相手が自分自身だったらどう打つかを考えて次の打ち手を決めます。
すなわち,今の盤面からどう打つかを決める際には,この手を打ったら相手は(自分のプログラムで考えれば)こう打ち返して,それに自分が打ち返して…という手筋を先読みして何パターンも考えるわけですね。そのうえで一番勝てそうだと判断した手を選ぶわけです。ここは人間によく似ている部分だと思います。

しかし,この先読み無しAlphaGoは違います。今の盤面の状態を見て,そこからここに打つと勝ちやすいだろうという感覚だけで打っても他の何千パターンもの先読みをしている囲碁プログラムに匹敵してしまいます。

そのAlphaGoに先読みを組み込んだら…どのような恐ろしい強さを誇るのでしょうか…?

ご存知の通り,この先読みを組み込んだAlphaGoは,囲碁で世界最強と謳われたイ・セドル九段を打ち負かしました。

というわけで,今回この記事では先読み無しAlphaGoがどのようにしてこの強さを誇るようになったかと,そのAlphaGoに先読みを組み込むことで最強の囲碁プログラムAlphaGoが作られた手法の二つに分けて紹介したいと思います。

こちらの記事ではかなり噛み砕いて分かりやすいように再構築しています。
逐語訳も作ったんですが思った以上に読みにくいので,気が向いたら綺麗に清書して投稿します。

とりあえず導入と背景

囲碁はこれまでAIにとってとてつもなく難しいゲームで,人間を越えるにはあと数十年かかるのではと言われていました。
その理由として,幅と深さが膨大なことです。 ほかのボードゲームと比べて,一手ごとに打てる手のパターン(すなわち幅)が多く,またゲームが終わるまでの手数(すなわち深さ)が多いわけです。 なので,チェスのように探索がすぐ終わる,というわけにはいかないんですね。

一般的にチェスは幅35,深さ80程度なので,全探索しても{35^{80}}通り(1247桁)調べるだけで済みます。しかし囲碁は幅250,深さ150ほどであり,3607桁と計算量がとても膨大になります。一桁増えれば総当たりの計算量は10倍になるわけで,これがコンピュータ囲碁がこれまで人間に全く歯が立たなかった理由の一つです。

この現状で囲碁プログラムが人間に勝てるようになるためには,計算量を削減するしかないわけですね。
第一に深さを削る。第二に幅を削る。このようにして計算量を削減します。

深さを削る場合,重要になるのは評価関数value functionです。 盤面の状態sから,勝っているか負けているかを表す評価関数{v^{*}(s)}の精度が非常に求められます。
なぜなら,理想的にはゲームの最後まで先読みするのが最も精度が高いですが,計算量を考えると現実的にはある程度のところで打ち切る必要があります。その打ち切った盤面での優勢劣勢を精度良く評価することが手の良さに直結するので,評価関数が非常に効いてきます。 この手法を用いることで,チェスやチェッカー,オセロにおいて人間を越えるパフォーマンスを出しています。

幅を削る場合,次にどの手を打つと勝ちやすいか?を表すpolicyが重要になってきます。 悪手を削り,良い手のみを深い手まで探索していくことで,幅の計算量をより減らすことが可能になります。 例えば,Monte Carlo rollouts searchはpolicyによって良い手のみを選んで終局まで探索することによって次の手を選びます。バックギャモンスクラブル(なにそれ?)で人間を越えているそうです。

その手法を発展させたのがモンテカルロ木探索,Monte Carlo tree search(MCTS)です。policyによって効率的な手を複数選び,計算を進めることで探索範囲を増やします。計算量を増やすことでより精度良く手を選ぶことができ,AlphaGo以前ではMCTSを用いたものが最強の囲碁プログラムでした(人の手のビッグデータを用いてpolicyを作ったもの)。 しかし,囲碁においてはMCTSを用いても強いアマチュアレベルまでしか到達できませんでした。

では,人類を越えたAlphaGoはどのように計算量を削減したのでしょうか。 AlphaGoでは幅と深さの計算量削減を,DeepLearningに委ねます。 深さを削るために勝敗評価を行うvalue network,幅を削るために良い手を選ぶpolicy networkを用意します。これらは多層のニューラルネットワークで構成されています。 そこにMCTSを組み合わせるという手法です。

policy networkのみで前述の先読み無しAlphaGoが構成され,そこにvalue networkとMCTSを組み合わせて先読みありのAlphaGoが作られるという感じです。 これらがどういう風に組まれているのかを,追って見ていきます。

DeepLearningについてですが,これは画像認識などでとても高い精度を誇っていて,2015年には物体の分類において人間の認識精度を越えています。 Googleの天才がたは,盤面を19×19の画像と見なして,盤面を畳み込みニューラルネットに読み込ませるという手法をとりました。
つまりAlphaGoは囲碁の盤面を画像認識に突っ込んで,勝ちやすいか勝ちにくいか判定させようっていうぶっ飛んだ手法をとってます。
とりあえずは,ニューラルネットワークは画像(=盤面)を入力したら確率などの値が出てくる関数のようなものと考えてください。

このくらいがざっとした導入ですかね。

先読み無しAlphaGoの作成

先読み無しAlphaGoですが,主に作るための作業が二段階に分かれています。

  • 教師付き学習フェーズ
  • 強化学習フェーズ

教師付き学習フェーズでは,実際の囲碁のプロが打った手のデータベースを用いて,policy networkを学習させます。
その後強化学習フェーズにおいては,自分自身と戦わせて,より強くpolicyを進化させていくフェーズになります。

具体的にpolicy networkをどう組んで,どうトレーニングさせたか見ていきましょう。

教師付き学習フェーズ(SL policyの作成)

論文のSupervised learning of policy networksの部分に相当します。

先行研究においての最強の囲碁プログラムは,上級者の手をpolicy networkに学習させることで手筋を予測させていました。 そこで,まずは先行研究と同じように教師付き学習policy network {p_σ(a|s)},以後はSL policyと呼ぶ,に上級者の手を学習させます。

f:id:s7rpn:20160610190516p:plain:h200

具体的には,KGS囲碁サーバーにある16万局,3000万の盤面(の反転,回転を加えて3000万×8)を用いて,13層のpolicy networkを学習させます。
囲碁データの盤面{s}をpolicyに入力したら,次に打たれる手{a}の確率が最も高くなるような確率分布{p_σ(a|s)}を出力するように確率的勾配降下法を用いて学習させます。
結果,次の手の予測が57.0%の精度で予測できるようになりました。 従来の最高の予測精度が44.4%であり,これだけでも大きな進歩です。

同様に,高速policy network{p_π(a|s)}も作成しました。これは予測精度は24.2%と低いですが,手を選ぶのに2μsしか消費しません。{p_σ(a|s)}は3ms消費するので,1000倍以上の速さを誇ります。
この速さを生かして終局まで探索することが可能であり,後に先読みを組み込む際に精度上昇に貢献します。

強化学習フェーズ(RL policyの作成)

論文のReinforcement learning of policy networksの部分に相当。

ここでは,policy network同士を戦わせることでより良い手を打つ強化学習policy network {p_ρ(a|s)},以後RL policyと呼ぶ,を作ることを目的とします。

最初はSL policyの重み{σ}を用います。
現在のRL policyとこれまでのpolicy(SL policyから現在のRL policyまで)からランダムに選ばれたpolicy同士を戦わせることで,現在のRL policyを進化させます。 ランダムに選ぶ理由として,現時点最強のみと戦わせていた場合に極所解に陥る可能性があるので,より多様性のあるの打ち方を体験できるように弱いpolicyから強いpolicyまでを使っています。

policyの進化のさせ方として,前述の通り,現時点では先読み無しのpolicyを扱っているので,ある手を打った場合の終局時の盤面が即座に計算で決定されます。
その手が勝っている場合は+1,負けている場合は-1として,各手ごとに勝ち負けを判断して,networkの勾配を更新します。

この強化学習フェーズを終えることで,先読み無しAlphaGoの完成です。50個のGPUを使って一日で128万局の対戦を行わせたそうです。完全に人間の能力を越えていますね…

最終的に,RL policyはSL policyに80%の確率で勝つようになりました。
また,オープンソースで最も強い囲碁ソフトPachi(こいつはもちろん先読みする囲碁ソフト)に,85%の確率で勝利できるようになりました。

そして,次は先読みをAlphaGoに組み込む時です。

AlphaGoに先読みを組み込む

これまでの先読み無しAlphaGoの時点で,強い手を選ぶことが可能なpolicyを作ることができました。 なので,幅についての計算量は心配する必要がないと思います。
ここで問題となるのは深さの計算量を削ることです。そのためには正確な盤面の勝敗の評価関数value functionが必要でした。

今回,AlphaGoに先読みを組み込む準備として,まずは盤面評価のためのvalue networkを作ります。
その後,それらpolicy,valueをMCTSに上手く組み込むことでAlphaGoを完成させます。

value networkの作成

論文のReinforcement learning of value networksの部分。

深さの計算量を削るための評価関数を作ります。

value network {v_θ(s)}は構造はpolicy networkとほぼ同じ13層のニューラルネットですが,最後の出力が異なり,勝敗を出力するように組まれています。 つまり,盤面{s}を入力して勝敗{z}(-1~+1)を出力します。

f:id:s7rpn:20160610190525p:plain:h200

その盤面の勝敗に関しては,両方が最善手を打つpolicy同士で戦わせた際の勝敗を{z}とします。現時点で最強のpolicyはRL policyなので,これを用いて勝敗を求めます。
value networkを作るにあたって,RL policyで戦わせた3000万局から独立した盤面のstate{s}とそれの勝敗{z}を教師データとして学習させました。
従来手法では人間が打った囲碁データからvalue functionを作ったものもあるそうですが,KGSの学習データ16万局ではGoogleの求める精度には至らなかったようです。(過学習ぎみになる) そのため,わざわざpolicy同士を戦わせてデータを新しく作ることになりました。

f:id:s7rpn:20160610190849p:plain:h180

グラフをご覧の通り,value networkによる盤面評価は,実際に現時点最強のRL policy同士で戦わせた盤面評価に迫る性能を発揮しています。
にもかかわらず,RL policyと比較してなんと計算時間が15000倍少なく済みます。
これがいわゆる”人間の勘とか呼ばれているもの”のような気もします。

先読みを組み込み,AlphaGoを完成させる

Searching with policy and value networksの部分。

さて,この記事も大詰めを迎えてきました。

とても計算が速く精度も高いvalue networkと,先読みせずともとても強いpolicy networkが揃ったので,後は先読みのためにこれらを上手くMCTSに組み込みます。手順が複雑。

f:id:s7rpn:20160610190508p:plain

まず,探索を一番上(root)から始めて,各々の状態(node)において次の手{a_t}を求めます。
その{t}番目のnodeでの次の手{a_t}

{ \displaystyle a_t =\underset{a}{argmax}(Q(s_t,a)+u(s_t,a))}

すなわち,{Q(s_t,a)+u(s_t,a)}を最も最大化する{a}が選ばれます。 ここで,

{\displaystyle u(s_t,a)∝\frac{P(s,a)}{1 + N(s,a)}}となります。

この{u(s_t,a)}{t}番目のnodeにおける次の手の確率分布{P(s,a)}と比例します。ただしその端点を訪ねた回数{N(s,a)}で割っているので,同じ場所ばかりを探索させないようにする効果を持ちます。1を足してるのは0除算を避けるためですよね。
以上を規定の数{L}番目のnodeまで探索を行い,端点に辿りついた際,SL policyを用いてその手までの各nodeでの確率分布{P}を求めます。
そして,この時点での勝敗の評価を,二通りの方法で行います。

  • value networkに盤面を評価させる
  • 高速policy{p_π}を用いて,終局まで対戦させ,勝敗を評価する

これら二通りの方法を足しあわせて,その時点での盤面の勝敗の評価{V(s_L)}

{V(s_L) = (1 − λ)v_θ(s_L) + λz_L}

として求めます。λは定数。

探索が最後まで終わったら,端点の{Q(s_t,a)}{N(s_t,a)}が更新されます。 これらは

{\displaystyle N(s,a)=\sum^{n}_{i=1}1(s,a,i)}

{\displaystyle Q(s,a)=\frac{1}{N(s,a)}\sum^{n}_{i=1}1(s,a,i)V(s_L^{i})}

から求められます。

式だけ見るとうわって感じですが,単純に{N(s,a)}は打てる手のうちの訪ねた手の数を数えているだけです。
{Q(s,a)}は訪ねた手での勝敗の評価を訪ねた手の数で割っているので,訪ねた手の勝率を返しています。
より勝ちやすい手を多く探索して,負けやすい手に目を向けない式の形になっていますね。
ある程度のステップで探索を止めますが,探索が終わった時点で,より多く訪ねた手を次の手として採用します。

興味深いのは,最終的なAlphaGoではpolicy部分にRL policyではなくSL policyを用いた方が強いことです。 RL policyは一つの強い手に集まりますが,多くの手筋を持ったSL policyのほうが見通しの能力が高いのでは?とのこと。
逆にvalue functionに関してはRL policyを用いて作成したvalue networkのほうがSL policyより強い手を打てるそうです。実際の囲碁でも強い人と戦うと盤面評価の能力は上がるけれども,よりたくさんの人と戦わないと想定外の手に対応できないような気もするので,感覚的にもなるほどと思いました。

あと,{λ}に関しては最適は0.5だそうです。高速policyとvalue networkを半々で評価すると一番強くなるっていうのも興味深いですね。
人間に例えるなら頭の中でざっくりと深い手まで先読みしつつ,同時に勘に頼って次の手を決めるって感じなので,かなり人っぽいと自分は思いますがどうでしょうか。

ハード的な面に関しては,AlphaGoは,value networkを求めるGPUと手の探索をするCPUを並列して動かすことで,より速度を上げているそうです。 最終的に,AlphaGoは48個のCPUと8個のGPUで使えるように組まれました。 同時に,より強い分散処理型として,1202個のCPUと176個のGPUを用いたものも作られました。これがイ・セドル九段を破ったAlphaGoです。

感想とか

やっぱり語りたいのはイ・セドル九段 vs AlphaGoの四局目78手ですよね。イ・セドル九段が打った神の一手とも言えるあの手です。 正直あの手は思い浮かびませんでした。でも後から見返すとものすごい妙手ですよね。
実際AlphaGoもあの手を考慮に入れていなかったんだと思います。長考した末あの手を打ったセドルが格好良すぎる。
この一局もリアルタイムで見ましたが,ものすごく興奮しました。人間の思考力がGoogleの本気のプログラムをまだ上回れるんだ,とそう思いました。

と同時に,ボードゲームでは人間が機械に全く歯が立たなくなる日も近いんだろうな,とも感じます。
何がすごいってvalue networkの計算速度の速さですよね。15000倍。これが人間の勘とか感覚に相当する物なら,勘を要求するような職人芸などはいずれ機械に取って代わられることになるんですかね。
ただ,囲碁に関して言えばそれをするために(自分同士で戦った譜ですが)大量のデータが必要だったので,人間の勘を完全に機械が越えるのもまだ時間はかかりそうだな,とも思います。
ただDeepLearningは学習時間と計算能力をつぎ込めば底なし思えてしまうレベルで最適化が進んでいくので,最適化しやすい分野はどんどん取って代わられてしまうんでしょうね。
未来はどうなってしまうんでしょうか。ちょっと怖い反面,わくわくしています。

あと,思ったより実装できそうなシンプルな構成だったので,暇がある時に実装できると良いなーとも思います。GPU絶対足りないですけどね…

この記事結構ざっと書いたので,質問とかあればなんなりと書き込んでください。
もちろん中上級者のかたがたの「これ違うんじゃね?」突っ込みもお待ちしています。実際訳してて不安な場所も多々あったので。時間見てブラッシュアップしていく予定。

最後に,この記事を通して何か興味深い知見を得ていただけたのならば幸いです。ここまで読んでいただきありがとうございました。

関連: 7rpn.hatenablog.com

7rpn.hatenablog.com