将棋ソフト開発(仮)

将棋のソフトを作るのです。趣味で。

評価関数

評価関数はどの程度正しいのでしょうか。

結論としては、ガバガバです。

 

同じ局面でも、強いとされるプログラムが200点で、もう片方が1000点とか日常茶飯事です。

人間はプロ同士ならそんなに形勢に差は出ません。

じゃあソフトはおかしいのでしょうか?

 

ここで採り上げたいのは二つです。

1:なぜソフトによって違いが出るのか

2:なぜそこまで大きな差が出るのか

 

人間の場合は、大雑把かつガバガバで(処理的に)効率的な形勢判断をします。

ソフトの場合は、緻密かつガバガバで(処理的に)非効率的な手法を含む形勢判断をします。

※ただし、効率的な手法による形勢判断の「プログラミング」はソフトを強くする上で非効率的であると考えています。

 

まず、人間の場合は考え方や内部的な処理の仕組みが似ています。

なので同じ結果になりやすく、形勢判断の他、盲点になりやすい手も、見つけやすい手もかなり似通っています。

人間基準ではそれでも些細な違いが盛大な個性に見えるかもしれませんが、

ソフトの場合は処理の仕組みも、やろうとしていることも、動作の仕組みも何から何まで違います。

(デジタルとみなされた値を扱うと言う点では同じですが、それは真っ白なキャンバスを渡されて、新しい動物を作ってくださいと言われるような物です)。

 

なので、ソフトの違いは極めて個性的になる資質を常に持ちます。

これが個性的な評価を出す理由のひとつです。

 

 

ではもう少し踏み込んで、具体的なことを考えていきます。

ソフトが実装する検索手法と評価関数は「ほとんどの場合」は統計的な勝率に基づきます。(「ほとんどの場合」がどの範囲までを指すかは私も知りません)。

 

つまり、検索ルーチンや評価ルーチンをいじくってみて、勝率が上がればそれが良い処理とされるわけです。

ここで重要な問題があります。

 

将棋は必ず一つの手しか選べないと言うことです。

勝率だけ見ると言うことは、選んだ手に対してのみ検索処理と評価に「正しい補正」がかかると言うことです。

このとき、そのソフトが選ばなかった手に対する処理の成否は問われません。

ここで盤面に対する判断がおかしくなります。

棋風とでも言いましょうか。

人間としての棋風とはかなり内容が違うのですが、棋風です。

 

よって、この方式での評価関数の結果が一定の信用に値するのは、

最初から全てそのソフトが指した場合のみ、と言うことになります。

(もちろん最初から最後までそのソフトに指させて勝率を取っているわけですから)。

 

 

この積み重ねにより、

1:ソフト自身が指した手は、より正しく評価されるよう更新される。

2: 指し手を選ぶ際、正しく評価される指し手を選んだ更新が生き残る。 

 

この2点が確定となり、ソフト間の棋風の違いはより明確になると同時に、

未知の局面(ソフトが選ばないであろう局面)の評価は、全く干渉されないことに拍車がかかります。

別のいい方をすると、好みの棋風に拍車がかかるとでもいいましょうか。

 

当然ですが、選ばなかった全ての手に対しての評価は、選んだ手よりも低いわけで、

だからといってその評価が正しいとも限らないのです。

ただひたすら、選んだ手に対する検索法と評価の最適化がおこなわれます。

そして最適化がおこなわた指し手が次からも選ばれるように補正されていきます。

 

 

このとき、「本当は最善手だけど、ソフトの好みではない手」だった場合、

評価関数は必ず狂っていて、

また、上手に検索して指しつぐことが出来ない可能性が常に残ります。(とは言ってもソフトレベルの話しでの上手かどうかです)。

 

 

将棋と言うのは、ほとんどの手は間違っているが、

正しい手がほんのいくつかあり、そのいくつかは全く性質の違う将棋を要求したり、

違う方式での形勢判断を要求するのです。

 

勝率だけによるバージョンアップをおこなった場合、棋風は明確に発生するものと思われます。

そして、そのソフトの一部だけを (特定的な将棋の考えとしては正しいが) 違う棋風に適応している処理を導入した場合、

内部で相反する処理が発生している可能性が高く、勝率は落ちる可能性が濃厚と思われます。

 

ただし、評価関数が大幅に間違っていても、指し手に乱れはほとんどなく、正しい手を見つけますが、これはまた別の要因によるものなので今回は省きます。

 

 

さて、人間の場合は、大雑把にガバガバに効率よく形勢判断をする生き物なので、

自分と違う棋風の盤面を見ても、日頃と大きな狂いを出すことなく形勢判断をします。

 

ソフトはそういった形勢判断はせず、今まで自分が現実上勝ってきた盤面を一番よしとします。

それがとんでもなく偏ってるとも知らずに。

ソフトの場合は、盤面が似てると言う概念も持ちません。

(ただしくは人間と違う意味で似てるかどうかを算出するソフトが多いですが。例えば三駒関係の演算の結果の数値が同じとか)。

 

と言うわけなので、とりわけそのソフトが「嫌いな盤面」に対しては信憑性のある評価値は出しません。

間違ってると言う保証はありませんが、正しいと言う保証もないのです。

 

1:ソフトがその局面に対する干渉を行なった履歴がない。

(例えばその指し手を選んだ)

2:ソフトがその局面を正しく判断できた履歴がない。

(例えば指し手は選んだが、処理が噛み合わなかったなどの理由でうまく勝てずに開発者に抹消された)

どちらかなのです。

 

 

