戻る

誤差逆伝播法

はじめに

ちょっと復讐のために、深層学習(Deep Learning: DL)について、今まで学んだことを何も見ずに再構成したいと思います。まあ、自分用の備忘録ってやつです。

学習について

データの羅列を便宜上ベクトルと言うことにします。D=x(i),y(i)i=1N \mathcal{D} = \\{ \mathbf{x}^{(i)}, \mathbf{y}^{(i)} \\}_{i = 1}^NというN個のデータのペアが得られるとします。ここで、ii番目入力ベクトルをx(i)\mathbf{x}^{(i)}とし、深層学習によってy(model)=f(x;W,b)\mathbf{y}^\mathrm{(model)} = f(\mathbf{x}; W, \mathbf{b})というモデルを構成します。目指すべきはデータセットにあるx(i)\mathbf{x}^{(i)}でもそれ以外のx(j)\mathbf{x}^{(j)}に対し、yy(model)\mathbf{y} \simeq \mathbf{y}^\mathrm{(model)}とできることです。

そのようなy(model)\mathbf{y}^\mathrm{(model)}を構築するために、ffをあるアルゴリズムの下で逐次的に構成することを学習という言うことにします。

さて、このffの中身に目を向けましょう!

線形変換の限界

今、雑に言えば入力ベクトルx(i)\mathbf{x}^{(i)}をうまく変換してy(i)\mathbf{y}^{(i)}に近いy(model)\mathbf{y}^\mathrm{(model)}としたいわけです。変換という言葉から、ベクトルに対する線形変換を単純に思いつきます。つまり、

yy(model)=Wx+b(1) \mathbf{y} \simeq \mathbf{y}^\mathrm{(model)} = W \mathbf{x} + \mathbf{b} \tag{1}

をなすという予想です。しかし、これでは豊富な表現力を持たないのです。

すごく簡単な例として入力と出力の両方が1次元であるとしましょう。このとき(1)(1)式は

yy(model)=ax+b(2) y \simeq y^\mathrm{(model)} = ax + b \tag{2}

というただの1次関数となります。データの集合がD=x,yi=14=(1,1),(2,2),(4,4),(5,5))\mathcal{D} = \\{ x, y \\}_{i = 1}^{4} = \\{(1, 1), (2, 2), (4, 4), (5, 5)) \\}とします。このデータにおいては、直ちにa=1,b=0a = 1, b = 0とすればx=1x = -1でもx=100x = 100でもy=1y = -1y=100y = 100というふう対応関係が説明できそうです。

しかし、もしデータの集合がD=x,yi=14=(2,4),(1,1),(2,4),3,9))\mathcal{D} = \\{ x, y \\}_{i = 1}^{4} = \\{(-2, 4), (-1, 1), (2, 4), 3, 9)) \\}のようであれば、(2)(2)式のモデルは予言能力を持ちません。

仮に線形変換を重ねたとしても、線形変換の線形変換は線形です(それが線形変換の定義でもある)。x\mathbf{x}に3回変換を施してデモを見てみると

W(3)(W(2)(W(1)x+b(1))+b(2))+b(3)=W(3)W(2)W(1)あらためてWnewとおけるx+W(3)W(2)b(1)+W(3)b(2)+b(2)ここも結局ただの定数ベクトルbnewとなる=Wnewx+bnew\begin{align} &\quad W^{(3)}( W^{(2)}( W^{(1)} \mathbf{x} + \mathbf{b}^{(1)} ) + \mathbf{b}^{(2)} ) + \mathbf{b}^{(3)} \\[8pt] &= \underbrace{W^{(3)} W^{(2)} W^{(1)}}_{\text{あらためて}W_{\rm new}\text{とおける}} \mathbf{x} \underbrace{ + W^{(3)} W^{(2)} \mathbf{b}^{(1)} + W^{(3)} \mathbf{b}^{(2)} + \mathbf{b}^{(2)} }_{\text{ここも結局ただの定数ベクトル}\mathbf{b}_{\rm new}\text{となる}} \\[8pt] &= W_{\rm new} \mathbf{x} + \mathbf{b}_{\rm new} \end{align}

