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

前回は、ニューラルネットワークの学習において重要である損失関数と勾配降下法について説明しました。前回は重みの更新量は微分を用いて求めましたが、層が深くなってきた場合、計算に時間がかかってしまうという問題があります。今回は、重みの勾配の計算を効率よく行う手法である誤差逆伝播について説明します。

勾配降下法のおさらい

誤差逆伝播法の説明をする前に、勾配降下法のおさらいをします。勾配降下法とは、現時点の状態から勾配(傾き)を計算して下る方向に進む手法でした。また、勾配降下法の概要を図にすると以下のようになっていました。この図が示していることは、損失Eを重みw微分することで勾配(傾き)を計算し、その勾配に比例した値を重みの更新量とするということです。

f:id:jinbeizame007:20180810213518p:plain:w500

これを数式で表現すると以下のようになります。

\begin{align} \Delta w &= - η\frac{\partial E}{\partial w} \\ &= - η\frac{\Delta E}{\Delta f(u)} \frac{\Delta f(u)}{\Delta u} \frac{\Delta u}{\Delta w} \end{align}

ここで、\Delta wは重みの更新量、ηは学習率です。学習率は、求められた勾配からどの程度重みを更新するかを決める係数です。損失関数Eを重みw偏微分して求めた勾配にマイナスと学習率ηをかけた値を重みの更新量\Delta wとしています。マイナスをかける理由は、勾配を上る方向から下る方向に変えるためです。

誤差逆伝播

ニューラルネットワークへ入力した値が、入力層→中間層→出力層の順に伝播することを、順伝播といいます。また、その逆向きに出力層から入力層に向かって伝播することを逆伝播といいます。誤差逆伝播とは、出力層で求められた誤差を入力層に向かって伝播する手法です。層が何層も重なる場合、純粋に偏微分を行って勾配を求めるよりも高速に効率よく勾配を計算することが出来ます。

誤差逆伝播法の説明の際は、各記号は以下のような意味で用います。

  • E:損失関数
  • w^{(l)}l層目のユニットへの重みの行列
  • u^{(l)} = w^{(l)}z^{(l-1)}l層目のユニットへの入力のベクトル
  • z^{(l)} = f(u^{(l)})l層目のユニットの出力のベクトル

それでは、誤差逆伝播法の具体的な仕組みについて説明していきます。 上の式は、合成関数の微分から以下のようになります

\begin{align} \Delta w^{(l)} &= - η\frac{\partial E}{\partial w^{(l)}} \\ &= - η\frac{\partial E}{\partial u^{(l)}}\frac{\partial u^{(l)}}{\partial w^{(l)}} \end{align}

ここで、u^{(l)} = w^{(l)} z^{(l-1)}から\frac{\partial u^{(l)}}{\partial w^{(l)}} = z^{(l-1)}となるため(l層目のユニットへの入力をl層目のユニットへの重みで微分すると、l-1層目のユニットの出力となるため)

\begin{align} \Delta w^{(l)} &= - η\frac{\partial E}{\partial u^{(l)}} \frac{\partial u^{(l)}}{\partial w^{(l)}} \\ &= - η\frac{\partial E}{\partial u^{(l)}} z^{ (l - 1) } \end{align}

となります。

つまり、\frac{\partial E}{\partial u^{(l)}}が分かれば、勾配\frac{\partial E}{\partial w^{(l)}}が分かり、重みの更新量\Delta w^{(l)}を求めることが出来ます。

ここで、 δ^{(l)} = \frac{\partial E}{\partial u^{(l)}}とし、デルタと呼ぶことにします。誤差逆伝播法とは、このデルタを出力層から入力層へ順に求めていく手法です。

また、損失関数を求める過程でu^{(l+1)}=w^{(l+1)}f(u^{(l)})という計算が含まれているため、合成関数の微分から以下のように変形することが出来ます。

\begin{align} δ^{(l)} &= \frac{\partial E}{\partial u^{(l)}} \\ &= \frac{\partial E}{\partial u^{(l+1)}} \frac{\partial u^{(l+1)}}{\partial u^{(l)}} \end{align}