ここで私が思うのは、極端な好みが発生するほど、他人の棋譜から指しつぐのは難しくなるということです。

これは将棋の特性として、極端な盤面ほど極端な指し手が最善になる可能性が高くなります。

・・・もう言わなくてもわかるよな。

そう、すでに自分と相反する盤面に直面した場合、

そこからやっちゃいけない自分の好みに向かって盤面を変更したがる可能性が常に残るのです。

 

将棋は選択肢は選べても、あとから「やっぱやめた」が出来ないことが多いです。

一度医者として就職することを決めたら、生涯医者として振舞わなければならない可能性が高いのです。

ところが、突然ペンキ塗りの仕事(盤面)を渡されたら、ソフトはその汚い手で医術を試みる可能性が残るのです。これは事態を悪化させます。

 

まぁ指し手の良し悪しに関しては、ソフトレベルでの高レベルの微差しかでないでしょうが、

形勢判断に関してはこの限りではないと言うことです。

 

 

と言うことで!

ソフトを使って将棋を研究する場合は

1:評価値を見ずに指し手だけをみるようにしましょう。ソフトの手は間違ってない保証は得られていますが、正しいと言う保証は得られていません。

2:複数ソフトの指し手を確認しましょう。ソフトによって好みがかなり偏ります。

その中で損得勘定は自分でするのが良いです。

幸いなことにおかしな筋と、問題のある筋が発生してる局面、に関してはソフトは教えてくれます。

 

ちなみに、ソフトの好みは「人間の感覚」で盤面を見てもよく分からないことが多いのであしからず。

ソフトはソフトで、盤面を人間とはまったく違う角度から見ているからです。

 

電王戦Final - 第五局

第四局の記事だけ書いてないんですけど。

第五局は、まぁこれはこれでいいんじゃないでしょうか。全てを含めて。

ただ川上さんの会見だけ、何を言いたかったのか一部分からなかったので、そのへんはなんとも言えないですけど。

 

ちなみに第五局で私が一番楽しかったのはエキシビジョンです(笑)。

私は将棋を見たいタイプなので。

 

 

では本題に。

自慢するわけではありませんが!

私のソフトは!

滅多に飛車とか角とか詰まされません!!

 

なぜなら、一手目でいきなりパスして相手が何を指そうとするのか探ろうとするソフトだから。

と言う事で、角や飛車が詰まされる盤面が比較的読みやすいわけです。

 十分な時間を得られればこの形式のほうが強くなります。

そのかわり、結論(指し手)を算出するのが遅くなって、早指しは弱いです。

 

またこの方式は、やんちゃなことを指せない役割も担わせてます。

純粋に一手パスした時に変化する点数が「局面の重み」なので、

どの程度やんちゃなことをしてるか、数値にして算出できるわけでもあります。

 

このとき、前後の局面や他の指し手と比べて、不自然な点数の推移がある場合、

「やんちゃなことをしてる」とか「綱渡りを始めようとしている」とか、ある程度予測します。

そうゆう時は、思考時間をおもいっきり増加させている仕様です。

(書くのは簡単ですが、苦労しました。と言うか本当に正しく動作してるのか今でも不明です)。

 

また、実はソフトは「詰めろ」とか「必至」を出すのは苦手です。

と言うか、ほとんどのソフトはそうゆう考えかたはしません。(出来ません)。

これは、ソフトの検索は総当り検索が基準にあるからで、

人間とは局面の理解の仕方や、手の考え方が違うからです。

「詰めろ」とは人間用の概念です。

 

でも、詰めろを簡単に出す方法があります。

一手パスするのです。これで詰んだら詰めろ。(たぶん人間の脳内と同じ方式です)。

んで、詰めろが正確に割り出された場合、その後の検索方式を最適化することができます。

 

私のソフトの場合は、詰めろを片っ端から出して、

(基本的には)その詰めろが解消されるまで検索を続けて点数を出します。

なので、手数に関わらず「詰めろ同士の優劣の比較」が可能になっています。

 

なので、私のソフトは、一直線の詰みとかにも案外強いです。

ちなみにソフトが、 「一直線の詰みに弱い」のと 「飛車が詰められる」 のは、

たぶん同じ理由だと思います。

手順通りの総当り検索だとそうなるんです。しょうがないね。

 

ただし、現段階できちんと作れているかと言われると、まだすごく不安定な動作です。

これ、理屈だけ書くと簡単に書いてるように見えると思うけど、

普通のプログラマーは嫌になって投げ出すレベルじゃないかなぁ。

 

そしてさらに、言うと、私のソフトは早指しするとめちゃくちゃ弱いです。

ある程度のスペックのあるPCで、一定時以上思考させたときに、始めて成果の出る方式です。

もちろん、今までにも書いてきたように、私のソフトは他にもいろいろなことをやっています。

なので、その遅さたるや凄まじい物があります。

 

 

でも、思考が遅いからって弱いソフトなわけじゃないんだよ。

むしろ本当の最善手を探すにはそれがいいんだよ、と言う思いがあります。

一応、なぜそうゆう考えなのかを「すごく大雑把」に書くとこうなります。

 

[A] 総当り検索速度:速度 300万 / 1sec, 一盤面探索平均40手。

[B] 遅いけど良い検索:速度 10万 / 1sec(速度1/30), 一盤面探索平均30手(検索盤面 3/4)。

だったとします。(数値の設定はすごく適当です)。

 

Aの場合、五手先を読むのに1億0240万0000盤面必要で、所要時間は約34秒です。

