#微分とは
深層学習において,損失関数を学習させるパラメータ(重みやバイアス)で微分した値は,パラメータの値を微少に変化させた時,損失関数の値がどう変化するのかを示しています.一般的に深層学習では多くのパラメータをニューラルネットワークにより更新させていくことで学習モデルの精度を上げていく.この時,推測データが正解データにどれだけ近いのかを測るための尺度として,損失関数の値を用います.この損失関数の値が小さいほど,推測したデータが正解のデータに近いことを表します.つまり学習とは,損失関数の値を最小にするパラメータを求めることでもあります.損失関数の最小値(厳密にはできるだけ小さい値)を求める際に微分を使い,パラメータを更新していきます.
#数値的と解析的
違いを6面サイコロの1の目が出る確率の求め方から考えてみます.
数値的:例えば,サイコロを10000回振ったら,1の目が1600回でた.すると,1の目が出る確率は1600/10000=0.16となる.
もう一度サイコロを10000回振り直したら,1の目が出る回数は高い確率で1600回にはならないでしょう.つまり,数値的に求める値には誤差が含まれます.
解析的:サイコロは1~6の目があるので,1の目が出る確率は1/6=0.166666...となる.
実際にサイコロを振っているわけではないので,解析的に求めた値に誤差は含まれません.
#数値微分
まず,数値微分の公式は以下のようになります.y=f(x)において,yをxで微分します.
dy/dx = { f(x+h) - f(x) } / h [h→0]
hの極限を取ることによって微分値を求めます.実際はhは0に限りなく近い値ではなく,1e-4(0.0001)程度の値とします.これは,0.000...001のように小さすぎる値は0.0として認識されてしまうからです.
例えば,y=x^2をxで微分すると
dy/dx = { (x+0.0001)^2 - x^2 } / 0.0001
ここで,x=1とすると,
dy/dx = 2.0001
となる.
このように,極限を用いて微分値を求めことを数値微分という.
数値微分は計算結果に誤差を含むので,真の微分値ではありません.
#解析的な微分
数値微分の例で説明すると,y=x^2をxで微分すると2xになる.極限を取ることなく微分値を求める方法.
x=1とすると,
dy/dx = 2*1 = 2
となる.
解析的な微分は計算結果に誤差を含まない.つまり真の微分値となります.
#まとめ
深層学習において,数値微分により損失関数の勾配を求めることは計算に膨大な時間がかかってしまい不向きです.一方で,解析的な微分を用いることで効率的に微分値を求め,誤差逆伝播法によりパラメータを更新することができます.
##数値微分は使う機会があるのか?
誤差逆伝播法の実装は複雑でミスが起きやすいことから,実装の正しさを確認するために,数値微分を用いることがあります.
##参考文献
ゼロから作るDeepLearning