マイロ将棋(26)教師データの改善結果を確認中

改善した教師データが本当に正しく反映されているのか、そして教師データ改善によって本当に棋力が上がるのかを確認しようとしています。改善後の教師データは改善前と比べて少ししか変えていません。改善前はマイロ将棋0.1で40局対局した結果を勝率データとしていたのに対し、改善後は改善前のデータに加えて、学習済のモデルで10局対局した結果を合わせた勝率としています。

 

教師データとする勝率の内訳

大きく変えてはいないので、強くなったとしても、少しだけだと思います。でもその少しだけが確認できれば、データの更新を積み重ねることで棋力が上がることに期待が持てそうです。

 

マイロ将棋(25)教師データの改善

教師データの改善に取り組んでいます。教師データを用いての学習を繰り返した結果、誤差が縮まることはわかったのですが、あまり強くならないという問題に悩まされてきました。王手されたら負けを回避し、それ以外はでたらめに指すというマイロ将棋1.0との対局では、多く学習したものほど勝率が低くなるようでした。

この問題を解決するため、王手している局面を除外した教師データで学習させるということもしてみましたが、一定の効果は確認できたものの、これはこれで、あまり王手をしなくなってしまうという問題がありました。

以前から教師データを改善すれば解決するだろうとは思っていたのですが、実施を躊躇していました。実施するには、それなりの強さを持った思考ルーチン同士で対局させる必要があり、データ作成に膨大な時間が掛かるからです。これまで作成した教師データは、でたらめに指すだけのマイロ将棋0.1同士での対局結果です。でたらめに指すだけなのでほぼ思考時間は掛からず、だいたい8時間で400万局くらい対局できていました。1局面あたり40局対局させて勝率を求めていたので、400万局の結果で10万局面分の教師データができます。計算すると1局あたりの実行時間は0.0072秒です。学習したモデル同士の対局だと1局あたり数秒から数十秒程度掛かり、とても現実的な時間では教師データを作れそうにないと思っていました。

しかし、学習しても強くならない問題を解決するためには教師データを改善すべきという思いが強くなり、改善に着手しています。処理を速くするために今回Python/C APIというものを使って、主要な処理をCの関数にする変更を加えました。複数の値をやり取りする方法がわからず苦労しましたが、何とかPython/C APIを用いて実行できるようにはなっています。現在は1時間で1万局対局できるくらいで、1局あたりだと約0.36秒です。マイロ将棋0.1と比べると約50倍掛かりますが、かろうじて現実的な時間で教師データを作成できるようになったかなと思います。

マイロ将棋(24)過学習発生具合の確認

過学習の発生具合確認を続けています。同じデータでの学習量を増やせば、過学習によって誤差が悪化するはずだと思うのですが、なかなかそうはなりません。10万局面分の学習データを一定量学習した後に入れ替えているので、そこで過学習によって悪化した内容がリセットされるようです。同じデータの学習量を増やすほど、一時的には誤差が悪化するのが以下のグラフのギザギザの縦幅で読み取れます。また同じデータの学習量を増やしても、最終的な学習結果は良くも悪くもならず、どの場合も同じくらいの結果に収束していくように見えるところが興味深いです。このグラフの場合だと学習量を元の4倍にした結果が、1500万局面分学習したグラフの一番右端では、誤差が10.0から11.0の間くらいです。6倍、8倍、10倍の場合も10.0から11.0の間くらいでほぼ一緒です。この学習では4倍よりたくさんの学習をさせてもあまり効果が無さそうです。もっと極端に学習量を増やしたら変わるのかもしれないですが。

過学習の発生具合確認

 

マイロ将棋(23)過学習発生具合の確認

過学習の発生具合を確認します。前回までの学習率の確認では過学習の影響を抑えるため、教師データ毎の学習量を少なめにしていました。今回は過学習の状況を確認するため、単位教師データあたりの学習量を増やして誤差がどうなるかを確認してみます。学習量を増やすので、過学習が発生しなければ、結果は前回よりも良くなるはずです。

 

前回の学習率0.1のデータを元に、単位局面あたりの学習量を2倍、3倍と増やして誤差の減り方を確認したのが以下のグラフです。4倍くらいまでは誤差が減る傾向がありますが、5倍のデータは4倍とほぼ変わらないか少し悪い結果で、このあたりでは過学習による悪影響が出ていると考えられます。

 

過学習発生具合の確認

 

