自作将棋AIの記事に出てくる「NNUE・蒸留・誤差逆伝播」を、ゼロから説明した入門記事を書きました
最終更新: 2026年7月7日(火)
将棋AIをブラウザ向けに1日で作り直した記録(別途プロジェクトに投稿)を書いたのですが、読み返すと NNUE・蒸留・誤差逆伝播・量子化 みたいな機械学習の言葉が、説明抜きでびっしり出てきます。将棋は指せるけれど機械学習は初めて、という人は、たぶん途中で止まってしまう。
そこで、「機械学習は完全に初めて/将棋はアマ二段くらいには指せる/コードは多少読める」という人向けに、前提知識をゼロから積み上げる入門編を書きました。方針は3つです。
- 数式は最小限にして、代わりに比喩で説明する
- コピペで動くPythonコードを添えて、一つひとつ手を動かして確かめられるようにする
- 抽象論で終わらせず、全部を実際の将棋AIの実装に紐づける——「概念 → それが本編のどこで効くか」が一本の線になるように
将棋はこの題材にとても向いています。機械学習の入門は、たいてい「手書き数字の認識」みたいな、初学者にとってどうでもいい題材で説明されます。でも将棋なら、「入力」はあなたが既に読める盤面、**「出力」は『どっちが勝ちか』**という、意味のはっきりしたもの。しかもどの抽象概念にも、実際に指すプログラムの中で具体的な仕事がある。だから「で、これは結局何の役に立つの?」という、入門でいちばん脱落しがちな疑問が起きにくい。
以下、本編に出てくる用語を、入門編ではどう噛み砕いているかを、順に紹介します。この記事自体は"予告編"なので要点だけ。式とコードで手を動かす本編は、末尾のリンクからどうぞ。
ニューラルネットワーク:調整可能なつまみ付きの、巨大な足し算機
まず一番の基礎から。ニューラルネットワークは、神秘的な何かではなく、巨大な関数です。
やっていることは驚くほど単純で、入力(将棋なら盤面の特徴——どのマスにどの駒があるか、など)の一つひとつに重みという数を掛けて、全部足す。それだけ。その「掛けて足す」を1つの層として、何段も重ねる。層と層の間に、値が大きくなりすぎないよう頭打ちにする簡単な処理(活性化関数)を挟む。最後の層が、1つの数(局面の良さ)を吐き出す。
肝は重みです。この重みが何十万個もあって、それぞれが独立した"つまみ"になっている。つまみの回し方次第で、同じ入力からまるで違う出力が出る。「学習」とは、この何十万個のつまみを、出力が役に立つ値になるまで少しずつ回して合わせていく作業のことです。
将棋AIの"目"の正体は、まさにこれ。「盤面を見て形勢を数値にする」という、一見高度な判断も、中を開ければ調整可能なつまみが大量に付いた、掛け算と足し算の山にすぎません。本編の自作ネットは、およそ「2,268個の盤面特徴 → 256 → 32 → 1」という4段構成で、約59万個のつまみを持っています。
評価関数:将棋AIの"頭脳"
次に評価関数。これは、ある1つの局面を見て「先手と後手、どちらがどれだけ有利か」を1つの数値で返すものです。将棋の世界では、この数値をよくセンチポーン(cp=歩1枚の1/100を単位とする点数)で表します。「+300cp」なら先手が歩3枚ぶん得、といった具合。
なぜこれが"頭脳"なのか。将棋AIは、数手先までいろいろな指し手を試し、その先の局面をこの評価関数で採点して、一番いい点数になる筋を選びます。つまり、読みの正しさは最終的に評価関数の正しさで決まる。どれだけ深く読んでも、末端の採点が下手なら、間違った筋を選んでしまう。
評価関数は、人間がルールで手書きすることもできるし、データから学習させることもできます。手書きは「歩は100点、玉が堅ければ加点」のように明快ですが、人間が思いつく項目しか入れられない。本編の物語の山場は、この手書きの評価関数を、学習した評価関数(ニューラルネット)に置き換える過程です。
損失と勾配降下:目隠しで山を下りる
では、ニューラルネットの何十万個ものつまみを、どうやって「いい値」に合わせるのか。ここで損失と勾配降下が出てきます。
損失は、「今の出力が、正解からどれだけ外れているか」を表す1つの数字です。ネットの答えと正解のズレが大きいほど、損失も大きい。学習のゴールは、この損失をできるだけ小さくすること。
勾配降下は、そのための方法です。イメージは、目隠しをして山を下りること。今いる地点の足元の傾き(=どのつまみを、どっちに、どれだけ回せば損失が減るか)を調べて、一番急に下る方向へ、ほんの一歩だけ進む。進んだ先でまた傾きを調べて、また一歩。これを何万回、何十万回と繰り返して、損失という谷の底(=つまみの良い設定)へ少しずつ近づいていく。一歩の大きさは「学習率」と呼ばれ、大きすぎると谷を飛び越え、小さすぎると永遠に着かない。
誤差逆伝播(backprop):学習の心臓部
さて、勾配降下には「足元の傾き」——つまりすべてのつまみについて、どっちにどれだけ回せば損失が減るか——が必要でした。つまみが何十万個もあるのに、どうやってそれを全部求めるのか。一つずつ動かして試すのは、非現実的です。
それを一発で解くのが**誤差逆伝播(バックプロパゲーション、backprop)**です。仕組みは、出力側から入力側へ、微分の連鎖律(合成関数の微分ルール)を使って、ズレの責任を遡って配っていくというもの。「最終的な間違いは、最後の層のこのつまみがこれだけ、その手前の層のあのつまみがこれだけ悪さをした」という各つまみの寄与を、後ろから前へ一掃で計算する。何十万個ぶんの傾きが、たった1回の逆向きの計算で全部そろう。
これが学習の心臓部であり、同時に絶対に手で書きたくない部分でもあります(式が層をまたいで爆発的に増える)。だからこそ、次に出てくる道具が要る。
PyTorch:面倒な微分を全部やってくれる道具
その「損失 → 勾配 → 誤差逆伝播 → 一歩進む」という一連の流れを、まるごと自動化してくれるのが PyTorch です。Facebook(現Meta)発の、ニューラルネットを作って学習させるためのPythonライブラリ。
あなたは「ネットワークはこういう形」「損失はこう測る」とだけ書けば、面倒な微分(backprop)も、つまみの更新も、帳簿づけも、全部PyTorchが肩代わりしてくれる。とくにありがたいのが自動微分——あなたが順方向の計算(掛けて足して出力を出す)を書くだけで、逆方向の傾き計算をPyTorchが勝手に導出してくれる機能です。本編の学習コードもこれで書かれています。
入門編では、ほんの数行のPyTorchコードで小さなニューラルネットを実際に学習させ、損失の数字がぐんぐん下がっていく様子を自分の目で見るところまでやります。ここで、上の「損失」「勾配降下」「backprop」が、抽象論から「手元で動く実物」に変わります。
蒸留(distillation):できる先生の答えを写経する
ここからが、本編の核心につながる概念です。蒸留とは、強くて重い先生に大量の問題を解かせ、その答えを、小さくて軽い生徒に真似させる技術のこと。
本編では、先生が強豪エンジンやねうら王、生徒が自作の小型ニューラルネットです。やねうら王は非常に強いけれど重く、ブラウザでは動かせない。でも「大量の局面に正解を付けてくれる先生」としては最高。そこで、やねうら王に何百万もの局面を採点させ、その採点を正解として生徒ネットに学ばせる。
なぜゼロから勉強させず、わざわざ先生の答えを写させるのか。その方が圧倒的に速く、賢くなるからです。教科書だけで独学するより、できる人の解答を大量に写経する方が、短時間でコツをつかめるのと同じ。先生の判断力を、ブラウザに収まる小ささまで"蒸留"する——これが、重いエンジンの強さを軽いネットに移し替える、本編の中心的なトリックです。
量子化(quantization):小数を整数に丸めて軽くする
学習が終わった直後のネットの重みは、細かい小数(float)です。これをそのまま使うと、ブラウザやスマホでは計算が重い。そこで量子化——小数を整数に丸めてしまう処理をかけます。
たとえば「0.5732…」という重みを「整数の何か」に近似する。すると、掛け算・足し算が整数演算で済み、計算がぐっと軽く・速くなる。もちろん、丸めるぶん少し精度は落ちる。けれど、その精度の犠牲と引き換えに、実用速度を手に入れる。ブラウザやスマホという非力な土俵で「一瞬で評価を返す」ためには欠かせない、地味だけど効くひと工夫です。デプロイ直前の最後の仕上げ、と思ってください。
アキュムレータとNNUE:ぜんぶが合流する場所
最後に、これまでの概念が全部集まる場所——NNUEです。
NNUEは、もともと将棋のために発明された評価関数の方式(後にチェスの強豪Stockfishが輸入しました)。その最大の着眼点はこうです。将棋は1手指しても、盤面はほんの少ししか変わらない。 動いた駒は基本1枚。なのに、毎回ネットワーク全体をゼロから計算し直すのは、途方もない無駄。
そこでNNUEは、変わった分(差分)だけを更新する。「さっきの局面の計算結果を覚えておいて、動いた1枚ぶんの影響だけ足し引きする」。この"覚えておく"役割の状態を、アキュムレータと呼びます。この差分更新の工夫のおかげで、ニューラルネットという本来重い評価を、数百万局面を読む探索に耐える速さに保てる。
ここに、これまでの全部——ニューラルネット(掛けて足す)、評価関数(局面を数値に)、蒸留(先生から学ぶ)、量子化(整数で軽く)——が合流します。本編で「NNUE」という言葉が出てきたら、それは「将棋のために生まれた、差分更新で高速に動く、蒸留された小型評価ネット」のことだ、と読めるようになっているはずです。
一貫した狙いは、たとえ数式を飛ばしても、比喩と動くコードで「概念 → それが本編のどこで効くか」が一本の線でつながること。この入門編を読んでから本編へ行くと、専門用語に詰まらずに最後まで読み切れると思います。将棋を入り口に機械学習を覗いてみたい人にも、機械学習の側から将棋AIを覗いてみたい人にも。
👉 入門編(完全版・式とコードつき): https://www.meetyudai.com/blog/applied-algorithms/H9beqVVY7h5qc3hNfskR 👉 本編(将棋AIを1日で作り直した話): https://www.meetyudai.com/blog/applied-algorithms/9fpLthtYgHvnImuFR0Jf
コメント (0)
まだコメントはありません。
コメントするにはログインが必要です。
Googleでログイン