Deep Learning

パーセプトロン


ローゼンブラットが1957年に考案した。 複数の信号を入力として受け取り、ひとつの信号を出力する。 信号は「流す(1)」または「流さない(0)」のどちらかである。 出力信号を「流す(1)」場合を、「ニューロンが発火する」という。

$x_1$ と $x_2$を入力信号、$y$を出力信号とし、 ノード $x_1$ とノード $y$ の間のエッジの重みを $w_1$, ノード $x_2$ とノード $y$ の間のエッジの重みを $w_2$, $\theta$ を閾値とする。

$\displaystyle \begin{equation} y = \left\{ \begin{matrix} 0 && (w_1 x_1 + w_2 x_2 \leqq \theta) \\ 1 && (w_1 x_1 + w_2 x_2 > \theta) \end{matrix} \right. \quad\quad\quad\quad(2.1) \end{equation}$

意図した動作を行う ($w_1$, $w_2$, $\theta$) の組を決める必要がある。

ANDを表すパラーメータの選び方は ($w_1$, $w_2$, $\theta$) $=$ (0.5, 0.5, 0.7), (0.5, 0.5, 0.8), (1.0, 1.0, 1.0) など無数にある。

NANDを表すパラーメータの選び方の例も ($w_1$, $w_2$, $\theta$) $=$ (-0.5, -0.5, -0.7) など無数にある。ANDを表すパラメータの符号を反転するだけでよい。

OR を表すパラーメータの選び方の例は ($w_1$, $w_2$, $\theta$) $=$ (1.0, 1.0, 0.5)


パーセプトロンの実装

and00.py
def AND(x1,x2):
  w1, w2, theta = 0.5, 0.5, 0.7
  tmp = x1 * w1 + x2 * w2
  if tmp <= theta:
    return 0
  else
    return 1

式(2.1)において $\theta$ を $-b$ と書く。$b$は「バイアス」を表す。
$\displaystyle \begin{equation} y = \left\{ \begin{matrix} 0 && (b + w_1 x_1 + w_2 x_2 \leqq 0) \\ 1 && (b + w_1 x_1 + w_2 x_2 > 0) \end{matrix} \right. \quad\quad\quad\quad(2.2) \end{equation}$
and.py
def AND(x1,x2):
  x = np.array([x1, x2])
  w = np.array([0.5, 0.5])
  b = -0.7
  tmp = np.sum(x * w) + b
  if tmp <= theta:
    return 0
  else
    return 1

nand.py
def NAND(x1,x2):
  x = np.array([x1, x2])
  w = np.array([-0.5, -0.5])
  b = 0.7
  tmp = np.sum(x * w) + b
  if tmp <= theta:
    return 0
  else
    return 1

or.py
def OR(x1,x2):
  x = np.array([x1, x2])
  w = np.array([0.5, 0.5])
  b = 0.7
  tmp = np.sum(x * w) + b
  if tmp <= theta:
    return 0
  else
    return 1


パーセプトロンの限界

XOR (eXclusive OR, 排他的論理和)を表すパラメータは存在しない。 2次元平面上の4点を ($x_1$, $x_2$) = (0, 0), (1, 1) のグループと ($x_1$, $x_2$) = (1, 0), (0, 1) のグループに直線で分けるのは無理だから。

$\displaystyle \begin{equation} y = \left\{ \begin{matrix} 0 && (b + w_1 x_1 + w_2 x_2 \leqq 0) \\ 1 && (b + w_1 x_1 + w_2 x_2 > 0) \end{matrix} \right. \quad\quad\quad\quad(2.2) \end{equation}$

多層パーセプトロン

単層のパーセプトロンでは XOR が表現できなかった。 しかし、2層にすることで実現できる。

$y =$ ($x_1$ NAND $x_2$) AND ($x_1$ OR $x_2$)
xor.py
def XOR(x1,x2):
  s1 = NAND(x1, x2)
  s2 = OR(x1, x2)
  y = AND(s1, w2)
  return y

このように多層にすることによって、パーセプトロンは複雑な関数であっても表現できる。 ただし、どのように重みを設定すればよいか、の問題は残る。


Yoshihisa Nitta

http://nw.tsuda.ac.jp/