ここで、l+1層目のユニットへの入力とその微分は以下のようになります。

\begin{align} u^{(l+1)} = w^{(l)}f(u^{(l)}) \\ \frac{\partial u^{(l+1)}}{\partial u^{(l)}} = w^{(l)} f'(u^{(l)}) \end{align}

また、δ^{(l+1)} = \frac{\partial E}{\partial u^{(l+1)}}よりδ^{(l)}は以下のようになります。

\begin{align} δ^{(l)} &= \frac{\partial E}{\partial u^{(l+1)}} \frac{\partial u^{(l+1)}}{\partial u^{(l)}} \\ &= δ^{(l+1)} w^{(l)} f'(u^{(l)}) \end{align}

したがって、出力層のユニットに対応するδのみ通常の方法δ = \frac{\partial E}{\partial f(u)} \frac{\partial f(u)}{\partial u}(誤差関数の微分と活性化関数の微分)で求めてしまえば、あとは入力層に向かって δ^{(l)}= δ^{(l+1)} w^{(l)} f'(u^{(l)})を繰り返していけば、誤差を逆伝播させることが出来ます。

まとめると、以下のようになります。

  • 順伝播

\begin{align} z^{ (l+1) } = f(w^{(l)}z^{(l)}) \end{align}

\begin{align} δ^{(l)} &= δ^{(l+1)} w^{(l)} f'(u^{(l)}) \\ \end{align}

  • 勾配降下法

\begin{align} \Delta w^{(l)} &= - η\frac{\partial E}{\partial w} \\ &= - η\frac{\partial E}{\partial u^{(l)}} \frac{\partial u^{(l)}}{\partial w^{(l)}} \\ &= - η δ^{(l)} z^{ (l - 1) } \end{align}

このように、誤差逆伝播法をによって求めた誤差を用いて、勾配降下法で重みを更新量を求めます。

今回は、重みの勾配の計算を効率よく行う手法である誤差逆伝播について説明しました。これで、形式ニューロンから誤差逆伝播法までを一通り説明し終わりましたので、ニューラルネットワーク入門は終了です。深層学習(Deep Learning)はニューラルネットワークを多層にしたものですので、深層学習に関してもここまで読めていれば基礎は大丈夫だと思います。ここまで読んで頂き本当にありがとうございます。もしご質問やご指摘等ありましたら、お気軽にコメントして頂けると幸いです。

最後に、ニューラルネットワークの基礎を学ぶ上でおすすめの書籍をご紹介いたします。

ニューラルネットワークの基礎がPythonのコードとともにとても分かりやすく説明されています。特に、誤差逆伝播法の部分は計算グラフを用いて直観的に説明されていて、とても分かりやすいと思います。手を動かしながら学んでいきたい方にはぴったりな書籍だと思います。最近続編でゼロから作るDeep Learning2が出版されました。こちらは自然言語処理編となっていますが、LSTMやAttentionなど自然言語処理以外でも多くの分野で用いられている非常に重要な手法が説明されているため、自然言語処理に興味がある方はもちろん、自然言語処理以外の分野を扱う方にもおすすめです。

ニューラルネットワークの入門書に多い表面をなぞったようなものではなく、非常に理論的に分かりやすく説明されています。誤差逆伝播法なども、なぜそのような手法を用いるのか、なぜそのような手法だと高速なのかなどとても詳しく書かれています。また、扱っている範囲も非常に網羅的であり、この本を一通り読めばニューラルネットワークの基礎はおさえたと言っても良いと思います。個人的には、ニューラルネットワークの入門書を1冊おすすめしてと言われたらこちらの本をおすすめします。

こちらの書籍はGoogleのIan Goodfellowさんによって書かれた書籍です。上記の2冊より1段階専門的になっており、非常に広い範囲をとても詳しく説明されています。個人的には、この書籍が一番深層学習やニューラルネットワークの本質を捉えた説明がされているのではないかとおもいます。上記の2冊のどちらかを読んで上でさらに専門的な内容に進みたい場合はこちらの書籍をおすすめします。

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