となります。 このため、豊かな表現力のためには非線形性が必要になります。

非線形性の導入

(1)(1)式の変換は線形変換のために、豊富な表現力を持たないため非線形性を持たせるように拡張しようというアイディアが前節で述べられました。非線形変換をσ\sigmaと書いておきます。それを

y(model)=σ(Wx+b)(3) \mathbf{y}^\mathrm{(model)} = \boldsymbol{\sigma}(W \mathbf{x} + \mathbf{b}) \tag{3}

と書くことにします。σ(v)\boldsymbol{\sigma}(\mathbf{v})は、任意のベクトルv\mathbf{v}の各成分viv_iに対して、σ(vi)\sigma(v_i)を作用させていることを表しています。添字の方が議論しやすいこともあるので(3)(3)を添字で表記しておくと、

yi(model)=σ(jWijxj+bi) y_i^\mathrm{(model)} = \sigma\left( \sum_{j}W_{ij} x_j + b_i \right)

となりますね。σ\sigma

limxσ(x)=0,limxσ(x)=1 \lim_{x \to -\infty} \sigma(x) = 0\,, \quad \lim_{x \to \infty} \sigma(x) = 1

を満たす関数です。また、ここで同じ添字が2回でてきたら和()(\sum)をとることは明らかなので、省略します1。行列の復讐みたくなりますが、行列の積などを添字表記で表しておきましょう。この2回現れた添字はfor文のfor (i in 0..10)のように絶対的な意味がないので、意味がある添字と区別ができる限り、どんな文字でおいても構いません。

(AB)ij=kAikBkj=AikBkj=AiBjuv=iuivi=uiviA(x)=iiAi(x)=iAi(x)\begin{align} (AB)_{ij} &= \sum_k A_{ik} B_{kj} = A_{ik} B_{kj} = A_{iゆ} B_{ゆj} \tag{行列の積} \\[8pt] \mathbf{u} \cdot \mathbf{v} &= \sum_i u_i v_i = u_i v_i \tag{内積} \\[8pt] \nabla \cdot \mathbf{A}(\mathbf{x}) &= \sum_i \partial_i A_i(\mathbf{x}) = \partial_i A_i(\mathbf{x}) \tag{発散} \end{align}

話はもどりますが、実は、(3)(3)のような変換

