なぜディープラーニングに線形代数が必要なのかを理解する
こんにちは。ゆうせいです。
ディープラーニングを学び始めると、行列とベクトルが山のように出てきます。そして多くの人が、ここで手が止まります。
「なぜ行列で書くのか」 「なぜ逆伝播で転置が出てくるのか」
この二つの疑問は、実は同じ場所から来ています。微分の連鎖律です。
そこでこの記事では、いきなり行列を使いません。まず、ユニットが各層に1つずつしかない最小のネットワークから始めます。この規模なら行列は不要です。ただの掛け算と足し算で、順伝播も逆伝播も最後まで計算できます。
そのうえで、ユニットを2つに増やします。すると連鎖律に「和」が現れます。その和を書き表す記法が、まさに行列積と転置なのです。
活性化関数にはReLUを使います。微分が0か1しかないため、指数関数が一切出てきません。数値も、電卓なしで計算できるように選びました。紙とペンだけで追えます。
結論
線形代数は、連鎖律を書き表すための記法です。
ユニットが1つずつのネットワークでは、連鎖律は変化率の掛け算だけで済みます。行列は要りません。
ユニットが増えると、経路が枝分かれします。すると、複数の経路をたどった影響をすべて足し合わせる必要が出てきます。この「掛けて足す」という操作が、行列積そのものです。
そして、順伝播が入力から出力へ向かうのに対し、逆伝播は出力から入力へ向かいます。方向が逆なので、同じ重みでも行と列の役割が入れ替わります。これが転置の正体です。
線形代数が必要な理由は、便利だからではありません。連鎖律を実際の規模で書くには、それしか方法がないからです。
と書いても数学的には何も変わりません。ただ、多くの人が
を使っているので、合わせておくと本や論文が読みやすくなる。それだけの話です。
準備1 誤差と損失の違い
もう一つ、先に整理しておきたい言葉があります。誤差と損失です。
この二つは似た場面で使われるため、初学者が混乱しやすい用語です。
三つの言葉を区別する
| 用語 | 英語 | 意味 | 符号 |
|---|---|---|---|
| 誤差 | error | 予測値と正解値のずれ | あり |
| 損失 | loss | 1件のデータに対する悪さの度合い | なし(0以上) |
| コスト | cost | すべてのデータの損失の平均 | なし(0以上) |
順に説明します。
誤差
予測値と正解値の差です。
これには符号があります。予測が大きすぎれば正、小さすぎれば負です。
、
なら、誤差は
です。
、
なら、誤差は
です。
どちらも「2だけずれている」のですが、向きが違います。
損失
誤差を「悪さの度合い」に変換した1つの数です。
なぜ変換が必要なのでしょうか。誤差のままでは、符号があるため扱いにくいからです。
たとえばデータが2件あって、誤差がそれぞれ と
だったとします。単純に足すと0になってしまいます。まったく合っていないのに、誤差ゼロという結論になってしまいます。
そこで二乗します。
二乗すれば符号が消えます。ずれが大きいほど大きな値になります。これが損失です。
損失は必ず0以上です。0のときだけ、予測が完全に当たっています。
コスト
すべてのデータの損失を平均したものです。
はデータの件数です。
学習で本当に小さくしたいのは、このコストです。1件だけ当たっても意味がありません。
データが1件のときは一致する
ここが重要な点です。
データが1件しかないとき、平均を取る相手が自分しかいません。したがって、コストと損失は同じ値になります。
この記事では、説明を簡単にするためデータを1件だけ扱います。ですので、損失とコストを区別する必要がありません。以降、すべて損失と呼びます。
また、この記事の例では偶然、誤差の値と損失の値が一致する場面が出てきます。
誤差2、損失2です。同じ数字ですが、意味は別物です。たまたま となっただけで、誤差が3なら損失は4.5になります。混同しないでください。
もう一つの「誤差」に注意
逆伝播の説明では、 のことを「誤差」と呼ぶ習慣があります。これが三つ目の意味です。
正確には誤差項と言い、次のものを指します。
その層の入力を少し動かしたとき、損失がどれだけ動くか。つまり、その層が背負っている責任の大きさです。
出力層では、たまたま となります。予測値と正解値の差と一致するため、「誤差」と呼ばれるようになりました。
しかし中間層の は、もはや何かの差ではありません。損失の変化率です。
言葉が同じでも、指しているものが違う。この点だけ頭に置いておいてください。
準備2 連鎖律とは何か
行列の話に入る前に、微分の連鎖律を丁寧に確認します。ここが分かっていないと、後の話がすべて曖昧になります。
合成関数の微分
が
の関数で、
が
の関数だとします。このとき、次が成り立ちます。
これが連鎖律です。英語ではchain rule、つまり鎖の規則です。
歯車で考えてください
三つの歯車が噛み合っている装置を想像してください。
1番目の歯車を1回転させると、2番目が3回転するとします。2番目を1回転させると、3番目が2回転するとします。
では、1番目を1回転させると、3番目は何回転するでしょうか。
6回転です。掛け算になります。
連鎖律も、まったく同じ発想です。
は「
を1動かすと
が3動く」という意味です。
は「
を1動かすと
が2動く」という意味です。
したがって、 を1動かすと
は6動きます。
微分とは変化率であり、変化率が連鎖するときは掛け算になる。これが連鎖律の中身です。