Bの場合、五手先を読むのに2430万0000盤面必要で、所要時間は243秒です。

(Bが7倍遅い)

 

Aの場合、15手先を読むのに 1073741824000000000000000盤面必要で (桁の名前は知らん)、

所要時間は99420539259259時間です。

Bの場合、15手先を読むのに14348907000000000000000盤面必要で、

所要時間は39858075000000時間です。

(Bが約3倍速い)。

 

30手読む場合は、Bが500倍の速度になります。

まぁ、65287649700231164383561643835616年かかるんだけどね。

 

だからBのほうが早指しは弱くて、長考は強いんです。

まぁそんな感じです。

( 実際はこんな単純な処理じゃないけど。

実際10手先を読んでる頃には、1手目は3つくらいに絞り込んでます)。

で、私はBが好きなんです。

 

だって、Aの方式って極論を言えば、単に総当り検索を作って、

あとは速いマシンを用意してくださいってことじゃないですか。

プログラマーはとは一体・・・

みたいな感覚を覚えるから。

しかも、探索手数が深くなればマシン速度が100倍になってもほとんど意味ないと言う・・・

 

 

話しにまとまりがないようですけど、今回はこれで終わり。

 

 

電王戦Final - 第三局

依然としてPCが修復されていないのですが…。

対局は先手74飛の所から、コンピューターが激しく勝勢を主張し始めました。

対して、糸谷竜王以外のほとんどの棋士はそこまでの点差はないだろう、との見解でした。

 

読み倒して形成を判断する、大雑把に形成を判断する、

この両者には仕組み上と言うか原理上と言うか、

大きく形成判断内容が乖離することがあります。

 

これは前回にも書いたようにどちらが正しいと言うことではなくて、

局面思考の処理方法の問題です。

 

ちなみに糸谷竜王は今回に関わらず「人間としての形成判断」と「ソフトとしての形成判断」を

いつも切り分けて考えているふしがあるので、ソフトの判断に一概に反対はしなかったものと思います。(彼はいつもそうなので)。

 

 

それと、私が知っている限りの全てのソフトが出す点数は、局面の有利度数ではないです。

手を指す際の選別として数値の大小を取りたいだけで、「どの程度有利か」とはダイレクトに直結していません。

 

例えば、横歩の150点は有利にも不利にもならない些細な差ですが、

千日手ぎみの角換わりや矢倉だと 150点の差はかなりの有利を作れている可能性があります。

【これは局面の重みの差によります】

 

なので、よく「300点差なら別に…」と言うような解説がありますが、あれは根本的なところで点数の意味を間違って解釈してます。

何点だからどうだ、と言うような直接的な意味づけはされていません。

 

また、人間とソフトでは形成評価の判断法が違うのはもちろんのこと、表現法も違います。

さらには根本的なところで「良いの定義自体」が違うことが多いです。

例えば、人間が言う「やや有利」が、ソフトには+4000に見えることもあります。

これはどちらかが間違ってるとかじゃなくて「良いの意味自体」が違うこともあると言うことです。

(※ただし、人間とソフトの評価が大きく乖離した場合、統計的にはソフト側の評価が勝敗を暗示するケースが多いです)  

 

 

さて、今回私が個人的に興味があったのが、

ドワンゴ人工知能研究所所長の山川さんと糸谷竜王のお話です。

話の内容と言うよりは、話のジャンル的に、ですが。

(話の内容は人工知能や哲学などの基礎の部分にも届かない表面的なものでした)。

 

私は以前、人工知能についてほんの少し書いた事があります。

人口知能を作りたいが、人間 (またはその模倣) を作りたいわけではないと。

 

 

またどうも、糸谷さんは西洋哲学の考えを持つ事が多いようで、

自己の認識、心、自我(つまり内的要因)を基点とした外的要因の認識に興味を持ってるように見受けられました。

  (内→外への興味)。  

ただし、おそらく糸谷さんの見識はおそらく深く、必ずしもそれに固執しない考えも強く伝わってきました。

 

山川さんは、通常の理化学、すなわち外的要因から外的要因を理解(と言うより解析とその活用)を目的としてるように見受けられました。

(外→外への興味)

これは仕事も兼ねるのでそうなるのもやむなしと言うところなのでしょうか?

 

私の場合は、外的要因から構築される内的要因について一番興味があります。

(外→内への興味)

これはなんの役に立つかと言うと、おそらく人工知能のうち「もっとも誰の役にも立たない」考え方です。

これは、人工知能と言うより「人口生命」と言うジャンルに近くなる場合もあります。

 

ちなみに内的要因による内的要因の考察、と言うのは原理上存在しません。

(トートロジーのように、「ボール」を問う質問に対し「ボール」と回答され、理解したとみなす場合は別とします)。

 

 

 

さて、こうゆう話は将棋と関係あるの?と言われると微妙なラインです。

これは、人間が自分と言うものを理解していなくても将棋を覚える事ができるからです。

 

しかし将棋プログラミングとなると話は別です。

プログラミングは、きっちりとソースコードで将棋を指す仕組みを記述した上で、

人工知能を動かさなくてはならないからです。

(人工知能は将棋を指す際、自己 (人工知能) に対する理解は必要ありませんが、その理解はプログラマー側が担保する必要があります)。

特に、以前書いた (私が作っているような) 将棋ソフトを作るとなるとなおさらです。

 

 

で、将棋に関わらずプログラミング自体はもちろん哲学への理解はあまり必要ないのですが、

扱う情報に煩雑性が帯びるほど、その整理に理論的な解釈、さらにそれをまとめる論理的な解釈が必要となります。

 

