DeepLearningの勉強をしている際に数値微分では中心差分を取ることで誤差を減らすことが出来るとの記述がありました。しかし、何故減らせるかの記述がなかったため調べてみました。
数値微分について
初めに数値微分について軽く説明します。
微分は瞬間の変化量を表したもので、下式のように定義されます。
$$
f'(x)=\lim_{h→0}\frac{f(x+h)-f(x)}{h}
$$
しかし、コンピュータで微分を行おうとする際には$\lim_{h→0}$の処理ができません。
そこで使用されるのが数値微分です。
数値微分とは、hを非常に小さな値として0に近づけることで、微分を近似する方法です。
式にすると以下のようになります。
$$
f'(x)\approx \frac{f(x+h)-f(x)}{h}
$$
これによりコンピュータを用いて微分を近似して計算することが出来ます。
数値微分で発生する誤差
数値微分を用いるとプログラムで微分が出来ることが分かりました。
しかし、数値微分では解析的な解と誤差が生じます。
その原因となるのが丸め誤差と打ち切り誤差です。
丸め誤差
例えば$10^{-100}$のように小さな値を用いて計算を行おうとすると、コンピュータ上では0.0のように桁を省略します。
このように桁を省略することで発生してしまう誤差のことを丸め誤差と言います。
数値微分の例を挙げると、hは大きすぎると本来のh→0と近似できなくなり、小さすぎると丸め誤差が発生してしまいます。
打ち切り誤差
打ち切り誤差とは、例えば$1\div 3=0.33333…$のような計算があった際には0.333は無限に続くため、コンピュータはある一定の値で計算を打ち切ります。
このように計算を途中で打ち切った際に発生するのが打ち切り誤差です。
中心差分
数値微分を行う際に誤差が発生してしまうのは仕方ないものの、誤差をなるべく減らす必要があります。
そこで、上記で示した様な誤差に対する対策として中心差分というものがあります。
中心差分とは$f(x+h)$と$f(x-h)$の関数間の差分を計算することにより、誤差を減らす方法です。
具体的には以下の式になります。
$$
f'(x)\approx \frac{f(x+h)-f(x-h)}{2h}
$$
また、$f(x+h)$と$f(x)$の差分をとる方法を前方差分、$f(x)$と$f(x-h)$の差分をとる方法を後方差分といいます。
なぜ中心差分にすると誤差は小さくなるのか?
今回の本題である「なぜ中心差分にすると誤差は小さくなるのか?」についてテーラー展開を用いて説明していきます。
テーラー展開
初めに$f(x+h)$を$x$のまわりでテーラー展開をすると以下のようになります。
$$
f(x+h)=f(x)+hf'(x)+\frac{h^2}{2}f^{(2)}(x)+\frac{h^3}{6}f^{(3)}(x)+…
$$
ここで、オーダー記法を用いると以下のように記述できます。
$$
f(x+h)=f(x)+hf'(x)+\frac{h^2}{2}f^{(2)}(x)+O(h^3)
$$
同様にして$f(x-h)$についても$x$まわりでテーラー展開をすると$f(x+h)$と$f(x-h)$はそれぞれ以下のように表せます。
$f(x+h)=f(x)+hf'(x)+\frac{h^2}{2}f^{(2)}(x)+O(h^3)$ ・・・(1)
$f(x-h)=f(x)-hf'(x)+\frac{h^2}{2}f^{(2)}(x)+O(h^3)$ ・・・(2)

ここで誤差項が$O(h^3)$を取るのは、この後の中心差分の誤差を求める時、$O(h^2)$や$O(h)$にすると都合が悪いからです。。。
前方差分と後方差分の誤差を求める
初めに(1)式を用いて前方差分について計算します。
$$
\begin{align}
\frac{f(x+h)-f(x)}{h}&=\frac{hf'(x)+\frac{h^2}{2}f^{(2)}(x)+O(h^3)}{h}\\
&=f'(x)+O(h)
\end{align}
$$
同様にして、(2)式を用いて後方差分についても計算します。
$$
\begin{align}
\frac{f(x)-f(x-h)}{h}&=\frac{hf'(x)-\frac{h^2}{2}f^{(2)}(x)+O(h^3)}{h}\\
&=f'(x)+O(h)
\end{align}
$$
上記より前方差分と後方差分の誤差はどちらも$O(h)$であると分かります。
中心差分の誤差を求める
初めに(1)式-(2)式を求めます
$$
f(x+h)-f(x-h)=2hf'(x)+O(h^3)
$$
上記式を中心差分の式に代入すると
$$
\begin{align}
\frac{f(x+h)-f(x-h)}{2h}&=\frac{2hf'(x)+O(h^3)}{2h}\\
&=f'(x)+O(h^2)
\end{align}
$$
よって、中心差分の誤差は$O(h^2)$であると分かります。
前方・後方差分と中心差分の比較
上記までで前方差分と後方差分の誤差は$O(h)$、中心差分の誤差は$O(h^2)$と求められました。
ここで、hは$0<h<1$を満たす小さな数のため、$O(h)$と$O(h^2)$を比較すると$O(h^2)$の方が誤差が小さいと分かります。
よって中心差分を用いることで数値微分の誤差を減らすことが出来ると分かります。
コメント