2020-12-11 20:00:00
タグ: 将棋日記

将棋ウォーズ2級に昇級しました! 3級から2級になるまでの勉強法

2020年12月10日に将棋ウォーズ2級に昇級しました! 3級から2級になるまでにやったこと、どのくらいの期間かかったのか、詰将棋、定跡はどのくらい勉強したかなど振り返りも含めてまとめていきます。 3級から2級になるまでにやったことで効果があったと感じたのはこの3つです、「四間飛車の定跡勉強」、「詰将棋(3手詰め)」、「チェスのタクティクスをする」

将棋なのにチェスの勉強が効果があったと感じるという他とは違ったアプローチがありますが、そのあたりも含めて記述していきます

目次

2級になるまでにかかった期間

2019年10月に将棋をはじめました。 将棋ウォーズは30級から始まり、最初は勝つたびに昇級しますが、ある程度の級位まで来ると1度勝っても昇級しない状態になります。 そのある程度の級位というのはおそらく6級以下程度です。

人によって違いがあって、強い人であれば4段くらいまで勝つたびに昇級・昇段する人もいると思います。

おそらくほんとに将棋始めたばかりの人は、おそらく6級、5級で一度止まります。

私の場合は5級で止まりました。

その後4級、3級、そして今回の2級昇級までの時系列は下記のようになります。

2019年10月5日 初将棋ウォーズ(この後5級で達成率高止まり)

2019年10月27日 3切れ4級昇級

2019年11月3日 10切れ4級昇級

2019年11月6日 10秒将棋 3級昇級

2019年11月23日 10分将棋 3級昇級

2020年1月13日 3分将棋 3級昇級

2020年12月10日 10秒将棋 2級昇級

3級から2級になるのになんと1年と1ヶ月もかかりました

10秒将棋

2級に昇級したのは10秒将棋が初めてでしたが、私は10秒将棋のほうが相性が良いようです。

10秒将棋で2019年の11月に3級になって以降ほとんど10秒将棋は指してなかったのですが、2020年12月に入って10秒将棋を再開してみたら、割とすんなり2級になれた気がします。 10切れ、3切れは時間切れ負けがあまりにも多すぎるんですよね。

10秒将棋のほうが時間切れ負けがないので、無理な手を指さなかったり、落ち着いて指せるので自分には向いているようでした。 なぜ1年近く10秒将棋やっていなかったのか。。もっと早めに10秒将棋をメインにしておけばよかったなと思っています。

2級になるまでにやったこと

2級になるために役に立ったなと思ったもののみかいておきます。

  • 四間飛車の定跡勉強
  • 詰将棋(3手詰め)
  • チェスのタクティクスをする

四間飛車の定跡勉強

2級への昇級時はほとんど居飛車を指していましたが、3級になりたてくらいの頃は一時期四間飛車を3ヶ月ほど指していました。 このときに四間飛車だけ定跡を勉強しました。

四間飛車の勝率は結局悪かったので、振り飛車はやめてしまったのですが、そのときに覚えた四間飛車の定跡が自分が居飛車側になって攻めるときに非常に役に立ちました。

将棋ウォーズは四間飛車使ってくる方が結構いるので、四間飛車の定跡を覚えていると有利かなと思います。

自分の場合は46銀左急戦(斜め棒銀)を使っていますが、自分が3級ですので相手もそんなに定跡詳しくない方が多いようで序盤でかなり優勢になることが多かったと思います。

ただこちらは船が囲いで薄いので逆転されることも多かったですが。。。 そこはやっていくうちに受けを覚えて、少しずつ勝率が上がっていったと思います。

詰将棋(3手詰め)

最近は全然やっていないのですが、詰将棋は3手詰めハンドブックをそれなりの数周回していました。

毎日のようにやっていたのが、2020年の6月あたりです。

3手詰めハンドブックと3手詰めハンドブックⅡを合わせて30週くらいはしていました。 大体200問を30分以内に解けるようになっていました。

一番早いときは200問を17分で解いていましたが、もはやこれは毎日やっていて答え覚えてるので良いのかどうかはわかりません。

とりあえずこれで実戦でも3手詰めであればすぐに見えるようになったので効果はあったかと思います。

使っていた問題集はこちら

チェスのタクティクスをする

これはおそらく普通に将棋勉強してる人とはだいぶ違う勉強法かとおもいます。

でもこれが将棋の棋力アップにかなり貢献していたように思います。