前回の記事では、ニューラルネットワークは「特徴を組み合わせることで、より複雑な特徴を表現する」ことを繰り返すことによって、非常に複雑な特徴を表現出来ることを説明しました。今回は、ニューラルネットワークの重みを学習によって獲得する方法を説明します。

機械学習ニューラルネットワーク

ニューラルネットワーク機械学習の手法の1つです。他の機械学習の手法とニューラルネットワークの違いの1つは、高次元のデータの複雑な特徴を学習によって獲得出来ることです。このデータから予測に必要な特徴を学習することを、表現学習といいます。

従来の機械学習手法では、人手で特徴量を設計していました。しかし、本当に抽出すべき特徴量を設計することは非常に難しいです。例えば、画像から猫を認識したい場合、画像の画素から必要な抽出する場合、画像の猫は猫によって毛の色や毛並みが違うだけでなく、ジャンプしていたり寝ていたり、一部が隠れていたり強い光が当たっていたりします。それらを全て認識できるような特徴量を人手で設計するのは非常に困難です。

以上のように、高次元の複雑なデータから予測に必要な特徴量を学習によって自動で獲得出来ることは、他の機械学習手法と比較してニューラルネットワークの大きな利点の1つです。以上の説明を図にすると以下のようになります。

f:id:jinbeizame007:20180809233035p:plain

グレーの枠が人手で行う部分で、青色の枠が学習で自動で行う部分です。従来の機械学習では特徴量を人手で設計していましたが、ニューラルネットワークは特徴量の抽出から予測まで学習することが出来ます。このように、ニューラルネットワークは生データ(加工されていないデータ)から予測まで (入力から出力まで) end-to-end (端から端まで) で学習出来ます

この特徴量の抽出から予測までニューラルネットワークで行っているという部分は以下のようなイメージになります。ニューラルネットワークは、出力層の手前まで「前の層の特徴を組み合わせることで、より抽象的な特徴を表現する」ことを繰り返します。そして、最終的に得られた特徴(例だと猫の顔や手)から予測を行います。つまり、入力層から中間層の最後の層までで特徴量の設計を学習(表現学習)を行い、中間層の最後の層から出力層への間でこれまでに得られた特徴量を用いて分類・予測を行います

f:id:jinbeizame007:20180809234352p:plain

損失関数

多くの機械学習では何らかの最適化を行います。最適化とは、パラメータθを変更することで関数f(θ)を最小化あるいは最大化することです。このとき、最小化あるいは最大化したい関数を目的関数と呼びます。また、最小化を行う場合には損失関数または誤差関数と呼ぶこともあります。

ニューラルネットワークの学習では、多くの場合入力と教師データ(正解)のペアを用いて損失関数を表現します。このように、教師データを用いた学習を教師あり学習といいます。反対に教師データを用いない学習を教師なし学習といいます。ニューラルネットワークでは多くの場合教師あり学習が行われます。

教師データは、主に2種類あります。回帰という値を予測したい学習では、正解とする実数を用います。また、分類という入力がどの種類か判別するを判別したい学習では、YesかNoかという意味で1と0を用います。例えば、犬か猫かひよこかを判別したい場合で猫が正解の際は、[0, 1, 0]という教師データとなります。このように、分類問題でどれか1つが正解の場合に、正解を1それ以外を0で表す表記法をone-hot表現と言います。

代表的な損失関数に、二乗誤差関数と交差エントロピー関数 (クロスエントロピー関数) があります。二乗誤差関数は、実数値を予測する回帰や2種類の分類問題である二値分類によく用いられます。交差エントロピー関数は、3種類以上の分類問題である多クラス分類によく用いられます。

二乗誤差関数

二乗誤差関数は以下の数式で表されます。

\begin{align} E = \frac{1}{2} \sum_{n=1}^N (y_n-t_n)^2 \end{align}

ここで、y_nニューラルネットワークの出力、t_nは教師データを表しています。nはデータの次元数を表しています。例えば、先ほどの犬と猫とひよこの分類の教師データの[0, 1, 0]だと、t_1=0, t_2=1, t_3=0です。ニューラルネットワークでいうとnは出力層のユニットの番号に対応します。\frac{1}{2}は後の計算で都合が良いのでかけています。

交差エントロピー関数

