前回 は、散らばった点に直線を1本当てはめ、つまみ(傾きと切片)を回して誤差を減らすところまでをやりました。「学習とはつまみ回しである」という、連載全体の背骨です。今回はそこから一歩進んで、いまのAIをかたち作っている最小の部品、ニューロンを1個だけ取り出して、その中で何が起きているのかを見ます。名前はいかめしいですが、やっていることは前回とほとんど地続きです。

ニューロンは「重みで混ぜて、発火するか決める」だけ

ニューロンは、いくつかの入力を受け取って、一つの出力を返す小さな部品です。中身は3ステップしかありません。

ニューロン1個の構造。入力x1・x2・x3にそれぞれ重みw1・w2・w3をかけて足し、バイアスbを加えた重み付き和を、活性化に通して出力yを出す図

まず、それぞれの入力に重みをかけます。重みは、その入力をどれだけ重く見るかを決める数で、前回のつまみ(傾き)を入力の数だけ増やしたものだと思ってください。次に、重みをかけた入力を全部足し合わせ、そこにバイアスという下駄を1つ加えます。これで重み付き和という一つの数になります。最後に、その数がある基準を超えたかどうかで出力を決めます。この最後のひと押しを活性化と呼びます。いちばん素朴な活性化は、0を超えたら1(発火)、超えなければ0、というステップ状の切り替えです。

式にすると、これだけです。入力の数だけ「重み × 入力」を足して、バイアス $b$ を加える。

$$z = w_1 x_1 + w_2 x_2 + \cdots + b$$

そしてニューロンの出力は、

$$y = \text{活性化}(z)$$

重み $w$ とバイアス $b$ が、このニューロンのつまみです。入力 $x$ は与えられたデータなので動かせませんが、つまみは学習で回せる。ここが前回とまったく同じ構図です。

ニューロン1個 = 平面に引いた1本の線

つまみが何をしているのかは、入力が2つの場合を絵にすると一目で分かります。ただ、その前に抽象的な話を一度、地面に下ろしておきます。

これから出てくる点の一つひとつは、判断したい対象を1個だと思ってください。たとえば果物の仕分けなら、点1つが果物1個です。横軸 x1 をその大きさ、縦軸 x2 を甘さとすれば、点の位置は「その果物の大きさと甘さ」を表します。そして点の色が正解で、青はりんご、赤はみかん、というぐあいです。x1 や x2 のような入力は、対象から測った特徴のことだと考えると腑に落ちます。入力が3つなら、測る特徴が3つに増えるだけです。

ニューロンがやりたいのは、この大きさと甘さから「どっちの果物か」を当てることです。重み w1 は、その判断で大きさ(x1)をどれだけ重視するかを決めるつまみだと考えてください。w1 を大きくすれば大きさで強く決め、小さくすれば甘さ(x2 とその重み w2)の方を重く見ます。この2つの重みとバイアスで、平面上に1本の境界線が決まり、その片側を青、反対側を赤と判定します。線の向きは重みが、位置はバイアスが決めます。

言葉より動かした方が早いので、デモを用意しました。青と赤の点を、ニューロン1個の境界線で分けてみてください。

うまく表示されないときは、デモを別タブで開く

3つのつまみ(重み2つとバイアス)を動かすと、平面の塗り分け、つまりニューロンの判定と、境界線が動きます。目標はギリギリを狙うことではなく、青が片側・赤が反対側にそろって、まちがいが0になることです。それさえ満たせば、線の引き方はどれでも正解です。手で合わせてもいいですし、「自動で学習」を押せば、前回とまったく同じ勾配降下が、まちがいの減る向きへ3つのつまみを回して境界線を運びます。線を引く部品が、線の引き方を自分で見つける。これがニューロン1個の学習です。

ここで当然の疑問が浮かびます。もし青と赤が、きれいに片寄らずぐちゃぐちゃに混ざっていたら、どうなるのでしょう。答えは、1本の線ではどうやっても分けられない、です。これはデモの不備ではなく、ニューロン1個の正真正銘の限界です。まっすぐ1本の線で二分できる並び(専門的には線形分離可能といいます)しか、ニューロン1個では扱えません。そして、この「1本では割れない並び」を扱えるようにする工夫こそが、次回への入り口になります。

中身のコード

ニューロン1個の計算は、本当にこれだけです。飾りのデモ用ではなく、いまのAIの内側でも同じ計算が延々とくり返されています。

// 入力 x1, x2 を重み w で混ぜ、バイアス b を足す
const z = w1 * x1 + w2 * x2 + b;   // 重み付き和
// 基準を超えたら発火(ステップ活性化)
const y = z > 0 ? 1 : 0;

学習は前回と同じで、まちがいが減る向きへ w1, w2, b を少しずつ動かすだけです。ひとつだけ実用上の都合を挟むと、上のステップ活性化は超えたか超えないかでカクッと切り替わるため、勾配(傾き)が測れません。そこで実際にはもっと滑らかな活性化を使います。このデモでも、なめらかなS字を描くシグモイドという関数を活性化に使って、勾配降下が効くようにしています。活性化の種類の話は、あとの回でもう少し掘り下げます。

この1個が、AIになる

ここが今回いちばん伝えたいところです。いま見たニューロン1個は、あらゆるニューラルネットワークの最小部品です。この部品を層にして何百個も並べれば手書きの数字を読み、何億個ものつまみを持たせて大量の文章で学習させれば、文章を書く大規模言語モデルになります。中で起きている計算は、最後まで重みで混ぜて活性化するのくり返しで、桁の大きさが違うだけ、部品はこの1個のままです。

とはいえ、さきほど見たとおり、ニューロン1個が引けるのは1本の線だけです。その1本では割れない入り組んだ模様を扱えるようにするのが、ニューロンを重ねるという次の一手で、そこからニューラルネットワークは一気にAIらしくなります。次回は、いちばん有名な「1本の線では割れない問題」を取り上げて、ニューロンを重ねると何が起きるのかを見ていきます。


連載「手で動かすAI」
← 前回 AIは結局どうやって学んでいるのか