パーセプトロン学習則

パーセプトロンは、動物の神経細胞を模倣したモデルとなっている。複数の入力シグナルを受け取り、入力シグナルにウェイトをかけて判断し、閾値以上であれば、シグナルを出力する。これを数式で表すと、複数の入力シグナル x = (x1, x2, ...) を受け取り、各入力シグナルにウェイト w をかけて、z = wTx を計算し、z ≥ 0 ならばシグナルを出力する、のように表すことができる。

\[ \begin{eqnarray} f(z) = \begin{cases} 1 & ( z \ge 0 ) \\ 0 & ( otherwise ) \end{cases} \end{eqnarray} \]

ウェイト w は、一般的に乱数で初期化してから、学習データを与えて、機械自身に学習を通して決定させる。このウェイト w を決定していくプロセスを学習とよぶ。

乱数で初期化された w があったとき、このモデルにある 1 サンプルの学習データ (x1, y1 = 1) を与えた時、z1 = wTx1 ≥ 0 と計算されたと仮定する。このとき z1 > 0 だから、f(z1) = 1 となるので 1 が出力される。これは学習データ y1 = 1 と一致するので、w を更新しなくても、このモデルは予測するのに十分に使える。

次に、もう 1 サンプルの学習データ (x2, y2 = 1) が与えられて、z2 = wTx2 < 0 と計算されたと仮定する。すると、このモデルは f(z2) = 0 と 0 を出力する。このモデルで出力した値は、学習データの y2 = 1 と異なるので、w を更新(修正)していく必要がある。その更新は、wTx2 の値が大きくなるような更新である必要がある。つまり、w に何かの値を加えて、しかも wTx2 の値を大きくしなくてはならない。その一つの方法として、以下のようにすることができる。

\[ \mathbf{w}^{new} = \mathbf{w} + \mathbf{x}_{2} \]

このとき、x2 は列ベクトルだから、x2Tx2 は必ず 0 よりも大きくなることから、次の関係が求まる。

\[ \begin{eqnarray} (\mathbf{w}^{new})^{T} \mathbf{x}_{2} &=& (\mathbf{w} + \mathbf{x}_{2})^{T}\mathbf{x}_{2} \\ &=& \mathbf{w}^{T}\mathbf{x}_{2} + \mathbf{x}_{2}^{T}\mathbf{x}_{2} \gt \mathbf{w}^{T}\mathbf{x}_{2} \end{eqnarray} \]

よって、一般的に、学習データ (x, y1 = 1) が与えられた時、もし、その時のモデルが f(z) = 0 となった場合は、次の式で w を更新することができる。

\[ \mathbf{w}^{new} = \mathbf{w} + \mathbf{x} \]

一方で、学習データ (x, y1 = 0) が与えられた時、その時のモデルが f(z) = 1 となった場合は、同様に考えて(wTx の値を小さくなるように修正を行う必要があるので)、次の式で w を更新する必要がある。

\[ \mathbf{w}^{new} = \mathbf{w} - \mathbf{x} \]

両者の符号に着目すると、w を更新する式は次のように一般化することができる。この式であれば、学習データに対して予測が正しいとき(「y = 1 かつ f(z) = 1」または「y = 0 かつ f(z) = 0」)、w の更新が行われないようになる。一方で、予測が間違った時に、正しい方向へ更新を行うようになる。

\[ \mathbf{w}^{new} = \mathbf{w} + (y - f(z)) \mathbf{x} \]

この式で見たように、w の更新は、y - f(z) の差を使って行われる。つまり、更新する場合は、x に対して 1 倍をかけて、w の更新を行う。この更新間隔を大きくしたり、小さくしたりすることができる。例えば、1 倍ではなく、η 倍をかけて w を更新させることもできる。

\[ \mathbf{w}^{new} = \mathbf{w} + \eta (y - f(z)) \mathbf{x} \]

パラメーターの更新はこのような単純な式で行える。しかし、損失関数の形や学習率 η によって、収束速度が遅かったり、あるいは最適解に収束できなかったりする。そのため、現在では、確率的勾配降下法(SGD)をはじめとする Momentum 法、AdaGrad 法、Adam 法など、様々な最適化アルゴリズムが提唱されている。

Python スクリプト

パーセプトロンの学習を Python で実装した例。

References

  • Lagandula AC. Perceptron Learning Algorithm: A Graphical Explanation Of Why It Works. website