世界コンピュータ将棋選手権とは

林隆弘氏(以下、林):今回「将棋AIの開発秘話を語る」ということで、座談会形式で秘話を語るということで、まずどのあたりからいきましょうか。

山口祐氏(以下、山口):まずその「コンピュータ将棋選手権」という大会について、私から簡単に説明してから、ここにいる3人の開発者が、それぞれどういった感想を持ったのかを順番に聞いていければと思っています。

:お願いします。

山口:はい。今回我々が参加したのは、「第31回世界コンピュータ将棋選手権」という大会でして、こちらは非常に歴史の長い大会です。将棋AI同士が対局をして最強を決めるといった、この業界では一番格式が高いというか、みなさん気合いを入れて参加する大会になっています。

毎年ゴールデンウィークの5月3日から5月5日にかけて開催されていまして、3日に一次予選、4日に二次予選、5日に決勝リーグが開催される流れになっています。

一次予選は合計34チームが参加して、上位の11チームが二次予選に進めます。二次予選はシードの19チームを加えて30チームが参加して、上位の8チームが決勝リーグに進んで、決勝リーグでは総当たりで優勝者を決めます。

ということで、こちらの大会にみなさん参加して、しのぎを削ったところです。ちなみに今回は「elmo」というソフトが優勝しました。

この大会の開催前に、ディープラーニングベースの将棋ソフトが今後どこまでいくかといったテーマでトークイベントがありそこでの話だったり、事前の前評判では、ディープラーニングベースのソフトが非常に強いのではないかと。下手したら決勝リーグに何チームか進む可能性があるんじゃないか、という前評判だったのですが、そのあたりをまず川島さんにうかがいたいと思います。

川島さん、今回は「dlshogi with GCT」というチームで参加されましたけど、今大会はどういった準備をされて臨まれましたか?

将棋AIの作り方には大きく2つの主流がある

川島馨氏(以下、川島):スライドに少しまとめたので、映しながら。大会の結果についてはさきほど少し触れましたが、このスライドも用意したので、私からも説明します。

決勝戦はelmoが1位で、山口さんが開発されたPALが2位、私が作ってチームで参加したdlshogi with GCT、こちらは私は決勝に行けると個人的には思っていたんですが、ちょっと振るわず、今回は14位という結果でした。

(一同笑)

これは前回のイベントで少し触れたんですが、今の将棋AIの作り方には大きく2つの主流があります。こちらのスライドの左側のαβ法に、評価関数にニューラルネットのNNUEという名前がついていますが、1年前まではそれを使ったソフトが圧倒的に強くて、杉村さんが開発された「水匠」も、こちらの左側の方法を使って開発されていました。

今回の大会で、けっこう行けるんじゃないかと言われていたディープラーニングは、2020年の11月の電竜戦でGCTが優勝して、これでだいぶ流れがきたんじゃないかというところがあります。こちらは、従来とはぜんぜん違う方法で作っています。

前回のイベントに出られた方には繰り返しの説明になってしまうんですが、盤面を画像として入力して、そこから指し手を予測しまして、次どこに指すかを確率で出してくれる、画像を与えれば打ち手がわかる、というところにディープラーニングが使われて、画像認識精度が飛躍的に上がった手法になっています。

これを始めに囲碁に応用したというので、すごく有名ですね。これを将棋で応用したのが、dlshogiやPALになります。私はかなり初期から始めていて、ようやく成果が出てきた状況で、これだけではそんなに強くはありません。序盤は強いのですが、終盤は強くないので、そこに探索を組み合わせて作ってきて、ようやく勝負ができる状況になってきた感じです。

期待はされていたのに成績はイマイチだった

川島:今回の大会では、私のソフトは14位というところになってしまって、期待はされていましたが成績はイマイチでした。どういうことをやってきたかと、このへんが悪かったかなというのを少し考えていました。

これは合っているかわかりませんが、まずこのディープラーニングのいろいろなパラメータを学習したモデルの精度が、まだ終盤で読み抜ける。さっきの指し手の予測のところで、終盤で詰みが絡む局面だと大駒をただ捨てて、そのあとに有利になるような展開があると、そのただで捨てるという手をまったく読まなかったりすることが、ディープラーニング系には特にあります。

そういう読み手があるということで、モデルの精度が不十分であることと、あとは入玉宣言がまだうまく学習できていないというのが、私のソフトにはあったようです。あとは振り飛車のソフトに、そこまでというわけではないんですが、負けたので、もしかしたら苦手な戦形がまだあるのかなと考えています。