数値で確かめる
具体的な関数で確認します。
のときを考えます。このとき
、
です。
連鎖律で微分を求めます。
本当でしょうか。 を少しだけ増やして確かめます。
とします。
変化量を計算します。
これを の変化量で割ります。
36とほぼ一致しました。連鎖律が正しいことが確認できます。
この「少し動かして確かめる」という方法を数値微分といいます。後でも使いますので、覚えておいてください。
逆伝播は連鎖律そのもの
ニューラルネットワークでは、次のような連鎖ができています。
重み を変えると
が変わり、
が変わると
が変わり、最終的に損失
が変わります。
知りたいのは です。連鎖律を使えば、次のように分解できます。
4つの因子の掛け算です。一つひとつは簡単に計算できます。
逆伝播とは、この掛け算を出力側から順番に実行していく手続きです。特別な理論ではありません。連鎖律を効率よく計算しているだけです。
準備3 ReLUという活性化関数
もう一つ、使う道具を確認します。
名前の意味
ReLUは Rectified Linear Unit の略で、日本語では正規化線形関数と呼ばれます。
rectified は「整流された」という意味です。電気回路の整流器と同じ言葉で、片方向にだけ電流を通す部品を指します。名前の通り、片方向にだけ値を通す関数です。
読み方は「レルー」または「レリュー」です。
定義
正の値はそのまま通し、負の値は0にします。それだけです。
微分
正なら1、負なら0です。 では厳密には微分できませんが、実装上は0または1と決めて扱います。
門番だと思ってください
正の値が来たら、そのまま通します。負の値が来たら、通行止めにして0にします。
連鎖律の観点で言えば、こういうことです。通した経路の変化率は1なので、掛けても何も変わりません。止めた経路の変化率は0なので、掛けた瞬間にすべてが0になります。
この極端さが、計算を単純にしています。
第1部 最小のネットワークで連鎖律を体験する
構成
各層にユニットが1つだけです。
| 層 | 要素数 | 活性化関数 |
|---|---|---|
| 入力層 | 1 | なし |
| 中間層 | 1 | ReLU |
| 出力層 | 1 | なし(恒等) |
一本道です。
行列は出てきません。すべてただの数です。

