なぜディープラーニングに線形代数が必要なのかを理解する

こんにちは。ゆうせいです。

ディープラーニングを学び始めると、行列とベクトルが山のように出てきます。そして多くの人が、ここで手が止まります。

「なぜ行列で書くのか」 「なぜ逆伝播で転置が出てくるのか」

この二つの疑問は、実は同じ場所から来ています。微分の連鎖律です。

そこでこの記事では、いきなり行列を使いません。まず、ユニットが各層に1つずつしかない最小のネットワークから始めます。この規模なら行列は不要です。ただの掛け算と足し算で、順伝播も逆伝播も最後まで計算できます。

そのうえで、ユニットを2つに増やします。すると連鎖律に「和」が現れます。その和を書き表す記法が、まさに行列積と転置なのです。

活性化関数にはReLUを使います。微分が0か1しかないため、指数関数が一切出てきません。数値も、電卓なしで計算できるように選びました。紙とペンだけで追えます。

結論

線形代数は、連鎖律を書き表すための記法です。

ユニットが1つずつのネットワークでは、連鎖律は変化率の掛け算だけで済みます。行列は要りません。

ユニットが増えると、経路が枝分かれします。すると、複数の経路をたどった影響をすべて足し合わせる必要が出てきます。この「掛けて足す」という操作が、行列積そのものです。

そして、順伝播が入力から出力へ向かうのに対し、逆伝播は出力から入力へ向かいます。方向が逆なので、同じ重みでも行と列の役割が入れ替わります。これが転置の正体です。

線形代数が必要な理由は、便利だからではありません。連鎖律を実際の規模で書くには、それしか方法がないからです。

コラム1 記号アレルギーをなくす

本題に入る前に、これから出てくる記号を先にまとめます。数学が苦手な人の多くは、内容ではなく記号でつまずいています。読み方が分からない記号は、頭の中で音にできないため、記憶にも残りません。

先に音にしておきましょう。

ギリシャ文字

記号読み方この記事での意味由来
\delta デルタ(小文字)誤差項。ある値を動かしたとき損失がどれだけ動くかdifference(差)の頭文字Dに対応
\eta イータ学習率。1回の更新でどれだけ動かすか慣習。特に意味はない
\sum シグマ(大文字)足し合わせるsum(合計)の頭文字Sに対応

\delta は、英語のdにあたるギリシャ文字です。数学では昔から「小さな差」を表す記号として使われてきました。ニューラルネットワークで誤差項を \delta と書くのも、その流れです。

\eta は、英語のeやhに近い文字です。学習率を表す記号として広く使われていますが、深い理由はありません。慣習だと思ってください。\alpha (アルファ)を使う教科書もあります。

\sum は、たくさん足すという意味です。次のように書きます。

\sum_{k=1}^{3} k = 1 + 2 + 3 = 6

下に「どこから」、上に「どこまで」を書き、その範囲で足していきます。

ギリシャ文字以外の記号

記号読み方意味
\partial ラウンド、または partial(パーシャル)偏微分。複数の変数のうち1つだけに注目して微分する
\hat{y} ワイハット予測値。帽子(hat)を被せて「推定した値」を表す
\odot 丸に点、アダマール積同じ位置どうしを掛ける
W^{T} ダブリュー転置行と列を入れ替えた行列。Tはtransposeの頭文字

\partial は、d を丸めた形の記号です。日本では「ラウンドディー」と読むことが多いのですが、正式な読み方は決まっていません。海外では partial と読みます。

普通の微分 \frac{dy}{dx} との違いは、変数が複数あるかどうかです。L w_1 にも w_2 にも依存するとき、w_1 だけを動かして調べるのが \frac{\partial L}{\partial w_1} です。他の変数は固定して考えます。

\hat{y} の帽子は、「これは本物ではなく、こちらが推定した値ですよ」という印です。統計学から来た習慣です。正解は t 、予測は \hat{y} と書き分けます。

記号は名前だと思ってください

初対面の人の名前を覚えるのと同じです。読み方が分かれば親しみが湧きます。

記号そのものに深い意味はありません。\delta

e と書いても数学的には何も変わりません。ただ、多くの人が \delta を使っているので、合わせておくと本や論文が読みやすくなる。それだけの話です。

準備1 誤差と損失の違い

もう一つ、先に整理しておきたい言葉があります。誤差と損失です。

この二つは似た場面で使われるため、初学者が混乱しやすい用語です。

三つの言葉を区別する

用語英語意味符号
誤差error予測値と正解値のずれあり
損失loss1件のデータに対する悪さの度合いなし(0以上)
コストcostすべてのデータの損失の平均なし(0以上)

順に説明します。

誤差

予測値と正解値の差です。

\hat{y} - t

これには符号があります。予測が大きすぎれば正、小さすぎれば負です。

\hat{y} = 6 t = 4 なら、誤差は 2 です。 \hat{y} = 2 t = 4 なら、誤差は -2 です。

どちらも「2だけずれている」のですが、向きが違います。

損失

誤差を「悪さの度合い」に変換した1つの数です。

なぜ変換が必要なのでしょうか。誤差のままでは、符号があるため扱いにくいからです。

たとえばデータが2件あって、誤差がそれぞれ +5 -5 だったとします。単純に足すと0になってしまいます。まったく合っていないのに、誤差ゼロという結論になってしまいます。

そこで二乗します。

L = \frac{1}{2}(\hat{y} - t)^2

二乗すれば符号が消えます。ずれが大きいほど大きな値になります。これが損失です。

損失は必ず0以上です。0のときだけ、予測が完全に当たっています。

コスト

すべてのデータの損失を平均したものです。

J = \frac{1}{n} \sum_{k=1}^{n} L^{(k)}

n はデータの件数です。

学習で本当に小さくしたいのは、このコストです。1件だけ当たっても意味がありません。

データが1件のときは一致する

ここが重要な点です。

データが1件しかないとき、平均を取る相手が自分しかいません。したがって、コストと損失は同じ値になります。

J = \frac{1}{1} \times L = L

この記事では、説明を簡単にするためデータを1件だけ扱います。ですので、損失とコストを区別する必要がありません。以降、すべて損失と呼びます。

また、この記事の例では偶然、誤差の値と損失の値が一致する場面が出てきます。

\hat{y} - t = 2

L = \frac{1}{2} \times 2^2 = 2

誤差2、損失2です。同じ数字ですが、意味は別物です。たまたま \frac{1}{2} \times 2^2 = 2 となっただけで、誤差が3なら損失は4.5になります。混同しないでください。

もう一つの「誤差」に注意

逆伝播の説明では、\delta のことを「誤差」と呼ぶ習慣があります。これが三つ目の意味です。

正確には誤差項と言い、次のものを指します。

\delta = \frac{\partial L}{\partial z}

その層の入力を少し動かしたとき、損失がどれだけ動くか。つまり、その層が背負っている責任の大きさです。

出力層では、たまたま \delta_2 = \hat{y} - t となります。予測値と正解値の差と一致するため、「誤差」と呼ばれるようになりました。

しかし中間層の \delta_1 は、もはや何かの差ではありません。損失の変化率です。

言葉が同じでも、指しているものが違う。この点だけ頭に置いておいてください。

準備2 連鎖律とは何か

行列の話に入る前に、微分の連鎖律を丁寧に確認します。ここが分かっていないと、後の話がすべて曖昧になります。

合成関数の微分

y u の関数で、u x の関数だとします。このとき、次が成り立ちます。

\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx}