将棋の場合「究極的には」煩雑性はないのですが、

その扱う膨大な処理容量によりわざわざ「煩雑的な思考」を取らざるを得ない場合があります。

 

その煩雑的な思考を使用する際たる将棋プレイヤーが「人間」です。

逆に、Bonanza系統のソフトは、意図的に煩雑性を発生させないように、

 「究極的な」総当り検索を基準にシンプルに問題を解決するように試みます。

 

GPSは、作業可能な範囲、または効率的に稼動すると判断された範囲で、

積極的に煩雑性を取り入れているようです。

私の場合は、さらに煩雑的な思考を論理的整合をもって綺麗にまとめ、効率的に処理を進める考えを持っています。

(この辺がプログラマーにとって手法が分かれるところであり、面白いところでもあると思っています)。

 

そして、それが人工知能と言う分野に直結するのです。

究極的にシンプルに作り上げた動作も人工知能に分類されますが、

煩雑性を持たせた上で論理的にまとめる手順は、まず人間の能 (脳じゃないよ) を研究することでもあります。

 

なぜなら、論理はヒトの内部的都合により発生したもので、

論理的な仕組みを組み込むためには、

それに対する理解、研究、解析が先に必要となるからです。

 

※論理はヒトのいない世界には落ちていないし、

仮に人間より高度な論理的能力を持った宇宙人がいたとしても、人間の論理とは形式的な整合性がとれないため人間には扱えません。

論理とはヒトが自己にとって内的な合理性と整合性をとるために、内的に発生している形式なのです。

(似たような話では、以前宇宙人は将棋と言うゲームを理解できないと言う話もしましたね)。

 

別の言い方をすれば、プログラマーは「意図的に」将棋を指せる宇宙人を作らなくては (産まなくては) ならないのです。

意図的にと言うことは、その宇宙人や、人間が内的に発生させ続ける論理構造に対し、

プログラマー側の理解がなければならないと言うことです。

  宇宙人なら、指し手の意味もある程度理解してくれるし、持将棋の指し分けももっと合理的にやってくれるでしょう、きっと。  

これが人工知能と哲学の結びつきです。

 

 

 

さて、究極的にシンプルなプログラムを作る場合はどうするのでしょうか。

これは論理はほぼ必要なく、必要なのはひたすら理論です。

bonanzaタイプを始め、多くの将棋ソフトはこれに近い物です。(なお完全なシンプルタイプはありません)

 

本当の究極的なプログラムでは、プログラムと言うよりもハードウェアが問題を解決します。

また、本当の意味で問題を解決出来るのは、理論上では唯一このプログラムのみです。

さらに、プログラミングが最も簡略化され、プログラマーが実現しやすいのもこの手法です。

 

ただし、動作が不完全な場合、見当違いの解出しやすいのもこのプログラムの特徴ですし、

資源を最も非合理的に消費するのもこのプログラムです。

そしてまた事実上、莫大な情報量を目の前に、それを完全に作動させる資源と時間は存在しません。

 

 

これは、どちらのプログラムが優れていると言う問題ではなくて、

単なるプログラマーの好みの問題です。

 

例えば私は、莫大な情報量を目の前に、

処理速度と回転数を上昇させて問題を解決するよりも、

処理速度を落とす引き換えに、それ以上に合理的手順を踏み、問題を早期に解決することを好みます。

なので私のプログラムは人工知能と密接に関わりがあります。

 

 

ところで、こんなに長く書いておいて

外的要因から構築される内的要因

の話はしませんでした。

これは将棋には関係がないのですが、機会があれば書こうかな、と思います。

 

電王戦Final - 第二局

PCメイン機が壊れました。

現在ほとんどのことが何もできません。

いつ直るのか、本当に直るのかも見通しが付きません。

 

そっくりそのまま直したいのですが、深刻なマザーボードの故障のようで、

同一のマザーボード、しかも内部のチップセットBIOSまでもが同一のマザーボードを発見してこないと直りそうにありません。

しかも製造中止になってるマザーなので、日本中の中古屋に在庫を確認中です。

マザーの内部シリアル番号まで合わせての問い合わせなので、嫌な顔されまくっております。

あぁ、もうほんと最悪。

 

 

さて、電王戦は第二局が終了しました。バグが発生して終局となりましたが、

対局自体、結果、過程、ルールなどに関しては書かないようにします。

(良い印象を受けなかったので)。

 

 

私のソフトではこのようなバグは (仕組み的に) 起きないので、

実際の所、なぜそうゆうバグが発生したのかは分かりません。

加えて、私は人 (他人) が作った物を参考にせず作ってるので、

人のソフトがどうなってるのか、想像すら付かないことがあります。

 

なので予想ですが、

USIから送られてきた「現在盤面」までの生成過程で、

Selene側でも「合法手」であるかどうかのチェックがおこなわれていたのではないでしょうか?

 

ちなみに私のソフトでは、私はそれは無意味だと思っているので、やったことがないのです。

Selene側の処理は分かりませんのが、私のソフトの仕組みを少しだけ書いてみようと思います。

 

まず、USI (GUIとエンジンを結ぶ通信名) は、

エンジンに対して対局の「初期局面」を送ってきます。

加えて、現在局面に至るまでの指し手が添付されています。

これを組み立てることにより、「初期局面」「現在の局面」「そこまでの手の流れ」 の三点が分かるわけです。

 

私のソフトの場合、この時点では深いことは考えずに、

