ニューラルネットワーク(Neural Network, 以下NN)は機械学習の歴史と共に歩んできたと言っても過言ではない. 戦後間もないウィーナーの時代 [1] からモデルが構築され始め, 幾つかの冬の時代(挫折)を超えて, そして現在流行りのディープラーニング(深層学習)は多層構造のNNによって構成されている. ここでは, NNの歴史に少しずつ触れながら, 多層パーセプトロンの学習則(逆誤差伝搬)までを解説していく. 本稿は主に [2], [3] を参照している.

\begin{align*} \newcommand{\bvec}[1]{\boldsymbol{#1}} \newcommand{\tvec}[1]{\bvec{#1}^{\mathsf{T}}} \newcommand{\ve}[1]{\bvec{#1}} \newcommand{\inpro}[2]{{\left\langle #1 , #2 \right\rangle}} \newcommand{\norm}[1]{{\left\| #1 \right\|}} \newcommand{\dint}[2]{\int\!\!\!\int_{#1} #2 } \newcommand{\tint}[2]{\int\!\!\!\int\!\!\!\int_{#1} #2 } \newcommand{\dif}[3]{\frac{d^{#1}#2}{d #3^{#1}}} \newcommand{\pard}[3]{\frac{\partial^{#1}#2}{\partial #3^{#1}}} \newcommand{\difrac}[2]{{\frac{d #1}{d #2}}} \newcommand{\parfrac}[2]{{\frac{\partial #1}{\partial #2}}} \newcommand{\tparfrac}[2]{{\tfrac{\partial #1}{\partial #2}}} \newcommand{\Div}{{\rm div}} \newcommand{\Rot}{{\rm rot}} \newcommand{\Curl}{{\rm curl}} \newcommand{\innprod}[2]{\langle #1, #2 \rangle} \newcommand{\n}{\ \\} \newcommand{\cm}{{\ , \ }} \def\diag{\mathop{\rm diag}\nolimits} \def\sign{\mathop{\rm sign}\nolimits} \end{align*}

脳機能のモデル化

NNは脳の神経回路網を数学的なモデルで表現したものである. その為, 理論の出発点は生理学となる. その知識によると, 神経回路の構成要素であるニューロン(神経細胞)はシナプスを介して他の細胞と結合しており, 電気信号によって情報を伝達しあっている. 1つのニューロンは外部からの電気的刺激を受けると膜電位(細胞内外の電位差)を上昇させていき, 刺激の総量がある一定値(閾値)を超えると瞬間的に電位パルス(インパルス, スパイク)を放出する. 放出したパルスは他のニューロンに影響を与えることができる. この相互作用を大域的に見ることで脳活動が実現されると考えられている.

上記の生理学の知見をを事実として受け入れてみると, 次の単純なモデル化が考えられる. 1つのニューロンにおいて, 他のニューロンからの刺激(入力)の総量を\(u\)と表し, その入力を受けて出力を決める活性化関数(activation function)\(f\)をおき, 出力を\(y = f(u)\)と表す. また総入力\(u\)は他のニューロンからの刺激の重ねあわせによって決まるので, 単純に入力に重みを掛け合わせ和をとった総量と考えられる. 即ち,

\begin{equation*} \begin{aligned} u = \sum_{i=1}^{n} w_{i}x_{i} + b = \ve{w}^{\mathsf{T}} \ve{x} + b\end{aligned} \end{equation*}

と表せるものとする. ここで, \(\ve{x} = [x_{1},\dots,x_{n}]^{\mathsf{T}}\)は入力(他のニューロンからの出力)ベクトル, \(\ve{w} = [w_{1},\dots,w_{n}]^{\mathsf{T}}\)は入力の重み(係数)ベクトルであり, 生理学的にはシナプスの結合の強さ(影響の度合い)を表している. そして\(-b\)はニューロン発火の条件を与えるしきい値(bias, threshold)を表している. 以上によってモデル化されるニューロンの機能の単位は図にまとめられ, ユニット(unit)と呼ばれる [4] .

NNを構成する単位:ユニット

NNを構成する単位:ユニット

活性化関数の例

実際に良く使われる活性化関数\(f\)としては, 次が挙げられる:

単位ステップ関数(ハードリミタ)\(U(u)\)

\(0\)\(1\)かを出力し, 決定的な識別を行う:

\begin{equation*} \begin{aligned} f(u) = \left\{ \begin{array}{ll} 0 & u < 0 \\ 1 & u > 0 \end{array} \right. \end{aligned} \end{equation*}

\(u=0\)で不連続となり, \(U(u)\)等で参照される事がある.

符号関数\(\sign(u)\)

二値のみを出力するのは単位ステップ関数と同じだが, \(-1\)\(1\)を出力する:

\begin{equation*} \begin{aligned} f(u) = \left\{ \begin{array}{ll} -1 & u < 0 \\ 1 & u > 0 \end{array} \right. \end{aligned} \end{equation*}

単位ステップ関数とは表現を変えたい文脈で用いられる.

線形関数\(u\)

入力をそのまま出力する線形関数も活性化関数に用いられる事がある:

\begin{equation*} \begin{aligned} f(u) = u \end{aligned} \end{equation*}

入力が有界でない場合出力が発散する場合がある. 線形関数は微分可能なので学習規則の導出の際に役立つ.

シグモイド(ロジスティック)関数\(\varphi(u)\)
\begin{equation*} \begin{aligned} f(u) = \frac{1}{1 + \exp(-u)} \end{aligned} \end{equation*}

明らかに\((0,1)\)で単調増加する関数である. グラフが単位ステップ関数に類似し, 関数の形が単純であり, しかも微分可能である事から非常に重要な関数である. 実際, \(u\)で微分してみると,

\begin{equation*} \begin{aligned} \difrac{ }{u} f(u) &= - \frac{-\exp(-u)}{\{1+\exp(-u)\}^{2}} = \frac{1}{1 + \exp(-u)}\left( 1 - \frac{1}{1 + \exp(-u)} \right) \\ &= f(u) (1-f(u)) \end{aligned} \end{equation*}

となって微分も簡易に計算できることも高評価の理由である. シグモイド関数は文献によっては\(\varphi(u)\)で参照される事がある.

\(\tanh\)(タンジェントハイパボリック)関数\(\tanh(u)\)
\begin{equation*} \begin{aligned} f(u) = \tanh(u) = \frac{\exp(u) - \exp(-u)}{\exp(u) + \exp(-u)} \end{aligned} \end{equation*}

これは\((-1,1)\)で単調増加する関数であり, 値域を\((0,1)\)とする為に

\begin{equation*} \begin{aligned} f(u) = \frac{\tanh(u) + 1}{2} \end{aligned} \end{equation*}

とする場合がある. \(\tanh\)の微分値も簡潔に表現できる:

\begin{equation*} \begin{aligned} \difrac{ }{u} f(u) &= \frac{\{\exp(u)+\exp(-u)\}^{2} - \{\exp(u)-\exp(-u)\}^{2}}{\{\exp(u)+\exp(-u)\}^{2}} \\ &= 1 - \tanh^{2}(u) = 1 - f^{2}(u) \end{aligned} \end{equation*}

また, 上述のシグモイド関数は\(\tanh\)を用いて表すこともできる:

\begin{equation*} \begin{aligned} \frac{1}{1 + \exp(-u)} &= \frac{1}{2} \frac{2 \exp(u/2)}{\exp(u/2) + \exp(-u/2)} \\ &= \frac{1}{2} \left( \frac{\exp(u/2) + \exp(-u/2)}{\exp(u/2) + \exp(-u/2)} + \frac{\exp(u/2) - \exp(-u/2)}{\exp(u/2) + \exp(-u/2)} \right) \\ &= \frac{1}{2} (1 + \tanh(u/2)) \end{aligned} \end{equation*}

図に関数のグラフを示す.

よく使われる活性化関数のグラフ

よく使われる活性化関数のグラフ

形式ニューロン

最初にニューロンをモデル化して研究を行ったのはMcCulloch-Pitts(ウォーレン・マカロック-ウォルター・ピッツ)であり, 彼らは1943年に形式ニューロン(formal neuron)を提案した. 形式ニューロンでは活性化関数は単にステップ関数\(U(u)\)となる:

\begin{equation*} \begin{aligned} U(u) = \left\{ \begin{array}{ll} 1 & u > 0 \\ 0 & u < 0 \end{array} \right.\end{aligned} \end{equation*}

これによって入力および出力は\(0\)\(1\)(all-or-none)となる. 形式ニューロンでは, 重みと閾値の組み合わせによって論理素子を実現できる:

NOT
\(U(-x_{1} + 0.5)\)
AND
\(U(x_{1} + x_{2} - 1.5)\)
OR
\(U(x_{1} + x_{2} - 0.5)\)
NAND
\(U(-x_{1} -x_{2} + 1.5)\)
XOR
\(U(x_{1} + x_{2} - 2U(x_{1} + x_{2} - 1.5) - 0.5)\)

実際に入力値に値を代入して真理値表U 作ると, ユニットが正しく動作する事を確かめられる. この素子の組み合わせによって任意の(フリップフロップを含めた)論理回路が実現できるのはもちろんのこと, 形式ニューロンはチューリングマシンと同等の計算能力(チューリング完全)を持つ事が示されている. 形式ニューロンはニューロンの最初のモデルとしてNNの大本の基礎となったが, 現在のNNにあるような学習能力を持ちあわせてはいない. しかし, 重みや閾値を変更することでユニットの動作が変わるという観察から, それらを能動的に変更することで学習が実現されうるという示唆は既に生まれていたものと考えられる.

単純パーセプトロンと単層パーセプトロン(パーセプトロン)

1957年にRosenblatt(ローゼンブラッド)は形式ニューロンを入力層(Sensory Layer, S層), 中間層(Associative Layer, A層), 出力層(Response Layer, R層)の3つに分けて階層的に結合し, 図1の構造を持つ単純パーセプトロン(simple perceptron)を提案した. ここで, S層とA層の間の重みはランダムに固定し, A層とR層の間の重みは学習によって決めるようになっている.

単純パーセプトロン

単純パーセプトロン

単純パーセプトロンの学習は, 微積分といった解析的な知見ではなくヘブ則(Hebbian rule)と呼ばれる生理学の法則を用いている. 即ちそれは「同時に発火したニューロン間のシナプス結合は強められる」という法則であり, 多くの神経学者及び心理学者が受け入れている事実である. 後に述べるが, ヘブ則による学習は解が存在すれば有限回数の学習で正しい解に収束することが示されており, 次節に述べるデルタ則(これは数値解析的に学習する)と併せて有用な学習法と言える. 単純パーセプトロンはNNの学習可能性を初めて示し, 史上初のNN研究ブームを引き起こすきっかけとなった.

ところで, 単純パーセプトロンは3層の階層構造をなしているが, 重みの学習の際に本質的に関与するのは中間層と出力層の間だけである. この学習する部分のみを抜き出すと, 図2の様に, 学習するニューロンの単純な入出力関係が得られる. これを単層パーセプトロン(single-layer perceptron)あるいは単にパーセプトロン(perceptron)と呼ぶ. そして単純パーセプトロンの学習の際には, S層とA層間の重みをランダムに決定した後は単層パーセプトロンの学習だけを考えば良い事になる.

単層パーセプトロン(パーセプトロン)

単層パーセプトロン(パーセプトロン)

単層パーセプトロンの学習則 - ヘブ則とデルタ則

単層パーセプトロンの学習にはサンプルが必要となるため, まずはサンプルの表記から行う. 学習の中でも特に教師あり学習(supervised learning)はサンプルのデータにラベルが付いている. ラベルは一般的にはなんでも良いが, 基本的にはデータがある性質を満たす場合(正例)はラベルを\(1\)に, 満たさない場合(負例)はラベルを\(-1\)とする [5] . そして\(N\)個のデータからなるサンプルの集合\(Z\)は, データ\(\ve{x}\)とその(教師)ラベル\(t\)の組の集合で表される:

\begin{equation*} \begin{aligned} Z = \{ (\ve{x}_{1}, t_{1}), (\ve{x}_{2}, t_{2}), \dots, (\ve{x}_{N}, t_{N}) \}\end{aligned} \end{equation*}

以下, 出力層が1つのユニットだけからなる単層パーセプトロン(図式的には図と等価)の学習を考える. ユニットが複数存在する場合でも出力層の内部でユニットは互いに独立に動作する(\(\because\)結合が無いため)ので拡張は容易である. また, 表記を簡単にするため, ユニットへの入力\(u\)はしきい値\(b\)を省き, 重みと入力の内積\(\ve{w}^{\mathsf{T}}\ve{x}\)のみで表現する:

\begin{equation*} \begin{aligned} u &= \sum_{i=1}^{n} w_{i} x_{i} + b = \sum_{i=1}^{n+1} w_{i} x_{i} \quad (w_{n+1} = b,\ x_{n+1} = 1) \\ &\equiv \ve{w}^{\mathsf{T}}\ve{x}\end{aligned} \end{equation*}

これは常に\(1\)を入力するユニットを仮定し, その結合重みを\(b\)とすることで説明できる.

ヘブ則

前節で述べたとおり, ヘブ則は「同時に発火したニューロン間のシナプス結合は強められる」というものであった. これはラベルを\(t_{l} \in \{ 1, 0 \}\ (l=1,\dots,N)\)(正例を1, 負例を0), サンプルデータ\(\ve{x}_{l}\)を入力した時の出力を\(y_{l} = U(u_{l}) = U\left( \ve{w}^{\mathsf{T}} \ve{x}_{l}\right)\)とすれば, 重み(シナプス結合)の更新量\(\Delta w_{i}\)は次の様に表せる:

\begin{equation*} \begin{aligned} \Delta w_{i} &= \left\{ \begin{array}{ll} \eta (\ve{x}_{l})_{i} & \text{if}\ t_{l} = y_{l} = 1 \\ 0 & \text{otherwise} \end{array} \right. \\ &= \eta t_{l}y_{l}(\ve{x}_{l})_{i}\end{aligned} \end{equation*}

ここで, \((\ve{x}_{l})_{i}\)はベクトル\(\ve{x}_{l}\)の第\(i\)要素, \(\eta > 0\)は学習の早さを決める係数であり, 学習率(learning rate)と呼ばれる. 学習の際には\(\ve{w} = \ve{0}\)で初期化してサンプルを順次入力し, 上の更新量に沿って重みを更新していけば良い. 第\(s\)ステップの時の重みベクトルを\(\ve{w}^{(s)}\)と表すと, 更新規則は,

\begin{equation*} \begin{aligned} \ve{w}^{(s+1)} = \ve{w}^{(s)} + \Delta \ve{w} = \ve{w}^{(s)} + \eta t_{l} y_{l} \ve{x}_{l}\end{aligned} \end{equation*}

と表せる. ここで, \(\Delta \ve{w}\)更新量を並べたベクトル\(\Delta \ve{w} = [\Delta w_{1},\dots,\Delta w_{n}]^{\mathsf{T}}\)である.

素朴なヘブ則の実装では, 上の\(\Delta w_{i}\)を観察すれば即座に分かるように, 重みが際限なく大きくなって発散してしまって学習が停止しない場合がある. 従って, 重みの発散を防ぐために重みは抑制する方向に更新するようにとる. 即ち, ラベルを\(\{ 1, -1 \}\), 活性化関数を符号関数\(\sign\)とし, 出力\(y_{l} = \sign(u_{l})\)とラベル\(t_{l}\)が異なる(サンプルを誤識別した)場合にのみ重みを更新する:

\begin{equation*} \begin{aligned} \Delta w_{i} &= \left\{ \begin{array}{ll} -\eta (\ve{x}_{l})_{i} = \eta t_{l}y_{l}(\ve{x}_{l})_{i} & \text{if}\ t_{l} \neq y_{l} \\ 0 & \text{otherwise} \end{array} \right.\end{aligned} \end{equation*}

この更新規則もヘブ則と呼ばれる事がある.

ヘブ則の重要な性質に, 最適な重みが存在するならば有限ステップで学習が停止(サンプルの誤識別がなくなる)する事が示されている. ここでは, [6] に従ってその証明を行う. まず, 存在が仮定された最適な重みを\(\ve{w}^{\ast}\)と表し, \(||\ve{w}^{\ast}||^{2} = \ve{w}^{\ast\mathsf{T}}\ve{w}^{\ast} = \sum_{i=1}^{n} w_{i}^{\ast 2} = 1\)となる様に正規化しておく [7] . ここで, \(||\ve{v}||\)はベクトル\(\ve{v}\)の2乗ノルムである. また, \(\gamma = \displaystyle \min_{l} y_{l} u_{l} = \min_{l} y_{l} \ve{w}^{\ast\mathsf{T}} \ve{x}_{l}\)なる定数 [8] をおき, \(\gamma > 0\)とする. この時, 更新式により,

\begin{equation*} \begin{aligned} ||\ve{w}^{(s+1)}||^{2} &= \ve{w}^{(s+1)\mathsf{T}} \ve{w}^{(s+1)} \\ &= (\ve{w}^{(s)} + \Delta \ve{w})^{\mathsf{T}}(\ve{w}^{(s)} + \Delta \ve{w}) \\ &= (\ve{w}^{(s)} + \eta t_{l} y_{l} \ve{x}_{l})^{\mathsf{T}}(\ve{w}^{(s)} + \eta t_{l} y_{l} \ve{x}_{l}) \\ &= \ve{w}^{(s)\mathsf{T}} \ve{w}^{(s)} + 2\eta t_{l} y_{l} \ve{w}^{(s)\mathsf{T}} \ve{x}_{l} + \eta^{2} \ve{x}_{l}^{\mathsf{T}}\ve{x}_{l} \quad (\because t_{l}^{2} = y_{l}^{2} = 1) \\ &\leq ||\ve{w}^{(s)}||^{2} + \eta^{2} ||\ve{x}_{l}||^{2} \quad (\because \eta t_{l} y_{l} (\ve{x}_{l})_{i} = \Delta w_{i} \leq 0)\end{aligned} \end{equation*}

が任意の\(l \in \{ 1,\dots,N \}\)で成り立つ. この関係式をステップ毎に繰り返し適用すれば,

\begin{equation*} \begin{aligned} ||\ve{w}^{(s)}||^{2} &\leq ||\ve{w}^{(s-1)}||^{2} + \eta^{2}||\ve{x}_{l^{(s-1)}}||^{2} \\ &\leq ||\ve{w}^{(s-2)}||^{2} + \eta^{2}(||\ve{x}_{l^{(s-1)}}||^{2} + ||\ve{x}_{l^{(s-2)}}||^{2}) \\ &\dots \\ &\leq ||\ve{w}^{(0)}||^{2} + \eta^{2} \sum_{k=0}^{s-1} ||\ve{x}_{l^{(k)}}||^{2} \\ &\leq s\eta^{2} \max_{l} ||\ve{x}_{l}||^{2} \quad (\because \ve{w}^{(0)} = \ve{0})\end{aligned} \end{equation*}

を得る. ここで, \(l^{(s)}\)はステップ\(s\)の更新の時に選ばれたサンプルの番号(インデックス)を表している. また, 全ての\(\ve{x}_{l}\ (l=1,\dots,N)\)は現実的に有界(いずれの要素も\((-\infty, \infty)\)にある)と考えられるので, 全てのデータを包む事ができる球(超球)の最小の半径を\(R\)とおけば, \(\displaystyle \max_{l} ||\ve{x}_{l}||^{2} \leq R^{2}\)が成り立つので,

\begin{equation*} \begin{aligned} ||\ve{w}^{(s)}||^{2} \leq s\eta^{2} \max_{l} ||\ve{x}_{l}||^{2} \leq s \eta^{2} R^{2}\end{aligned} \end{equation*}

となる. 一方, \(\ve{w}^{\ast}\)\(\ve{w}^{(s+1)}\)の内積をとると,

\begin{equation*} \begin{aligned} \ve{w}^{\ast \mathsf{T}} \ve{w}^{(s+1)} &= \ve{w}^{\ast \mathsf{T}} ( \ve{w}^{(s)} + \eta t_{l} y_{l} \ve{x}_{l}) \\ &= \ve{w}^{\ast \mathsf{T}} \ve{w}^{(s)} + \eta t_{l} y_{l} \ve{w}^{\ast \mathsf{T}} \ve{x}_{l} \\ &\geq \ve{w}^{\ast \mathsf{T}} \ve{w}^{(s)} + \eta \gamma\end{aligned} \end{equation*}

が成立し, この関係式もステップ毎に繰り返し適用すると,

\begin{equation*} \begin{aligned} \ve{w}^{\ast \mathsf{T}} \ve{w}^{(s)} &\geq \ve{w}^{\ast \mathsf{T}} \ve{w}^{(s-1)} + \eta \gamma \\ &\geq \ve{w}^{\ast \mathsf{T}} \ve{w}^{(s-2)} + 2\eta \gamma \\ &\dots \\ &\geq \ve{w}^{\ast \mathsf{T}} \ve{w}^{(0)} + s\eta \gamma = s\eta \gamma\end{aligned} \end{equation*}

を得て, この式の両辺を二乗すると次の結果を得る:

\begin{equation*} \begin{aligned} s^{2} \eta^{2} \gamma^{2} &\leq (\ve{w}^{\ast \mathsf{T}}\ve{w}^{(s)})^{2} \\ &\leq (\ve{w}^{\ast \mathsf{T}} \ve{w}^{\ast}) (\ve{w}^{(s) \mathsf{T}} \ve{w}^{(s)}) \quad (\because シュワルツの不等式) \\ &= ||\ve{w}^{\ast}||^{2} ||\ve{w}^{(s)}||^{2} = ||\ve{w}^{(s)}||^{2} \\ &\leq s\eta^{2}R^{2}\end{aligned} \end{equation*}

ここで, 不等式中央の内積\(\ve{w}^{\ast \mathsf{T}}\ve{w}^{(s)}\)は最適解\(\ve{w}^{\ast}\)と現在の重み\(\ve{w}^{(s)}\)との類似度とも捉えられる [9] ので, この不等式によりステップ数\(s\)増加の度に類似度の下限\(s^{2}\eta^{2}\gamma^{2}\)が上限\(s\eta^{2}R^{2}\)よりも早く増加する事が観察できる. 即ち類似度は単調増加し, 重みは最適解に近づいて行くことが分かる. またステップ数\(s\)について解くと\(\displaystyle s \leq \frac{R^{2}}{\gamma^{2}}\)が成立し, \(\gamma, R\)は有限のために\(s\)もまた有限となる. これらの結果により, 有限ステップで\(\ve{w}^{\ast}\)が得られ, 学習が停止することが示された.

デルタ則

デルタ則(デルタルール)は現在の重み\(\ve{w}\)でのサンプルによる出力とラベルの誤差(経験誤差)\(E(\ve{w})\)を定義し, \(E(\ve{w})\)を極小にする様に重みを更新していく学習則である. 誤差\(E(\ve{w})\)\(\ve{w}\)による偏微分\(\displaystyle\parfrac{E(\ve{w})}{\ve{w}}\)は勾配, 即ち最も\(E(\ve{w})\)の変化する方向(最急勾配)を表すので, 重みの更新量\(\Delta \ve{w}\)は学習率\(\eta > 0\)を用いて

\begin{equation*} \begin{aligned} \Delta \ve{w} = - \eta \parfrac{E(\ve{w})}{\ve{w}}\end{aligned} \end{equation*}

とすれば, 更新の度に誤差を最小にする様に重み\(\ve{w}\)を更新することができる. 学習の収束は, \(\Delta \ve{w}\)の大きさ(\(||\Delta \ve{w}||^{2}\)等)が十分に小さくなった時とすれば良く, そのときは極小解 [10] が得られている. この手法は最急勾配法(steepest gradient method)と呼ばれる基本的な数値最適化の手法の一種である. ここでは, ユニットの活性化関数を単位ステップ関数\(U(u)\), ラベルを\(\{ 1, 0 \}\)として考える.

さて, 誤差は様々なものが考えられるが, 単純に二乗誤差

\begin{equation*} \begin{aligned} E(\ve{w}) = \frac{1}{2} \sum_{l=1}^{N} (t_{l} - y_{l})^{2} = \frac{1}{2} \sum_{l=1}^{N} \left\{ t_{l} - U(\ve{w}^{\mathsf{T}}\ve{x}_{l}) \right\}^{2}\end{aligned} \end{equation*}

とする [11] と, 後に示す様に局所最適解に嵌ってしまう可能性がある. 第一, 単位ステップ関数\(U(u)\)はもとより微分可能では無く, このままでは学習則を導出できない. そこで, まず, ユニットの活性化関数を一旦微分可能なシグモイド関数\(\varphi\)とし, その出力を\(y_{l}=1\)となる確率\(p(y_{l}=1)\)として定義する:

\begin{equation*} \begin{aligned} p(y_{l} = 1) = \varphi(u_{l}/T) = \frac{1}{1+\exp(-u_{l}/T)}\end{aligned} \end{equation*}

ここで, \(T \geq 0\)は温度パラメタと呼ばれ, 図のグラフで見れるように\(T \to 0\)とすると単位ステップ関数に漸近することが分かる.

様々な温度パラメタ\ :math:`T`\ におけるシグモイド関数\ :math:`\varphi(u/T)`\ のグラフ

様々な温度パラメタ\(T\)におけるシグモイド関数\(\varphi(u/T)\)のグラフ

同時にラベル\(t_{l}\)もある確率分布\(q\)に従って生成される確率変数と考える事ができ, \(t_{l}\)\(1\)を取る確率は\(q(t_{l}=1) = t_{l}\)で定義することができる. この様に定義した出力とラベルの確率分布\(q,p\)間の“違い”を誤差\(E(\ve{w})\)とする. 特に機械学習では, 確率分布間の違いを測る尺度として非常に重要なKLダイバージェンス(Kullback-Leibler divergence)\(KL(q||p)\)がある:

\begin{equation*} \begin{aligned} KL(q||p) = \sum_{l=1}^{N} q(t_{l}) \log\left[ \frac{q(t_{l})}{p(t_{l})} \right]\end{aligned} \end{equation*}

すぐに分かるように\(KL(q||p) = 0\)となるのは\(q\)\(p\)が完全に一致する時(\(q(t_{l}) = p(t_{l})\ (l=1,\dots,N)\))のみである.

それでは誤差\(E(\ve{w})\)をKLダイバージェンスとして, その\(\ve{w}\)による偏微分を計算する事を考える. まず, \(KL(q||p)\)は定義式から次の様に展開できる:

\begin{equation*} \begin{aligned} E(\ve{w}) &= KL(q||p) = \sum_{l=1}^{N} q(t_{l}) \log\left[ \frac{q(t_{l})}{p(t_{l})} \right] \\ &= \sum_{l=1}^{N} \left\{ q(t_{l}=0) \log\left[ \frac{q(t_{l}=0)}{p(t_{l}=0)} \right] + q(t_{l}=1) \log\left[ \frac{q(t_{l}=1)}{p(t_{l}=1)} \right] \right\} \\ &= \sum_{l=1}^{N} \left\{ (1-t_{l}) \log\left( \frac{1-t_{l}}{1-\varphi(u_{l}/T)} \right) + t_{l} \log \left( \frac{t_{l}}{\varphi(u_{l}/T)} \right) \right\}\end{aligned} \end{equation*}

見通しを良くする為に和の内部を\(e_{l}(\ve{w})\)とおき, \(e_{l}(\ve{w})\)\(w_{i}\)で偏微分すると,

\begin{equation*} \begin{aligned} \parfrac{}{w_{i}} e_{l}(\ve{w}) &= \parfrac{e_{l}(\ve{w})}{\varphi(u_{l}/T)} \parfrac{\varphi(u_{l}/T)}{w_{i}} \quad (\because 合成関数の微分) \\ &= \left\{ (1-t_{l})\frac{1}{1-\varphi(u_{l}/T)} - \frac{t_{l}}{\varphi(u_{l}/T)} \right\} \parfrac{\varphi(u_{l}/T)}{u_{l}} \parfrac{u_{l}}{w_{i}} \quad (\because 合成関数の微分) \\ &= \frac{\varphi(u_{l}/T)(1 - t_{l}) - t_{l} \left\{ 1 - \varphi(u_{l}/T) \right\}}{\varphi(u_{l}/T) \left\{ 1 - \varphi(u_{l}/T) \right\}} \frac{1}{T} \varphi(u_{l}/T) \left\{ 1 - \varphi(u_{l}/T) \right\} (\ve{x}_{l})_{i} \\ &= \frac{1}{T} \left\{ \varphi(u_{l}/T) - t_{l} \right\} (\ve{x}_{l})_{i}\end{aligned} \end{equation*}

が得られ, 更新量\(\Delta \ve{w}\)

\begin{equation*} \begin{aligned} \Delta \ve{w} &= - \eta \parfrac{E(\ve{w})}{\ve{w}} = - \eta \frac{1}{T} \sum_{l=1}^{N} \parfrac{}{\ve{w}} e_{l}(\ve{w}) \\ &= - \frac{\eta}{T} \sum_{l=1}^{N}(\varphi(u_{l}/T) - t_{l}) \ve{x}_{l} = - \frac{\eta}{T} \sum_{l=1}^{N} \delta_{l} \ve{x}_{l}\end{aligned} \end{equation*}

とまとめられる. ここで, \(\delta_{l} = \varphi(u_{l}/T) - t_{l}\)は誤差信号と呼ばれる. シグモイド関数から単位ステップ関数に戻すために\(T \to 0\)とするが, 同時に\(\eta \to 0\)として\((\eta / T) \to \epsilon\)となる様な\(\epsilon > 0\)をとって\(\Delta \ve{w}\)が発散しないようにすれば, デルタ則による重みの更新量\(\Delta \ve{w}\)は,

\begin{equation*} \begin{aligned} \Delta \ve{w} = -\epsilon \sum_{l=1}^{N} \delta_{l} \ve{x}_{l} = \epsilon \sum_{l=1}^{N} \left\{ t_{l} - U(u_{l}) \right\} \ve{x}_{l}\end{aligned} \end{equation*}

となる. この\(\epsilon\)も学習率と呼ばれ, 実践においては\(0.1\)から\(0.5\)あたりに設定される. この学習則は\(\sum_{l=1}^{N}\)の存在により, 全てのサンプルを提示して更新するのでこれを特に一括(斉時)学習(batch learning)と呼ぶが, 1つのサンプル毎に重みを更新するやり方もある:

\begin{equation*} \begin{aligned} \Delta \ve{w} = \epsilon \left\{ t_{l} - U(u_{l}) \right\} \ve{x}_{l}\end{aligned} \end{equation*}

これは逐次学習(on-line learning)と呼ばれる. 一般に逐次学習の方が収束が早い事が知られている [12] .

この更新則による学習が局所最適に陥らないことを示す. \(\displaystyle\parfrac{e_{l}(\ve{w})}{w_{i}}\)を更に\(w_{j}\)で偏微分し2階の偏導関数を求めると,

\begin{equation*} \begin{aligned} \parfrac{ }{w_{j}}\parfrac{e_{l}(\ve{w})}{w_{i}} &= \parfrac{{}^{2} e_{l}(\ve{w})}{w_{i} \partial w_{j}} \\ &= \frac{1}{T} \parfrac{\varphi(u_{l}/T)}{w_{j}} x_{i} = \frac{1}{T^{2}} \varphi(u_{l}/T) \left\{ 1 - \varphi(u_{l}/T) \right\} (\ve{x}_{l})_{i}(\ve{x}_{l})_{j}\end{aligned} \end{equation*}

となり, \((H)_{ij} = \displaystyle \parfrac{{}^{2} e_{l}(\ve{w})}{w_{i} \partial w_{j}}\)なる\(e_{l}(\ve{w})\)のヘッセ行列(Hessian matrix)\(H\)

\begin{equation*} \begin{aligned} H = \frac{1}{T^{2}} \varphi(u_{l}/T) \left\{ 1 - \varphi(u_{l}/T) \right\} \ve{x}_{l} \ve{x}_{l}^{\mathsf{T}}\end{aligned} \end{equation*}

で計算できる. 明らかに\(\displaystyle\frac{1}{T^{2}}\varphi(u_{l}/T) \left\{ 1 - \varphi(u_{l}/T) \right\} > 0\)であり, 行列\(\ve{x}_{l}\ve{x}_{l}^{\mathsf{T}}\)は任意のベクトル\(\ve{v}\)に対して二次形式\(\ve{v}^{\mathsf{T}} (\ve{x}_{l}\ve{x}_{l}^{\mathsf{T}}) \ve{v}\)が,

\begin{equation*} \begin{aligned} \ve{v}^{\mathsf{T}} (\ve{x}_{l}\ve{x}_{l}^{\mathsf{T}} ) \ve{v} &= (\ve{x}_{l}^{\mathsf{T}} \ve{v})^{\mathsf{T}} (\ve{x}_{l}^{\mathsf{T}} \ve{v}) = (\ve{x}_{l}^{\mathsf{T}} \ve{v})^{2} \geq 0\end{aligned} \end{equation*}

となるので半正定値行列である. 従って, ヘッセ行列\(H\)も半正定値となり, \(e_{l}(\ve{w})\)は凸関数であることが分かり, 極小値が大域的な最小値に一致する(局所最小値が存在しない)ことが確かめられた.

最後に誤差\(E(\ve{w})\)として二乗誤差を用いた場合の更新量\(\Delta \ve{w}\)を求めておく. 今度は\(e_{l}(\ve{w}) = \displaystyle \frac{1}{2} (t_{l} - y_{l})^{2}\)とおき, ユニットの活性化関数を一般に微分可能な関数\(f\)とすると,

\begin{equation*} \begin{aligned} \parfrac{ }{w_{i}} e_{l}(\ve{w}) &= \parfrac{e_{l}(\ve{w})}{y_{l}} \parfrac{y_{l}}{u_{l}}\parfrac{u_{l}}{w_{i}} \quad (\because 合成関数の微分) \\ &= -(t_{l} - y_{l}) f^{\prime} (u_{l}) x_{i} \quad (f^{\prime} (u_{l}) \equiv \parfrac{y_{l}}{u_{l}} = \parfrac{ }{u_{l}} f(u_{l})) \\ &= \delta_{l} f^{\prime}(u_{l}) x_{i}\end{aligned} \end{equation*}

となる. 従って更新量\(\Delta \ve{w}\)

\begin{equation*} \begin{aligned} \Delta \ve{w} = - \eta \sum_{l=1}^{N} \delta_{l} f^{\prime}(u_{l}) \ve{x}_{l}\end{aligned} \end{equation*}

となる. さて, この学習則は局所最小値におちいる場合がある事に上で言及したが, これは\(e_{l}(\ve{w})\)の2階の偏導関数が

\begin{equation*} \begin{aligned} \parfrac{{}^{2} e_{l}(\ve{w})}{w_{i} \partial w_{j}} &= \parfrac{ }{w_{j}} y_{l} f^{\prime}(u_{l}) x_{i} - (t_{l} - y_{l}) \parfrac{ }{w_{j}} f^{\prime}(u_{l}) x_{i} \\ &= \left\{ (f^{\prime}(u_{l}))^{2} - (t_{l} - y_{l}) f^{\prime\prime} (u_{l}) \right\} x_{i} x_{j}\end{aligned} \end{equation*}

となるが, \((f^{\prime}(u_{l}))^{2} - (t_{l} - y_{l}) f^{\prime\prime} (u_{l})\)が常に非負になるとは限らないからである. 実際, \(f\)をシグモイド関数とすると2階微分は

\begin{equation*} \begin{aligned} f^{\prime\prime}(u_{l}) &= f^{\prime}(u_{l}) (1-f(u_{l})) - f(u_{l}) f^{\prime}(u_{l}) = f^{\prime}(u_{l}) (1 - 2 f(u_{l})) \\ &= f(u_{l}) (1 - f(u_{l}))(1-2f(u_{l}))\end{aligned} \end{equation*}

であり, \(t_{l} = 1\)とすると,

\begin{equation*} \begin{aligned} (f^{\prime}(u_{l}))^{2} - (1 - y_{l}) f^{\prime\prime} (u_{l}) &= (f^{\prime}(u_{l}))^{2} + f^{\prime}(u_{l})(1-2f(u_{l})) - 1 \\ &= f^{\prime}(u_{l}) (f^{\prime}(u_{l}) + 1 - 2f(u_{l}) ) - 1 \\ &= f(u_{l}) (1 - f(u_{l})) (-(f(u_{l}))^{2} + 1 - f(u_{l})) - 1 < 0\end{aligned} \end{equation*}

となってしまう. 従って二乗誤差を用いる場合はヘッセ行列が半正定値行列とならず, 誤差が局所最小値におちいる場合がある.

多層パーセプトロン

単層パーセプトロンはサンプルが直線(平面)で分離できる(線形分離可能な)問題にしか適用できない事 [13] が1969年にMinskey-Papertに指摘された. 線形分離不可能な例としてよく例に引き出されるのが図3XOR問題である.

XOR問題

XOR問題

この問題は1本の直線では分離できず, 従って単層パーセプトロンでは正しく学習することができない. この線形分離不可能な問題のために, NN研究の第一次ブームは終焉を迎え最初の冬の時代が訪れた.

この問題は1986年, Rumelhart-McClelland(デビット・ラメルハート-ジェームス・マクレランド)によって提案された多層パーセプトロン(multi-layer perceptron, MLP)によって解決を見た. 多層パーセプトロンは図4に表される様に, 入力層(input layer), 任意個数の中間(隠れ)層(middle(hidden) layer), 出力層(output layer)からなる多層構造を持ち, 全てのユニット出力の活性化関数は非線形関数(大体はシグモイド関数)となっている.

多層パーセプトロン

多層パーセプトロン

多層パーセプトロンが線形分離不可能な問題にも適用できるのは, 主に次の2つの理由による:

  1. 階層構造を用いている事: これは形式ニューロンのXOR素子で既に示唆されていたが, ニューロンを階層的に繋いで全ての重みを可変にすれば, 1つのユニットが1つの分離結果を持つため複数の分離結果を合成することができる.
  2. ユニットの出力が非線形であること: ユニットの出力を非線形にすることで, 線形分離不可能な入力をニューロン内部で非線形変換し, 線形分離可能な問題に還元できる場合がある.

多層パーセプトロンは様々な現実的な問題に適用できる為に, NNの第二次研究ブームを引き起こした. 現在においても, 一口にNNと言うと3層(1つの中間層)からなる多層パーセプトロン(3層NN)の事を指すことが多い.

多層パーセプトロンの学習則 - 逆誤差伝搬法

全ての重みが可変となった多層パーセプトロンでは, 単層パーセプトロンにおける学習則の様に出力層の重みを更新するだけではなく, 全ての重みを逐次更新していく必要がある. 多層パーセプトロンの学習として標準的に用いられる逆誤差伝搬法((error) back-propagation method)は, 出力層での誤差を順次後ろ向きに(出力\(\to\)中間\(\to\)入力層の順に)伝播させて重みを更新していく手法である.

それでは学習則を導出していくが, 多層構造を表現する為に次の定義を導入する. まず, 入力層を第\(1\)層, 入力層と繋がった中間層を第\(2\)層, 第\(2\)層と繋がった層を第\(3\)層, \(\dots\)と呼び, 出力層は第\(n\)層とする. 即ち\(n\)層構造の多層パーセプトロンを考える. また, 各層のユニット個数は一般に異なっても良いことにし, 第\(k\)層におけるユニットの数を\(L_{k}\)と表す. 第\(k-1\)層における第\(i\)ユニットと第\(k\)層における第\(j\)ユニットを繋ぐ重みを\(w_{ij}^{k-1,k}\)と表し, 第\(k\)層の第\(i\)ユニットへの入力総量を\(u_{i}^{k}\)と, またその出力を\(y_{i}^{k} = f(u_{i}^{k})\)と表す. \(f\)は微分可能な活性化関数ならば何でも良いが, ここではシグモイド関数とする. また, 出力層に複数ユニットが存在するのでサンプルラベルも各出力ユニットに対応して用意し, \(i\)番目の出力ユニットに与えるラベルを\(t^{l}_{i}\ (i=1,\dots,N)\)と表す.

デルタ則の導出と同様に誤差の勾配を取ることを考える. 無論, 局所最小を回避する為に誤差関数\(E\)としてKLダイバージェンスを導入する. \(E\)\(w_{ij}^{k-1,k}\)によって偏微分すると,

\begin{equation*} \begin{aligned} \parfrac{E}{w_{ij}^{k-1, k}} &= \parfrac{E}{u_{j}^{k}} \parfrac{u_{j}^{k}}{w_{ij}^{k-1,k}} \quad (\because 偏微分の連鎖律。 u_{j}^{k} を挟み込んでいるのが逆誤差伝播のキモ。) \\ &= \parfrac{E}{u_{j}^{k}} \parfrac{ }{w_{ij}^{k-1,k}} \left( \sum_{s=1}^{L_{k-1}} w_{sj}^{k-1,k} y_{s}^{k-1} \right) = \parfrac{E}{u_{j}^{k}} y_{i}^{k-1} \\ &= \parfrac{E}{y_{j}^{k}} \parfrac{y_{j}^{k}}{u_{j}^{k}} y_{i}^{k-1} \quad (\because 偏微分の連鎖律) \\ &= \parfrac{E}{y_{j}^{k}} f^{\prime}(u_{j}^{k}) y_{i}^{k-1} \end{aligned} \end{equation*}

ここで\(\displaystyle\parfrac{E}{y_{j}^{k}}\)は出力層の場合(\(k=n\))と中間層の場合(\(k<n\))で結果が異なる. 出力層の場合は, デルタ則の結果から,

\begin{equation*} \begin{aligned} \parfrac{E}{y_{j}^{n}} &= \frac{1-t_{j}^{l}}{1-y_{j}^{n}} - \frac{t_{j}^{l}}{y_{j}^{n}} = \frac{y_{j}^{n}(1-t_{j}^{l}) - t_{j}^{l}(1 - y_{j}^{n})}{y_{j}^{n}(1-y_{j}^{n})} = \frac{y_{j}^{n} - t_{j}^{l}}{f^{\prime}(u_{j}^{n})} \end{aligned} \end{equation*}

となり, 一方中間層の場合は, 偏微分の連鎖律(chain rule)によって,

\begin{equation*} \begin{aligned} \parfrac{E}{y_{j}^{k}} &= \sum_{s=1}^{L_{k+1}} \parfrac{E}{u_{s}^{k+1}} \parfrac{u_{s}^{k+1}}{y_{j}^{k}} \\ &= \sum_{s=1}^{L_{k+1}} \parfrac{E}{u_{s}^{k+1}} \parfrac{}{y_{j}^{k}} \left( \sum_{t=1}^{L_{k}} w_{ts}^{k, k+1} y_{t}^{k} \right) = \sum_{s=1}^{L_{k+1}} \parfrac{E}{u_{s}^{k+1}} w_{js}^{k,k+1} \end{aligned} \end{equation*}

と展開できる. これらの結果をまとめると,

\begin{equation*} \begin{aligned} \parfrac{E}{w_{ij}^{k-1, k}} = \left\{ \begin{array}{ll} \displaystyle \frac{y_{j}^{n} - t_{j}^{l}}{f^{\prime}(u_{j}^{n})} f^{\prime}(u_{j}^{n}) y_{j}^{n-1} = (y_{j}^{n} - t_{l}) y_{i}^{n-1} & (k = n) \\ \displaystyle \sum_{s=1}^{L_{k+1}} \parfrac{E}{u_{s}^{k+1}} w_{js}^{k,k+1} f^{\prime}(u_{j}^{k}) y_{i}^{k-1} & (k < n) \end{array} \right.\end{aligned} \end{equation*}

となるが, 次の第\(k\)層の\(i\)番目のユニットの誤差信号\(\delta_{i}^{k}\)

\begin{align*} \begin{aligned} \delta_{i}^{k} &= \parfrac{E}{u_{i}^{k}} = \parfrac{E}{y_{i}^{k}} \parfrac{y_{i}^{k}}{u_{i}^{k}} \\ &= \left\{ \begin{array}{ll} y_{i}^{n} - t_{i}^{l} & (k = n) \\ \displaystyle \sum_{s=1}^{L_{k+1}} \parfrac{E}{u_{s}^{k+1}}w_{js}^{k,k+1} f^{\prime}(u_{i}^{k}) = \sum_{s=1}^{L_{k+1}} \delta_{s}^{k+1} w_{js}^{k,k+1} f^{\prime}(u_{i}^{k}) & (k < n) \end{array} \right.\end{aligned} \end{align*}

を用いれば, より簡潔に勾配を表現できる:

\begin{equation*} \begin{aligned} \parfrac{E}{w_{ij}^{k-1, k}} = y_{i}^{k-1} \delta_{j}^{k}\end{aligned} \end{equation*}

以上により, 逆誤差伝搬法は次の手順に従って重みを更新すれば良い事が分かる:

  1. \(k \leftarrow n\)とする.

  2. 誤差信号\(\delta_{i}^{k}\ (i = 1,\dots,L_{k})\)の計算を行う:

    \begin{equation*} \begin{aligned} \delta_{i}^{k} = \left\{ \begin{array}{ll} y_{i}^{n} - t_{i}^{l} & (k = n) \\ \displaystyle \sum_{s=1}^{L_{k+1}} \delta_{s}^{k+1} w_{js}^{k,k+1} f^{\prime}(u_{i}^{k}) & (k < n) \end{array} \right. \end{aligned} \end{equation*}
  3. \(k \leftarrow k-1\)とする.

  4. \(k = 1\)ならば次へ, そうでなければ2. に戻る.

  5. 重みを更新する:

    \begin{equation*} \begin{aligned} w_{ij}^{k-1,k} \leftarrow w_{ij}^{k-1,k} - \eta y_{i}^{k-1} \delta_{j}^{k} \quad (k=2,\dots,n,\ i = 1,\dots, L_{k-1},\ j = 1,\dots,L_{k}) \end{aligned} \end{equation*}

これは基本となる逐次学習法であるが, 一括学習の時は\(\delta_{i}^{n}\)の所でサンプルについての和を取って次のようにすれば良い:

\begin{equation*} \begin{aligned} \delta_{i}^{n} = \sum_{l=1}^{N} (y_{i}^{n} - t_{i}^{l})\end{aligned} \end{equation*}
[1]ノーバート・ウィーナー, 池原止戈夫, 彌永昌吉, 室賀三郎, 戸田巌, “ウィーナー サイバネティックス ―動物と機械における制御と通信” 岩波書店, 2011
[2]庄野逸, Deep Learning 勉強会(1)
[3]高橋治久, 堀田一弘, “学習理論” コロナ社, 2009
[4]これは非常に単純なモデルであり, 理解や応用が簡単な為に様々な場面で用いられる. 特に機械学習では無批判にこのユニットを用いる向きがある. しかし, このモデルは厳密にニューロンの動作を表現できてはいないことに注意が必要である. 例えば, このモデルでは入力\(u\)が強ければ常に高電位を放出する事になるが, 実際にはニューロンはパルスを放出した後は一時的に放出電位が下がる事が実験により知られている. よりニューロンの動作を精密に表したモデルにホジキン-ハックスレー型のニューロンモデルがある[^13].
[5]正例のラベルを\(1\), 負例のラベルを\(0\)としたり問題に応じて都合良く決められるが, 識別できる二値なら何でもよく, 本質的な違いは存在しない.
[6]高橋治久, 堀田一弘, “学習理論” コロナ社, 2009
[7]この正規化によっても一般性は全く失われない. \(\ve{w}\)は入力の重みの比率を定めているに過ぎず, 実際\(u = \ve{w}^{\mathsf{T}}\ve{x} + b\)から見れるように, \(\ve{w}\)は面(識別面という)の法ベクトルとなっている.
[8]最も面\(\ve{w}^{\ast}\)に近いベクトルの距離を表しており, マージンと呼ばれる. かの有名なSVMのマージンそのものである
[9]2つのベクトル\(\ve{v}_{1}, \ve{v}_{2}\)がなす角度\(\theta\)\(\cos\theta = \ve{v}_{1}^{\mathsf{T}}\ve{v}_{2}/(||\ve{v}_{1}||||\ve{v}_{2}||)\)により求められるので, \(\theta=0\)ならば2つのベクトルは一致している(類似度が最大)と見ることができる. 角度\(\theta\)\(0\)に近い(類似度が高い)時は内積\(\ve{v}_{1}^{\mathsf{T}}\ve{v}_{2}\)が高い値を取ることが分かる
[10]大域的な最小解とは限らない事に注意
[11]係数の\(1/2\)に本質的な意味は無いが, 微分の際に計算を簡単にする狙いがある.
[12]しかし, 局所最適に嵌ってしまうリスクが潜んでいる
[13]\(\ve{w}\)は識別面の法ベクトルを表すが, 出力を単位ステップ(もしくは符号)関数とすると入力ベクトルが面の上半領域にある場合は\(1\)を, 下半領域にある場合は\(0(-1)\)を出力する.