【計算グラフ】でいろいろな活性化関数の微分が簡単にできるか試してみた

ニューラルネットワークの学習とは、損失関数が小さくなるように重みパラメータを更新することですが、そのためには重みパラメータの勾配(偏微分)を計算する必要があります。

これを解析的に効率良く解くための手法が誤差逆伝播法で、正に数学ワールドです。

少しでも分かりやすく解説するために、「ゼロから作るDeep Learning」では計算グラフによる方法が紹介されています。

管理人は計算グラフは知らなかったのですが、なかなか面白かったので理解を深めるために自分で応用問題を解いてみました。

本では活性化関数の中でReLU関数シグモイド関数ソフトマックス関数の微分の求め方が載っていましたので、ソフトプラス関数ソフトサイン関数の微分を自分で計算グラフを使って求めてみました。

本を読んでいて、もう少し例題が欲しいと思っていた方の参考になれば幸いです。

 

計算グラフとは

「ゼロから作るDL」を読んでいない方も計算グラフでググればまとめ記事が沢山出てきますので、計算グラフとは何かについてはそちらを参照して下さい。

ここでは本には出ていない物流の事例で簡単に説明します。

 

フォワーディング専業のA社では来期の予算を作成中です。

売上は海上フォワーディングと航空フォワーディングに分かれ、次のような概算表を作りました。

 

これは簡単な計算例ですが、計算グラフでは四則演算単位に要素分解して更に簡単に表現します。

 

これは計算グラフを知らなくても、視覚的に理解できると思います。

この時、海上フォワーディングの件数が1件増減したら、最終売上にどれくらい影響があるかを調べたいとします。

このような分析は感度分析として知られています。

 

この感度分析は式にすると次のように書くことができます。

売上への影響=売上の増減/件数の増減

 

もし件数が1件増えたとすると、売上は40万円増えますね。

2件増えたとすると、売上の増加は80万円です。

この場合、件数当たりの売上の増減額は40万円ということができます。

倍率40万倍ということです。

 

実は、これは「件数に関する売上の微分」をやっているのと同じことです。

件数がある微小な値だけ増えた場合に、売上がその微小な値の何倍増加するか?

微分というと難しそうに思えますが、ただこれだけのことです。

 

そして、この微分を求めるには、計算グラフを逆に辿っていけば良いというのが、この本に書いてある主張です。

逆に辿ることを逆伝播といいますが、次のようになります。

 

最後のノードに1が入力された場合に、それが逆伝播していって、最初の運賃や件数が何倍に拡大されるのかを調べるのです。

この例では「+」と「×」の2種類のノードがありますが、「+」のノードを逆伝播しても倍率は変わりません。

「×」のノードでは、順伝播の際の入力をひっくり返した値が掛け算されます。

この規則に沿って逆伝播していくと、海上運賃は1,000倍、海上件数は40万倍されます。

つまり、売上を海上運賃で微分すると1,000、海上件数で微分すると40万というわけです。

 

この時、売上をL、海上運賃をx、海上件数をyとすると、

∂L/∂x=1,000

∂L/∂y=400,000

という偏微分の式で書くことができます。

 

この例では「×」と「+」という四則演算のノードしか使いませんでしたが、いかなる関数でも同様のノードで記述することができます。

例えば、

f(x)=sin(x)

というノードは、

というように表します。

そして逆伝播では微分倍されます。

sin(x)の微分はcos(x)ですので、

というように逆伝播します。

このように逆伝播ではノードを通ることによって微分倍されます。

 

この辺りの解説についてはネットにまとめ記事が沢山出ていますので、そちらを参照してみて下さい。

 

ソフトプラス関数の微分

それではこのやり方を使って、まずはソフトプラス関数の微分を求めてみましょう。

ソフトプラス関数はReLU関数に似ていて、xが小さい時にはy=0、xが大きい時にはy=xになります。

xが-3から3の間くらいの中途半端な値を取る時には、滑らかな曲線になります。

ReLU関数はx=0で非連続で微分不可ですが、ソフトプラス関数は全区間で微分可能という特徴があります。

 

ソフトプラス関数は次式で表されます。

f(x) = log(1+ex)

これを計算グラフで表し、逆伝播することによって微分を求めてみます。

 

計算グラフは次のように書けます。

 

xをexにした後に1を足し、その対数を取ればいいだけなので簡単です。

この計算グラフの最後のノードに1を入力し逆伝播させると、次のようになります。

 

まずlog関数の逆伝播の倍率が1/(1+ex)になっていますが、これはlog関数f(x)=log(x)の微分が1/xであるためです。

逆伝播では微分倍されるのでしたね。

この例ではlog関数への入力xが1+exですので、微分は1/(1+ex)になります。

ですので、1/(1+ex)になるのです。

 

次の「+」のノードではそのまま逆伝播します。

その次のexp関数の逆伝播では微分倍されます。

exp関数f(x)=exの微分はexですので、ex倍されます。

ですので、1/(1+ex)がex /(1+ex)になります。

 

これがイコール、ソフトプラス関数f(x) = log(1+ex)の微分です。

 

ソフトサイン関数の微分

ソフトサイン関数はシグモイド関数の一種です。

ニューラルネットワークの理解に欠かせないシグモイド関数について調べてみた

 

-1から1の連続値に変換するという点ではtanh関数(ハイパボリックタンジェント関数)にとても良く似ています。

 

ソフトサイン関数は次式で表されます。

f(x) = x/(1+|x|)

これも計算グラフで表し、逆伝播することによって微分を求めてみましょう。

 

順伝播の計算グラフは次のようになります。

 

そして、最後のノードに1を入力し逆伝播させると、次のようになります。

 

4つのノードがありますが、新しいのは「」と「abs」です。

「/」はf(x)=1/xを表す関数で、その微分は-1/x2です。

この例では入力xが1+|x|ですので、逆伝播では-1/(1+|x|)2されます。

 

「abs」は絶対値を返す関数f(x)=|x|で、その微分はxがプラスの場合とマイナスの場合とで分けて考える必要があります。

まずxがプラスの場合は、f(x)=xですので微分するとです。

一方、xがマイナスの場合はf(x)=-xになりますので、微分すると-1になります。

ゼロの場合はプラスに含めておきましょう。

 

あと一つ注意しないといけないのが、順伝播で一つの信号が分岐している場合の逆伝播です。

何を言っているかというと、上の図の左側の部分です。

順伝播のxとして入力信号が入ってきますが、それが2つに分岐しています。

このような場合には、逆伝播する時に分岐した2つのルートからの逆伝播信号を合計する必要があります。

 

合計する時にもxがプラスの場合とマイナスの場合とで場合分けする必要がありますが、どちらの場合も1/(1+|x|)2と同じ結果になります。

従って、ソフトサイン関数の微分は1/(1+|x|)2と求められました。

 

以上のように簡単な関数の微分さえ分かれば、後は計算グラフにすることによって、複雑な関数の微分でも解析的に求められることが分かりました。