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

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

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

ニューラルネットワーク機械学習の手法の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}

となります。

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