理論関連事項

統計学の基本事項,確率分布の詳細,各種データ解析法の理論的背景について.

ニューラルネットワークとは,人工的に設定したニューロンと呼ばれるものが学習の過程で,そのシナプスの結合強度を変化させ,問題の解決能力を得るような機械学習法の総称のことをいう.難しい.そこで,ニューラルネットワークを限りなく簡単に表現するとすると,この場合,ニューラルネットワークとは,超たくさんの変量をパラメーターとして持つ回帰法である,といえる.以下の単回帰および重回帰と基本的な仕組みは何ら変わらない.単に変数の数が多いだけ.

単回帰

以下の左の図のようなデータが与えられたときにおいて,新たな $x$ の値に対する $y$ の値を予測したい場合は,単回帰分析を行い,右の図のような直線を求めれば良いことを小学校や中学校で習う.

tml_neural_network_overview_01.svg

もし与えられたデータ点 (インスタンス) が2つだけであった場合は,2次元平面上における回帰の係数は一意に決定されるのであったが,このデータようにたくさんのインスタンスが得られた場合,これ対して求められる式は最小二乗法を解くことによって求まる.このデータに対して実際にこれを適用すると以下のものが求まる.

\begin{eqnarray*}y=2x+1\tag{1}\end{eqnarray*}

すなわち,単回帰とは以下の式における係数 $a$ と $b$ を求めるものであった.

\begin{eqnarray*}y=ax+b\tag{2}\end{eqnarray*}

単回帰から重回帰へ

上の単回帰は $y$ に対して唯一の変数 $x$ を考えていたが,この変数はいくつでも増やせる.これは以下のような式によって表される.ここで $n$ はパラメーターの個数.

\begin{eqnarray*}y=\sum_{i=1}^{n}a_ix_i+b\tag{3}\end{eqnarray*}

そして,この式の係数の表記方法は高等数学を習うころには以下のように変化するのであった.

\begin{eqnarray*}y=\sum_{i=1}^{n}\beta_ix_i+\alpha\tag{4}\end{eqnarray*}

しかし,ここでは以下の表記を用いる.

\begin{eqnarray*}y=\sum_{i=1}^{n}w_ix_i+b\tag{5}\end{eqnarray*}

この式は展開すると以下のように変形できる.

\begin{eqnarray*}y=w_1x_1+w_2x_2+\cdots+w_nx_n+b\tag{6}\end{eqnarray*}

これは,横ベクトル (1行n列の行列) と縦ベクトル (n行1列の行列) を用いると以下のように表現される.

\begin{eqnarray*}y=(w_1,w_2,\cdots,w_n)\left(\begin{array}{c}x_1\\x_2\\ \vdots\\x_n\end{array}\right)+b\tag{7}\end{eqnarray*}

よって,ベクトルを太字のアルファベットを用いて表すとすると,式7は以下のように表現することができる.これが重回帰で求める実際の式となる.この $\boldsymbol{x}$ はインプットデータ (ベクトル形式) であり,$y$ は各インプットベクトルデータに紐付いた値である.

\begin{eqnarray*}y=\boldsymbol{w}\boldsymbol{x}+b\tag{8}\end{eqnarray*}

重回帰からネットワークへ

ここで,さらに上の重回帰を拡張する.ここでは,それを超重回帰とかネットワーク等と表現する.上の式8を計算して得られる値はスカラである.ベクトルでも行列でもない.しかし,インプットベクトル $\boldsymbol{x}$ に式8のような処理をしたとして,もし,一時的にベクトルを算出することができるのなら,そのベクトルに対して再び式8のような処理を行えば,超多変量のスーパー重回帰みたいなことができるようになるので,きっと回帰の表現力,すなわち性能が向上しそうである.そうするには,式8,すなわち式7を以下のように拡張してやればいい.ここで,一時的に計算されるベクトルを $\boldsymbol{t}$ とする.

\begin{eqnarray*}\boldsymbol{t}=\left(\begin{array}{cccc}w_{11}&w_{12}&\cdots&w_{1n}\\w_{21}&w_{22}&\cdots&w_{2n}\\\vdots&\vdots&\ddots&\vdots\\w_{m1}&w_{m1}&\cdots&w_{mn}\end{array}\right)\left(\begin{array}{c}x_1\\x_2\\ \vdots\\x_n\end{array}\right)+\left(\begin{array}{c}b_1\\b_2\\ \vdots\\b_m\end{array}\right)\tag{9}\end{eqnarray*}

この式は,行列を太字のアルファベットを用いて表すとすると以下のようになる.このとき,ベクトル $\boldsymbol{x}$ の次元数は $n$,$\boldsymbol{b}$ と $\boldsymbol{t}$ の次元数は $m$ となる.この $m$ の値をどれくらいにするかは解析者に委ねられるが,そのような,与えられたデータから決定できないパラメーターのことをハイパーパラメーターという.

\begin{eqnarray*}\boldsymbol{t}=\boldsymbol{W}_{(m,n)}\boldsymbol{x}+\boldsymbol{b}\tag{10}\end{eqnarray*}