これが連鎖律です。英語ではchain rule、つまり鎖の規則です。

歯車で考えてください

三つの歯車が噛み合っている装置を想像してください。

1番目の歯車を1回転させると、2番目が3回転するとします。2番目を1回転させると、3番目が2回転するとします。

では、1番目を1回転させると、3番目は何回転するでしょうか。

3 \times 2 = 6

6回転です。掛け算になります。

連鎖律も、まったく同じ発想です。

\frac{du}{dx} = 3 は「x を1動かすと u が3動く」という意味です。

\frac{dy}{du} = 2 は「u を1動かすと y が2動く」という意味です。

したがって、x を1動かすと y は6動きます。

微分とは変化率であり、変化率が連鎖するときは掛け算になる。これが連鎖律の中身です。

数値で確かめる

具体的な関数で確認します。

u = 3x, \quad y = u^2

x = 2 のときを考えます。このとき u = 6 y = 36 です。

連鎖律で微分を求めます。

\frac{du}{dx} = 3

\frac{dy}{du} = 2u = 12

\frac{dy}{dx} = 12 \times 3 = 36

本当でしょうか。x を少しだけ増やして確かめます。x = 2.001 とします。

u = 6.003

y = 6.003^2 = 36.036009

変化量を計算します。

36.036009 - 36 = 0.036009

これを x の変化量で割ります。

\frac{0.036009}{0.001} = 36.009

36とほぼ一致しました。連鎖律が正しいことが確認できます。

この「少し動かして確かめる」という方法を数値微分といいます。後でも使いますので、覚えておいてください。

逆伝播は連鎖律そのもの

ニューラルネットワークでは、次のような連鎖ができています。

w \rightarrow z \rightarrow a \rightarrow \hat{y} \rightarrow L

重み w を変えると z が変わり、z が変わると a が変わり、最終的に損失 L が変わります。

知りたいのは \frac{\partial L}{\partial w} です。連鎖律を使えば、次のように分解できます。

\frac{\partial L}{\partial w} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial a} \cdot \frac{\partial a}{\partial z} \cdot \frac{\partial z}{\partial w}

4つの因子の掛け算です。一つひとつは簡単に計算できます。

逆伝播とは、この掛け算を出力側から順番に実行していく手続きです。特別な理論ではありません。連鎖律を効率よく計算しているだけです。

準備3 ReLUという活性化関数

もう一つ、使う道具を確認します。

名前の意味

ReLUは Rectified Linear Unit の略で、日本語では正規化線形関数と呼ばれます。

rectified は「整流された」という意味です。電気回路の整流器と同じ言葉で、片方向にだけ電流を通す部品を指します。名前の通り、片方向にだけ値を通す関数です。

読み方は「レルー」または「レリュー」です。

定義

\text{ReLU}(u) = \max(0, u) = \begin{cases} u & (u > 0) \\ 0 & (u \leq 0) \end{cases}

正の値はそのまま通し、負の値は0にします。それだけです。

微分

\text{ReLU}'(u) = \begin{cases} 1 & (u > 0) \\ 0 & (u < 0) \end{cases}

正なら1、負なら0です。u = 0 では厳密には微分できませんが、実装上は0または1と決めて扱います。

門番だと思ってください

正の値が来たら、そのまま通します。負の値が来たら、通行止めにして0にします。

連鎖律の観点で言えば、こういうことです。通した経路の変化率は1なので、掛けても何も変わりません。止めた経路の変化率は0なので、掛けた瞬間にすべてが0になります。

この極端さが、計算を単純にしています。

第1部 最小のネットワークで連鎖律を体験する

構成

各層にユニットが1つだけです。

要素数活性化関数
入力層1なし
中間層1ReLU
出力層1なし(恒等)

一本道です。

x \rightarrow z_1 \rightarrow a_1 \rightarrow \hat{y}

行列は出てきません。すべてただの数です。

記号と初期値

記号読み方何の略か初期値
x エックス入力。数学で未知数に使う慣習から2
w_1 ダブリューいちweight(重み)3
z_1 ゼットいち活性化前の値。慣習でzを使う(計算結果 6)
a_1 エーいちactivation(活性化された値)(計算結果 6)
w_2 ダブリューにweight(重み)1
\hat{y} ワイハットyの予測値。hatは推定の印(計算結果 6)
t ティーtarget(正解、目標値)4
L エルLoss(損失)(計算結果 2)
\delta_2 デルタに出力層の誤差項(計算結果 2)
\eta イータ学習率(learning rate)0.01

初期値はあらかじめ与えられた値です。(計算結果 )と書いた項目は、これから求めるものです。

順伝播

計算式は次の通りです。

z_1 = w_1 x

a_1 = \text{ReLU}(z_1)

\hat{y} = w_2 a_1

順に計算します。

z_1 = 3 \times 2 = 6

6は正なので、ReLUはそのまま通します。

a_1 = 6

\hat{y} = 1 \times 6 = 6

誤差と損失を求める

まず誤差です。

\hat{y} - t = 6 - 4 = 2

予測が2だけ大きすぎました。

次に損失です。

L = \frac{1}{2}(\hat{y} - t)^2 = \frac{1}{2} \times 2^2 = \frac{1}{2} \times 4 = 2

今回はたまたま誤差も損失も2になりました。偶然の一致です。混同しないでください。

なお、係数 \frac{1}{2} は、微分したときに2が消えて式が簡単になるために付けます。数学的な必然性はありません。

連鎖の全体像を書き出す

逆伝播に入る前に、連鎖の構造を確認します。

L \hat{y} の関数です。 \hat{y} w_2 a_1 の関数です。 a_1 z_1 の関数です。 z_1 w_1 x の関数です。

したがって、w_1 が損失に与える影響は、次の連鎖で表せます。

\frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial a_1} \cdot \frac{\partial a_1}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_1}

4つの因子を、一つずつ求めていきます。

因子1 損失を予測値で微分する

L = \frac{1}{2}(\hat{y} - t)^2 \hat{y} で微分します。

外側の二乗を微分すると2が出て、内側 (\hat{y} - t) の微分は1です。ここでも連鎖律を使っています。

\frac{\partial L}{\partial \hat{y}} = \frac{1}{2} \times 2 \times (\hat{y} - t) \times 1 = \hat{y} - t

係数 \frac{1}{2} を付けた理由が、ここで分かります。

数値を入れます。

\frac{\partial L}{\partial \hat{y}} = 6 - 4 = 2

出力層は恒等関数なので、この値をそのまま出力層の誤差項とします。

\delta_2 = 2

意味を確認してください。予測値を1増やすと、損失が2増える。だから予測値は減らすべきだ、ということです。

※恒等関数とは、入力した値をそのまま同じ値として出力する関数です。数式では (f(x) = x) と表され、何も変化させない操作を意味します。

因子2 予測値を中間層の出力で微分する

\hat{y} = w_2 a_1 です。a_1 で微分します。

\frac{\partial \hat{y}}{\partial a_1} = w_2 = 1

因子3 ReLUを微分する

z_1 = 6 は正でした。

\frac{\partial a_1}{\partial z_1} = 1

因子4 中間層の入力を重みで微分する

z_1 = w_1 x です。w_1 で微分します。

\frac{\partial z_1}{\partial w_1} = x = 2

掛け合わせる

\frac{\partial L}{\partial w_1} = 2 \times 1 \times 1 \times 2 = 4

歯車の話を思い出してください。w_1 を1動かすと、それが4倍になって損失に届く。そういう意味です。

数値微分で検算する