今回大会に出る2週間ぐらい前に、HEROZにA100というスーパーコンピューターが導入されたので、これを使って最後に追加で教師データを作って学習させました。大会でもA100を使って参加しました。これはdlshogiのほうで調整が甘い部分があって、十分に活かせなかったところもあります。

逆にPALはけっこう活かせてたんじゃないかなと思うんですが、これはあとで山口さんに聞いてみたいと思います。

どういうところかというと、dlshogiは先ほどの探索も組み合わせて動いているのですが、その時にどの手を指すかをいろいろシミュレーションして、その時の勝率の累計を取っています。

細かい話になるんですが、float32という32ビットで保持していまして、シミュレーション回数が数千万回ぐらいになると、かなり精度が落ちてくるという問題があります。かなり極端に落ちるので、上限を設定していて、この上限に引っかかって時間が余っているので、打ち切ったところがありました。ここはちょっと調整が甘かったところです。

モデルの精度の調整

川島:学習の時にどの手に指すかについては指し手だけを学習しているんですが、AlphaZeroというソフトだと、指し手ではなくてどういう確率で選ぶかのシミュレーション結果をもとに、分布を学習するという、囲碁では主流の方法を使っています。私の将棋ソフトは、そういうのが主流になる前から開発していたという経緯もあって、指し手を学習しているので、読みが幅を読むというか深さが狭いところを読んでいく特徴があります。

持ち時間が短い時は非常に効率的に読めるんですが、長い時だともしかしたらよくなかったのかなと思います。温度パラメータというところで、幅を取るか深さを取るかを調整できるんですが、ここはA100に合わせてもうちょっと調整の余地があったかなと思います。

モデルのブロックサイズというのがあって、これはResNetというディープニューラルネットワークのモデルを使っているんですが、それをブロックという単位でどんどん大きくしていきます。囲碁だと20ブロックとか40ブロックとか大きいブロックが主流ですが、私のソフトでは10ブロックという小さめのを使っています。

これは将棋だとあまり大きいブロックがなくてもわりと強くなるんですが、逆にこのA100という、すごく良いGPUを使おうとすると、ちょっと余らしている状況がありまして、A100だともうちょっと有効に使えるというのはあったかなと。

あとは大会が終わったあとに、floodgateというコンピュータ将棋ソフト同士で自由に対戦できるサイトに放流していまして、そこの成績を見ると、杉村さんが放流された「水匠」にdlshogiが7勝4敗で勝ち越していたりします。ですから、大会で優勝できる可能性もあったかもしれないですが、この下位のソフトにもわりとポロポロ負けていたりもします。

勝つ時は勝つんですがポロポロ負けるような。さっき話したモデル精度の問題とかもまだ完璧ではないところもあって、こういうところで今回決勝に残れなかったという要因になっているのかなと思っています。

利用した計算資源

川島:あとは利用した計算資源としましては、電竜戦の時に優勝したGCTというソフトを主に開発されていた加納さんとチームで参加しました。加納さんが作られたGCTモデルを追加学習しています。こちらは、加納さんはほぼGoogleのColabだけで学習しています。

これに対して最後にA100で追加学習をして強くしたんですが、この時は8GPU載っているマシン5台ぐらいを2週間ぐらい使わせてもらいました。空いている期間でほぼ動かしてという感じです。これをやったのと、あとはfloodgateの棋譜とかも混ぜて学習しています。

これが大会の時では逆転負けするような時もあったので、このfloodgateとディープラーニング系の相性みたいな問題もあって、得意でない局面になったという可能性もあります。ここは本当に混ぜることが良いのかというのはまだわかっていないと思っています。

これを混ぜずに学習した予行練習が少し前にあったんですけど、そこでは2位だったので。もしかしたら精度が上がっているようで実は弱点も増えちゃったのはあるのかなと思っています。

山口:ありがとうございます。今回新しく出てきた情報もいくつかあると思うので追加で聞きたいなと思うところもあるんですけど。この大会が終わったあとにモデルファイルを2パターン公開されていましたよね。それぞれの違いというのはどういったところにあるんですか。

川島:そうですね。1個は、大会のほとんどで使っていたのは自己対局で一番勝率が良かったほうを使っていまして、それは単純に自己対局で良いほうですね。もう1個のほうはfloodgateに流したところ、あまり下位に負けることが少なかったので、そっちのほうがもしかしたらいろいろなソフトの相性はいいかなと思って用意していたんですが、それを使ったのは最後の対局だけでした。

その選択が良かった・悪かったというのは、もう片方使っていたらどうだったのかとちょっと思っていたりします。

探索と調整でまだまだ強くなる可能性がある

