AIや機械学習を学んでいると、ニューラルネットワークやディープラーニングという言葉によく出会います。
しかし、その仕組みをいきなりTransformerやLLMから理解しようとすると、かなり大変です。
そこで今回は、ニューラルネットワークの基礎となる考え方のひとつである**パーセプトロン(Perceptron)**を取り上げます。
パーセプトロンそのものは非常に単純です。
しかし、
- 入力
- 重み
- バイアス
- 活性化関数
- 出力
という、現代のニューラルネットワークにもつながる重要な要素がすでに含まれています。
今回はPythonで実装する直前まで、まずは「何を計算しているのか」を理解していきます。
1. そもそも人工ニューロンとは何か
ニューラルネットワークは、人間の脳にある神経細胞、つまりニューロンから着想を得ています。
生物のニューロンは、他のニューロンから信号を受け取り、それらをまとめ、一定の条件を満たしたときに次のニューロンへ信号を送ります。
これを非常に単純化すると、
複数の入力を受け取り、重要度を考慮してまとめ、条件を満たせば出力する
という仕組みになります。
この考え方を数学的なモデルにしたものが人工ニューロンです。
たとえば、ある人工ニューロンに次の3つの情報が入力されるとします。
- 今日の気温
- 湿度
- 雨が降っているか
これらの情報をもとに、
外出するか、しないか
を判断したいとします。
人工ニューロンは、それぞれの情報を同じ重要度では扱いません。
「雨が降っているか」を重要視するかもしれませんし、「気温」を重要視するかもしれません。
この重要度を表すのが**重み(weight)**です。
2. 入力と重み
人工ニューロンでは、入力をよく次のように表します。
x1, x2, x3, ...
たとえば、
x1 = 気温
x2 = 湿度
x3 = 雨が降っているか
とします。
それぞれの入力には、対応する重みがあります。
w1, w2, w3, ...
つまり、
x1 × w1
x2 × w2
x3 × w3
のように計算します。
重要な情報には大きな重みを設定し、重要でない情報には小さな重みを設定します。
イメージとしては、
「この情報をどのくらい重要視するか」
を表す数字です。
3. 重み付き和
入力と重みを掛けたら、それらをすべて足します。
これを重み付き和と呼びます。
数式で書くと、
x1w1 + x2w2 + x3w3
です。
たとえば、
x1 = 1
x2 = 0
x3 = 1
重みが、
w1 = 0.7
w2 = 0.2
w3 = 1.0
だったとします。
すると、
1 × 0.7
+ 0 × 0.2
+ 1 × 1.0
なので、
1.7
になります。
つまり人工ニューロンは、まず
複数の入力を、重要度を考慮しながら1つの数字にまとめる
ということをしています。
ここは非常に重要です。
ニューラルネットワークという言葉から、とても複雑なことをしているように思えますが、基本となる計算は
掛け算
+
足し算
です。
4. バイアスとは何か
実際のパーセプトロンでは、重み付き和にさらに**バイアス(bias)**という値を加えます。
数式では、
x1w1 + x2w2 + x3w3 + b
となります。
b がバイアスです。
では、このバイアスは何のためにあるのでしょうか。
簡単に言えば、
判断のしやすさを調整する数字
です。
たとえば、結果が0より大きければ「YES」、0以下なら「NO」にするとします。
バイアスが、
b = 2
であれば、全体としてYESになりやすくなります。
逆に、
b = -2
なら、YESになりにくくなります。
そのためバイアスは、よく
発火のしやすさを調整するもの
と説明されます。
5. パーセプトロンの基本式
ここまでをまとめると、パーセプトロンではまず次の値を計算します。
z = x1w1 + x2w2 + ... + xnwn + b
記号が増えると難しく見えますが、意味は単純です。
入力 × 重み
を全部足して、
バイアス
を加えているだけです。
より短く書けば、
z = 重み付き和 + バイアス
です。
6. しかし、そのままでは答えにならない
ここで少し問題があります。
計算結果が、
1.7
だったとしても、
-0.4
だったとしても、それだけでは最終的な判断になっていません。
そこで、
この数字を最終的な出力に変換する仕組み
が必要になります。
これが**活性化関数(activation function)**です。
7. 活性化関数
最も単純なパーセプトロンでは、ステップ関数という考え方を使います。
たとえば、
z > 0 なら 1
z <= 0 なら 0
とします。
つまり、
z = 2.3
なら、
1
を出力します。
一方、
z = -0.8
なら、
0
を出力します。
図にすると、次のようなイメージです。
入力
↓
重みを掛ける
↓
すべて足す
↓
バイアスを加える
↓
活性化関数
↓
0 または 1
これが非常に基本的なパーセプトロンです。
8. パーセプトロンは「判断装置」
ここまで理解すると、パーセプトロンは意外と単純な仕組みに見えてきます。
本質的には、
入力された複数の情報から、YES / NO を判断する装置
です。
たとえば、
メールがスパムかどうか
を判断するとします。
入力として、
x1 = URLが含まれている
x2 = 「無料」という言葉がある
x3 = 大文字が大量に使われている
などを与えます。
それぞれに重みを掛け、
x1w1 + x2w2 + x3w3 + b
を計算します。
その結果が一定以上なら、
1 = スパム
それ以外なら、
0 = 通常メール
と判断できます。
もちろん実際のスパム判定ははるかに複雑ですが、考え方の基礎はこの延長線上にあります。
9. AND回路を考えてみる
パーセプトロンの説明でよく登場するのがAND回路です。
ANDでは、
0 AND 0 → 0
0 AND 1 → 0
1 AND 0 → 0
1 AND 1 → 1
となります。
つまり、
両方が1のときだけ1
です。
これをパーセプトロンで表現できます。
たとえば、
w1 = 1
w2 = 1
b = -1.5
とします。
すると、
x1 = 0, x2 = 0
0 × 1 + 0 × 1 - 1.5
= -1.5
なので出力は、
0
です。
x1 = 1, x2 = 0
1 × 1 + 0 × 1 - 1.5
= -0.5
なので、
0
です。
x1 = 0, x2 = 1
同様に、
0
です。
x1 = 1, x2 = 1
1 × 1 + 1 × 1 - 1.5
= 0.5
なので、
1
になります。
見事にANDになりました。
10. 重みとバイアスを変えると判断基準も変わる
ここで非常に重要なことがあります。
パーセプトロンでは、
入力
そのものよりも、
重み
バイアス
が判断基準を決めています。
たとえば同じ入力でも、重みを変えれば結果が変わります。
つまり、
どの情報を重要視するか
そして、
どこを境界として判断するか
を決めているのが、重みとバイアスです。
機械学習における「学習」という言葉も、ここにつながってきます。
11. 機械学習の「学習」とは何か
AIが「学習する」と聞くと、人間のように本を読んで理解しているように感じるかもしれません。
しかし、パーセプトロンにおける学習はもっと数学的です。
非常に単純化すると、
正しい答えに近づくように重みとバイアスを調整する
ことです。
たとえば本当の答えが、
1
なのに、パーセプトロンが、
0
を出したとします。
すると、
重みやバイアスが適切ではなかった
と考えます。
そこで少し値を変更します。
そしてもう一度予測します。
予測
↓
間違える
↓
重みを修正
↓
もう一度予測
↓
また修正
という処理を繰り返していきます。
これが機械学習における「学習」の原型です。
AIが何かを理解しているというより、
間違いが減るように内部の数字を調整している
と考えると分かりやすいでしょう。
12. 学習前と学習後
学習前のパーセプトロンでは、重みが適当な値かもしれません。
w1 = 0.1
w2 = -0.3
b = 0.2
この状態では、正しい判断ができない可能性があります。
しかし学習を繰り返すことで、
w1 = 0.8
w2 = 0.9
b = -1.2
のように、より適切な値へ変化していきます。
つまり、機械学習ではプログラマーが、
もし○○なら1
もし△△なら0
とすべてのルールを書くのではありません。
データを与え、
この入力なら正解は1
この入力なら正解は0
という例を見せながら、
判断に必要なパラメータを機械自身に調整させる
わけです。
ここが従来型プログラミングと機械学習の大きな違いのひとつです。
13. パーセプトロンは直線で世界を分ける
パーセプトロンには重要な特徴があります。
それは、
判断境界が直線になる
ということです。
2つの入力がある場合、
x1w1 + x2w2 + b = 0
という式は、数学的には直線を表します。
そのため、パーセプトロンはデータを、
直線のこちら側
と、
直線の向こう側
に分類することになります。
このような問題を、
線形分離可能
と呼びます。
ANDやORのような問題は、1本の直線で分離できます。
そのため単純なパーセプトロンでも解くことができます。
14. しかしXORは解けない
単純なパーセプトロンには有名な弱点があります。
それがXORです。
XORは、
0 XOR 0 → 0
0 XOR 1 → 1
1 XOR 0 → 1
1 XOR 1 → 0
となります。
ANDとは違い、
どちらか片方だけが1なら1
です。
このデータを平面に配置すると、1本の直線ではきれいに分けることができません。
つまり、
単純なパーセプトロンではXORを表現できない
ということです。
これは非常に重要な発見でした。
15. では、どうするのか
1個のパーセプトロンで無理なら、複数のパーセプトロンを組み合わせればいい。
ここから、
多層パーセプトロン
という考え方につながります。
さらに、
入力層
↓
隠れ層
↓
出力層
という構造へ発展し、
ニューラルネットワーク、
そしてディープラーニングへとつながっていきます。
つまり現代の巨大なAIも、その根元をたどっていくと、
入力
↓
重み
↓
足し算
↓
バイアス
↓
活性化関数
という非常に基本的な構造にたどり着きます。
16. ここまでのまとめ
パーセプトロンは、人工ニューロンを数学的に表現した非常に基本的なモデルです。
計算の流れは、
入力
↓
重みを掛ける
↓
全部足す
↓
バイアスを加える
↓
活性化関数
↓
出力
です。
式では、
z = x1w1 + x2w2 + ... + xnwn + b
となります。
そして最も重要なのは、
機械学習における「学習」とは、正しい答えに近づくように重みやバイアスを調整することである
という点です。
AIという言葉は非常に大きく聞こえます。
しかし、その基礎では、
入力を受け取り
↓
重要度を掛け
↓
足し合わせ
↓
判断し
↓
間違っていたら修正する
ということを繰り返しています。
この仕組みを理解しておくと、この先ニューラルネットワークやディープラーニングを学ぶときにも、「AIが何をやっているのか」がずっと見えやすくなります。
次回
次は実際にPythonを使い、
入力
重み
バイアス
活性化関数
をコードとして表現してみます。
そしてANDやORを実際にパーセプトロンで計算しながら、
「人工ニューロンがコードになる瞬間」
を確認していきます。