本当に4でしょうか。確かめます。

w_1 3.001 にします。他は変えません。

z_1 = 3.001 \times 2 = 6.002

正なので、そのまま通ります。

a_1 = 6.002

\hat{y} = 1 \times 6.002 = 6.002

損失を計算します。

6.002 - 4 = 2.002

L = \frac{1}{2} \times 2.002^2 = \frac{1}{2} \times 4.008004 = 2.004002

変化量を求めます。

2.004002 - 2 = 0.004002

変化率を求めます。

\frac{0.004002}{0.001} = 4.002

4とほぼ一致しました。連鎖律の計算が正しかったことが確認できます。

この検算方法は、実装のときにも使えます。手計算した勾配と数値微分の結果が合わなければ、どこかで間違えています。

もう一つの重みも求める

w_2 についても、連鎖律を書きます。

\frac{\partial L}{\partial w_2} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial w_2}

\hat{y} = w_2 a_1 なので、次の通りです。

\frac{\partial \hat{y}}{\partial w_2} = a_1 = 6

掛け合わせます。

\frac{\partial L}{\partial w_2} = 2 \times 6 = 12

w_1 より連鎖が短いことに注目してください。出力に近い層ほど、連鎖が短くなります。

重みを更新する

学習率 \eta (イータ)を 0.01 とします。

w \leftarrow w - \eta \frac{\partial L}{\partial w}

なぜ引くのでしょうか。勾配が正なら、その重みを増やすと損失が増えるからです。損失を減らしたいのだから、逆向きに動かします。

w_1 を更新します。

3 - 0.01 \times 4 = 3 - 0.04 = 2.96

w_2 を更新します。

1 - 0.01 \times 12 = 1 - 0.12 = 0.88

損失が下がったか確かめる

更新後の値で、もう一度順伝播します。

z_1 = 2.96 \times 2 = 5.92

a_1 = 5.92

\hat{y} = 0.88 \times 5.92 = 5.2096

損失を計算します。

5.2096 - 4 = 1.2096

L = \frac{1}{2} \times 1.2096^2 = \frac{1}{2} \times 1.46313216 = 0.73156608

比較します。

項目更新前更新後
予測値6.00005.2096
誤差2.00001.2096
損失2.00000.7316

損失が約63%減少しました。予測値が正解の4に近づいています。

これが学習です。連鎖律で勾配を求め、その逆向きに少し動かす。それだけです。

負の値が出るとどうなるか

w_1 = -1 に変えて計算してみます。

z_1 = -1 \times 2 = -2

負なので、ReLUは0にします。

a_1 = 0

\hat{y} = 1 \times 0 = 0

損失を計算します。

0 - 4 = -4

L = \frac{1}{2} \times 16 = 8

逆伝播します。

\frac{\partial L}{\partial \hat{y}} = -4

\frac{\partial \hat{y}}{\partial a_1} = 1

\frac{\partial a_1}{\partial z_1} = 0

ここで0が現れました。以降、何を掛けても0です。

\frac{\partial L}{\partial w_1} = -4 \times 1 \times 0 \times 2 = 0

w_2 の勾配も見てみます。

\frac{\partial L}{\partial w_2} = -4 \times a_1 = -4 \times 0 = 0

両方とも0になりました。損失は8もあるのに、学習が完全に止まっています。

これが死んだReLU問題です。ユニットが1つしかないため、極端な形で現れました。

対策としては、学習率を適切に設定することや、負の側でもわずかに勾配を残すLeaky ReLUを使う方法があります。初学者の段階では、そういう現象があると知っておけば十分です。

そして、連鎖律の観点でも重要な教訓があります。連鎖の途中に0が一つでもあると、そこから先はすべて0になる。掛け算だからです。

この性質は、後で勾配消失の話につながります。

第1部のまとめ

ここまでで、行列は一度も出てきませんでした。

連鎖律は変化率の掛け算です。順番に掛けていくだけです。

では、なぜ行列が必要になるのでしょうか。ユニットを増やせば分かります。

コラム2 転置とは何か

第2部で転置が出てきます。先に、記号ではなく中身を理解しておきましょう。

定義は単純

転置とは、行と列を入れ替えることです。英語ではtranspose、つまり「置き換える」という意味です。記号は右肩に T を付けます。

A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix}

これは2行3列です。転置すると、次のようになります。

