Udemyの関連講座リンクリンクExcelだと見える勾配消失と勾配爆発の原因Excelでニューラルネットワークの実装を行うと、Pythonにあるようなライブラリーがないためとても手間がかかるのですが、利点もあります。一つは、アルゴリズムをきちんと理解できること。これは、自分できちんと理解していないと実装できないからです。一つは、パラメータが収束しない時、その原因究明がやり易いことです。Excelシートにすべての計算ステップが残るので行数はとても多くなりますが、途中経過が計算式とともにすべて見れるので、どこが悪いのか発見しやすいのです。原因の多くは計算式の入力ミスなのですが、計算式が正しくても勾配消失や勾配爆発が原因の時もあります。そんな時にも何が原因なのか、はっきりわかります。勾配消失とは、勾配降下法により計算されるすべてのパラメータの勾配がゼロになってしまうことです。すべての勾配がゼロになってしまうと、パラメータは更新されなくなってしまい、それ以上の学習が進みません。逆に勾配爆発とは、勾配が大きくなりすぎてパラメータが大きくなり過ぎてしまい発散してしまうことです。これら勾配消失と勾配爆発は、隠れ層が多いディープラーニングにおいてよく問題になることですが、隠れ層が1層しかなくても条件が揃えば起こります。その条件はディープラーニングで起こる問題の真因であったりします。(たぶん)そこで、Excelで見たらどのように原因が見れるのかを以下ご紹介します。勾配消失の原因をExcelで追跡する勾配消失を再現するまずは勾配消失を発生させてみましょう。入力データが5画素の輝度データを合計した値の場合、その値は最大で1,250くらいになります。それをそのまま入力とし、パラメータの初期値を0~1の乱数とした場合の様子を以下に示します。クリックすると拡大しますクリックすると拡大します見事にすべての勾配が始めから消失しました。消失したのかを追ってみましょう。シグモイド関数の導関数がゼロになることが原因パラメータの勾配はいくつかありますが、その中の一つがどのように計算されたかを見てみます。下図の1の勾配はこのように計算されています。クリックすると拡大します2つの式を合せると、1は2×4×5で計算されますが、このうち5がゼロになっています。これは隠れ層活性化関数の導関数です。クリックすると拡大しますここでは活性化関数はシグモイド関数を使っています。シグモイド関数の導関数がゼロになるかを調べるために、シグモイド関数の性質から見てみましょう。シグモイド関数の導関数がゼロになるのは入力が大きすぎるためシグモイド関数は次式で表されます。1/(1+e-x)グラフでは次のようになります。xがゼロの時のf(x)は0.5、xがゼロからマイナス方向に離れるつれてf(x)はゼロ、xがゼロからプラス方向に離れるにつれてf(x)は1に近づくという性質を持っています。xが両極端の値を取る時には0や1になるのですが、そうでない時には0から1の間の値を取ります。グラフを見ると分かるように、f(x)が0から1の間の数を取るxの区間は、非常に狭いです。大体、0±4の区間しかありません。xがこの区間を外れるとf(x)は0か1になります。次に、シグモイド関数の導関数を見てみます。シグモイド関数とその導関数には、次式の関係があります。(1-f(x))/f(x)この関係式を使ってシグモイド関数の導関数のグラフを描くと、次のようになります。この導関数はxがゼロでは0.25、そこから離れるにつれてゼロになる関数です。xが0±5くらいでは0から0.25の間の値になりますが、この範囲を離れるとゼロになります。ゼロになるということは勾配がゼロになるということですので、パラメータは更新されません。xは0±5という非常に限られた範囲でないとパラメータは更新されません。勾配降下法の計算においてxとは前の層からの出力に重みを掛けた線形和です。前の層の出力の値が大きいと線形和が大きくなり、簡単に5を超えてしまうことがあります。重みが1以下でも、前の層からの出力が何百という数だと簡単に5を超えてしまい、シグモイド関数の導関数はゼロになってしまいます。すると勾配を求める式にはシグモイド関数の導関数が掛け算で入っているため、勾配がゼロになってしまうのです。normalizationのように入力を正規化するのか有効だと思います。normalizationの逆伝播の算出式を計算グラフを辿って求める隠れ層が多いと勾配消失し易い一方、ディープラーニングでは事情が異なります。入力が大きくならないように調整したとしても、勾配消失する可能性が高くなります。誤差逆伝播法では出力と教師データとの誤差が、出力層から逆伝播していって先頭の隠れ層の重みの勾配が求められます。これは先頭の隠れ層から出力層まで、複数の線形関数や活性化関数が連鎖しているからです。隠れ層が5層ある場合には、各隠れ層にある活性化関数と出力層の活性化関数を合せて6つの活性化関数が、関数の連鎖の中に含まれています。いうことは、先頭の隠れ層の重みの勾配の計算式には、活性化関数の導関数が6つ掛け算で含まれます。活性化関数がシグモイド関数なら、どういうことになるでしょう?シグモイド関数の導関数のグラフをもう一度見てみましょう。xがゼロの時に0.25の最大値を取ります。最大でも0.25なのです。グラフを見ると分かるように、xがゼロから2ずれるだけでも0.1に急減します。仮に6つのシグモイド導関数の値がすべて0.1だとすると、勾配は0.000001倍されてしまうのです。あっという間に勾配はゼロ近辺になってしまいます。隠れ層が多い場合の対策はReLU関数このように活性化関数にシグモイド関数を使うと、導関数の値が最大0.25にしかならないため、勾配消失が起こりやすくなります。Unit)がよく用いられます。ReLU関数は次式で定義されます。(x<0)xが正の時にはxの値をそのまま、負の時にはゼロを出力する関数で、グラフに描くとこうなります。ReLU関数の良い点は、xが正であれば導関数が常に1になることです。xをxで微分すると1ですので。従って、隠れ層が100になっても1,000になっても、活性化関数の導関数のせいで勾配消失が起こることはありません。欠点はxが負になると導関数はゼロになってしまうことです。前の層からの出力の線形和は常に正である必要があります。これはニューラルネットワークが決める重みによりますので、担保できません。ReLU関数が使われます。グラフにするとこうなります。xが負の時に常にゼロではなくて、微妙に下がってますね。Leakyとは「漏れている」という意味ですが、確かに左へ行くに従い漏れているような形になっています。これを式で表すと次のようになります。(x<0)なぜこのように漏らすのかというと、xが負の時に微分してもゼロにならないからです。この場合だと微分すると0.1になりますね。ちなみに、この係数は0.1で固定ではありません。通常は0.01で用いる場合が多いようです。これで、隠れ層が多い場合に活性化関数が原因で勾配消失することはなくなりました。これで安心はできません。今度は勾配爆発する危険があるからです。勾配爆発の原因をExcelで追跡する勾配爆発を再現するまずは先ほど勾配消失させた例で、勾配爆発させてみましょう。ReLU関数とします。クリックすると拡大しますクリックすると拡大します勾配爆発の原因なぜこうなってしまったのかを詳しく追ってみましょう。下図の1の勾配はこのように計算されています。クリックすると拡大します2つの式を合せると、1は2×4×5で計算されます。このうち5が隠れ層活性化関数の導関数で、これがゼロになると勾配消失しました。ReLU関数を使っていて、x(この場合はu)が負の数なので導関数は0.01になっています。-10の170乗というように勾配が大きく振動しながら発散しています。ReLU関数を使ったら、今度は勾配爆発を起こしてしまったわけです。勾配が大きく振動してしまうのでしょうか?重みパラメータは勾配により次バッチの重み=現バッチの重み-学習率×勾配の式で更新されます。この時あまりにも勾配が大きすぎると、上式から明らかなように次バッチの重みは大きな負の値になってしまうことがわかります。ところで、逆伝播の勾配の計算式では重みは次式4の中に入っています。ReLU関数の負領域での勾配は0.01ですので、大きな負の値をとる勾配にこれが掛けられると少しはマシになるものの、4も大きな負の値になります。従って、次に次バッチの重み=現バッチの重み-学習率×勾配で計算される重みは、大きな正の値になります。すると逆伝播の計算式より、次に計算される勾配は大きな正の値になります。次バッチの重み=現バッチの重み-学習率×勾配で計算される次の重みは大きな負の値になります。このように、重みも勾配も大きな負の値と大きな正の値を行ったり来たりして、振幅もどんどん大きくなります。発散してしまうわけです。このように一旦勾配がある範囲から外れて、大きくなり過ぎたり小さくなり過ぎたりすると、発散してしまいます。勾配爆発の対策には入力の正規化と初期値の設定の見直しこれを防ぐ有効な手立てはないのでしょうか?先ほどの逆伝播の計算式を見ると2と4、つまり入力と重みが極端な値にならないように注意すれば良いことがわかります。normalizationが有効だと思います。重みについては、初期値の設定が重要になってくると思います。Xavierの初期値やHeの初期値として理論化されていますので、そちらも参照してみて下さい。normalizationが有効になってくると思います。AI数学-文系でも理解できる!高校から始めるデータ分析、AIのための数学-データ分析、機械学習に関わる数学に絞り、効率的に学習できるようカリキュラムを構成しました。文系でも理解できるよう丁寧な説明をしています。Pythonエンジニア育成推進協会認定スクールによる高品質な数学コースです。–1000人以上が受講している(株)キカガクの『脱ブラックボックスセミナー』が遂に登場!機械学習の参考書を「閉じてしまった人」への再入門に最適な講座です。微分・線形代数といった数学の基礎からPythonでの実装まで短時間で習得しましょう。永遠の旅人よろしければシェアお願いしますTwitterFacebookLinkedInB!HatenaLINELINE活性化関数でよく使われるシグモイド関数の歴史や定義について調べてみた。Next再帰型ニューラルネットワーク(RNN)のBPTTをExcelに実装してみた。アルゴリズムを表記方法からわかりやすく解説します。ニューラルネットワークの計算の肝となる誤差伝播法。前回は3×3の9画素で〇✕を見分けるニューラルネットワークを作りました。...モーメンタム法のアルゴリズムをExcelに実装して具体例を解いてみた。...ポアソン分布のパラメータλをExcelソルバーを使って最尤法で求めてみた。...重点サンプリングによるモンテカルロ積分をExcelで試して効果を見てみた。【区間推定の使い方】タイヤの摩耗を具体例にわかりやすく解説します。TOP28【作業分析6】MMCモデル|最適なトラックドック数をSimpyでシミュレーション【作業分析5】トラックの待機台数の多さを人の表情でアニメーション(2)カンボジアの物流でお困りのことがあればお気軽にご相談下さい。学生時代にアジアの雑踏にハマる。誰もが羨むメーカーを退職し「旅するように働く」ことを目指し物流業界に転職。理工学と経営学のダブル修士。2023年1月からカンボジアのオートレスビーチ在住。