10万教師データ毎に学習データを入れ替えているため、途中で過学習が発生しても新しいデータを学習することで誤差は再び小さくなるのかなと思います。学習量を増やしたことで誤差が悪化するというところまでは明確には確認できていません。これ以上確認してもそれほど得られるものはないような気もしますが、学習データをもっと増やしたら誤差が悪化するのかというところをもう少し確認してみます。

 

マイロ将棋(22)学習率と誤差の減り方

前回、学習率による傾向を確認するため、800万局面分まで学習を進めましたが、それでも違いがわからなかったので、1500万局面分まで学習を進めました。ですが結果は前回とあまり変わらず、学習率の違いによる大きな差は確認できませんでした。しいて言えば、学習率の小さい0.05の結果が他よりも若干悪いですが、局所解に陥ってしまって、誤差が減らなくなっているというわけではなさそうです。ここまでの結論として、このマイロ将棋では学習率にはそれほど大きな影響を受けないと考えておきます。

学習率と誤差の減り方の関係

学習率と誤差の減り方の関係(拡大図)

 

マイロ将棋(21)学習率と誤差の減り方

前回、学習率の違いについて調べましたが、0.05、0.1、0.15と3種類実行した結果は大きくは変わらない結果でした。結局、学習率は大きめの方がよいのか、小さめの方がよいのかがまだわからないので、もう少し学習を進めています。そのうち差が出てくるだろうと思って進めているのですが、800万局面分のデータで学習した後もあまり大きな差は出ていません。強いて言えば学習率の小さい0.05の誤差の縮まり具合に若干陰りが出てきているようにも見えますが。この先学習を続けてもずっとこの傾向が続くのか、差が出てくるのかわかりませんが、まだ学習データはあるのでもう少し続けてみます。

 

学習率と誤差の減り方の関係

学習率と誤差の減り方の関係(拡大図)

 

マイロ将棋(20)学習率と誤差の減り方

以前、過学習について確認しようとしていましたが、その前に学習率について確認します。これまでのところマイロ将棋では、最適化手法としてSGD確率的勾配降下法)を使用しています。ディープラーニングでは、教師データを元にパラメータの調整を行いますが、調整の仕方としていろいろな方法が考えられています。SGD確率的勾配降下法)は調整の仕方としては基本的な方法です。マイロもあまり詳しくは理解できていませんが、教師データとの誤差が大きいほど教師データに近づくように大きくパラメータを調整するという方法です。違っていたらすみません。他の最適化手法としては、モーメンタムSGD、ADAM、RMSProp等があり、いろいろと試してはみたのですが、これまで試した結果ではマイロ将棋ではSGDが最もよく収束するようです。扱うデータの性質によっても、どの最適化手法が適しているのかは変わると思います。

 

SGDには学習率を表すαという設定があって、この設定によって一回の学習でどのくらいパラメータを動かすのかを決めることができます。αを大きくすると一回の学習で大きくパラメータが動き、評価する結果も大きく変わります。大きく動くので少ない学習回数で教師データに近づきますが、モデルが教師データに近い値を出せるようになってくると、パラメータを動かしすぎることで逆に教師データから遠ざかってしまうということも起きてきます。そうなったとしても次の学習でまた教師データに近づくように調整が入るので、結果的には収束に向かっていきます。

 

パラメータを小さくすると、一回の学習で少しだけパラメータが動くようになります。少ししか動かないので、教師データに近づけるためにはたくさんの学習が必要になります。モデルが教師データに近い値を出せるようになってくると、パラメータを動かしすぎて教師データから遠ざかるということが無くなってくるので、その分早く収束します。

 

たくさん学習することを前提にすればαの値はできるだけ小さくした方が良いのかなと思いますが、αを小さくすることで局所解から抜け出せなくなってしまうのではないかという点が気になっています。本当はもっと誤差を縮められるパラメータがあるのに、調整を少しずつしかしないと、もっと誤差が縮められる場所に到達せずに、別のあまりよくないところで調整を続ける結果になってしまう気がしています。

 

簡単に結論が出るものではなさそうですが、α値により学習結果がどのように変わるのかを確認してみました。CNN(持ち駒分離)のモデルでα値を0.15、0.1、0.05に設定してそれぞれがどのくらい誤差を縮める結果になるのかを調べた結果が以下のグラフです。過学習の影響を抑えるために、教師データ毎の学習回数は少なめにしています。

 



 

ここまで試した結果では、α値が大きいほど、初めの内はよい結果になっています。小さいα値の0.05の方も、初めの内は誤差が大きいですが、学習を進めるにつれて着実に誤差を縮めています。局所解につかまる場面には出会っていないようです。