山口:そうですね。なかなかその辺の調整は非常に難しいところがあるかなと思いますね。そうですね。GPUの使用率の問題ですか? 1個前のスライドでネットワークのサイズが10ブロックでそれほどGPUの使用率が上がらないみたいなみたいなお話があったと思いますけど、これは確かにどうですかね? たぶん半分ぐらいしか使っていないイメージですかね?

川島:わりとそうですね。40パーセントぐらいまで落ちている時が多いですね。

山口:落ちている。そうですね。視聴者の方は開発者じゃない方も当然いらっしゃると思うので、このGPUを使う将棋ソフトについて説明しておきますと、一応GPUだけで計算しているわけではなくて、GPUとの盤面の例えばどの駒を動かすとかそういったところはCPUを使って計算をしています。ですから、CPUの部分の計算とGPUの部分の計算が両方同時に走っているかたちになっています。

このGPUの計算の負荷が小さいと、あるいは使用するデバイス、GPUの性能がすごく高かったりするとCPUのほうがボトルネックになってしまって、GPUのほうの性能が100パーセント活かせられない可能性があると。川島さん、そのあたりの認識で合っていますかね?

川島:そうですね。はい。

山口:ありがとうございます。つまり、まだまだこの探索の部分はCPUを組み合わせたところで調整する余地があって、ますます強くなる可能性を秘めているといったところですかね。

川島:そうですね。探索と調整と、あとは、モデル精度はまだ問題があると思っていますので、学習する教師のバリエーションを増やすとか、まだ改善できる余地はあると思います。

山口:なるほど。まだまだ強くなると。今はfloodgateでレートが4,400ぐらいですから十分強いと思うんですけど、まだまだ強くなる可能性があるというのはけっこう驚異的ではありますね。

勝率の累計をどうするか

山口:あと1点私が気になっていたのは、勝率の累計で、floatで持っているというので探索を打ち切っていたという話があったじゃないですか。これはどうなんですかね? 私は特に制限する必要がないんじゃないかなと前から思っていたんですけど、そのあたりはどうですかね。

川島:そうですね。累計の訪問数が3,000万ぐらいになると、10ブロックだとなりやすくて、そうすると正しい評価値、doubleで計算すると100とかいう評価値でも500以上とか付いてけっこう誤差が大きいんですね。

山口:ありがとうございます。1つ思ったのは、この問題は私もけっこう昔から認識していて、実用上問題になることはないかなと思って放置していたんですけど。

細かい話になるのでちょっと簡単に説明すると、この精度の問題があって、小数点を何桁まで保持するかみたいな話がコンピューターではあります。3,000万などのそういった単位になってくると、そこに+1した時にその+1の部分が0.000……パーセントになって、精度が足りなくてその1がほとんど無視されてしまって、全体の合計値が上がらないような問題があるんですね。

その合計値が増えないので正確な評価ができなくなるといった不具合があるんじゃないかということで、そちらの対応をされていたということだと思うんですけど。

私の浅はかな考えだとそのくらい、ノード数が増えている。つまりある探索局面に対してこのノードの探索があった時に、それが3,000万とかいった時は、もうけっこうその手にほぼ集中できている。十分読めているかなと思っていて、要するにそこの評価値はおかしくなっているけど、その手を選択するというところはたぶん動かないんじゃないかなと思っていたりするんですが、そのあたりはどうですか?

川島:そうですね。1手しかなければそうですね。たぶんもう十分ですが、2手ぐらいになった時にやっぱり精度が少し影響するかも。というところはありますね。

山口:なるほど。ありがとうございます。そのあたりはけっこう難しいですね。勝率で持つのかdoubleで持つ。doubleで持つと、メモリがけっこう大量に必要になるので。

「やねうら王」の役割分担

杉村達也氏(以下、杉村):そうですね。私は「やねうら王」というチームで参加していたんですが、それについては勝率の累計をdoubleで保持しているというかたちで対応していたようです。それでメモリが溢れた、もしくはメモリ解放が間に合わなくて時間切れ問題が出てしまったので、またあとで説明しようと思います。

山口:ありがとうございます。せっかく今お話をいただいたので、この流れで杉村さんにもお話をうかがっていければと思うんですが。杉村さんの開発していたチーム、一応ご本人としては、ひらがなで書かれた「すいしょう」というソフトで参加されていて、そちらは一次予選から、こちらはフルスクラッチですかね。

杉村:そうですね。それは探索部が全部フルスクラッチで書いてとりあえず動くかというかたちでやっていて、勉強みたいなものです。もう1つ、二次予選のシードに出ていた「やねうら王」という将棋ソフトなのですが、そちらについてはチームで参加というかたちで、「やねうら王」の主たる開発者であるやねうらお(@yaneuraoh)さんと、あと今回は他に3人おりまして、私とみざーさんという方です。