交差エントロピー関数は以下の数式で表されます。

\begin{align} E = -\sum_{n=1}^N t_n \log y_n \end{align}

ここで、logの低はeとなっています。また、先ほどと同様にy_nニューラルネットワークの出力、t_nは教師データを表しています。交差エントロピー関数は他クラス分類の際に用いられるため、教師データは[0, 1, 0]のようなone-hot表現となっているため、t_nは0か1のどちらかになります。そのため、上式はt_nが1のときの計算をするだけになります。その際の E=-\log xをグラフで表現すると以下のようになります。正解の0に近い値のときは0に近い値となり、xの値が0に近づくにつれて損失となる値が大きくなります。

f:id:jinbeizame007:20180810142815p:plain

ここまでで、ニューラルネットワークは損失関数を最小化するように学習するということを説明しました。ここからは、損失関数を用いてどのように学習を行うのかを説明します。

勾配降下法

機械学習の多くの手法では、目的関数の最小化または最大化を行うために最適なパラメータを探索します。ニューラルネットワークも同じで、損失関数を最小化する最適なパラメータ(重みとバイアス)を探索します。

探索したい最適なパラメータというのは、すべての入力に対する損失関数の値の合計が最小値を取るパラメータです。二乗誤差関数の場合を例にとると以下のような式になります。

\begin{align} E = \frac{1}{2} \sum_{d=1}^{D} \sum_{n=1}^N (y_n-t_n)^2 \end{align}

ここで、Dはデータの個数です。このような損失関数は、1つのデータに対する損失関数と比較して非常に複雑な関数なだけでなく、パラメータの値に対する損失関数の値は入力してみないと分からないため損失関数の全体の形が分かりません。そのため、最小値を取るパラメータを見つけるのは非常に難しいです。

そこで、損失関数の全体の形が分からなくても、現時点の状態から勾配(傾き)を計算して下る方向に進む手法を用います。また、この手法を勾配降下法と言います。勾配降下法の概要を図にすると以下のようになります。

f:id:jinbeizame007:20180810213518p:plain:w500

ここで、青線のグラフが損失関数、x軸がパラメータ(重み)、y軸が損失の大きさ、右上の黒点が現在の状態、右上の黒点に重なっている直線が勾配(傾き)、左下の黒点が損失関数の最小値を取る点を示しています。現在の状態から損失関数の勾配を求め、勾配を下る方向に重みの更新を行います

勾配は微分を用いて求めます。実際には偏微分を行いますが、今回は簡単にするために通常の微分を用います。次の記事では偏微分を用います。勾配降下法を数式で表すと、以下のようになります。\Delta wは重みの更新量です。ηは学習率といい、誤差をどの程度更新するか決める値です。

\begin{align} \Delta w = - η\frac{\Delta E}{\Delta w} \end{align}

ここで、合成関数の微分から、次のようになります。

\begin{align} \Delta w &= - η\frac{\Delta E}{\Delta w} \\ &= - η\frac{\Delta E}{\Delta y} \frac{\Delta y}{\Delta w} \end{align}

そして、ネットワークの出力であるyy=f(u)とすると

\begin{align} \Delta w &= - η\frac{\Delta E}{\Delta f(u)} \frac{\Delta f(u)}{\Delta w} \\ &= - η\frac{\Delta E}{\Delta f(u)} \frac{\Delta f(u)}{\Delta u} \frac{\Delta u}{\Delta w} \end{align}

となります。 ここで、ηは学習率、Eは損失関数、yはネットワークの出力、fは活性化関数、uは活性、wは重みです。

ここで、誤差関数を二乗誤差関数、活性化関数をシグモイド関数、入力のデータを1次元とした場合を例に考えていきます。

ここで、誤差関数の1つである二乗誤差関数とその微分は、

\begin{align} E &=\frac{1}{2}(f(u) - t)^2 \\ \frac{\Delta E}{\Delta f(u)} &= f(u) - t \end{align}

となり、二乗誤差関数の微分を代入すると、