$\boldsymbol{t}$ は $(m,1)$ の行列,すなわち,$\boldsymbol{t}=\boldsymbol{T}_{(m,1)}$ なので,これに対しては,新たな行列 $\boldsymbol{W}^{\prime}$ を用いて,以下のような操作をすることでスカラ $y$ を得ることができる.

\begin{eqnarray*}y=\boldsymbol{W}^{\prime}_{(1,m)}\boldsymbol{T}_{(m,1)}+b^{\prime}\tag{11}\end{eqnarray*}

すなわち,これは以下を意味する (式11に式10を代入).

\begin{eqnarray*}y=\boldsymbol{W}^{\prime}_{(1,m)}(\boldsymbol{W}_{(m,n)}\boldsymbol{x}+\boldsymbol{b})+b^{\prime}\tag{12}\end{eqnarray*}

全てを行列表記にすると以下となる.

\begin{eqnarray*}\boldsymbol{Y}_{(1,1)}=\boldsymbol{W}^{\prime}_{(1,m)}(\boldsymbol{W}_{(m,n)}\boldsymbol{X}_{(n,1)}+\boldsymbol{B}_{(m,1)})+\boldsymbol{B}^{\prime}_{(1,1)}\tag{13}\end{eqnarray*}

逆に,よりシンプルに (行列よりベクトル,ベクトルよりスカラを優先した表記) 表現すると以下のようになる.すなわち,ここでいうところの超重回帰では,インプットベクトルデータに何らかの行列を掛けて,それにベクトルを足すことで算出されたベクトルに,さらにベクトルを掛けてスカラを足すことで目的の値 $y$ を表現しようとするのである.

\begin{eqnarray*}y=\boldsymbol{w}^{\prime}(\boldsymbol{W}\boldsymbol{x}+\boldsymbol{b})+b^{\prime}\tag{14}\end{eqnarray*}

そして,この超重回帰,すなわちネットワークは当然,今と同じ手順を繰り返すことでさらに複雑化することができるのである.

ネットワークからニューラルネットワークへ

このようなネットワークをほんの少しだけ改変することでニューラルネットワークは導かれる.ニューラルネットワークでは,ネットワークを計算して算出されるベクトルを活性化関数と呼ばれる特殊な関数の入力にして上の計算をする.式14をニューラルネットワークに変換するとするなら,活性化関数を $\phi()$ として以下のように表現される.

\begin{eqnarray*}y=\boldsymbol{w}^{\prime}\phi(\boldsymbol{W}\boldsymbol{x}+\boldsymbol{b})+b^{\prime}\tag{15}\end{eqnarray*}

この $\phi()$ には色々なものが使われるが,近年もっとも良しとされるのは以下の線形正規化関数である.

\begin{eqnarray*}\phi(x)=\max(0,x)\tag{16}\end{eqnarray*}

ニューラルネットワークは脳の振る舞いを模倣した機械学習法のことである.脳ではニューロンとニューロンが繋がり合い,信号を伝達する.ある一定以上の刺激がニューロンへ届くと別のニューロンへと刺激が伝達する.活性化されたニューロンは発火した,という風に表現される.この式16は入力が0以下であるとき常に0を返す.ニューラルネットワークでは,これでニューロンが発火していない状態を模倣している.一方で,0より大きな値が入力された場合はその値が次のニューロンへと伝達する,ということになる.

すなわち,ニューラルネットワークとは,基本的には回帰分析法が超拡張されたものであり,それに,ニューロンの発火,非発火現象を加えて問題を解決しようとする機械学習法である.ニューラルネットワークでは上で示した回帰とは異なり,出力の値もベクトルとすることができる.原理はものすごく簡単である.

しかし,ニューラルネットワークは,そのシンプルなアルゴリズムにも関わらず,複雑な系を学習することができる.学習に際しては,以下のような図に従って左から右へと計算が進むことで目的の解を出そうとする.青い丸で表されているものがインプットベクトル,それに重み行列 $\boldsymbol W^{12}$ を掛け,黒い丸で表される新たなベクトルを生成する (これが上の項目における $\boldsymbol{t}$ に相当),次にそのベクトルに重み行列 $\boldsymbol W^{23}$ を掛け,...というように計算は進み,最終的に目的とする赤い丸で表される出力ベクトルを算出する.

tml_neural_network_overview_02.svg

ニューラルネットワークの学習において,これらの重み行列 $\boldsymbol W^{ij}$ はデータを読み込む度に (一括か逐次的または半逐次的に) 繰り返し更新される.これの更新を繰り返すことによって入力ベクトルと出力ベクトルがより一致するような辻褄合わせをする.

学習の進み方

トレーニングデータセットとバリデーションデータセットの準備が終わった後,ニューラルネットワークにおける学習は以下のように進む.

  1. ネットワークの構造をデザインする.
  2. 入力データに対する出力ベクトルを計算する.
  3. ターゲットベクトルと出力ベクトルを比較し,誤差を計算する.
  4. 誤差関数を微分し,重み行列の各要素を動かす方向を決定する.
  5. 重み行列を更新する.
  6. 上の2-5を繰り返す.誤差関数の値がそれ以上小さくならなくなったとき,終了する.
Hatena Google+