記号と初期値
| 記号 | 読み方 | 何の略か | 初期値 |
|---|---|---|---|
| エックス | 入力。数学で未知数に使う慣習から | 2 | |
| ダブリューいち | weight(重み) | 3 | |
| ゼットいち | 活性化前の値。慣習でzを使う | (計算結果 6) | |
| エーいち | activation(活性化された値) | (計算結果 6) | |
| ダブリューに | weight(重み) | 1 | |
| ワイハット | yの予測値。hatは推定の印 | (計算結果 6) | |
| ティー | target(正解、目標値) | 4 | |
| エル | Loss(損失) | (計算結果 2) | |
| デルタに | 出力層の誤差項 | (計算結果 2) | |
| イータ | 学習率(learning rate) | 0.01 |
初期値はあらかじめ与えられた値です。(計算結果 )と書いた項目は、これから求めるものです。
順伝播
計算式は次の通りです。
順に計算します。
6は正なので、ReLUはそのまま通します。
誤差と損失を求める
まず誤差です。
予測が2だけ大きすぎました。
次に損失です。
今回はたまたま誤差も損失も2になりました。偶然の一致です。混同しないでください。
なお、係数 は、微分したときに2が消えて式が簡単になるために付けます。数学的な必然性はありません。

連鎖の全体像を書き出す
逆伝播に入る前に、連鎖の構造を確認します。
は
の関数です。
は
と
の関数です。
は
の関数です。
は
と
の関数です。
したがって、 が損失に与える影響は、次の連鎖で表せます。
4つの因子を、一つずつ求めていきます。
因子1 損失を予測値で微分する
を
で微分します。
外側の二乗を微分すると2が出て、内側 の微分は1です。ここでも連鎖律を使っています。
係数 を付けた理由が、ここで分かります。
数値を入れます。
出力層は恒等関数なので、この値をそのまま出力層の誤差項とします。
意味を確認してください。予測値を1増やすと、損失が2増える。だから予測値は減らすべきだ、ということです。
※恒等関数とは、入力した値をそのまま同じ値として出力する関数です。数式では (f(x) = x) と表され、何も変化させない操作を意味します。

因子2 予測値を中間層の出力で微分する
です。
で微分します。
因子3 ReLUを微分する
は正でした。
因子4 中間層の入力を重みで微分する
です。
で微分します。
掛け合わせる
歯車の話を思い出してください。 を1動かすと、それが4倍になって損失に届く。そういう意味です。
数値微分で検算する
本当に4でしょうか。確かめます。
を
にします。他は変えません。
正なので、そのまま通ります。
損失を計算します。
変化量を求めます。
変化率を求めます。
4とほぼ一致しました。連鎖律の計算が正しかったことが確認できます。
この検算方法は、実装のときにも使えます。手計算した勾配と数値微分の結果が合わなければ、どこかで間違えています。
もう一つの重みも求める
についても、連鎖律を書きます。
なので、次の通りです。
掛け合わせます。
より連鎖が短いことに注目してください。出力に近い層ほど、連鎖が短くなります。
重みを更新する
学習率 (イータ)を
とします。
なぜ引くのでしょうか。勾配が正なら、その重みを増やすと損失が増えるからです。損失を減らしたいのだから、逆向きに動かします。
を更新します。
を更新します。
損失が下がったか確かめる
更新後の値で、もう一度順伝播します。
損失を計算します。
比較します。
| 項目 | 更新前 | 更新後 |
|---|---|---|
| 予測値 | 6.0000 | 5.2096 |
| 誤差 | 2.0000 | 1.2096 |
| 損失 | 2.0000 | 0.7316 |
損失が約63%減少しました。予測値が正解の4に近づいています。
これが学習です。連鎖律で勾配を求め、その逆向きに少し動かす。それだけです。
負の値が出るとどうなるか
に変えて計算してみます。
負なので、ReLUは0にします。
損失を計算します。
逆伝播します。
ここで0が現れました。以降、何を掛けても0です。
の勾配も見てみます。
両方とも0になりました。損失は8もあるのに、学習が完全に止まっています。
これが死んだReLU問題です。ユニットが1つしかないため、極端な形で現れました。
対策としては、学習率を適切に設定することや、負の側でもわずかに勾配を残すLeaky ReLUを使う方法があります。初学者の段階では、そういう現象があると知っておけば十分です。
そして、連鎖律の観点でも重要な教訓があります。連鎖の途中に0が一つでもあると、そこから先はすべて0になる。掛け算だからです。
この性質は、後で勾配消失の話につながります。
第1部のまとめ
ここまでで、行列は一度も出てきませんでした。
連鎖律は変化率の掛け算です。順番に掛けていくだけです。
では、なぜ行列が必要になるのでしょうか。ユニットを増やせば分かります。
第2部 ユニットを増やすと和が現れる
構成
入力2、中間層2、出力1にします。
| 層 | 要素数 | 活性化関数 |
|---|---|---|
| 入力層 | 2 | なし |
| 中間層 | 2 | ReLU |
| 出力層 | 1 | なし |
何が変わったのか
一本道ではなくなりました。
入力 は、
にも
にも影響します。経路が枝分かれしました。
そして中間層の2つの出力は、どちらも に流れ込みます。経路が合流しました。
この分岐と合流が、連鎖律に「和」を持ち込みます。