チェスのタクティクスを始めたのが2020年の9月からだったのですが、その後10月あたりから将棋ウォーズの達成率も伸びるようになって来ました。

チェス自体ももともとやっていたわけではなく本格的に始めたのは2020年の9月くらいです。

将棋って割打ちの銀とか、ふんどしの桂とかそういう駒得の手筋がありますよね。将棋ウォーズだとエフェクトが出るのでわかりやすい。

でもそれを勉強する場所って実戦以外にあまりないんですよね。 もしかしたら、次の一手問題集とかにあるのかもしれませんが私は読んだことないので、そういった手筋を勉強する場が私はありませんでした。

そこでチェスのタクティクスです。

lichessというサイトで、タクティクスという将棋で言う次の一手問題を無料で解くことができます。

lichessに関しては過去記事でも言及しているので、チェスに興味ある方はこちらも参照ください。 チェス(Chess)が遊べる、学習できるサイト lichess がおすすめ! | なぎなぎブログ

おそらく実際のチェスの対局で出てきた、両取り(フォーク)、田楽刺し(スキュア)、ピン、開き王手(ディスカバードアタック)などの手筋が発生する局面をAIが選んで生成しているので、問題数が豊富です。

チェスの場合将棋よりも駒得の効果が顕著に出ます。 なのでほとんどの問題は駒得問題です。

なので答えが割とはっきりしていてわかりやすいと感じます。このあたり初心者でもかなりとっつきやすいですよね。

以前こんなツイートしてました

将棋の場合は、駒得だけではなく、駒効率だったり、玉の硬さだったりとか色々あって難しいです。 将棋ウォーズの次の一手問題とかもやるときはありますが、わりと私には意味がわからないことが多いです。

このあたりの感覚がわからないから将棋が弱いというのはあるかもしれませんが、それが今の自分の課題だったりするのかなぁとは思いますが。

とはいえ駒得も将棋の形成判断で重要な要素で、一番わかり易い要素だと思います。その手筋のチェスをやりながら楽しく学ぶことができたと思っています。

チェスをやったら将棋も強くなるのか?

チェスをやったら強くなったということを上述しましたが、これはおそらく初級者のうちだけかと思います。

チェスも将棋も、両取り(フォーク)、田楽刺し(スキュア)、ピン、開き王手(ディスカバードアタック)などの手筋など共通の手筋があるので、その部分を勉強すればおそらくチェスも将棋も両方強くなるのではないかと思います。

ただこれは初級者のうちだけで、棋力が上がれば当然将棋、チェスの専門的な領域が重要となってきます。 各専門領域の知識なので、それを別の領域で活かすことはおそらく難しいでしょう。

さいごに

将棋ウォーズ3級から2級になるまでにやったことを、自分なりにまとめてみました。

チェスをやったら強くなったという普通とは違うアプローチでしたが、もし同じように初級者で実はチェスにも興味あるという方がいれば、参考になればと思います。

2020-11-16 18:00:00

将棋ソフト開発 Week4 ~ 自己対局してみる! ~

プログラミングの勉強がてらに、将棋ソフト開発をしています。4週目となりました今回は自己対局と、評価関数の部分にニューラルネットワークを使っているのでその解説をしています。4週目でやったこと、進捗報告、これからやることについて記載していきます。

これまでの記事はこちら 将棋ソフト開発 Week0 ~ 将棋アプリ開発始めます ~ | なぎなぎブログ将棋ソフト開発 Week1 ~ 将棋のコア部分を作る ~ | なぎなぎブログ将棋ソフト開発 Week2 ~ USIに対応する! ~ | なぎなぎブログ将棋ソフト開発 Week3 ~ 評価関数、探索部 その1 ~ | なぎなぎブログ

目次

進捗報告

今回は動画にしました! 軽く技術的な解説もしているのでよかったら見てください。

4週目でやったこと

  • 評価関数の修正
  • 探索部の修正

評価関数の修正

前回の記事で書きましたが、手番情報をベクトルに含めていたので、それをなくしました。 1712次元のベクトルだったのが1710のベクトルにしています。 学習ももちろんし直しです。

盤面のベクトル表現

1710次元のベクトルです。 このベクトルは0または1の2値のベクトルにしています。 動画でも少し触れていますがこのベクトルは疎なベクトルになるので、疎ベクトル・行列積は計算量を少なくすることができます。