あとは「Fluke」というソフトで参加していたんですけど、「やねうら王」のチームで手助けをしてくれていた井本さんと4人で対応していて、やねうらおさんが主たる開発者として探索部であったり、学習モデルについての学習であったりとか、それをすべて対応していました。

私が基本的に評価関数、評価モデルの学習を進めて、どういう手法が一番勝率が高くなるかをやっています。みざーさんが基本的には当日のオペレーションもやっていただいたんですが、そのモデル構造とか活性化関数とかをどこを変えたらどうなるかということを実装してくれました。井本さんも同じくモデルとかについてこういう構造がいいんじゃないかといろいろ提案をいただいて、いろいろ実装していただいて実験とかもしていたという、役割分担はそういうかたちになっていました。

手数が伸びてフリーズし予選敗退

ただ結局のところは「やねうら王」はdlshogiベースでほとんど使わせていただきました。最終的に、モデルはdlshogiと同じで10ブロック、192フィルタというかたちでそのまま使っていた学習が一番強くなったというか、それが限界近くまでいって、恐らく他のモデルがまだ学習が足りなくて、本番に間に合わず、dlshogi標準モデルでの参加になりました。

その「やねうら王」については、スライドなどを準備していなくて申し訳ないんですが、10位で終わりました。上位8名じゃないと決勝リーグには残れないので、二次予選敗退になりましたが、最初の頃は4連勝か5連勝ほどしていて、けっこう調子良いのかなと思っていたのですが、恐らくPALさんとの対局で一部おかしな部分が出ました。

入玉勝負あたりで相当手数が伸びた時に、4分ほどこちらがフリーズしまして、何も指せなくなったんですね。その時に「これは何か不具合があるな」と認識したんですけど、4分ほど経ったら指し始めたので、ちょっと原因はわからないまま、なんとか危機を脱したので、このままでというかたちでした。

その次に「Kristallweizen」という、通称「白ビール」と呼ばれているソフトと戦った時に、同じように手数が伸びまして、こちらは相当勝勢ではあったんですが、残念ながらそこでフリーズしてしまいました。

原因はわからないのですが、恐らく本番環境で検証が足りていなくて、直前の改造がちょっとおかしかったのかとか、探索が多すぎるから問題なのかと前バージョンの探索部に戻したり、探索をあまりさせないようにしよう、みたいなその場しのぎのかたちであったり。

あとは先ほど言った勝率を保持するのにdouble型を使っていたのをfloat型に戻して、メモリを使わないようにするかたちに戻したりなどをしているうちに、残念ながら負けてしまいまして、それで二次予選敗退になってしまいました。

単独でdlshogiを使うよりも混ぜたほうがなぜか強くなる

私がだいたい、評価関数の学習の部分で工夫したところが多かったので、そこの部分について少しお話ししますと、基本的にはGCTさん、11月の大会で優勝された時に評価関数モデルだけではなくて、その教師局面も相当な数をアップロードしていたので、それを使いながらの機械学習するのが主でした。

こちらは「水匠」を開発していた部分で、「水匠」の1手100万ノードほど探索させた教師局面が2億局面ほどありましたので、そちらについて混ぜて使ったほうが強くなるので、それを混ぜて使ったと。ただ混ぜるだけだと評価値の出力のスケールというか大きさが、ぜんぜん違うというところがありました。

なので、そのdlshogiの評価値と「水匠」の評価値で、ある程度同じ値になったほうがいいかなということで、まずは評価値ごとの勝率を計測しまして、その勝率から評価値に戻すような作業をしました。dlshogiの勝率と「水匠」の自己対局の勝率で、同じぐらいの評価値のスケールで出るようにしたほうが、実験上では強くなりました。ですので、単独でdlshogiの教師局面を使うよりも混ぜたほうがなぜか強くなる、そういうかたちの学習が多かったですね。

あとはdlshogiさんが公開したGCTは入玉局面でも、まだ評価値が300ぐらいしか出せない、相当入玉局面についての学習が進んでいないのかなという部分もあったので、教師局面で入玉宣言勝ちをした教師というのを若干割合を増やして学習をさせて、入玉の評価値がある程度しっかり出るようにしたという工夫もありました。

基本的に勝率計測は対「水匠」で一番勝率が高くなるのを目指していて、だいたい11月に公開されたGCTに対してレーティングが250から300ぐらい短時間の計測では上がったかなという感じですね。ただ長時間の計測はちょっと時間が間に合わずあまりできていませんでした。

ということで、ちょっと不具合というか、メモリまわりのフリーズ等がなければ決勝リーグに残れたのかちょっとわからないのですが、そこは残念でした。 (次回につづく)