こんにちは。 では早速、実際に差分法を確認してみましょう。 前回のシグモイド関数の微分を差分法により計算しましょう。プロットで同じ図が得られれば上の計算が合っている数値確認になります。 ここで注意すべきことがあります。それは微分を計算する式は

    \[f'(x) = \lim_{\delta h \rightarrow 0} \frac{f(x+\delta h) - f(x)}{\delta h}\]

ではなく

    \[f'(x) = \lim_{\delta h \rightarrow 0} \frac{f(x+\delta h) - f(x - \delta h)}{ 2 \delta h}\]

を使いましょうということです。これは以前スタンフォード大学のレジュメをあさってた際にそのように記述されていました。 ちょっと詳しい理由がわからないのでわかる方がいれば教えて欲しいです。おそらく計算上の関係だと思うのですが。。 ではプロットして前回と比較してみると (Recall below)

    \[\sigma '(x) = \sigma (1 - \sigma)  \]

見えないですけどちゃんと一致しています。よって僕の前回の微分計算は正しかったということです。ちなみにシグモイド関数の微分の最大値が0.25ということは頭の隅に置いておいてください。 今回は非常に簡単な例で差分法を確認しましたが実際に僕が機械学習をしていて差分法を使うときは「勾配」を必要とする時です。 あいにくこんな簡単な関数をは使うことはほとんどなく、実際は多変数関数を扱います。そして最適化する際に必要となるのが「勾配」です。 勾配とは関数がもっとも大きくなる方向です、この事実は多変数のテイラー展開により証明できます。 勿論、勾配になってもやることは同じです。各変数で偏微分をとればいいだけです。その際に差分法による数値計算で安心できます。 簡単なので退屈かもしれませんね。次回はニューラルネットワークかも?   指摘&アドバイスお願いします。