{u(i)=W(i)z(i1)+b(i)z(i)=σ(u(i))\begin{align} \left\{ \begin{aligned} \mathbf{u}^{(i)} &= W^{(i)}\mathbf{z}^{(i-1)} + \mathbf{b}^{(i)} \\[8pt] \mathbf{z}^{(i)} &= \boldsymbol{\sigma}(\mathbf{u}^{(i)}) \end{aligned} \right. \end{align}

を繰り返すことでニューラルネットを構成できるのです。このiiごとのステップが「層」であり、層の数が「深さ」と表現されます。一方、中間の層でWWの行と列の大きさを変えることもでき、行列のサイズの方を「幅」といいます。万能近似定理 (universal approximation theorem)の結果によれば、無限の幅を持つ1層のニューラルネットで、任意の連続関数に近似できます。この結果から動機づけされて、深さのあるニューラルネットでも同様の近似ができるものだと期待されています。

誤差関数の計算

深さLLのニューラルネットを考えると、得られるモデル(まだ学習していない)は

    z(1)=x{u(i)=W(i)z(i1)+b(i)z(i)=σ(i)(u(i))    y(model)=z(L) \begin{align} &~~~~ \mathbf{z}^{(1)} = \mathbf{x} \\[8pt] & \left\{ \begin{aligned} \mathbf{u}^{(i)} &= W^{(i)}\mathbf{z}^{(i-1)} + \mathbf{b}^{(i)} \\[8pt] \mathbf{z}^{(i)} &= \boldsymbol{\sigma}^{(i)}(\mathbf{u}^{(i)}) \end{aligned} \right. \\[8pt] &~~~~ \mathbf{y}^\mathrm{(model)} = \mathbf{z}^{(L)} \end{align}

です。これをまとめて書けば下記のようになりますが、かなり煩雑になります。

y(model)=σ(L)(W(L)(σ(2)(W(2)(σ(2)(W(2)x+b(2)))+b(2)))+b(L1)) \mathbf{y}^{\rm (model)} = \boldsymbol{\sigma}^{(L)} ( W^{(L)} (\cdots \boldsymbol{\sigma}^{(2)} ( W^{(2)}( \boldsymbol{\sigma}^{(2)}(W^{(2)} \mathbf{x} + \mathbf{b}^{(2)}) ) + \mathbf{b}^{(2)} ) \cdots )+ \mathbf{b}^{(L-1)} )

次に、誤差関数ED\mathcal{E}_\mathcal{D}が最小となるWWb\mathbf{b}を探すことが必要です。何を動かせばいいかと言うと、W(i),b(i)W^{(i)}, \mathbf{b}^{(i)}というパラメタです(それぞれ重みとバイアスと言われます)。以降、簡単のために

W=(W(2),,W(L))b=(b(2),,b(L))σ=(σ(2),,σ(L))\begin{align} W &= (W^{(2)}, \ldots, W^{(L)}) \\[8pt] \mathbf{b} &= (\mathbf{b}^{(2)}, \ldots, \mathbf{b}^{(L)}) \\[8pt] \boldsymbol{\sigma} &= (\boldsymbol{\sigma}^{(2)}, \ldots, \boldsymbol{\sigma}^{(L)}) \end{align}

と表すことがあります。いま誤差関数はこれらのパラメタや活性化関数により陽に

ED(y(i),y(model)(x(i);W,σ,b)) \mathcal{E}_\mathcal{D}(\mathbf{y}^{(i)}, \mathbf{y}^{\rm (model)}(\mathbf{x}^{(i)}; W, \boldsymbol{\sigma}, \mathbf{b}))

と表されるはずです。

さーて、微分タイムです。本によってはE/W\partial {\cal E}/\partial WE/b\partial {\cal E}/\partial \mathbf{b}のように書かれている計算です。しかし、正直この記法はあまり好きじゃありません。なぜなら、この書き方はいかにも行列やベクトルで微分しているように見えるからです。実際は各成分にたいして微分を施した量であるため、計算は成分表示でやるほうが親切だと思います。まずはkk番目の重み行列の(ij)(ij)成分であるWij(k)W^{(k)}_{ij}を変数と思って微分しましょう。その前に、ニューラルネットの関係式を添字表記で表しておきますと

{ui(k)=Wij(k)zj(k1)+bi(k),zi(k)=σ(k)(ui(k))\begin{align} \left\{ \begin{aligned} u^{(k)}_i &= W_{ij}^{(k)} z^{(k-1)}_j + b^{(k)}_i\,, \\ z^{(k)}_i &= \sigma^{(k)}(u_i^{(k)}) \end{aligned} \right. \end{align}

と表されます。これを使って誤差関数を微分しましょう。活性化関数を作用する中間のui(k)u_i^{(k)}を使うことで、

EDWij(k)=EDul(k)ul(k)Wij(k)\begin{align} \frac{\partial {\cal E}_{\cal D}}{\partial W_{ij}^{(k)}} &= \frac{\partial {\cal E}_{\cal D}}{\partial u_l^{(k)}} \frac{\partial u_l^{(k)}}{\partial W_{ij}^{(k)}} \tag{4} \end{align}

とできます(再度言及しておきますが、アインシュタインの縮約規則を使っています。llがダミー添字であり、和が省略されています)。(4)(4)右辺の最初の因子は

Δl(k)=EDul(k)(5) \Delta^{(k)}_l = \frac{\partial {\cal E}_{\cal D}}{\partial u_l^{(k)}} \tag{5}

とし定義しておき、(4)(4)右辺の最後の因子は

ul(k)Wij(k)=Wij(k)(Wlm(k)zm(k1)+bl(k))=δilδjmzm(k1)=δlizj(k1)\begin{align} \frac{\partial u_l^{(k)}}{\partial W_{ij}^{(k)}} &= \frac{\partial}{\partial W_{ij}^{(k)}} ( W_{lm}^{(k)} z_m^{(k-1)} + b_l^{(k)} ) \\ &= \delta_{il} \delta _{jm} z_m^{(k-1)} = \delta_{li} z_j^{(k-1)} \tag{6} \end{align}

と計算されます。微分の途中に登場するδij\delta_{ij}はクロネッカーのデルタと呼ばれ、i=ji = jのときδij=1\delta_{ij} = 1iji \neq jのときδij=0\delta_{ij} = 0となります。慣れていないと上の(6)(6)式で何の計算をしているかわからないかもしれませんが、簡単な例で説明すると、qi=(x,y,z)q_i = (x, y, z)としたとき

qiqj \frac{\partial q_i}{\partial q_j}

を計算しているようなものです。xxxxで微分すれば11だし、xxyyで微分すれば0です。クロネネッカーのデルタを使えば、微分の結果をまとめて表現できるのです。

(5)(6)(5)(6)(4)(4)に代入すると

EDWij(k)=Δl(k)δlizj(k1)=Δi(k)zj(k1) \frac{\partial {\cal E}_{\cal D}}{\partial W_{ij}^{(k)}} = \Delta_l^{(k)} \delta_{li} z_j^{(k-1)} = \Delta_i^{(k)} z_j^{(k-1)}

とできますね。

層同士の関係

{ui(k)=Wij(k)zj(k1)+bi(k),zi(k)=σ(k)(ui(k))\begin{align} \left\{ \begin{aligned} u^{(k)}_i &= W_{ij}^{(k)} z^{(k-1)}_j + b^{(k)}_i\,, \\[8pt] z^{(k)}_i &= \sigma^{(k)}(u_i^{(k)}) \end{aligned} \right. \end{align}

の関係からkk番目とk+1k+1番目の層に関係をつけることができます。Δl(k)\Delta_l^{(k)}を使うと

Δl(k)=EDul(k)=EDum(k+1)um(k+1)ul(k)=δm(k+1)ul(k)(Wln(k+1)zn(k))=δm(k+1)Wln(k+1)ul(k)σ(k)(un(k))=δm(k+1)Wln(k+1)σ(k)(ul(k))un(k)ul(k)=δm(k+1)Wln(k+1)σ(k)(ul(k))δln=δm(k+1)Wlm(k+1)σ(k)(ul(k))\begin{align} \Delta_l^{(k)} &= \frac{\partial {\cal E}_{\cal D}}{\partial u^{(k)}_l} \notag \\[8pt] &= \frac{\partial {\cal E}_{\cal D}}{\partial u^{(k+1)}_m} \frac{\partial u^{(k+1)}_m}{\partial u^{(k)}_l} \notag \\[8pt] &= \delta_m^{(k+1)} \frac{\partial}{\partial u_l^{(k)}} (W_{ln}^{(k+1)} z_n^{(k)}) \notag \\[8pt] &= \delta_m^{(k+1)} W_{ln}^{(k+1)} \frac{\partial}{\partial u_l^{(k)}} \sigma^{(k)} (u_n^{(k)}) \notag \\[8pt] &= \delta_m^{(k+1)} W_{ln}^{(k+1)} \sigma^{(k)\prime}(u_l^{(k)}) \frac{\partial u_n^{(k)}}{\partial u_l^{(k)}} \notag \\[8pt] &= \delta_m^{(k+1)} W_{ln}^{(k+1)} \sigma^{(k)\prime}(u_l^{(k)}) \delta_{ln} \notag \\[8pt] &= \delta_m^{(k+1)} W_{lm}^{(k+1)} \sigma^{(k)\prime}(u_l^{(k)}) \end{align}

です。

Footnotes

  1. アインシュタインの縮約規則といいます。

戻る