ここまでで、ニューロン1個(第1回)を重ねてネットワークにすれば、1本の線では割れない模様も分けられる(第2回)ところまで来ました。そのたびに「自動で学習する」を押して結果を眺めてきましたが、よく考えると、ネットワークの中で数字が実際にどう動いているのかを、まだ一度も手で追っていません。この回では、その中身を一歩ずつ追いかけます。地味に見えますが、ここを飛ばすと次回がまるごと宙に浮くので、土台としてきちんと踏みます。
ネットワークは、単純な部品の鎖
構えるような話ではありません。ニューラルネットワークの計算は、ごく単純な部品をいくつもつないだ鎖に、数字を通していくだけです。部品の種類も3つしかありません。何かを掛ける(× で重みをかける)、足す(+ でバイアスや和をとる)、そして曲げる(活性化関数に通す)。この3つの組み合わせだけで、ネットワーク全体ができています。
使うのは、新しく何かを足した鎖ではなく、第1回のニューロン1個です。入力を2つ——果物の大きさ $x_1$ と甘さ $x_2$——受け取り、それぞれに重みを掛けて足し、バイアスを加えて重み付き和 $z$ をつくり、最後に第1回で出てきた活性化に通して予測 $y$ を出す。それだけの鎖です。具体的な数を入れてみましょう。大きさ $x_1 = 2$、甘さ $x_2 = 1$、重みを $w_1 = 0.5$、$w_2 = 1$、バイアス $b = -1$ とします。
左から順に追います。まず重み付き和をつくります。大きさ $x_1 = 2$ に $w_1 = 0.5$ を掛けて $1$、甘さ $x_2 = 1$ に $w_2 = 1$ を掛けて $1$、この2つを足してバイアス $b = -1$ を加えると、$z = 1 + 1 - 1 = 1$ です。次にこの $z$ を、第1回で出てきた活性化に通します。ここでは第1回のデモで使ったシグモイド、どんな数も0から1のあいだへなめらかに押し込む関数を使います。$z = 1$ を通すと、予測は $y = 0.73$。この果物は「0.73くらいりんごらしい」という判定です。
注目してほしいのは、途中の $z$ が、宙に浮いた記号ではなく $1$ という具体的な数として確定していることです。数字を一度通せば、鎖のどの地点にも「いまここはこの数」という値が置かれます。$z = 1$ も $y = 0.73$ も、紙にメモするようにそのまま残しておける。いまはこのメモを残す意味がピンと来なくていいのですが、次回これが主役になります。
ここでやったのは、第1回で言葉で説明した「重みで混ぜて、活性化する」を、具体的な数で1回通しただけです。新しい部品は一つも登場していません。この、入力から予測まで左から右へ一度通す計算を、前向き計算と呼びます。
数字を流してみる
読むより、自分で流した方が早いです。同じニューロンを動かせるデモを用意しました。
うまく表示されないときは、デモを別タブで開く 。
スライダーで大きさ $x_1$ や重み $w_1$ を動かしてみてください。動かした瞬間、その先の重み付き和 $z$ が変わり、それを受けて予測 $y$ も変わります。$w_1$ を大きくすれば $z$ が伸び、$y$ は1へ近づく。逆に $z$ を大きく下げると $y$ は0へ張りつく(活性化が0から1に収める働きです)。前の地点の値が決まって初めて次が決まる、という一方通行が、数字の動きそのもので見えるはずです。「1歩ずつ流す」を押すと、左端の入力から順に点灯して、数字が鎖を伝わっていく様子が確かめられます。
大事なのは、どんなに複雑なネットワークでも、起きているのはこれと同じだということです。ニューロンが何百万個に増え、鎖が枝分かれして網の目になっても、一つひとつの部品は「掛ける・足す・活性化する」のどれかで、数字が入口から出口へ流れて各地点の値が確定する、という筋書きは変わりません。この部品のつながり全体を、計算グラフと呼びます。PyTorch や TensorFlow といったAI開発の道具は、どんなモデルも内部ではこの計算グラフとして持っています。
メモが、次回の主役になる
前向き計算そのものは、ただの「入力を通して予測を出す」計算で、真新しいことは何もありません。第0回からデモの裏でずっと動いていた計算です。今回わざわざ一歩ずつ追ったのは、次回のためです。
次回の逆伝播では、予測 $y$ と正解のズレ(誤差)から出発して、この鎖をこんどは逆向きに一度たどります。そのとき、各つまみを「どちらへどれだけ回せば誤差が減るか」を計算するのに使うのが、まさに今回メモした途中の値($z$ や $y$ など)です。前向きに一度流して値を残しておいたからこそ、逆向きの計算が、あらためて何も測り直さずに済む。前向き計算は、その下ごしらえだったわけです。
鎖を左から右へ流して、値を残す。次回はその同じ鎖を、右から左へ一度たどる。この往復が、ネットワークが学ぶということの全体像です。まずは前向き、数字が流れる様子をデモで存分に触ってみてください。
連載「手で動かすAI」
← 前回 1本の線では割れない問題