USIの言うとおりにガチャガチャガチャと現在局面を言われたとおりに組み立てて行きます。

この時点で、エンジン側は、合法手であるかどうかの判断は付きません。

将棋のルールさえ把握してませんし、駒の動き方も知りません。

私のエンジンが知ってるのは、初期局面から現在局面に対しての組み立て方のみです。

 

知っていても意味がないのです。

なぜなら、エンジンはGUI側の命令に立て付くことは出来ないので。

なので、言われたとおりに駒の位置を動かすのみです。

 

 

少し話はそれますが、もし、相手が非合法手を指していたとしても、勝ちを宣言することはおろか、

エンジンはGUIに対し、抗議することさえ許されません。

したがって、現在局面を作るまでの地図が、非合法であるか、合法であるかのチェックをするのは、エンジンにとって無駄な作業です。

(もっとも私のソフトの場合、他の所で無駄なことをいっぱいやってます)。

 

初手で52飛車(王手)の移動が記載されていた場合、

28にある飛車を、52の位置に移動せねばなりません。

それは将棋のルールでもなんでもなく、そう書いてあるからエンジンはそうしなければならないのです。

 

とは言っても「普通は」バグがない限り、GUI側が将棋のルールを把握し、ジャッジするものなので、変な命令は送られて来ません。

普通の将棋で言うところの、記録係や審判みたいな役目をすべてGUIが引き受けます。

GUIがそうしろと言ってくるからには、GUIが正しいのです。抗議をする権利もないレベルで。

 

(※現実上の問題では、GUIが変なことをやってくるなら、「エンジン作者の私自身」が「GUIの作者」に対して抗議します。「おたくのGUI、将棋のルール間違ってますよ」、と。)。

 

 

話を戻して、それが終わると、現在の局面が完成します。

 たぶん、おそらくですが、Seleneは、

 このただの局面組み立ての時点で、駒の動き方をすでに知っていて、

しかもそれを照合していたのでしょう。たぶんですが。

 

その時「角成らず」は、不必要との考えから、

Salene側には合法手の一覧には加えられていなかったのでしょう。

その結果、情報の辻褄が合わず、なんらかのバグが出てしまった・・・。

 

 と言うことなのではないでしょうか。

 

 

 さて、私のソフトは、この状態から将棋のルールの把握に入ります。

駒の動きを教える際、若干厄介なのが、飛車と角、香車です。

なぜならこれ、駒単体では動ける位置を決めれないからです。

金や桂馬などは、「ここに動ける、味方の駒があったら動けない」と言う単純な命令で済みますが、

飛角香に関してはそれはダメで、先に盤面全体の把握が必要で、

それに沿って動ける位置が決まります。

 

そんなわけで、私のプログラムでは、

「合法手全部出しますよルーチン」に対して盤面を送りつけると、

その盤面内の、全ての駒のその動ける位置がリストになって一気に返ってきます。

ちなみに、成ると成らずは別の動きとして算出されますが、

無駄っぽい動きに関しては、盤面検索ルーチンで一括削除しています。

 

私のプログラムでは、この時に合法手と、非合法手の切り分けがおこなわれます。

と言うことでこの段階 (合法手全部出しますよルーチン) では、

飛車成りと、飛車成らずの両方の動きは認めますが、

42桂成らずのような非合法手は削除されます。

(削除と言うか、その手の存在を最初から発生させません)。

 

ちなみに飛角歩などの成らずに関しては、一撃で検索ルーチンから削除されますが、

検索の途中で打ち歩詰めが発見された際は、成らずの動きが解禁されます。

 

 

なんで、記事でここまで書いたかと言うと、

以前、飛車を正しく動けないソフトが予選にエントリーされていて、

しょうがないから、飛車は1マスずつしか動けない、と言う応急処置(?)を取っていたソフトがあるんですよね。

 

世の中にはそうゆうバグ(?)もあるんだな、と言うお話でした。

 

 

 

 

 

 

 

 

 

電王戦Final - 第一局

一年ぶりの更新でございます。

 

見ましたので感想を書いて見ようと思いました。

なお、私はプログラマーですので、開発者側の視点で書くことが多いです。

将棋についての解説や、私の見解も書きますが、間違ってたらすみません。

 

まず、将棋の感想ですが、

Aperyは、指してにランダムを入れてるとのことですが、これは激しく裏目に出たと思います。

ランダムが発生する条件や、ランダムが許容する範囲は分からないのですが、

指し手の特徴から言って「ソフト特有のわざと最善手を外した手加減の手」と言う印象をつよく受けました。

 

それも一つではなく、いくつか感じました。

28手目 - 65銀

34手目 - 44角打

54手目 - 22飛

など。

 

特にそれを感じたのは24手目の44角です。(これにより、先手は無条件で歩を突けました)

どうもこれ、後手にとってはデメリットこそあれ、メリットがなかったようです。

敗着なのかどうかは分かりませんが、大きな敗因の一つだと思います。

 

さて、指し手をランダムにすると言うことはどうゆうことなのかを少し書きましょう。

まず、ソフト自身が思った「最善ではない」と言う手をわざと指すと言うことです。

これは、評価値による機械的な判断でおこなうことはとても難しいのです。

なにしろ最善ではない (わざと点が低い手を指す) のですから。

現在のほぼ全てのソフトは、人間と違い「総合評価点」と言うだた「1点のみの基準」により指し手を決定するので、

その内容については一切吟味できず、ソフト自身も意味が分かっていないのです。

 

ランダムを採用する理由としては、一直線に決め打ちしない、と言うメリットがあります。

