じんべえざめのノート

仮想生物と強化学習と深層学習に興味がある大学院生のブログ。

ニューラルネットワーク入門➁

前回の記事では、形式ニューロンを用いてANDやORなどの線形分離が可能な論理回路を表現できることを説明しました。しかし、XORなどの線形分離が不可能なものは表現出来ませんでした。今回は、形式ニューロンを組み合わせることで、非線形なモデルを表現する方法を説明します。

XOR

XORは、x_1x_2の片方のみ1のときのみ1になる論理回路です。ANDやORとあわせて表にすると、以下のようになります。

x_1 x_2 OR AND XOR
0 0 0 0 0
0 1 1 0 1
1 0 1 0 1
1 1 1 1 0

このように、XORはORからANDになる場合を引いたような論理回路です。形式ニューロンを組み合わせてXORを表現する際も、同じような仕組みで表現することが出来ます。

ニューラルネットワーク

f:id:jinbeizame007:20180805194322p:plain:w500

先にXORを表現するニューラルネットワークの概要を載せます。上図では、バイアスの表記は省略されています。ニューラルネットワークは、基本的に入力層・中間層(隠れ層)・出力層の3種類の層から構成されます(層が定義されていないものもあります)。ニューラルネットワークは、このように層を重ねることで、より複雑なモデルを表現することが出来ます。それでは、実際にニューラルネットワークを用いてXORを表現していきます。

f:id:jinbeizame007:20180805200539p:plain:w300

まずは、ANDとORの形式ニューロンを組み合わせます。ここで、wの右上の(1)は1層目の重みという意味で、右下の数字は、次の層のユニットの番号と前の層のユニットの番号を示しています。例えば、w_{12}^{(1)}は前の層の2番目のユニットから、次の層の1番目のユニットへの重みという意味です。

\begin{align} \begin{cases} w_{11}^{(1)} = 0.5 \\ w_{12}^{(1)} = 0.5 \\ b_1^{(1)} = -0.2 \end{cases} \ \ \begin{cases} w_{21}^{(1)} = 0.5 \\ w_{22}^{(1)} = 0.5 \\ b_2^{(1)} = -0.7 \end{cases} \end{align}

ここで、重みとバイアスを以上のように設定します。左の式はs_1への重みとバイアスで、ORを表現しています。右の式はs_2への重みとバイアスで、ANDを表現しています。これでORの形式ニューロンとANDの形式ニューロンを組み合わせることが出来ました。これを使ってXORを表現していきます。

f:id:jinbeizame007:20180805235404p:plain:w500

\begin{align} \begin{cases} w_{11}^{(1)} = 0.5 \\ w_{12}^{(1)} = 0.5 \\ b_1^{(1)} = -0.2 \end{cases} \ \ \begin{cases} w_{21}^{(1)} = 0.5 \\ w_{22}^{(1)} = 0.5 \\ b_2^{(1)} = -0.7 \end{cases} \ \ \begin{cases} w_{11}^{(2)} = 1.0 \\ w_{12}^{(2)} = -1.0 \\ b_1^{(2)} = 0 \end{cases} \end{align}

上図がXORを表現したニューラルネットワークとその重みです。今までの式に、一番右の式が追加されました。 w_{11}^{(2)}s_1 (OR)から y への重みで、w_{12}^{(2)}s_2 (AND)から y への重みです。

\begin{align} y &= f(s_1w_{11}^{(2)}+s_2w_{12}^{(2)}+b_1^{(2)}) \\ &= f(s_1-s_2) \end{align}

yは上式で求めることが出来ます。fは階段関数です。s_1 (OR)が1でs_2 (AND)が0のときにs_1-s_2 > 0y=1となり、それ以外の場合が s_1-s_2 \leq 0y=0となります。表にすると、以下のようになります。

x_1 x_2 s_1 (OR) s_2 (AND) y (XOR)
0 0 0 0 0
0 1 1 0 1
1 0 1 0 1
1 1 1 1 0

これで、ANDとORの形式ニューロンを組み合わせてXORを表現することが出来ました。このニューラルネットワークでは、ANDとORという単純な特徴を組み合わせてXORという複雑な特徴を表現しています。これにさらに形式ニューロンを組み合わせることで、より複雑な特徴も表現することが出来ます。

このように、ニューラルネットワーク「特徴を組み合わせることで、より複雑な特徴を表現する」、ということを繰り返すことで、画像などの高次元のデータからも非常に複雑な特徴を表現することが出来ます。近年大きな成果をあげている深層学習 (Deep Learning) では、層を何層も重ねることによって非常に複雑な特徴を学習しています。

バイアスの扱い

これまでは、重みとバイアスを分けて書いてきました。しかし、バイアスも重みに含めることが出来ます。これまでは、中間層が無く入力が2つ、出力が1つのニューラルネットの重みとバイアスは以下のように表現していました。

\begin{align} y &= f(\sum_{i=1} x_iw_i + b) \\ y &= f(x_1w_1 + x_2w_2 + b) \end{align}

ここで、バイアスbを入力値x_0=1と重みw_0を用いることで、以下のように表現出来ます。

\begin{align} b &= x_0w_0 \\ y &= f(x_0w_0 + x_1w_1 + x_2w_2 ) \\ &= f(\sum_{i=0} x_iw_i) \end{align}

これで、バイアスbを重みwに統一することが出来ました。ここからは、必要のない場合はバイアスは重みに含んでいるものとして表現します。

今回は、形式ニューロンを組み合わせることによって複雑な特徴を表現できることを説明しました。しかし、複雑なニューラルネットワークになればなるほど、人間が重みを設定するのは大変です。次回は、この重みを人間が設定するのではなく学習によって自動で獲得する方法を説明していきます。