1710次元のベクトルの各要素の意味ですが、下記のようにしています。

        // 先手持ち駒
        // 先手歩の持ち駒数: 19 、歩の数は18だが、持っていないも含めているので18ではなく19である
        // 先手香の持ち駒数: 5パターン
        // 先手桂の持ち駒数: 5
        // 先手銀の持ち駒数: 5
        // 先手金の持ち駒数: 5
        // 先手角の持ち駒数: 3
        // 先手飛の持ち駒数: 3

        // 後手歩の持ち駒数: 19
        // 後手香の持ち駒数: 5
        // 後手桂の持ち駒数: 5
        // 後手銀の持ち駒数: 5
        // 後手金の持ち駒数: 5
        // 後手角の持ち駒数: 3
        // 後手飛の持ち駒数: 3


        // 先手盤上の駒
        // 先手歩の位置のパターン 81, 81マスあるので81である
        // 先手香の位置のパターン 81
        // 先手桂の位置のパターン 81
        // 先手銀の位置のパターン 81
        // 先手金の位置のパターン 81
        // 先手角の位置のパターン 81
        // 先手馬の位置のパターン 81
        // 先手飛の位置のパターン 81
        // 先手竜の位置のパターン 81
        // 先手玉の位置のパターン 81

        // 後手歩の位置のパターン 81
        // 後手香の位置のパターン 81
        // 後手桂の位置のパターン 81
        // 後手銀の位置のパターン 81
        // 後手金の位置のパターン 81
        // 後手角の位置のパターン 81
        // 後手馬の位置のパターン 81
        // 後手飛の位置のパターン 81
        // 後手竜の位置のパターン 81
        // 後手玉の位置のパターン 81
        // 合計1710パターン

ちなみに、コンピュータ将棋では、KP(玉(K)とその他の駒(P))の関係を入力にすることもありますが、今回は上記のように単純に盤面をベクトル表現にしたものを採用しています。 KPの場合は 81 * 1548 = 125,388 次元のベクトルになります。 1548は玉以外の駒の位置を表しているので、上記の1710のパターンから玉の位置の情報を抜いたベクトルと等しいです。

125388次元のベクトルだと、評価関数が大きくなってしまうので、今回私が作ってるものは入力は1710次元で試しています。 1710次元で良い結果が出るのかはまだ不明です。やってみないとわからないですね。

探索部の修正

探索部というか、データ構造の修正になりますが、盤情報のクラスをイミュータブルにしていた関係上探索するたびに毎回新しい盤情報インスタンスを作る必要がありました。 毎回インスタンスを作るのにはコストがかかるので、副作用を許容するようにして、指してを作用させると盤が同一インスタンスで変更されるようにしました。 戻すときはundoで盤面を戻します。

現実世界の将棋を例にすると、局面ごとに新しい盤を持ってきて、その局面を再現する盤を作る(局面の数だけ将棋盤が必要)という作業をやめて、 継ぎ盤1つで探索局面を進めていくようにした。という感じです。 毎回新しい将棋盤を用意してたときに比べたら、空間計算量(メモリ)的にも、処理量的にも減っていると思います。

その結果、 3手先の読みまではすぐに結果を返せるようになりましたが、やはり5手先などまで読ませようとするとだいぶ時間がかかります。

思ったよりも深く読むことができず、既存のトップの将棋ソフトはすごいなと思って、ツイッターでつぶやいた所なんとやねうらおさんに拾っていただき、ブログで言及していただけました。

どうすれば少ない探索量で深くまで読めるようになりますか? | やねうら王 公式サイト

指し手オーダリングが重要とのことで非常に勉強になります。 このあたりは今後の課題として改善していこうかなと思っています。

これから取り組むこと

これから5週間目(week5)で取り組むことについて

そろそろ挫折気味! っていうことで、気分切り替えてフロント側でもやろうかなと思います。 アプリでもいいけど一旦Webで作ろうかなと思います。 その準備をするって感じですかね。

あまり時間トレなさそうなので、進捗はあまりなくなってしまうかも。。。

とりあえずがんばります。

2020-11-05 18:00:00

将棋ソフト開発 Week3 ~ 評価関数、探索部 その1 ~

プログラミングの勉強がてらに、将棋ソフト開発をしています。3週目となりました今回は評価関数と、探索部の開発を始めていきます。今回探索部はアルファベータ法を使い、評価関数はニューラルネットワークを使って作るものとします。3週目でやったこと、進捗報告、これからやることについて記載してきます。