これにより、毎回違った将棋が実現できます。

 

しかし、

A 「aもbも将棋として成立する」

B「分かりにくいが、aは成立し、bはギリギリ成立しない」

この時、Aの場合なら構わないのですが、

Bの時ランダムでわざとbが選択される可能性があるのです。

 

この時、人間はあらゆる基準や判断から。「AとB」を見分ける事が可能なことが多いです。

逆にソフトは、「AとB」を見分けるすべをほとんど持ちません。これは「評価値」と言う「1点のみ」の基準から指し手を決めるので、人間のような「あらゆる基準」を持たないからです。

(そう、ソフトはAとBの時点で見分けが付かないので、どこまでが定跡なのかな?と言う判断も付かず、ランダムのONとOFFを切り替えるタイミングを判断することも極めて難しいのです)。

 

さて、ランダムを多く採用すれば、わざと最善手と違う差し手を指し続けると言うことになります。

定跡内の(Aの)選択のような、aでもbでもどっちでもいい、と言うならそれでいいのですが、

ある程度戦いが近づいている中(Bのような状況の中)、わざと最善手と違う手を何度も指すのは、ソフトの形勢にとってかなりつらいことになります。

 

私の見たところによると、今回の対局はそれが発生したように見えました。

(Aperyの仕様は知らないので本当は違うのかもしれませんが、私にはそう見えました。ソフト特有のそうゆう手でした)。

 

 

さて、ではどうしてランダムとは言え、こんなに強いソフトが悪手や疑問手を連発することがあるのでしょうか?

 

その答えは「総当り基準」の検索法が大きく関わってきます。

将棋と言うのは、どんなにマシンが高速で、ある程度検索を枝狩りしても、

検索しきれないのが普通だからです。

 

いやコンピューターが数億盤面も考えれば検索できるでしょ?

って思う人も多いと思うかもしれませんが、純粋な総当り検索を採用すると、

たった数億盤面程度では無理の極みです。100億でも無理です。

と言うよりそこまで行くと単純な総当り検索は99.9999%以上が無駄な処理と言わざるを得ません。

(※ 完全な総当り検索10億盤面は、GPS最新版の3000万盤面検索より弱いです。GPSは激しく枝狩りされてますが、3000万でも無駄な検索の塊です)。

 

話を戻しまして、その時、わざと変な手を指しても、検索した範囲の中でごまかし続ける (損を先延ばしし続ける) ような状況が発生 (盤面上可能) だとすると、

具体的に検索範囲内に損が表面化してこないので、

「(人間から見て)わざと変な手指してもあんまり評価値さがらないじゃーん」

と言うことになるのです。

ソフト側は「じゃあランダムでちょっとくらい点の低い手指しても大丈夫だよねー」と言う事になるのです。

 

これは人間の感覚で言うと、すぐ気づく場合が多いです。

なぜなら、

損を先延ばしにしようとしてるのが実感できるからです。

人間はなんのために、どういう意味の手を指してるのか、と言うのを理解してから指します。

「このままだとやられちゃうからなんとかしないと」

と言う趣旨で指すのが人間です。

だから、具体的に損が実現する前の段階から「嫌な雰囲気、嫌な感覚」と言うのを

ビンビン感じるのです。

 

逆にコンピューターは、検索範囲内で損が実現してなければ、

当然「損をしてない点数」が算出されるわけで、

点数が下がってないから大丈夫なもんは大丈夫、と言う理由で指し手を決めます。

そこに将棋の内容や、指し手の内容に対する理解はないのです。

 

これは、どちらが正しいのか、と言うのは実際には誰にもわかりません。

なぜなら、ソフトにとっても人間にとっても「検索や読みの外側」だから、

それは実際にはどうなるか分からないのです。

でも「大雑把に考えてたぶん損」と言う考えを適用できるのが人間であって、

「明確な検索(読み)で実現しない限りは一切判断出来ません」と言うスタイルを適用できるのがソフトなのです。

 

これについて、どちらが将棋(指し手)にとっていいのかは、分かりません。

と言うより、コンピュータは大量処理を得意としているので、根本的な長所の違いの問題なのでしょう。

指し手を考えるときは、自分の長所である得意な方法で指し手を考えるのが良いと言うことなのでしょう。

 

そうゆう将棋に対する根本的な考え方が違うからこそ、

ソフトと人間では見つける手が違い、時にはソフトが良い手を発見し、

時には人間が良い手を指すわけです。

(手を見つけるまでの経路、そして良し悪しの基準が全然違うわけですね)。

ちなみに、たんいt評価値の「1点基準」でしか考えられないことについては、現在のソフトの大きな弱点だと思っています。

 

さて、話は長くなりましたが、

その「悪い癖」があからさまに出てしまったのが34手目の44角だったのではないだろうか、

と思っています。

 

 

 

では、話を戻します。

28手目の65銀についてです。

これはどうも、人間にとっては悪手のようで解説者から悪いと言われ続けてましたが、

冷静に棋譜だけを見ると「あり得る手」のようです。

 

一応将棋をしてない人にも説明すると、「指しにくい局面」と「将棋の優劣」は別にあります。

この「指しやすい」と「指しにくい」はコンピューターにはあまりそうゆう概念はなく、

どちらかと言うと人間特有の感覚です。

 

どうゆう時にそうゆうことが発生するかと言うと、色々あるのですがたとえば一例をあげると、

先手は少々間違っても形勢はほぼ影響はない、

しかし、後手は一つ間違うと形勢を大きく損ねる、