A^{T} = \begin{pmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{pmatrix}

3行2列になりました。

やっていることは、左上から右下への対角線を軸にして、パタンと折り返しただけです。数字の中身は一つも変わっていません。

例1 成績表を裏返す

3人の生徒が2科目のテストを受けたとします。

生徒国語数学
Aさん8060
Bさん7090
Cさん5085

行列にすると、3行2列です。

\begin{pmatrix} 80 & 60 \\ 70 & 90 \\ 50 & 85 \end{pmatrix}

これを転置すると、次の表になります。

科目AさんBさんCさん
国語807050
数学609085

\begin{pmatrix} 80 & 70 & 50 \\ 60 & 90 & 85 \end{pmatrix}

データはまったく同じです。Bさんの数学が90点であることは変わりません。

変わったのは、見る向きです。

元の表は「生徒ごとに、どの科目が得意か」を見るのに向いています。転置した表は「科目ごとに、誰が得意か」を見るのに向いています。

同じデータを、違う方向から読む。転置とは、そういう操作です。

例2 配線図を逆から読む

ニューラルネットワークの重みも、表だと思ってください。

W_1 = \begin{pmatrix} 1 & 2 \\ 3 & -1 \end{pmatrix}

この行列の各要素が何を表すか、表にします。

入力1から入力2から
中間1へ12
中間2へ3-1

行が「どこへ」、列が「どこから」です。W_{1,21} = 3 は、入力1から中間2への配線の太さを表しています。

順伝播では、この向きで読みます。中間ユニット1に何が入ってくるかを知りたければ、1行目を見ればよいのです。

では逆伝播ではどうでしょうか。今度は「入力1は、どこに影響を与えたか」を知りたくなります。

その情報は、1列目に縦に並んでいます。

読みにくいですね。そこで、表を裏返します。

中間1から中間2から
入力1へ13
入力2へ2-1

W_1^{T} = \begin{pmatrix} 1 & 3 \\ 2 & -1 \end{pmatrix}

今度は横に読めます。入力1に関係する数字が、1行目に並んでいます。

これが逆伝播で転置が現れる理由です。

同じ配線図を、行き先から出発点へ、逆向きに読み直している。ただそれだけのことです。新しい情報は何も加わっていません。

覚え方

順伝播は「入力から出力へ」。行が出力側でした。

逆伝播は「出力から入力へ」。行が入力側になります。

主役が入れ替わるので、表も裏返す。これが転置です。

第2部 ユニットを増やすと和が現れる

構成

入力2、中間層2、出力1にします。

要素数活性化関数
入力層2なし
中間層2ReLU
出力層1なし

何が変わったのか

一本道ではなくなりました。

入力 x_1 は、z_{1,1} にも z_{1,2} にも影響します。経路が枝分かれしました。

そして中間層の2つの出力は、どちらも \hat{y} に流れ込みます。経路が合流しました。

この分岐と合流が、連鎖律に「和」を持ち込みます。

多変数の連鎖律

変数が複数ある場合、連鎖律は次の形になります。

\frac{\partial L}{\partial x} = \sum_{k} \frac{\partial L}{\partial u_k} \cdot \frac{\partial u_k}{\partial x}

\sum (シグマ)は、足し合わせるという記号でした。

意味はこうです。x から L へ至る経路が複数あるなら、すべての経路について計算して足し合わせる。

なぜ足すのでしょうか。x を少し動かしたとき、その影響が複数の道を通って同時に伝わるからです。すべての影響の合計が、最終的な変化になります。

記号と初期値

記号読み方何の略か初期値
x エックス入力ベクトル\begin{pmatrix} 2 \\ 1 \end{pmatrix}
W_1 ダブリューいちweight(重み)。大文字は行列を表す\begin{pmatrix} 1 & 2 \\ 3 & -1 \end{pmatrix}
z_1 ゼットいち活性化前の値(計算結果 \begin{pmatrix} 4 \\ 5 \end{pmatrix} )
a_1 エーいちactivation(活性化された値)(計算結果 \begin{pmatrix} 4 \\ 5 \end{pmatrix} )
W_2 ダブリューにweight(重み)\begin{pmatrix} 1 & 2 \end{pmatrix}
\hat{y} ワイハット予測値(計算結果 14)
t ティーtarget(正解)12
L エルLoss(損失)(計算結果 2)
\delta_2 デルタに出力層の誤差項(計算結果 2)
\delta_1 デルタいち中間層の誤差項(計算結果 \begin{pmatrix} 2 \\ 4 \end{pmatrix} )
\eta イータ学習率0.01

大文字と小文字の使い分けにも慣習があります。行列は大文字、ベクトルや数は小文字で書くことが多いのです。W が大文字で x が小文字なのは、そのためです。

添え字の意味

W_{1,ij} は、j 番目の入力から i 番目の中間ユニットへの重みです。

行が受け取る側、列が送る側です。コラム2で見た配線図の表と同じ読み方です。

順伝播 まず添え字で書く

行列を使わずに書きます。

z_{1,1} = W_{1,11} x_1 + W_{1,12} x_2

z_{1,2} = W_{1,21} x_1 + W_{1,22} x_2

計算します。

z_{1,1} = 1 \times 2 + 2 \times 1 = 2 + 2 = 4

z_{1,2} = 3 \times 2 + (-1) \times 1 = 6 - 1 = 5

同じことを行列で書く

z_1 = W_1 x

\begin{pmatrix} 1 & 2 \\ 3 & -1 \end{pmatrix} \begin{pmatrix} 2 \\ 1 \end{pmatrix} = \begin{pmatrix} 4 \\ 5 \end{pmatrix}

添え字で2行かかったものが、1行になりました。

そして重要なのは、この式が中間層の数によらないことです。中間層が100個でも、z_1 = W_1 x のままです。

行列積とは、掛けて足すという操作をまとめて書く記法です。それ以上でも以下でもありません。

ReLUを通す

z_{1,1} = 4 z_{1,2} = 5 も正なので、そのまま通ります。

a_1 = \begin{pmatrix} 4 \\ 5 \end{pmatrix}

ここで、行列積との違いを押さえてください。

行列積では、複数の入力が混ざって1つの出力になりました。ReLUでは、各要素が独立に処理されます。1番目の出力は1番目の入力にしか依存しません。

混ぜる操作と、混ぜない操作。この違いが逆伝播に効いてきます。

出力を求める

\hat{y} = W_2 a_1 = 1 \times 4 + 2 \times 5 = 4 + 10 = 14

誤差を求めます。

14 - 12 = 2

損失を求めます。

L = \frac{1}{2} \times 2^2 = 2

逆伝播 出力層の誤差項

第1部と同じです。

\delta_2 = \hat{y} - t = 2

出力層の重みの勾配

連鎖律を書きます。W_{2,1} について考えます。

\frac{\partial L}{\partial W_{2,1}} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial W_{2,1}}

\hat{y} = W_{2,1} a_{1,1} + W_{2,2} a_{1,2} なので、次の通りです。

\frac{\partial \hat{y}}{\partial W_{2,1}} = a_{1,1} = 4

掛けます。

\frac{\partial L}{\partial W_{2,1}} = 2 \times 4 = 8

同様に計算します。

\frac{\partial L}{\partial W_{2,2}} = 2 \times 5 = 10

行列で書けば、次の一行です。

\frac{\partial L}{\partial W_2} = \delta_2 , a_1^{T} = \begin{pmatrix} 8 & 10 \end{pmatrix}

ここで a_1 を転置している理由を確認してください。a_1 は縦に並んだ2行1列でした。しかし W_2 は横に並んだ1行2列です。形を揃えるために、横向きにしています。

中間層へ誤差を伝える

a_{1,1} が損失に与える影響を求めます。

\frac{\partial L}{\partial a_{1,1}} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial a_{1,1}} = 2 \times W_{2,1} = 2 \times 1 = 2

同様に計算します。

\frac{\partial L}{\partial a_{1,2}} = 2 \times W_{2,2} = 2 \times 2 = 4

行列で書きます。

\frac{\partial L}{\partial a_1} = W_2^{T} \delta_2 = \begin{pmatrix} 1 \\ 2 \end{pmatrix} \times 2 = \begin{pmatrix} 2 \\ 4 \end{pmatrix}

転置が現れました。コラム2で見た通り、配線図を逆から読んでいます。

W_2 は「中間1と中間2から出力へ」という横向きの表でした。W_2^{T} は「出力から中間1へ、出力から中間2へ」という縦向きの表です。

ReLUを逆に通る

z_1 = (4, 5) はどちらも正なので、微分は1です。

\delta_1 = \frac{\partial L}{\partial a_1} \odot \text{ReLU}'(z_1) = \begin{pmatrix} 2 \\ 4 \end{pmatrix} \odot \begin{pmatrix} 1 \\ 1 \end{pmatrix} = \begin{pmatrix} 2 \\ 4 \end{pmatrix}

記号 \odot はアダマール積、つまり同じ位置どうしを掛ける演算です。フランスの数学者アダマールの名前が付いています。

なぜ行列積ではないのでしょうか。連鎖律に戻れば分かります。

\frac{\partial L}{\partial z_{1,1}} = \frac{\partial L}{\partial a_{1,1}} \cdot \frac{\partial a_{1,1}}{\partial z_{1,1}}

a_{1,1} z_{1,1} にしか依存しません。したがって、和が発生しません。和がないのだから、行列積にはなりません。

混ざったものを戻すときは行列積。混ざっていないものを戻すときはアダマール積。この対応は覚えておく価値があります。

中間層の重みの勾配

W_{1,11} について、連鎖律を書きます。

\frac{\partial L}{\partial W_{1,11}} = \frac{\partial L}{\partial z_{1,1}} \cdot \frac{\partial z_{1,1}}{\partial W_{1,11}}

z_{1,1} = W_{1,11} x_1 + W_{1,12} x_2 なので、次の通りです。

\frac{\partial z_{1,1}}{\partial W_{1,11}} = x_1 = 2

掛けます。

\frac{\partial L}{\partial W_{1,11}} = 2 \times 2 = 4

残りも同様に計算します。

\frac{\partial L}{\partial W_{1,12}} = 2 \times 1 = 2

\frac{\partial L}{\partial W_{1,21}} = 4 \times 2 = 8

\frac{\partial L}{\partial W_{1,22}} = 4 \times 1 = 4

行列で書きます。

\frac{\partial L}{\partial W_1} = \delta_1 x^{T} = \begin{pmatrix} 2 \\ 4 \end{pmatrix} \begin{pmatrix} 2 & 1 \end{pmatrix} = \begin{pmatrix} 4 & 2 \\ 8 & 4 \end{pmatrix}