これまでの記事はこちら 将棋ソフト開発 Week0 ~ 将棋アプリ開発始めます ~ | なぎなぎブログ将棋ソフト開発 Week1 ~ 将棋のコア部分を作る ~ | なぎなぎブログ将棋ソフト開発 Week2 ~ USIに対応する! ~ | なぎなぎブログ

目次

進捗報告

きふわらべさんに勝てるようになりました!

きふわらべさんの最新版がこれでいいかわからないですが、こちらからダウンロードさせていただきました。

ぐれーすけーる

なぎなぎ将棋は今の所3手の読み入れてるので、3手詰めまでは解けます!つよつよ!

3週目でやったこと

  • 探索部の実装
  • ニューラルネットワークの実装

ちょっと今回は忙しくて、記事をしっかり書いてる時間はなかったのでメモ書き程度に

探索部の実装

今回探索部はアルファベータ法を使っています。

はじめはネガアルファでやっていたんですが、ネガアルファだと評価値を出すときにちょっと困るときがありました。 ネガアルファは探索を進めていった局面の評価を常にその評価の盤面の手番のプレイヤーにすることで実装を単純にしています。

しかしそうすると、最終的に帰ってくる評価値が、自分の手番とは逆(相手の手番)で評価された評価値が帰ってくることがあります。 そうすると評価値を表示する上でちょっと困るかなと思い、常に最初に打った手番側の観点から評価するアルファベータ法を使うようにしました。

最善手を求めるだけであれば、ネガアルファでも構わないと思います。 もしくは後手番の評価を先手番に直すとかもできそうでもありますが。

というわけで一旦今は常に最初に打った手番側の観点から評価するタイプのアルファベータ法を使っています。

今の所3手先を読むのに5秒〜60秒くらいかかります。 本当は深さ4か5くらいまでは読めてほしかったのですが、、、

次の局面の生成時に毎回盤のインスタンスを作っていたり、合法手生成で時間を取っていそうでした。 ニューラルネットワークの行列積の計算のほうが時間がかかると思っていたので、このあたりは人間がわかりやすい実装や、バグが起きづらい実装を意識して作成しており、パフォーマンスはかなり犠牲にしていました。 その影響が出てしまったのかもしれません。

ニューラルネットワークの実装

今の所ピュアなJavaで実装しています。 入力層は01のスパースなベクトルにしているので、それ用の計算をしているので、そんなに計算量はないと思うのですが、2層以降は密になるので、若干計算量が多くなります。 それをピュアなjavaで計算するとやはり遅くはなりそうです。

ただ今の所ボトルネックはこの計算部分かと思いきや、合法手生成など探索部のコストのほうがボトルネックになっていそうでした。

ネットワーク構成

入力層: 1712 (盤上の駒の表現、+ 先手、後手の手番情報) 隠れ層1: 512 隠れ層2: 32 隠れ層3: 32 出力層: 1

というネットワークにしていました。

入力に手番は必要なのかどうか?

入力に手番情報を入れていましたが、将棋では手番が重要で、手番が変われば勝敗が変わることもあるので非常に重要なパラメータと思っていました。 ニューラルネットワークの入力に入れればこの手番の価値も学習してくれるだろうという意図で入れていましたが、これを入れると同一局面でも先手版か後手版かで最善手が異なるということが起きてしまいました。

本来同一局面であれば先手、後手にかかわらず最善手は同じのはず。 なので無駄に関数を複雑にしているだけかなーと、なので今度からは先手後手のパラメータは外してみようかと思います。

手番のパラメータを使わない場合は、つねに手番側からのみた盤の表現を入力として渡せば良い。つまり盤面を反転させて渡せば良さそうです。

学習

とりあえずランダム対局で作った、詰みと詰みの1手前の局面だけ20000局くらいを学習しました。 その結果持ち駒をもつとなんか無駄に王手をかけるようになってしまった気がします。。。

既存の強いソフトの棋譜と評価値を使えば強くなると思いますが、今後変則将棋とか学習させるとなると何もないところからの学習とかも必要になってくるので、どうしたら良いのかなぁと悩んでおります。

これから取り組むこと

これから4週間目(week4)で取り組むことについて

  • 評価関数の作成
  • 探索部の改良

まだ学習もまともにやっていなかったりするので、しばらくは、評価関数、探索部周りの改良になるかと思います。