前回、ニューロン1個は平面に1本の直線を引く係だと分かりました。そして最後に、青と赤がぐちゃぐちゃに混ざっていたら1本の線では割れない、という限界にも触れました。今回はその壁を正面から扱います。壁の越え方が、そのままニューラルネットワークの正体であり、この連載でずっと待っていた「AIらしくなる」瞬間です。
1本の線では、どうやっても割れない
いちばん有名な意地悪な配置が、XOR(エックスオア)と呼ばれるものです。正方形の4つの角に点を置き、向かい合う角どうしを同じ色にします。左上と右下が青、左下と右上が赤。たったこれだけの4点が、ニューロン1個には解けません。
左の絵のように、線をどこにどう引いても、4つの点すべてを正しく分けることはできません。うまく引けば3点までは合わせられますが、どうやっても最後の1点が反対側に取り残される。青2つを片側に、赤2つを反対側に、という引き方がそもそも存在しないのです。前回の言葉で言えば、この並びは線形分離できません。ニューロン1個の限界に、まっすぐぶつかったわけです。
ところが右の絵を見てください。線を2本使えるなら話は別です。2本の線で青い対角線をはさむように帯をつくれば、その帯の中が青、外が赤、ときれいに分かれます。まっすぐな線を組み合わせるだけで、結果として曲がった境界ができました。これがすべての鍵です。
ニューロンを重ねる
では、どうやって線を2本使うのか。答えは単純で、ニューロンを2個並べればいい。1個が1本の線なら、2個で2本です。ただ並べるだけでなく、その2個の出力を受け取って最終的な判定を下す、もう1個のニューロンを後ろに置きます。前に並べた層を隠れ層、うしろの1個を出力層と呼びます。
隠れ層の各ニューロンが、それぞれ自分の線を引いて「その線のどちら側か」を答え、出力層がその答えたちを重みで混ぜて、最終的な色を決める。線を引く係を束ね、その結果をもう一段のつまみでまとめる。この一段重ねるという操作こそ、ニューラルネットワークという名前の中身です。名前が長いので、ここから先は縮めてネットワークと呼びます。
増やすと、境界が曲がる
理屈より、動かした方が早いです。前回と同じXORの配置(対角どうしが同じ色)を、今度はニューラルネットに解かせます。
うまく表示されないときは、デモを別タブで開く 。
最初、隠れニューロンは1個です。この状態で「自動で学習」を押しても、引けるのは1本の直線だけなので、まちがいは0になりません。前回のニューロン1個と同じ壁です。そこで、隠れニューロンの数を2個、3個と増やしてみてください。使える線が増え、「自動で学習」を押すと、塗り分けが直線から曲線へ、さらに入り組んだ形へと変わって、青と赤をぴたりと分けられるようになります。まちがいが0に落ちる瞬間が、壁を越えた瞬間です。
つまみの数が増えるほど、ネットワークが描ける境界は複雑になります。この「複雑な形を描ける度合い」を、表現力と呼びます。ニューロンを重ねて数を増やすことは、表現力を上げることそのものなのです。
中身のかたち
2層のネットの計算も、前回の重み付き和と活性化を2段にしただけです。式で書くと、まず隠れ層の各ニューロン $j$ が自分の線を計算します。
$$h_j = \text{活性化}\left( w_{j1} x_1 + w_{j2} x_2 + b_j \right)$$
そして出力層が、その $h$ をまた重みで混ぜてまとめます。$\sum$ は「$j$ について全部足す」という記号です。
$$y = \text{活性化}\Bigl( \sum_j v_j h_j + c \Bigr)$$
コードにしても、for ループが一段増えるだけです。
// 隠れ層: 各ニューロンが「自分の線」を引く
const h = [];
for (let j = 0; j < H; j++) {
const z = w[j][0]*x1 + w[j][1]*x2 + b[j];
h[j] = Math.tanh(z); // なめらかな活性化
}
// 出力層: 隠れの答えを混ぜて最終判定
let z2 = c;
for (let j = 0; j < H; j++) z2 += v[j] * h[j];
const y = 1 / (1 + Math.exp(-z2)); // シグモイド
コードに出てくる tanh(タンエイチ)は活性化関数のひとつで、前回の終わりに出てきたシグモイドと同じ、なめらかなS字の仲間です(こちらは出力が−1から1に収まります)。デモの「自動で学習」は、この全部のつまみ(w, b, v, c)を、まちがいが減る向きへ一斉に調整しています。層をまたいでつまみを調整するこの計算には、誤差逆伝播という名前がついていて、連載の要になる回で、数値微分からゼロで組み立て直します。今は、重ねれば境界が曲がる、という結果を手でつかめれば十分です。
ここが「ディープ」ラーニングの入り口
いま起きたことは、想像以上に大きい一歩です。ニューロンを一段重ねただけで、1本の線では絶対に届かなかった模様に手が届きました。層をもっと深く、何段にも重ねていくと、境界はいくらでも複雑な形を描けるようになります。この層を深く積むことこそ、ディープラーニングの「ディープ(深い)」の意味です。
写真に写った花の名前を言い当てるのも、文章の続きを書くのも、根っこはこれと同じで、つまみを大量に持った深いネットワークが、入り組んだ境界を学習しているだけです。前回の「重みで混ぜて活性化する」ニューロン1個が最小部品で、それを層に重ねて表現力を得る。ここまでで、いまのAIの骨格はもう手のなかにあります。
残る大きな謎は一つ、層をまたいだ大量のつまみを、機械はどうやって正しい向きに回しているのか、です。その答え(誤差逆伝播)に入る前に、次回はまず、ネットワークの中で数字が実際にどう流れているのかを一歩ずつ手で追います。それが、逆向きの計算を読むための土台になります。
連載「手で動かすAI」
← 前回 ニューロン1個は何をしているのか
