タグ

ブックマーク / yaneuraou.yaneu.com (31)

  • 近年のコンピュータ将棋の急速な伸びの理由は? | やねうら王 公式サイト

    表題の件を当事者視点で。 「近年のコンピュータ将棋の急速な伸びの理由は?」という問いの模範解答が分からない。(1年で200ほど伸びるようになった理由。) そこそこ聞かれる質問なので、答えを用意しておきたいのだが・・・ — Shota Chida (@mizumon_) July 14, 2016 理由をたったひとつ挙げるとしたら、2016年時点での最新の回答は「誰でも機械学習が出来るようになった」ではないかと思います。 従来、将棋ソフトの機械学習というのはBonanzaメソッド(通称ボナメソ)一択でした。激指はオンライン学習風の何かをやっていたのですけど、Bonanzaの3駒関係ほどパラメーターの数が多いと(数百万パラメーター)、オンライン学習ではうまくいかないと信じられていたので、誰もやっていませんでした。 ボナメソについて書かれた保木さんの論文自体、当時の将棋ソフト開発者には難解で(見

    alcus
    alcus 2016/07/27
  • sfen文字列は一意に定まらない件 | やねうら王 公式サイト

    やねうら王 定跡フォーマット2016ではsfen文字列とそれに対応する(その局面での定跡となる)指し手をずらずらと書くようになっているのですが、sfen文字列は、一意に定まらないということをすっかり忘れていました。 SFENで先手の持ち駒が角金歩のときの表記。 BGP : ShogiGUI, 局面ペディア PGB : Blunder.Converter PBG : やねうら王定跡フォーマット2016 — merom686 (@merom686) July 14, 2016 というのも、手駒の出力順まではsfen文字列の仕様として規定されていないからです。すでにいくつかのソフトで違いがあるようです。価値の低い駒の順(歩、香、桂、銀、金、角、飛)に並べるのが普通の感覚だと思うんですけど(Bulnder.Converter)、そうでないソフトも結構あります。USIプロトコルの仕様の説明では駒の価

  • コンピューター将棋でXeon Dual構成はアリなのか? | やねうら王 公式サイト

    とりあえず20コア×Dualで物理40コア、論理80コアのPCが1台届いた。早速これをコンピューター将棋に活用していこうと思うのだが、結構嫌らしい問題があることに気づいたのでざっと書きとどめておく。 論理コア80。これが意外とやっかいである。 Windowsの場合、論理コアが64を超えているのでこのときプロセッサグループを2つ作る。プロセッサグループとはなんぞや?と思われるかも知れないが、その説明を書き出すと話が終わらない。ここでは、1つのプログラムが利用するのは、通常、1つのプロセッサグループなのだと思って欲しい。 そうすると、普通にプログラムを書くと片側のXeonしか使われない。どちらのCPUを使うかは、タスクマネージャーなどから設定できる。詳しくは「thread affinity 設定 windows」などでggrks。 それで両方のXeonを使いたいときは、明示的に複数プロセッサグ

    alcus
    alcus 2016/07/07
  • 将棋の局面を256bitに圧縮するには? | やねうら王 公式サイト

    Ponanzaに倣い、大量に自己対戦棋譜を生成してそれをもとに強化学習をやりたいわけですが、この生成を誰かに手伝ってもらおうと思ったときに棋譜のファイルサイズが大きいので、そのやりとりが意外と大変です。 ところで、1局面は何bitで表現できるのでしょうか? 将棋の完全ハッシュは何bitで表現できますか? 上の記事に出てきた話では、なのはminiがハフマン符号化を用いて256bitに収めているということでした。 そこでやねうら王も256bitにpack/unpackするルーチンを提供しようと思い、書いてみることにしました。USE_SFEN_PACKERをdefineするとPosition::sfen_pack(),sfen_unpack()などが使えるようになります。やねうら王を用いて大量の棋譜を生成している人は、是非活用してみてください。 さて、局面を256bitに収めるコードを、書いて気

  • 将棋ソフト用の標準定跡ファイルフォーマットの提案 | やねうら王 公式サイト

    やねうら王、いままでに何度か定跡ファイルを作っているのですが、過去、SQLiteを用いていました。しかし、そんなに登録する局面が多くなるわけでもないですし、メモリが足りないわけでもないので、いまどきは「起動時に定跡ファイルを丸読みしてstd::mapにでも持っておけばいいじゃん」ということに落ち着くように思います。 また、昔なら、局面のhash keyをキーとして保存しておくのが流行ったのですが、そんなところで省メモリにしても仕方がないですし、何かソフトを作り変えたときに同じ局面でもhash keyの値が変わってしまうこともありますし、hash keyの値をキーとするのはもう流行らないのではないかと思うわけです。 そこで次のようにsfen文字列を1行目に書いて、2行目以降にその局面での指し手、相手の予想される応手(ないときは”none”)、その指し手で局面を進めたときの評価値、この指し手の

    alcus
    alcus 2016/04/01
  • 囲碁ソフトがプロ棋士に勝利したようです | やねうら王 公式サイト

    Googleが作ったDeepMindの「AlphaGo」という囲碁ソフトが中国出身のプロ棋士(Fan Huiさん)に勝利したそうです。(5戦5勝) グーグルが最新人工知能使い囲碁ソフト開発 プロに勝利 http://www3.nhk.or.jp/news/html/20160128/k10010388481000.html 囲碁はソフト自体は、将棋ソフトとは違い、指し手生成などがシンプルなので結局、作り込みではなく、機械学習一発で勝負が決まってしまうような側面がありました。また、囲碁におけるDeepLearningを用いた機械学習で、近年、プロの棋譜との指し手一致率が急激に上がるなか、「これ、あとはもう探索部もNN(ニューラルネットワーク)で書ければ超強いよね」と私は思っていたのですが、ついに現実となったようです。 プロ棋士としてFan Huiさんはトッププレイヤーとは差があるそうで、この

    alcus
    alcus 2016/01/29
  • 壁判定機能つきSquareの実装 | やねうら王 公式サイト

    このWALL(壁)というのは盤外を表す駒で、盤面の升を9×9ではなく、16×13ぐらい広く確保しておいて、周辺にWALLという駒を配置しておき、sqが盤外に出たかどうかを判定するのが普通です。(この技法は、うさぴょんや、BlunderなどBitboardを用いないタイプの将棋ソフトで採用されていることが多かったように思います。) 実際は、盤外のメモリに書き込んでもいいことを利用すると、上のコードのうち、WALLの判定は省略できます。(pieces_on(sq)==WALLという条件はpieces_on(sq)!=NO_PIECEに含まれるので) しかしこのように盤面を広く確保すると、このSquare型と盤上の升との対応がややこしくなります。少なくともSquare型で盤内を表す値が離散値(飛び飛び)になるので、Bitboardから1bit取り出すときとかにテーブルを引く手間が必要になったりし

  • custom allocator難しすぎワロタ | やねうら王 公式サイト

    昨日の記事でx86用のコードでheapから(newで)確保されたメモリのアライメントが16バイト境界になってなくて大変だという話を書いたのだが、その続き。 std::stack<StateInfo>である。StateInfoはstructで、alignas(16)がついている(or メンバーの定義にalignas(16)がついているものがある)とする。 ここにpush()ときに内部的にヒープからメモリが割り当てられるようで、これもalignasを無視しやがるので、どうにかしたい。 しかし、std::stackのカスタムアロケーターを書くの、難しくてさっぱりわからん。std::stackって、内部的にはstd::dequeなんだっけ?てか、こんなalignasを無視するような糞コンテナ要らないんだけど…。調べる気にもならん…。 push()とtop()さえあればいいので、とりあえず以下のよう

  • x86環境用にアライメント合わせるのが壊滅的に難しい件 | やねうら王 公式サイト

    やねうら王miniをx86(32bit環境)でコンパイルが通るように作業してたのですが、どうもアライメントを合わせるのが壊滅的に難しいです。 SSE命令を使うときに16byte単位にアライメントが合っていないと実行時にエラーになるものがあります。_mm_store_si128()等です。 まあそれはそれで仕方ないのでアライメントを合わせようとBitboardなどのstructにalignas(16)をつけたわけです。 ところが、ヒープから割り当てたときにはこれがアライメントされていない可能性があるようです。 thread.cpp template<typename T> T* new_thread() { std::thread* th = new T(); *th = std::thread(&T::idle_loop, (T*)th); return (T*)th; } > sourc

  • 将棋の完全ハッシュは何bitで表現できますか? | やねうら王 公式サイト

    ちょっと気になる話題が聞こえてきたので記事にまとめておきます。 完全ハッシュの定義についてはggrks。 局面(盤面+手駒+手番)を何bitにpack出来るかという話。 これは、定跡データを作るときなどになるべく小さくpackしたいのでわりと切実な問題。 なのはminiは、ハフマン符号を使っているらしい。 ハフマン符号化は、出現頻度が高いものに短いbit列を割り当てる。 将棋の盤面だと、空白の升が一番出現頻度が高く、次に歩である。そこで、空白の升を0b(1bit)、先手の歩を100b(3bit)とか何かそんな感じで割り当てていくと、そこそこ短くなるという理屈である。詳しくはggrks。 たぶんハフマン符号化等をしていいなら200bitぐらいに収まる気がする。 しかしAVX時代に突入して、256bitなら一命令で計算できるので、差分計算がしやすく、かつ256bitに収まって欲しいという要求も

    alcus
    alcus 2016/01/06
  • 技巧の秘密 | やねうら王 公式サイト

    電王トーナメントの放送で私がしゃべった『技巧』の秘密(?)、動画が上がっていたので紹介しておきます。 『技巧』の設計思想、そこに流れる哲学には私はすこぶる衝撃を受けた。 かと言って、これと同じことをするのは私には無理だ…。集中力がもたない。来年は、別の方法で『Ponanza』『技巧』レベルに持っていこうと思う。