\begin{align} \Delta w &= - η\frac{\Delta E}{\Delta f(u)} \frac{\Delta f(u)}{\Delta u} \frac{\Delta u}{\Delta w} \\ &= -η(f(u) - t)\frac{\Delta f(u)}{\Delta u} \frac{\Delta u}{\Delta w} \end{align}

ここで、活性化関数の1つであるシグモイド関数とその微分は、

\begin{align} f(u) &= \frac{1}{1-e^{-x}} \\ \frac{\Delta f(u)}{\Delta u} &= f(u)(1-f(u)) \end{align}

となり、シグモイド関数微分を代入すると

\begin{align} \Delta w &= -η(f(u) - t)\frac{\Delta f(u)}{\Delta u} \frac{\Delta u}{\Delta w} \\ &= -η(f(u) - t)f(u)(1-f(u)) \frac{\Delta u}{\Delta w} \end{align}

ここで、入力データが1次元のためu=xwであり、微分すると\frac{\Delta u}{\Delta w} = xとなるため、これを代入すると

\begin{align} \Delta w &= -η(f(u) - t)f(u)(1-f(u)) \frac{\Delta u}{\Delta w} \\ &= -η(f(u) - t)f(u)(1-f(u))x \end{align}

そして、y=f(u)なので

\begin{align} \Delta w &= -η(f(u) - t)f(u)(1-f(u))x \\ &= -η(y - t)y(1-y)x \end{align}

となります。

今回は、ニューラルネットワークの学習において重要である損失関数と勾配降下法について説明しました。今回は重みの更新量は微分を用いて求めましたが、層が深くなってきた場合、計算に時間がかかってしまうという問題があります。次の記事では、重みの勾配の計算を効率よく行う手法である誤差逆伝播について説明します。

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

前回の記事では、形式ニューロンを用いて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に統一することが出来ました。ここからは、必要のない場合はバイアスは重みに含んでいるものとして表現します。

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

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

 \displaystyle

深層学習は、データから分類や予測に必要な特徴を発見する表現学習が可能な機械学習手法です。特に、画像などの高次元の複雑なデータに関しても表現学習が可能な点は、深層学習の大きな特徴の1つです。ニューラルネットワーク入門シリーズでは、深層学習で用いられるニューラルネットワークの基礎をまとめていきます。

このシリーズはニューラルネットワークの初学者の方を対象にしており、大学1~2年生程度の数学の知識があれば理解が出来る内容になっています。出来るだけ簡潔な説明にするために理論の詳細の部分についてはカバーしていませんが、このシリーズを読み終える頃には、ニューラルネットワークとはどのようなものか」「他の機械学習手法と比較してどのような特徴があるか」「どのように学習を行うのか」が分かるようになっており、説明もその順番で行われています。

ニューラルネットワークは、形式ニューロンを組み合わせることで作られています。そのため、今回は形式ニューロンについて説明します。

形式ニューロン

f:id:jinbeizame007:20180815232320p:plain:w500

形式ニューロンは、上図のイメージのような実際のニューロン(神経)の活動をモデル化したもので、1943年にW. マカロックとW. ピッツによって考案されました。形式ニューロンはn個の入力に対して1つの出力を行います。入力に対してニューロンの状態がある閾値を超えると1、超えないと0を出力します。また、この閾値を超えることを発火すると言います。これをモデル化すると次のようになります。

f:id:jinbeizame007:20180803203547p:plain:w500

上図は形式ニューロンの概要です。また、図中の〇はユニットやノードと呼ばれています。xは入力、yは出力、wは重み、bはバイアスです。

f:id:jinbeizame007:20180813103404p:plain

形式ニューロンはxを入力することで、yを出力します。その出力する値が重みwとバイアスbによって決まるため、これらをパラメータと呼びます。ユニットへの入力uは、入力xに重みwを掛けたものの和にバイアスを足した値となります。重みは入力との結合の強さを表していて、バイアスはニューロンの発火のしやすさを表しています。式で表すと以下のようになります。

\begin{align} u &= \displaystyle \sum_{i} x_iw_i + b \\ &= x_1w_1 + x_2w_2 + b \end{align}