多変数の連鎖律
変数が複数ある場合、連鎖律は次の形になります。
(シグマ)は、足し合わせるという記号でした。
意味はこうです。 から
へ至る経路が複数あるなら、すべての経路について計算して足し合わせる。
なぜ足すのでしょうか。 を少し動かしたとき、その影響が複数の道を通って同時に伝わるからです。すべての影響の合計が、最終的な変化になります。
記号と初期値
| 記号 | 読み方 | 何の略か | 初期値 |
|---|---|---|---|
| エックス | 入力ベクトル | ||
| ダブリューいち | weight(重み)。大文字は行列を表す | ||
| ゼットいち | 活性化前の値 | (計算結果 | |
| エーいち | activation(活性化された値) | (計算結果 | |
| ダブリューに | weight(重み) | ||
| ワイハット | 予測値 | (計算結果 14) | |
| ティー | target(正解) | 12 | |
| エル | Loss(損失) | (計算結果 2) | |
| デルタに | 出力層の誤差項 | (計算結果 2) | |
| デルタいち | 中間層の誤差項 | (計算結果 | |
| イータ | 学習率 | 0.01 |
大文字と小文字の使い分けにも慣習があります。行列は大文字、ベクトルや数は小文字で書くことが多いのです。 が大文字で
が小文字なのは、そのためです。
添え字の意味
は、
番目の入力から
番目の中間ユニットへの重みです。
行が受け取る側、列が送る側です。コラム2で見た配線図の表と同じ読み方です。
順伝播 まず添え字で書く
行列を使わずに書きます。
計算します。
同じことを行列で書く
添え字で2行かかったものが、1行になりました。
そして重要なのは、この式が中間層の数によらないことです。中間層が100個でも、 のままです。
行列積とは、掛けて足すという操作をまとめて書く記法です。それ以上でも以下でもありません。
ReLUを通す
も
も正なので、そのまま通ります。
ここで、行列積との違いを押さえてください。
行列積では、複数の入力が混ざって1つの出力になりました。ReLUでは、各要素が独立に処理されます。1番目の出力は1番目の入力にしか依存しません。
混ぜる操作と、混ぜない操作。この違いが逆伝播に効いてきます。
出力を求める
誤差を求めます。
損失を求めます。
逆伝播 出力層の誤差項
第1部と同じです。
出力層の重みの勾配
連鎖律を書きます。 について考えます。
なので、次の通りです。
掛けます。
同様に計算します。
行列で書けば、次の一行です。
ここで を転置している理由を確認してください。
は縦に並んだ2行1列でした。しかし
は横に並んだ1行2列です。形を揃えるために、横向きにしています。
中間層へ誤差を伝える
が損失に与える影響を求めます。
同様に計算します。
行列で書きます。
転置が現れました。コラム2で見た通り、配線図を逆から読んでいます。
は「中間1と中間2から出力へ」という横向きの表でした。
は「出力から中間1へ、出力から中間2へ」という縦向きの表です。
ReLUを逆に通る
はどちらも正なので、微分は1です。
記号 はアダマール積、つまり同じ位置どうしを掛ける演算です。フランスの数学者アダマールの名前が付いています。
なぜ行列積ではないのでしょうか。連鎖律に戻れば分かります。
は
にしか依存しません。したがって、和が発生しません。和がないのだから、行列積にはなりません。
混ざったものを戻すときは行列積。混ざっていないものを戻すときはアダマール積。この対応は覚えておく価値があります。
中間層の重みの勾配
について、連鎖律を書きます。
なので、次の通りです。
掛けます。
残りも同様に計算します。
行列で書きます。
縦ベクトルと横ベクトルを掛けると、行列ができます。2行1列と1行2列を掛けて、2行2列になりました。
数値微分で検算する
を確かめます。
を
にします。
は変わらず5です。
損失を計算します。
変化率を求めます。
4と一致しました。
和の連鎖律を目で見る
ここまで、実は「和」がまだ現れていません。中間層から出力層への経路が1本ずつだったためです。
和が現れる場所を見るために、 を計算してみます。学習には使いませんが、層をもう一つ深くすれば必ず必要になる計算です。
から損失へ至る経路は2本あります。
経路A:
経路B:
経路Aの寄与を計算します。各段の変化率を並べます。
掛け合わせます。
経路Bの寄与を計算します。
掛け合わせます。
足し合わせます。
についても同じことをします。
経路A: なので、
経路B: なので、
足し合わせます。
この和が行列積だった
いま計算した結果を並べます。
これを行列で書いてみます。
を求めます。行と列を入れ替えるだけです。
掛けます。
1行目です。
2行目です。
一致しました。
ここが、この記事で最も伝えたい部分です。
経路ごとに変化率を掛けて、すべての経路を足し合わせる。連鎖律が要求するこの操作は、行列積そのものです。
そして注目してほしいのは、 の1行目が
になっている点です。元の
では、1と3は縦に並んでいました。
は「入力1から中間1へ」の重み。
は「入力1から中間2へ」の重み。
どちらも入力1に関係する数字です。転置すると、それが横一列に揃います。だから、そのまま掛けて足せるのです。
転置は、必要な数字を計算しやすい向きに並べ替える操作だ、と考えてください。
重みを更新する
学習率を とします。
を更新します。
を更新します。
更新後は次の通りです。
損失が下がったか確かめる
どちらも正なので、そのまま通ります。
出力を計算します。
誤差と損失を計算します。
比較します。
| 項目 | 更新前 | 更新後 |
|---|---|---|
| 予測値 | 14.0000 | 12.7080 |
| 誤差 | 2.0000 | 0.7080 |
| 損失 | 2.0000 | 0.2506 |
損失が約87%減少しました。
負の値が出る場合
入力だけを変えてみます。重みは初期値に戻します。
2番目が負なので、0になります。
正解を とします。
ReLUの微分は、9が正なので1、 が負なので0です。
の勾配を求めます。
2行目がすべて0になりました。
連鎖律で考えれば当然です。2番目のユニットを通る経路には、途中に0の因子が入っています。掛け算なので、そこから先はすべて0です。
そしてこれは正しい挙動です。2番目のユニットは、この入力に対して0を出力しました。出力に何も寄与していないのだから、責任もありません。
第1部と違うのは、1番目のユニットが生きている点です。ユニットが複数あれば、一つが死んでも学習は続きます。
第3部 バイアスを加える
ここまでバイアスを省いてきました。連鎖律の構造に集中するためです。ここで足します。
バイアスという言葉
biasは「偏り」という意味です。統計学では偏りを表す悪い意味の言葉ですが、ニューラルネットワークでは単に「下駄を履かせる値」を指します。
何が変わるのか
順伝播の式が変わります。
は bias の頭文字です。
変わらないものもあります。転置による誤差の伝播も、アダマール積も、重みの勾配の式も、まったく同じです。バイアスは足し算なので、掛け算の構造に影響しません。
バイアスの勾配
連鎖律を書きます。
を
で微分すると、係数は1です。
したがって、次のようになります。
誤差項そのものです。新しい計算は不要です。
中間層でも同じです。
なぜバイアスが必要なのか
バイアスがないと、 のとき必ず
になります。入力が0のときの出力を、0以外にできません。
一次関数で言えば、切片が0に固定された状態です。原点を通る直線しか引けません。
バイアスを加えると、ReLUが折れ曲がる位置も動かせるようになります。表現できる関数の幅が大きく広がります。
記号と初期値
| 記号 | 読み方 | 何の略か | 初期値 |
|---|---|---|---|
| ビーいち | bias(バイアス、下駄) | ||
| ビーに | bias(バイアス) | 1 | |
| ティー | target(正解) | 18 |
重み 、
と入力
は、第2部と同じです。
計算例
順伝播します。 は第2部と同じです。
誤差と損失を計算します。
逆伝播します。
ReLUの微分はどちらも1です。
バイアスの勾配は、 を書き写すだけです。
三つの段階を比べる
| 項目 | 1-1-1 | 2-2-1 | バイアスあり |
|---|---|---|---|
| 順伝播 | |||
| 出力層の誤差項 | 同じ | 同じ | |
| 前の層へ | 同じ | ||
| 重みの勾配 | 同じ | ||
| バイアスの勾配 | なし | なし |
1-1-1 から 2-2-1 への変化が、記法上の最大の飛躍です。バイアスの追加は、一行増えるだけです。
第4部 なぜ線形代数でなければならないのか
理由1 経路の数が爆発する
第1部のネットワークでは、 から
への経路は1本でした。
第2部では、 からの経路が2本になりました。
では、中間層が100個、それが3層あったらどうでしょうか。経路数を求めます。
100万本です。連鎖律は、これらすべてを足し合わせることを要求します。
経路を一つずつ書き出すことは不可能です。しかし行列積で書けば、次の三行で済みます。
これが誤差逆伝播法の効率性の正体です。経路を数え上げるのではなく、層ごとにまとめて処理します。
理由2 パラメータの数
手書き数字認識でよく使われる構成で数えます。入力784、中間層100、出力10とします。
合計を計算します。
約8万個です。1つの計算に5秒かかるとすると、順伝播1回に必要な時間は次の通りです。
秒
日数に直します。
順伝播1回に約5日かかります。学習には数万回の繰り返しが必要ですから、人間の手には負えません。
理由3 形が検算になる
計算の途中で、形を何度も確認しました。まとめます。
| 量 | 形 | 対応するもの |
|---|---|---|
| 2行1列 | ||
| 2行2列 | ||
| 2行1列 |
勾配の形は、必ず対応するパラメータの形と一致します。一致しなければ、どこかで間違えています。
実装でつまずく原因のほとんどは、数学の難しさではなく形の不一致です。形を追える人は、エラーの原因を数分で特定できます。
理由4 まとめて計算できる
実際の学習では、データを1件ずつではなく、まとめて処理します。これをミニバッチといいます。
形は2行3列です。列がデータ1件に対応します。
式は変わりません。
が2行2列、
が2行3列なので、
は2行3列です。3件分の結果が一度に得られます。
バイアスを加える場合は、ブロードキャストという仕組みが働きます。2行1列の が3列に自動的に複製され、各列に同じ値が足されます。
バイアスはユニット固有の値なので、どのデータにも同じ値が足される。それで正しいのです。
逆伝播では、逆の操作をします。3列分の誤差項を足し合わせます。
複製の逆は合計。ここでも連鎖律の「和」が現れています。
そして、データが複数になると、損失とコストの区別が生きてきます。1件ごとの損失を平均したものがコストです。実際に最小化するのは、こちらです。
理由5 掛け算だから消える
連鎖律は掛け算です。この性質は、良いことも悪いことも引き起こします。
シグモイド関数を使うと、微分値は最大でも0.25です。20層なら、次のようになります。
を使って概算します。
約1兆分の1です。入力側の層には、勾配がほとんど届きません。これが勾配消失問題です。
ReLUなら、正の領域で微分が1です。
減衰しません。
第1部で「連鎖の途中に0が一つあると、そこから先はすべて0になる」と書きました。これはその一般化です。1より小さい数を何度も掛ければ、0に近づきます。
ReLUを使った理由は、手計算が楽になるからだけではありません。深いネットワークを学習可能にした、本質的な選択でした。
練習問題
自分で手を動かして確認してください。解答は各問題の直後にあります。
問題1 誤差と損失
予測値が7、正解値が3のとき、誤差と損失をそれぞれ求めてください。また、この二つの違いを説明してください。
解答を示します。
誤差を求めます。
損失を求めます。
違いを説明します。
誤差は、予測と正解のずれそのものです。符号があり、予測が大きすぎれば正、小さすぎれば負になります。
損失は、そのずれを「悪さの度合い」に変換した値です。二乗するため符号が消え、必ず0以上になります。
補足します。予測値が で正解が3の場合、誤差は
ですが、損失は同じく8です。ずれの向きが違っても、悪さの度合いは同じという扱いになります。
問題2 最小ネットワークの順伝播
次の設定で、、
、
、誤差、
を求めてください。
解答を示します。
正なので、そのまま通ります。
誤差を求めます。
損失を求めます。
問題3 連鎖律の分解
問題2の設定で、 を連鎖律の4つの因子に分解し、それぞれの値を示したうえで、最終的な値を求めてください。
解答を示します。
連鎖律を書きます。
各因子を求めます。
(
が正のため)
掛け合わせます。
補足します。 についても求めておくと比較になります。
偶然、同じ値になりました。連鎖の長さは違いますが、結果が一致することもあります。
問題4 数値微分による検証
問題3の結果を、数値微分で確かめてください。 を
にして計算します。
解答を示します。
正なので、そのまま通ります。
損失を計算します。
変化量を求めます。
変化率を求めます。
問題3で求めた24とほぼ一致しました。
補足します。完全に一致しないのは、数値微分が近似だからです。二次以上の項がわずかに残ります。刻み幅を小さくすれば近づきますが、小さくしすぎると桁落ちで誤差が増えます。
問題5 転置
次の行列を転置してください。また、 の2行目に並ぶ数字が、元の
のどこにあったか説明してください。
解答を示します。
2行3列が、3行2列になりました。
説明します。 の2行目は
です。
元の では、2は1行2列目、8は2行2列目にありました。どちらも2列目です。
つまり、元の行列の2列目が、転置後は2行目になっています。
補足します。転置とは、縦に並んでいたものを横に並べ替える操作です。数字の中身は一つも変わっていません。
逆伝播で転置が必要になるのは、順伝播で縦に散らばっていた情報を、横に揃えて計算したいからです。
問題6 和の連鎖律
次の設定で、 を、経路ごとに計算してから足し合わせる方法で求めてください。
解答を示します。
まず順伝播します。
どちらも正です。
経路Aを計算します。 です。
掛け合わせます。
経路Bを計算します。 です。
掛け合わせます。
足し合わせます。
問題7 行列で確かめる
問題6の結果を、 を計算することで確かめてください。
も求めてください。
解答を示します。
まず を求めます。
ReLUの微分はどちらも1なので、そのままです。
を求めます。
この行列は左上から右下への対角線に対して対称なので、転置しても見た目が同じです。ただし読み方は変わります。行が入力側、列が中間層側になります。
掛けます。
1行目です。
2行目です。
1番目が63で、問題6の結果と一致しました。
です。
補足します。経路ごとの計算でも確かめられます。
経路A:
経路B:
一致しました。行列積の1行が、経路の和に対応しています。
問題8 重みの勾配と連鎖の途中の0
(1) 問題6の設定で、 と
を求めてください。
(2) もし が負だった場合、
の何行目がどうなるか答えてください。
解答を示します。
(1) 出力層から求めます。
形は1行2列で、 と一致します。
中間層です。
1行目です。
2行目です。
形は2行2列で、 と一致します。
(2) が負なら、ReLUの微分は0になります。
したがって の2行目は、すべて0になります。
2番目の中間ユニットに繋がる重みは、この入力に対して更新されません。
補足します。(1)の結果で、2列目が1列目の2倍になっている点にも注目してください。入力 が
の2倍だからです。
連鎖律で言えば、 の部分が効いています。この性質が、入力データの正規化が必要な理由の一つです。
学習の進め方
初学者がこの分野を学ぶ順序を示します。
| 段階 | 内容 |
|---|---|
| 1 | 記号の読み方を覚える |
| 2 | 誤差と損失の違いを理解する |
| 3 | 連鎖律を一変数で理解する |
| 4 | 1-1-1 のネットワークで順伝播と逆伝播を計算する |
| 5 | 数値微分で検算する |
| 6 | 更新後に損失が下がることを確認する |
| 7 | 転置が何をしているか、表で理解する |
| 8 | 多変数の連鎖律に「和」が入る理由を理解する |
| 9 | 経路ごとの和が行列積であることを確かめる |
| 10 | 2-2-1 のネットワークで計算する |
| 11 | 負の値が出る場合も計算する |
| 12 | バイアスを加える |
5番と9番を飛ばさないでください。
5番は、自分の計算が正しいことを自分で確認する手段です。これができると、理解が確信に変わります。
9番は、この記事の核心です。行列積が天下り式の道具ではなく、連鎖律の要求から必然的に出てくるものだと分かります。
振り返り
次の問いに答えられるか確認してください。
- 誤差と損失は、それぞれ何を表しますか
の読み方と、この記事での意味は何ですか
- 連鎖律はなぜ掛け算になるのですか
- 連鎖の途中に0が一つあると、結果はどうなりますか
- 経路が複数あるとき、連鎖律はどう変わりますか
- その変化は、どの演算に対応していますか
- 転置とは、具体的に何をする操作ですか
- 逆伝播で転置が現れるのはなぜですか
- 活性化関数の逆伝播でアダマール積を使うのはなぜですか
- 自分の計算した勾配が正しいか、どう確かめますか
すべて答えられれば、この記事の内容は理解できています。
まとめと次の学習ステップ
線形代数が必要な理由は、便利だからではありません。連鎖律を実際の規模で書くには、それしか方法がないからです。
ユニットが1つずつのネットワークでは、連鎖律は変化率の掛け算でした。行列は不要でした。損失は2から0.7316へ、約63%減少しました。
ユニットを2つにすると、経路が枝分かれし、合流しました。連鎖律に和が入り、それを書き表す記法として行列積が必要になりました。損失は2から0.2506へ、約87%減少しました。
そして、経路ごとの計算と行列積の結果が一致することを確かめました。 を経路Aと経路Bで計算した和が14、
の1行目も14。同じものでした。
転置は、暗記すべき規則ではありません。成績表を裏返すのと同じで、同じデータを違う向きから読んでいるだけです。順伝播で「入力から中間層へ」と読んだ配線図を、逆伝播で「中間層から入力へ」と読み直す。それが転置です。
さらに、数値微分による検算も行いました。手で求めた勾配4に対し、数値微分の結果は4.002。理論と計算が一致することを、自分の手で確認できました。
次の学習ステップとしては、同じ計算をPythonで実装してみてください。ライブラリを使う前に、NumPyだけで書くことをおすすめします。そして必ず、数値微分と比較してください。この記事でやったことを、そのままコードにするだけです。
その先には、より深いネットワーク、畳み込み層、そして注意機構が待っています。いずれも、今回扱った連鎖律と、行列積、転置、アダマール積の組み合わせで構成されています。土台は、すでにできています。
セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。
投稿者プロフィール

- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。
最新の投稿
新人エンジニア研修講師2026年8月23日なぜディープラーニングに線形代数が必要なのかを理解する
新人エンジニア研修講師2026年8月23日ボルツマンマシンはなぜボルツマンマシンというのか 名前の由来から仕組みまで
新人エンジニア研修講師2026年8月22日行列積とアダマール積の使い分け ミキサーとふるいで教える
新人エンジニア研修講師2026年8月22日生成AIパスポート試験対策 トランスフォーマーを完全整理