縦ベクトルと横ベクトルを掛けると、行列ができます。2行1列と1行2列を掛けて、2行2列になりました。

数値微分で検算する

\frac{\partial L}{\partial W_{1,11}} = 4 を確かめます。

W_{1,11} 1.001 にします。

z_{1,1} = 1.001 \times 2 + 2 \times 1 = 2.002 + 2 = 4.002

z_{1,2} は変わらず5です。

\hat{y} = 1 \times 4.002 + 2 \times 5 = 4.002 + 10 = 14.002

損失を計算します。

14.002 - 12 = 2.002

L = \frac{1}{2} \times 4.008004 = 2.004002

変化率を求めます。

\frac{2.004002 - 2}{0.001} = 4.002

4と一致しました。

和の連鎖律を目で見る

ここまで、実は「和」がまだ現れていません。中間層から出力層への経路が1本ずつだったためです。

和が現れる場所を見るために、\frac{\partial L}{\partial x_1} を計算してみます。学習には使いませんが、層をもう一つ深くすれば必ず必要になる計算です。

x_1 から損失へ至る経路は2本あります。

経路A: x_1 \rightarrow z_{1,1} \rightarrow a_{1,1} \rightarrow \hat{y} \rightarrow L

経路B: x_1 \rightarrow z_{1,2} \rightarrow a_{1,2} \rightarrow \hat{y} \rightarrow L

経路Aの寄与を計算します。各段の変化率を並べます。

\frac{\partial z_{1,1}}{\partial x_1} = W_{1,11} = 1

\frac{\partial a_{1,1}}{\partial z_{1,1}} = 1

\frac{\partial \hat{y}}{\partial a_{1,1}} = W_{2,1} = 1

\frac{\partial L}{\partial \hat{y}} = 2

掛け合わせます。

1 \times 1 \times 1 \times 2 = 2

経路Bの寄与を計算します。

\frac{\partial z_{1,2}}{\partial x_1} = W_{1,21} = 3

\frac{\partial a_{1,2}}{\partial z_{1,2}} = 1

\frac{\partial \hat{y}}{\partial a_{1,2}} = W_{2,2} = 2

\frac{\partial L}{\partial \hat{y}} = 2

掛け合わせます。

3 \times 1 \times 2 \times 2 = 12

足し合わせます。

\frac{\partial L}{\partial x_1} = 2 + 12 = 14

x_2 についても同じことをします。

経路A: W_{1,12} = 2 なので、2 \times 1 \times 1 \times 2 = 4

経路B: W_{1,22} = -1 なので、(-1) \times 1 \times 2 \times 2 = -4

足し合わせます。

\frac{\partial L}{\partial x_2} = 4 + (-4) = 0

この和が行列積だった

いま計算した結果を並べます。

\frac{\partial L}{\partial x} = \begin{pmatrix} 14 \\ 0 \end{pmatrix}

これを行列で書いてみます。

W_1^{T} \delta_1

W_1^{T} を求めます。行と列を入れ替えるだけです。

W_1^{T} = \begin{pmatrix} 1 & 3 \\ 2 & -1 \end{pmatrix}

掛けます。

\begin{pmatrix} 1 & 3 \\ 2 & -1 \end{pmatrix} \begin{pmatrix} 2 \\ 4 \end{pmatrix}

1行目です。

1 \times 2 + 3 \times 4 = 2 + 12 = 14

2行目です。

2 \times 2 + (-1) \times 4 = 4 - 4 = 0

\begin{pmatrix} 14 \\ 0 \end{pmatrix}

一致しました。

ここが、この記事で最も伝えたい部分です。

経路ごとに変化率を掛けて、すべての経路を足し合わせる。連鎖律が要求するこの操作は、行列積そのものです。

そして注目してほしいのは、W_1^{T} の1行目が (1, 3) になっている点です。元の W_1 では、1と3は縦に並んでいました。

W_{1,11} = 1 は「入力1から中間1へ」の重み。 W_{1,21} = 3 は「入力1から中間2へ」の重み。

どちらも入力1に関係する数字です。転置すると、それが横一列に揃います。だから、そのまま掛けて足せるのです。

転置は、必要な数字を計算しやすい向きに並べ替える操作だ、と考えてください。

重みを更新する

学習率を \eta = 0.01 とします。

W_2 を更新します。

1 - 0.01 \times 8 = 0.92

2 - 0.01 \times 10 = 1.90

W_1 を更新します。

1 - 0.01 \times 4 = 0.96

2 - 0.01 \times 2 = 1.98

3 - 0.01 \times 8 = 2.92

-1 - 0.01 \times 4 = -1.04

更新後は次の通りです。

W_1 = \begin{pmatrix} 0.96 & 1.98 \\ 2.92 & -1.04 \end{pmatrix}, \quad W_2 = \begin{pmatrix} 0.92 & 1.90 \end{pmatrix}

損失が下がったか確かめる

z_{1,1} = 0.96 \times 2 + 1.98 \times 1 = 1.92 + 1.98 = 3.90

z_{1,2} = 2.92 \times 2 + (-1.04) \times 1 = 5.84 - 1.04 = 4.80

どちらも正なので、そのまま通ります。

a_1 = \begin{pmatrix} 3.90 \\ 4.80 \end{pmatrix}

出力を計算します。

0.92 \times 3.90 = 3.588

1.90 \times 4.80 = 9.12

\hat{y} = 3.588 + 9.12 = 12.708

誤差と損失を計算します。

12.708 - 12 = 0.708

L = \frac{1}{2} \times 0.708^2 = \frac{1}{2} \times 0.501264 = 0.250632

比較します。

項目更新前更新後
予測値14.000012.7080
誤差2.00000.7080
損失2.00000.2506

損失が約87%減少しました。

負の値が出る場合

入力だけを変えてみます。重みは初期値に戻します。

x = \begin{pmatrix} 1 \\ 4 \end{pmatrix}

z_{1,1} = 1 \times 1 + 2 \times 4 = 1 + 8 = 9

z_{1,2} = 3 \times 1 + (-1) \times 4 = 3 - 4 = -1

2番目が負なので、0になります。

a_1 = \begin{pmatrix} 9 \\ 0 \end{pmatrix}

\hat{y} = 1 \times 9 + 2 \times 0 = 9

正解を t = 10 とします。

\delta_2 = 9 - 10 = -1

\frac{\partial L}{\partial a_1} = \begin{pmatrix} 1 \\ 2 \end{pmatrix} \times (-1) = \begin{pmatrix} -1 \\ -2 \end{pmatrix}

ReLUの微分は、9が正なので1、-1 が負なので0です。

\delta_1 = \begin{pmatrix} -1 \\ -2 \end{pmatrix} \odot \begin{pmatrix} 1 \\ 0 \end{pmatrix} = \begin{pmatrix} -1 \\ 0 \end{pmatrix}

W_1 の勾配を求めます。

\begin{pmatrix} -1 \\ 0 \end{pmatrix} \begin{pmatrix} 1 & 4 \end{pmatrix} = \begin{pmatrix} -1 & -4 \\ 0 & 0 \end{pmatrix}

2行目がすべて0になりました。

連鎖律で考えれば当然です。2番目のユニットを通る経路には、途中に0の因子が入っています。掛け算なので、そこから先はすべて0です。

そしてこれは正しい挙動です。2番目のユニットは、この入力に対して0を出力しました。出力に何も寄与していないのだから、責任もありません。

