誤差逆伝播法と勾配の問題
ニューラルネットワークがどの重みを直せばよいかを知る仕組み、誤差逆伝播法を学びます。基礎層では、誤差を出口から入口へ後ろ向きにたどり、各重みの責任を割り当てることをつかみます。深掘り層では、連鎖律・信用割当問題・勾配消失問題・勾配爆発問題を数式も交えて説明できるようになります。
ねらい
このレッスンでは、ニューラルネットワークがどの重みを直せばよいかを知る仕組み、誤差逆伝播法(ごさぎゃくでんぱほう)を学びます。
基礎
「誤差を出口から入口へ後ろ向きにたどって、それぞれの重みの責任を割り当てる」という全体像をつかみます。
1. 誤差を後ろからたどって責任を割り当てます
リレーで最後にゴールしたタイムが悪かったとします。原因を知るには、アンカーだけを見ても分かりません。第一走者から最終走者まで、それぞれがどれだけタイムに影響したかをたどる必要があります。
ニューラルネットワークも同じです。出口の出力にずれがあったとき、そのずれは、出力層に近い重みだけでなく、入力層に近い重みまで、たくさんの重みが積み重なって生まれています。そこで、出口で分かったずれを出力層から入力層へ向かって、層をさかのぼりながら分配していきます。各重みに「あなたはこのずれにこれだけ責任がある」という割り当てを伝えていくのです。この、誤差を後ろ向きにたどって各重みへ伝える手順を誤差逆伝播法といいます。
このとき問題になるのが、どの重みにどれだけの責任があるのかをどう正しく割り当てるかです。この、結果に対する各部分の責任を正しく割り当てる難しさを信用割当問題(しんようわりあてもんだい)といいます。誤差逆伝播法は、この信用割当問題を計算で解く方法だ、ととらえられます。
ポイント
誤差逆伝播法は、出口で分かったずれを出力層から入力層へさかのぼって各重みに分配し、それぞれの責任の大きさを伝える手順です。
ここまでの要点
- 出口のずれは、たくさんの重みが積み重なって生まれるため、後ろ向きにたどって各重みへ責任を分配します。
- この、各部分の責任を正しく割り当てる難しさを信用割当問題といい、誤差逆伝播法がそれを計算で解きます。
まずは全体像をつかめれば十分という人は、ここで区切って大丈夫です。「誤差を後ろからたどって、重みの責任を割り当てる」と押さえられていれば、この先の深掘りに進む土台はできています。
発展
ここからは、責任の割り当てを支える連鎖律と、深い層で起きる勾配の問題を数式も交えて見ます。ここでは微分の考え方を少し使います。
2. 勾配とは、重みを動かしたときのずれの変化です
各重みの責任は、勾配(こうばい)という量で表します。勾配とは、ある重みをほんの少し動かしたときに、誤差関数の値がどれだけ変化するか、その変化の割合のことです。数学では、この変化の割合を微分(びぶん)で求めます。傾きが急なほど、その重みを動かしたときにずれが大きく変わる、つまりその重みの責任が大きい、という意味になります。
勾配が分かれば、ずれを減らす方向に重みを動かせます。勾配を使って重みを少しずつ動かし、ずれを小さくしていく方法を勾配降下法(こうばいこうかほう)といい、後の最適化のレッスンでくわしく扱います。ここでは、「各重みの責任は勾配という傾きで表され、誤差逆伝播法はこの勾配を計算する」と押さえてください。
理解の確認
勾配とは、ある重みを少し動かしたときに誤差関数の値がどれだけ変わるか、その変化の割合です。傾きが急なほど、その重みの責任が大きいことを表します。誤差逆伝播法は、各重みの勾配を計算します。
3. 連鎖律で、後ろから勾配を伝えます
出力層から入力層まで、各層の勾配を効率よく求めるための数学の道具が連鎖律(れんさりつ)です。
ニューラルネットワークは、層の計算が次々につながった、入れ子の構造をしています。連鎖律とは、こうしたつながった計算全体の変化の割合が、各段の変化の割合をかけ合わせたものになる、という規則です。式で書くと、全体の変化の割合 = 1段目の変化の割合 × 2段目の変化の割合 × …(段の数だけ続く)となります。読み下すと、つながった変化の割合は、それぞれの段の変化の割合の積になります。かけ合わせる、と耳で読めば意味がつかめます。
この規則のおかげで、出力層の側から一段ずつ変化の割合をかけ合わせていくだけで、入力層に近い重みの勾配まで求められます。各層で一度求めた計算を再利用しながらさかのぼれるため、たくさんの重みの勾配を効率よく計算できます。これが誤差逆伝播法の中身です。
理解の確認
連鎖律は、つながった計算全体の変化の割合が、各段の変化の割合の積になるという規則です。誤差逆伝播法は、この規則を使い、出力層から一段ずつかけ合わせて各重みの勾配を求めます。
4. 勾配消失問題と勾配爆発問題
連鎖律で勾配を求めるとき、各段の変化の割合をかけ合わせていく、という点が、深い層で二つの問題を生みます。
一つ目は勾配消失問題(こうばいしょうしつもんだい)です。かけ合わせる各段の値が1より小さいと、それを何段もかけ合わせるうちに、積はどんどん0へ近づきます。層が深いほど、入力層に近い側の勾配がとても小さくなり、ほとんど0になってしまいます。勾配が0に近いと、その重みはほとんど動かず、学習が進みません。前のレッスンで触れた、シグモイド関数などの平らな領域は、各段の変化の割合を小さくするため、この勾配消失問題を起こしやすくします。ReLU関数が広く使われるようになった理由の一つが、この問題を起こしにくいことでした。
二つ目は勾配爆発問題(こうばいばくはつもんだい)です。今度は逆に、かけ合わせる各段の値が1より大きいと、何段もかけ合わせるうちに、積がとても大きな数へふくれあがります。勾配が大きすぎると、重みが一度に大きく動きすぎて、学習が不安定になり、うまく収まらなくなります。
どちらも、連鎖律で多くの段をかけ合わせることから生まれる、深いネットワーク特有の問題です。これらへの対処は、活性化関数の選び方や、後の章で学ぶ正規化やスキップ結合など、さまざまな工夫で行われます。
理解の確認
勾配消失問題は、1より小さい値を何段もかけ合わせるうちに勾配が0へ近づき、入力層に近い重みが学習されなくなる問題です。勾配爆発問題は、1より大きい値をかけ合わせるうちに勾配がふくれあがり、学習が不安定になる問題です。どちらも連鎖律で多くの段をかけ合わせることから生まれます。
動かして確かめる
各段の変化の割合を、下のトレーナーで実際に動かして確かめてみましょう。1より小さくすると、入力層に近い段 (右側)ほど勾配がしぼんでいきます。1より大きくすると、逆にふくれあがります。1に近いとどちらも起きません。
スタディード / G検定 / 動く解説
1より小さい値をかけ続けると、勾配は消えてなくなる。
連鎖律は、各段の変化の割合をかけ合わせます。1段あたりの割合を動かすと、入力層に近い段(右)ほど勾配がどう積み上がるかが変わります。
理解度の確認
説明できる項目にチェックを入れましょう。すべて確認できたら、完了ボタンで記録します。
分からなかった点・気になった点
読み込み中です。