ユニットの出力yは、ユニットへの入力uに活性化関数fを適用したものになります。一般に活性化関数には階段関数、シグモイド関数、正規化線形関数など様々な関数がありますが、形式ニューロンの場合は階段関数を用います。

\begin{align} y &= f(u) \\ &= f(\displaystyle \sum_{i} x_iw_i + b) \end{align}

形式ニューロンによる論理回路

ここからは実際に形式ニューロンを使っていきます。形式ニューロンを用いることで、ANDゲートやORゲートなどの論理回路を表現することが出来ます。活性化関数には、以下の階段関数を用います。

\begin{align} f(u) = \begin{cases} 1 \ (u > 0) \\ 0 \ (u \leq 0) \end{cases} \end{align}

f:id:jinbeizame007:20180806182434p:plain:w500

ANDゲートは重みとバイアスを以下のように設定することで実現できます。 \begin{align} \begin{cases} w_1 = 0.5 \\ w_2 = 0.5 \\ b = -0.7 \end{cases} \end{align}

\begin{align} u = 0.5x_1 + 0.5x_2 - 0.7 \end{align}

x_1 x_2 u y
0 0 -0.7 0
0 1 -0.2 0
1 0 -0.2 0
1 1 0.3 1

ORゲートは重みとバイアスを以下のように設定することで実現できます。 \begin{align} \begin{cases} w_1 = 0.5 \\ w_2 = 0.5 \\ b = -0.2 \end{cases} \end{align}

\begin{align} u = 0.5x_1 + 0.5x_2 - 0.2 \end{align}

x_1 x_2 u y
0 0 -0.2 0
0 1 0.3 1
1 0 0.3 1
1 1 0.8 1

このように、形式ニューロンを用いることでANDやORなどの論理回路を表現することが出来ます。

線形と非線形

ここまでは、形式ニューロンを用いて論理回路を表現してきました。この論理回路をグラフで表すと、それぞれ以下のようになります。

ANDは以下のような関数で表現されていました。

\begin{align} y = \begin{cases} 1 \ ( 0.5x_1 + 0.5x_2 -0.7 > 0) \\ 0 \ (0.5x_1 + 0.5x_2 - 0.7 \leq 0) \end{cases} \end{align}

変形すると、

\begin{align} y = \begin{cases} 1 \ ( x_2 > x_1 +1.4) \\ 0 \ (x_2 \leq x_1 + 1.4) \end{cases} \end{align}

f:id:jinbeizame007:20180804161204p:plain:w500

ORは以下のような関数で表現されていました。

\begin{align} y = \begin{cases} 1 \ ( 0.5x_1 + 0.5x_2 -0.2 > 0) \\ 0 \ (0.5x_1 + 0.5x_2 - 0.2 \leq 0) \end{cases} \end{align}

変形すると、

\begin{align} y = \begin{cases} 1 \ ( x_2 > x_1 +0.4) \\ 0 \ (x_2 \leq x_1 + 0.4) \end{cases} \end{align}

f:id:jinbeizame007:20180804161505p:plain:w500

このように、ANDやORは1本の直線で分離することが出来ます。この、1本の直線で分離することを線形分離といいます(正確には、N次元空間上でN-1次元の超平面で分離すること)。形式ニューロンは、このような線形分離が出来るモデルを表現することが出来ます。

逆に、形式ニューロンは線形分離が出来ないモデルは表現できません。線形分離が出来ない論理回路の例にXORがあります。XORは片方のみ1の場合に1、それ以外が0となる論理回路です。表にすると以下のようになります。

x_1 x_2 y
0 0 0
0 1 1
1 0 1
1 1 0

ORからANDの場合を引いたようなものになっています。 グラフにするとこのようになります。

f:id:jinbeizame007:20180804180354p:plain:w500

このグラフの黒い点と青い点を一本の線で分けることは不可能です。このような線形分離が出来ないモデルは形式ニューロンでは表現出来ません。しかし、形式ニューロンを組み合わせてニューラルネットワークを用いることで以下のように分離することが出来ます。

f:id:jinbeizame007:20180804181626p:plain:w500

このように、複数の直線や曲線などで分離することを非線形分離といいます。次の記事では、このような非線形分離が可能なニューラルネットワークについて説明します。