第1部と違うのは、1番目のユニットが生きている点です。ユニットが複数あれば、一つが死んでも学習は続きます。

第3部 バイアスを加える

ここまでバイアスを省いてきました。連鎖律の構造に集中するためです。ここで足します。

バイアスという言葉

biasは「偏り」という意味です。統計学では偏りを表す悪い意味の言葉ですが、ニューラルネットワークでは単に「下駄を履かせる値」を指します。

何が変わるのか

順伝播の式が変わります。

z_1 = W_1 x + b_1

\hat{y} = W_2 a_1 + b_2

b は bias の頭文字です。

変わらないものもあります。転置による誤差の伝播も、アダマール積も、重みの勾配の式も、まったく同じです。バイアスは足し算なので、掛け算の構造に影響しません。

バイアスの勾配

連鎖律を書きます。

\frac{\partial L}{\partial b_2} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial b_2}

\hat{y} = W_2 a_1 + b_2 b_2 で微分すると、係数は1です。

\frac{\partial \hat{y}}{\partial b_2} = 1

したがって、次のようになります。

\frac{\partial L}{\partial b_2} = \delta_2

誤差項そのものです。新しい計算は不要です。

中間層でも同じです。

\frac{\partial L}{\partial b_1} = \delta_1

なぜバイアスが必要なのか

バイアスがないと、x = 0 のとき必ず z = 0 になります。入力が0のときの出力を、0以外にできません。

一次関数で言えば、切片が0に固定された状態です。原点を通る直線しか引けません。

バイアスを加えると、ReLUが折れ曲がる位置も動かせるようになります。表現できる関数の幅が大きく広がります。

記号と初期値

記号読み方何の略か初期値
b_1 ビーいちbias(バイアス、下駄)\begin{pmatrix} 1 \\ 2 \end{pmatrix}
b_2 ビーにbias(バイアス)1
t ティーtarget(正解)18

重み W_1 W_2 と入力 x は、第2部と同じです。

計算例

順伝播します。W_1 x は第2部と同じです。

z_1 = \begin{pmatrix} 4 \\ 5 \end{pmatrix} + \begin{pmatrix} 1 \\ 2 \end{pmatrix} = \begin{pmatrix} 5 \\ 7 \end{pmatrix}

a_1 = \begin{pmatrix} 5 \\ 7 \end{pmatrix}

\hat{y} = 1 \times 5 + 2 \times 7 + 1 = 5 + 14 + 1 = 20

誤差と損失を計算します。

20 - 18 = 2

L = \frac{1}{2} \times 4 = 2

逆伝播します。

\delta_2 = 2

\frac{\partial L}{\partial W_2} = 2 \times \begin{pmatrix} 5 & 7 \end{pmatrix} = \begin{pmatrix} 10 & 14 \end{pmatrix}

\frac{\partial L}{\partial b_2} = 2

\frac{\partial L}{\partial a_1} = \begin{pmatrix} 1 \\ 2 \end{pmatrix} \times 2 = \begin{pmatrix} 2 \\ 4 \end{pmatrix}

ReLUの微分はどちらも1です。

\delta_1 = \begin{pmatrix} 2 \\ 4 \end{pmatrix}

\frac{\partial L}{\partial W_1} = \begin{pmatrix} 2 \\ 4 \end{pmatrix} \begin{pmatrix} 2 & 1 \end{pmatrix} = \begin{pmatrix} 4 & 2 \\ 8 & 4 \end{pmatrix}

\frac{\partial L}{\partial b_1} = \begin{pmatrix} 2 \\ 4 \end{pmatrix}

バイアスの勾配は、\delta を書き写すだけです。

三つの段階を比べる

項目1-1-12-2-1バイアスあり
順伝播z = wx z = Wx z = Wx + b
出力層の誤差項\hat{y} - t 同じ同じ
前の層へw \delta W^{T}\delta 同じ
重みの勾配\delta x \delta x^{T} 同じ
バイアスの勾配なしなし\delta

1-1-1 から 2-2-1 への変化が、記法上の最大の飛躍です。バイアスの追加は、一行増えるだけです。

第4部 なぜ線形代数でなければならないのか

理由1 経路の数が爆発する

第1部のネットワークでは、x から L への経路は1本でした。

第2部では、x_1 からの経路が2本になりました。

では、中間層が100個、それが3層あったらどうでしょうか。経路数を求めます。

100 \times 100 \times 100 = 10^6

100万本です。連鎖律は、これらすべてを足し合わせることを要求します。

経路を一つずつ書き出すことは不可能です。しかし行列積で書けば、次の三行で済みます。

\delta_3 = \left( W_4^{T} \delta_4 \right) \odot \text{ReLU}'(z_3)

\delta_2 = \left( W_3^{T} \delta_3 \right) \odot \text{ReLU}'(z_2)

\delta_1 = \left( W_2^{T} \delta_2 \right) \odot \text{ReLU}'(z_1)

これが誤差逆伝播法の効率性の正体です。経路を数え上げるのではなく、層ごとにまとめて処理します。

理由2 パラメータの数

手書き数字認識でよく使われる構成で数えます。入力784、中間層100、出力10とします。

W_1: 100 \times 784 = 78400

b_1: 100

W_2: 10 \times 100 = 1000

b_2: 10

合計を計算します。

78400 + 100 + 1000 + 10 = 79510

約8万個です。1つの計算に5秒かかるとすると、順伝播1回に必要な時間は次の通りです。

79510 \times 5 = 397550

日数に直します。

397550 \div 86400 \approx 4.6

順伝播1回に約5日かかります。学習には数万回の繰り返しが必要ですから、人間の手には負えません。

理由3 形が検算になる

計算の途中で、形を何度も確認しました。まとめます。

対応するもの
\delta_1 2行1列z_1 と同じ
\partial L / \partial W_1 2行2列W_1 と同じ
\partial L / \partial b_1 2行1列b_1 と同じ

勾配の形は、必ず対応するパラメータの形と一致します。一致しなければ、どこかで間違えています。

実装でつまずく原因のほとんどは、数学の難しさではなく形の不一致です。形を追える人は、エラーの原因を数分で特定できます。

理由4 まとめて計算できる

実際の学習では、データを1件ずつではなく、まとめて処理します。これをミニバッチといいます。

X = \begin{pmatrix} 2 & 1 & 0 \\ 1 & 4 & 2 \end{pmatrix}

形は2行3列です。列がデータ1件に対応します。

式は変わりません。

Z_1 = W_1 X

W_1 が2行2列、X が2行3列なので、Z_1 は2行3列です。3件分の結果が一度に得られます。

バイアスを加える場合は、ブロードキャストという仕組みが働きます。2行1列の b_1 が3列に自動的に複製され、各列に同じ値が足されます。

バイアスはユニット固有の値なので、どのデータにも同じ値が足される。それで正しいのです。

逆伝播では、逆の操作をします。3列分の誤差項を足し合わせます。

\frac{\partial L}{\partial b_1} = \sum_{k} \delta_1^{(k)}

複製の逆は合計。ここでも連鎖律の「和」が現れています。

そして、データが複数になると、損失とコストの区別が生きてきます。1件ごとの損失を平均したものがコストです。実際に最小化するのは、こちらです。

理由5 掛け算だから消える

連鎖律は掛け算です。この性質は、良いことも悪いことも引き起こします。

シグモイド関数を使うと、微分値は最大でも0.25です。20層なら、次のようになります。

0.25^{20} = (2^{-2})^{20} = 2^{-40}

2^{10} \approx 10^3 を使って概算します。