だけど後手が正しく指すと全くの互角である。

つまり後手が綱渡りの連続を強いられたとします。

もちろん人間の感覚だと「先手よし」です。

 

人間は感覚でも形勢を評価するので、

「指しやすい」と「有利」を混同してしまうことがあると言うことです。

(逆にソフトは「指しやすい」を基準に優劣の予測が出来ません)。

 

人間同士でも、持ち時間の長い対局や、研究局面などでは、

あまり惑わされることがないようです。

なので、今後タイトル戦などで65銀が出てきても不思議ではありません。

(ただしいくら形勢は互角と言っても、指しにくいものは指しにくいし、他にもいい手は一杯あるし、メリットがあるかと言われるとあまり多くないと思うので出てこない可能性のほうが高いかもしれません。将棋としてはあり得ても、公式戦ではあり得ないかもしれない手、と言う位置づけでしょうか)。

 

さて、 54手目 の22飛 についてです。

この将棋の、目に見える(棋譜として実現した)決定的な後手の損は、

62手目の77と金(龍を取った手)です。

これは、58手目に45角と出たので、攻め合いが確定し、

ここで、45角とせざるを得なかったのは、22飛のせいじゃないだろうか?

と言うのが私の考えです。

つまり、62手目に77と金にしないための分岐点まで戻すと、

54手目の22飛まで遡るのじゃないだろうか?と言うように考えています。

 

 

このようにソフトは、「形勢的に」成立するのか成立しないのか、

よく分からない微妙な手がたくさんあり、

なおかつ「一時的にちょろまかす」ような手もいっぱいあるとき、大きく検索を消耗し、

検索自体も足りなくなります。

これでも、完全に評価値に従った「最善手」を指す場合は、

ここまでこの問題が表面化することはありません。

 

こうゆう状態のとき、わざとランダムにより「評価値的な次善手」を指すと、変なことが発生しやすくなるということです。

(だいたい、わざと評価値的な次善手 を採用した場合、無意味な手や、わざわざやらなくてもいい手(44角打)のような手を、手と手の間に挟んでくるケースさえあるのです。ランダムの導入は考え物です)。

 

ここまで、第一局の内容と、私のソフトに対する見解でした。

ランダムどうこうは、私は本当はAperyの仕様を知らないので、間違ってるかもしれません。

が、直感的に私にはそのように見えました。

 

 

 

さて、終局付近のソフトの無駄な王手ですが、

これもこれで書くと長くなるのですが、

一言で言うとこれは「将棋に対する考え方」の問題です。

人間からすると、「めんどうくさい、不愉快」な手かもしれませんが、

それは人間から見てそうなのであって、ソフトから見ればそうではないと言うことです。

また、人間の都合は将棋自体には関係なく「めんどうくさい」と言うのは、

将棋盤外の都合だということです。

 

ソフトとしては、基本的には最短手数の勝利が美しくなり、

負ける場合は1手でも引き伸ばすことを良しとするケースが多いです。

これは詰め将棋の考え方に似てますね。

絶対に必ずではありませんが、どっちかと言うとソフトはそのような方針のもと、棋譜を作ります。

 

電王戦見ました

第一局、菅井 対 習甦 の対局すごかったです。

私自身、あまり棋力が高くなく、24でR1000付近なのですが、習甦のごまかしようもない強さはさすがと思いました。

 

前回の電王戦でもソフトは3勝1分と高い結果を出したのですが、

今回は、その強さがはっきりと分かる形で勝利したと思います。

たまたま勝ったのか、強いから勝ったのか、

今回の対局では強いから勝ったと言える、鬼のような強さでした。

 

それを実装するのって、けっこう難しいんですよね。

勝つだけ勝てばいいみたいな将棋ですと、

基本はマシンの検索にまかせて総当り検索を大暴れさせれば、大筋はそれでよいわけです。

でもそれだと、まともな将棋にはなりにくいし、

強いから勝ったとも言いにくいような将棋になりがちなんですよね。

 

今回の習甦は本当に見事だったと思います。

なにより、貫禄の安定した動作を見せてくれました。

実はこれが一番重大かつ難しいところだと思うのですが、

開発者である竹内さんはそんな不安は見せておりませんでした。

それどころか、将棋の内容にこだわっていたご様子です。

すごいですね。やることをやっている証拠なんだと思います。貫禄です。

 

 

第二局のやねうら王は、そのへん少し慌てている様子もあるようです。

これが普通だと思います。ましてや、初電王戦でしかもバージョンアップなしなら特に。

(プログラマーにとってバグが出るのは顔に泥を塗るような失態ですからね・・・)

 

どうやら、そのへんドワンゴが両者の都合をうまく取りまとめられなかったようで、

なにやら軽い騒動になっているようですが、

私は勝敗は気にせず、純粋にその将棋を見せてもらうことにしました。

他の対局はどちらかと言うと棋士側を応援していたのですが、

今回は完全に第三者的な立場から将棋の内容だけを見ることにします。

どちらにも問題があるので素直に応援できないと言うのが本音ですね。

 

 

私も早くせめて人様に見せれるソフトにしたいのですが、

本業としてやってるわけではないのでいつになることやらか・・・

 

ログインIDを忘れて放置してたとは言えない

ディスプレイをヤフオクで落として素晴らしい解像度となりました。

 

電王戦 (ソフトとプロ棋士の対局) に出場するやねうらおさん(ソフト開発者)の話を読んできたのですが、

共感できる部分がいっぱいありました。

 

とある開発者はコンピューターは名人より強いと断言してるようですが、