2^{-40} = (2^{-10})^4 \approx (10^{-3})^4 = 10^{-12}

約1兆分の1です。入力側の層には、勾配がほとんど届きません。これが勾配消失問題です。

ReLUなら、正の領域で微分が1です。

1^{20} = 1

減衰しません。

第1部で「連鎖の途中に0が一つあると、そこから先はすべて0になる」と書きました。これはその一般化です。1より小さい数を何度も掛ければ、0に近づきます。

ReLUを使った理由は、手計算が楽になるからだけではありません。深いネットワークを学習可能にした、本質的な選択でした。

コラム3 よく出る言葉の意味

用語の意味をまとめておきます。分からなくなったら、ここに戻ってきてください。

用語英語意味
順伝播forward propagation入力から出力へ計算を進めること
逆伝播backpropagation出力から入力へ勾配を計算すること
勾配gradient微分の値。どちらへどれだけ動かすべきかを示す
学習率learning rate1回の更新でどれだけ動かすかの倍率
活性化関数activation function各ユニットの出力を決める関数
パラメータparameter学習で変化する値。重みとバイアス
ハイパーパラメータhyperparameter人間が決める値。学習率など
エポックepoch全データを1回学習し終えた単位
ミニバッチmini-batchまとめて処理するデータの束
転置transpose行と列を入れ替えること
アダマール積Hadamard product同じ位置どうしを掛ける演算

押さえておきたい区別

パラメータとハイパーパラメータの違いは、初学者がよく混乱する点です。

パラメータは、学習によって自動的に決まります。重み W とバイアス b がこれにあたります。

ハイパーパラメータは、人間が事前に決めます。学習率 \eta 、中間層の数、ユニット数などです。

「ハイパー」が付いているのは、パラメータより上位の設定という意味です。パラメータの決まり方を決める値、と考えてください。

伝播という言葉

伝播は「でんぱ」と読みます。「でんぱん」と読む人もいますが、一般的には「でんぱ」です。

波が広がっていくイメージの言葉です。入力が波のように層を通って広がるから順伝播、誤差が逆向きに広がるから逆伝播です。

練習問題

自分で手を動かして確認してください。解答は各問題の直後にあります。

問題1 誤差と損失

予測値が7、正解値が3のとき、誤差と損失をそれぞれ求めてください。また、この二つの違いを説明してください。

解答を示します。

誤差を求めます。

\hat{y} - t = 7 - 3 = 4

損失を求めます。

L = \frac{1}{2} \times 4^2 = \frac{1}{2} \times 16 = 8

違いを説明します。

誤差は、予測と正解のずれそのものです。符号があり、予測が大きすぎれば正、小さすぎれば負になります。

損失は、そのずれを「悪さの度合い」に変換した値です。二乗するため符号が消え、必ず0以上になります。

補足します。予測値が -1 で正解が3の場合、誤差は -4 ですが、損失は同じく8です。ずれの向きが違っても、悪さの度合いは同じという扱いになります。

問題2 最小ネットワークの順伝播

次の設定で、z_1 a_1 \hat{y} 、誤差、L を求めてください。

x = 3, \quad w_1 = 2, \quad w_2 = 2, \quad t = 8

解答を示します。

z_1 = 2 \times 3 = 6

正なので、そのまま通ります。

a_1 = 6

\hat{y} = 2 \times 6 = 12

誤差を求めます。

12 - 8 = 4

損失を求めます。

L = \frac{1}{2} \times 4^2 = 8

問題3 連鎖律の分解

問題2の設定で、\frac{\partial L}{\partial w_1} を連鎖律の4つの因子に分解し、それぞれの値を示したうえで、最終的な値を求めてください。

解答を示します。

連鎖律を書きます。

\frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial a_1} \cdot \frac{\partial a_1}{\partial z_1} \cdot \frac{\partial z_1}{\partial w_1}

各因子を求めます。

\frac{\partial L}{\partial \hat{y}} = \hat{y} - t = 12 - 8 = 4

\frac{\partial \hat{y}}{\partial a_1} = w_2 = 2

\frac{\partial a_1}{\partial z_1} = 1 (z_1 = 6 が正のため)

\frac{\partial z_1}{\partial w_1} = x = 3

掛け合わせます。

4 \times 2 \times 1 \times 3 = 24

補足します。w_2 についても求めておくと比較になります。

\frac{\partial L}{\partial w_2} = 4 \times a_1 = 4 \times 6 = 24

偶然、同じ値になりました。連鎖の長さは違いますが、結果が一致することもあります。

問題4 数値微分による検証

問題3の結果を、数値微分で確かめてください。w_1 2.001 にして計算します。

解答を示します。

z_1 = 2.001 \times 3 = 6.003

正なので、そのまま通ります。

a_1 = 6.003

\hat{y} = 2 \times 6.003 = 12.006

損失を計算します。

12.006 - 8 = 4.006

4.006^2 = 16.048036

L = \frac{1}{2} \times 16.048036 = 8.024018

変化量を求めます。

8.024018 - 8 = 0.024018

変化率を求めます。

\frac{0.024018}{0.001} = 24.018

問題3で求めた24とほぼ一致しました。

補足します。完全に一致しないのは、数値微分が近似だからです。二次以上の項がわずかに残ります。刻み幅を小さくすれば近づきますが、小さくしすぎると桁落ちで誤差が増えます。

問題5 転置

次の行列を転置してください。また、A^{T} の2行目に並ぶ数字が、元の A のどこにあったか説明してください。

A = \begin{pmatrix} 5 & 2 & 7 \\ 1 & 8 & 3 \end{pmatrix}

解答を示します。

A^{T} = \begin{pmatrix} 5 & 1 \\ 2 & 8 \\ 7 & 3 \end{pmatrix}

2行3列が、3行2列になりました。

説明します。A^{T} の2行目は (2, 8) です。

元の A では、2は1行2列目、8は2行2列目にありました。どちらも2列目です。

つまり、元の行列の2列目が、転置後は2行目になっています。

補足します。転置とは、縦に並んでいたものを横に並べ替える操作です。数字の中身は一つも変わっていません。

逆伝播で転置が必要になるのは、順伝播で縦に散らばっていた情報を、横に揃えて計算したいからです。

問題6 和の連鎖律

次の設定で、\frac{\partial L}{\partial x_1} を、経路ごとに計算してから足し合わせる方法で求めてください。

x = \begin{pmatrix} 1 \\ 2 \end{pmatrix}, \quad W_1 = \begin{pmatrix} 2 & 1 \\ 1 & 3 \end{pmatrix}, \quad W_2 = \begin{pmatrix} 3 & 1 \end{pmatrix}, \quad t = 10

解答を示します。

まず順伝播します。

z_{1,1} = 2 \times 1 + 1 \times 2 = 2 + 2 = 4

z_{1,2} = 1 \times 1 + 3 \times 2 = 1 + 6 = 7

どちらも正です。

a_1 = \begin{pmatrix} 4 \\ 7 \end{pmatrix}

\hat{y} = 3 \times 4 + 1 \times 7 = 12 + 7 = 19

\delta_2 = 19 - 10 = 9

経路Aを計算します。x_1 \rightarrow z_{1,1} \rightarrow a_{1,1} \rightarrow \hat{y} \rightarrow L です。

\frac{\partial z_{1,1}}{\partial x_1} = W_{1,11} = 2

\frac{\partial a_{1,1}}{\partial z_{1,1}} = 1

\frac{\partial \hat{y}}{\partial a_{1,1}} = W_{2,1} = 3

\frac{\partial L}{\partial \hat{y}} = 9

掛け合わせます。

2 \times 1 \times 3 \times 9 = 54

経路Bを計算します。x_1 \rightarrow z_{1,2} \rightarrow a_{1,2} \rightarrow \hat{y} \rightarrow L です。

\frac{\partial z_{1,2}}{\partial x_1} = W_{1,21} = 1

\frac{\partial a_{1,2}}{\partial z_{1,2}} = 1

\frac{\partial \hat{y}}{\partial a_{1,2}} = W_{2,2} = 1

\frac{\partial L}{\partial \hat{y}} = 9

掛け合わせます。

1 \times 1 \times 1 \times 9 = 9

足し合わせます。

\frac{\partial L}{\partial x_1} = 54 + 9 = 63

問題7 行列で確かめる

問題6の結果を、W_1^{T} \delta_1 を計算することで確かめてください。\frac{\partial L}{\partial x_2} も求めてください。

解答を示します。

まず \delta_1 を求めます。

\frac{\partial L}{\partial a_1} = W_2^{T} \delta_2 = \begin{pmatrix} 3 \\ 1 \end{pmatrix} \times 9 = \begin{pmatrix} 27 \\ 9 \end{pmatrix}

ReLUの微分はどちらも1なので、そのままです。

\delta_1 = \begin{pmatrix} 27 \\ 9 \end{pmatrix}

W_1^{T} を求めます。

W_1^{T} = \begin{pmatrix} 2 & 1 \\ 1 & 3 \end{pmatrix}

この行列は左上から右下への対角線に対して対称なので、転置しても見た目が同じです。ただし読み方は変わります。行が入力側、列が中間層側になります。

掛けます。

1行目です。

2 \times 27 + 1 \times 9 = 54 + 9 = 63

2行目です。

1 \times 27 + 3 \times 9 = 27 + 27 = 54

\frac{\partial L}{\partial x} = \begin{pmatrix} 63 \\ 54 \end{pmatrix}

1番目が63で、問題6の結果と一致しました。

\frac{\partial L}{\partial x_2} = 54 です。

補足します。経路ごとの計算でも確かめられます。

経路A: W_{1,12} \times 1 \times W_{2,1} \times 9 = 1 \times 1 \times 3 \times 9 = 27

経路B: W_{1,22} \times 1 \times W_{2,2} \times 9 = 3 \times 1 \times 1 \times 9 = 27

27 + 27 = 54

一致しました。行列積の1行が、経路の和に対応しています。

問題8 重みの勾配と連鎖の途中の0

(1) 問題6の設定で、\frac{\partial L}{\partial W_1} \frac{\partial L}{\partial W_2} を求めてください。

(2) もし z_{1,2} が負だった場合、\frac{\partial L}{\partial W_1} の何行目がどうなるか答えてください。

解答を示します。

(1) 出力層から求めます。

\frac{\partial L}{\partial W_2} = \delta_2 a_1^{T} = 9 \times \begin{pmatrix} 4 & 7 \end{pmatrix} = \begin{pmatrix} 36 & 63 \end{pmatrix}

形は1行2列で、W_2 と一致します。

中間層です。

\frac{\partial L}{\partial W_1} = \delta_1 x^{T} = \begin{pmatrix} 27 \\ 9 \end{pmatrix} \begin{pmatrix} 1 & 2 \end{pmatrix}

1行目です。

27 \times 1 = 27, \quad 27 \times 2 = 54

2行目です。

9 \times 1 = 9, \quad 9 \times 2 = 18

\frac{\partial L}{\partial W_1} = \begin{pmatrix} 27 & 54 \\ 9 & 18 \end{pmatrix}

形は2行2列で、W_1 と一致します。

(2) z_{1,2} が負なら、ReLUの微分は0になります。

\delta_{1,2} = 9 \times 0 = 0

したがって \frac{\partial L}{\partial W_1} の2行目は、すべて0になります。

\begin{pmatrix} 27 & 54 \\ 0 & 0 \end{pmatrix}

2番目の中間ユニットに繋がる重みは、この入力に対して更新されません。

補足します。(1)の結果で、2列目が1列目の2倍になっている点にも注目してください。入力 x_2 = 2 x_1 = 1 の2倍だからです。

連鎖律で言えば、\frac{\partial z}{\partial W} = x の部分が効いています。この性質が、入力データの正規化が必要な理由の一つです。

学習の進め方

初学者がこの分野を学ぶ順序を示します。

段階内容
1記号の読み方を覚える
2誤差と損失の違いを理解する
3連鎖律を一変数で理解する
41-1-1 のネットワークで順伝播と逆伝播を計算する
5数値微分で検算する
6更新後に損失が下がることを確認する
7転置が何をしているか、表で理解する
8多変数の連鎖律に「和」が入る理由を理解する
9経路ごとの和が行列積であることを確かめる
102-2-1 のネットワークで計算する
11負の値が出る場合も計算する
12バイアスを加える

5番と9番を飛ばさないでください。

5番は、自分の計算が正しいことを自分で確認する手段です。これができると、理解が確信に変わります。

9番は、この記事の核心です。行列積が天下り式の道具ではなく、連鎖律の要求から必然的に出てくるものだと分かります。

振り返り

次の問いに答えられるか確認してください。

  • 誤差と損失は、それぞれ何を表しますか
  • \delta の読み方と、この記事での意味は何ですか
  • 連鎖律はなぜ掛け算になるのですか
  • 連鎖の途中に0が一つあると、結果はどうなりますか
  • 経路が複数あるとき、連鎖律はどう変わりますか
  • その変化は、どの演算に対応していますか
  • 転置とは、具体的に何をする操作ですか
  • 逆伝播で転置が現れるのはなぜですか
  • 活性化関数の逆伝播でアダマール積を使うのはなぜですか
  • 自分の計算した勾配が正しいか、どう確かめますか

すべて答えられれば、この記事の内容は理解できています。

まとめと次の学習ステップ

線形代数が必要な理由は、便利だからではありません。連鎖律を実際の規模で書くには、それしか方法がないからです。

ユニットが1つずつのネットワークでは、連鎖律は変化率の掛け算でした。行列は不要でした。損失は2から0.7316へ、約63%減少しました。

ユニットを2つにすると、経路が枝分かれし、合流しました。連鎖律に和が入り、それを書き表す記法として行列積が必要になりました。損失は2から0.2506へ、約87%減少しました。

そして、経路ごとの計算と行列積の結果が一致することを確かめました。\frac{\partial L}{\partial x_1} を経路Aと経路Bで計算した和が14、W_1^{T} \delta_1 の1行目も14。同じものでした。

転置は、暗記すべき規則ではありません。成績表を裏返すのと同じで、同じデータを違う向きから読んでいるだけです。順伝播で「入力から中間層へ」と読んだ配線図を、逆伝播で「中間層から入力へ」と読み直す。それが転置です。

さらに、数値微分による検算も行いました。手で求めた勾配4に対し、数値微分の結果は4.002。理論と計算が一致することを、自分の手で確認できました。

次の学習ステップとしては、同じ計算をPythonで実装してみてください。ライブラリを使う前に、NumPyだけで書くことをおすすめします。そして必ず、数値微分と比較してください。この記事でやったことを、そのままコードにするだけです。

その先には、より深いネットワーク、畳み込み層、そして注意機構が待っています。いずれも、今回扱った連鎖律と、行列積、転置、アダマール積の組み合わせで構成されています。土台は、すでにできています。

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。