私にはとてもそうとは思えません。

そもそもソフトは将棋がなんたる物かすら理解してません。もちろん形勢判断もおかしいです。

ソフトが勝つのは純粋に読みのゴリ押しです。

 

開発者も棋士側も、高レベルのアマチュアもそうだと思うのですが、

「勝つ = 強い」 とはとても思えないのです。

なんと言うか、人間が、「こりゃ強い」と感じるのは、勝敗じゃないんです。

特にその世界の中に入っているとそうなると思います。

 

まぁ、人間が明確に目で見て確実に確認出来て、明確に分かるのは

「勝敗だけ」だから勝敗に目がゆくのでしょうけども・・・

勝敗は単なる強さを測定するほんの一要素の一つであって、

困ったことに人間ってやつは、それ以外の強さの測定能力があまり高くないのです。

 

 

将棋と言うのは、実は99%以上が将棋以外の要素から成り立っています。

そもそも、

戦う、攻める、守る、大将を討ち取る、勝つ、負ける、有利になる、不利になる・・・などなど、

こうゆう根本的な将棋の概念自体が人間特有の物で、

将棋は99%人間特有の概念です。

 

人が槍を持って相手の心臓を突き刺した。

それを見て「佐藤と鈴木が戦って鈴木が勝ったぞ!」と誰かが言った。

とっても人間らしい概念のかたまりだと思います。

少なくとも物理現象を説明した物じゃないです。

 

じゃあ将棋ソフトはどうなの?と言うと、

ほぼ全てのソフトは、攻めるも守るも、その他何も教えていません。

なぜかと言うと、それを教えるなんてとてもとても・・・って感じだからです。

ただひたすらに確実な読みと、適当な評価計算の連続です。

 

ただし、私のソフトは多少教えてあります。

それは評価点を様々に複数出すと言う点だけですが。

自分が取れる駒、取られそうな駒、別々に切り分けて個別に点数が出せるので、

一応攻めの概念と守りの概念は若干ですが導入されていますし、その度合いも調節できます。(これ以上やろうとは思いませんけども・・・)。

 

ただ、人間の頭の中がどうなっているか、

と言う事に比べると、もう比べ物にならないくらい複雑なことになってますね。人間は。

もうなにがどう複雑なのかも分からないくらい複雑です、人間は。

 

その結果として、人間は実際に読むべき盤面を恐ろしく効率化しています。

 

そのため、コンピューターと人間では脳みその構造その物が違うので、

人間のやりかたをそのままソフトに導入するのが正しいとなるわけでもありません。

得意分野がありますからね。

少ない労力でそれに見合った合理的な仕事を考え出すのは人間の得意とする所ですけども、

全部データを読み込んで総当り検索なんてどう見てもコンピュータのほうが得意です。

 

ですので、ソフトはなにもかも人間の真似をする必要は全くないと思っています。

(が、現時点ではマネをしなきゃならないのに難しすぎて出来てない部分のほうが圧倒的に多いと思います)。

その結果として、ソフトと人間では将棋に対する考えかたというか、

将棋がなんであるのか、と言う段階から人間とはそれを異にします。

もちろん、手の考えかたから盤面評価その他もろもろ、全部変わってきます。

将棋の解説なんてもってのほかですね。

(ただし、ある程度棋力がある人に対してはいろいろな手の流れを表示すればそれでよいので、そうゆう意味では難しくありません。これは人間とソフトが将棋という物を共通の「中間言語」として扱えると言うことです。将棋初心者には通用しません)。

 

 

さて、やねうらおさんと見解を少し違うところがあります。

やねうらおさんはこう言いました。

「人間が少ない手数で効率的に考えれるのは経験があるからです」と。

それはかなり私の考えとは違います。

経験と言うのは、人間が持ち合わせるものすごい数の能力のうちの、ほんの一つだと思います。

だって、人間に将棋を教える時、「これは攻めの手だよ」の一言で伝わるんですよ。

もうすでに将棋を知る前から「攻め」とか知ってるんです。それで通じるんです。すごい。

それどころか、「王」を取ったら勝ちだよ。で伝わるんです。

すでに勝ちとか負けとか知ってるんです。すごい。

勝ちとか負けは、人間の本能的な概念なのでしょうね。

それを人間が形あるゲームにして将棋が生まれたのでしょう。

将棋その物が人間の土俵なんです。

宇宙人に将棋は指せませんし、きっと勝敗の意味も分からずなんのゲームもできません。(出来るかもしれないけど)。

 

そんなわけで、将棋を指してる人間の頭の中は、きっとものすごい数の概念の切り分けが発生してるんだと思います。

そして、概念以外にもものすごい数の能力が発動してるんだろうと思います。

経験、というのは、その能力のうちのたった一つなんでしょう。

それが目標の設定とその効率化に繋がるんだと思います。

 

私には一つの思いがあります。

それは人工知能を作ることです。(まず無理なのですが。実際にも作ってません)。

人間が100万の項目(概念や能力)を無意識に使い、物を判断してるとしたら、

そのうちの重要部分の20や30でもソフトが扱えたら良いなと思っています。

もちろん人間のコピーを作りたいわけではなくて、コンピューターの長所(効率的な性能)と共存する形でです。

その時、両者が噛み合って爆発的な性能の向上が見られれば、それを作るのがどんなに楽しいことでしょうか。

 

そんなわけで、私は評価点を様々な角度から出すソフトをプログラミングしているのでした。

あれ、なんか書き終えてみるとただの落書きみたいな文章になっているような。